加载对象
加载对象的主要接口包括:
- Asset.Load(Async):常规打包的资产
- Scene.Load(Async):场景资产
- RawAsset.LoadAsync:原始二进制
Asset.Load(Async)
此接口主要用于打包 AssetBundle 的常规资产加载,以下是一些调用此接口的代码示例:
// 加载文本
var asset = Asset.Load(pathToAsset, typeof(TextAsset));
var ta = asset.asset as TextAsset;
var text = ta.text;
// 如果需要加载文本中的二进制可以这样:
var bytes = ta.bytes;
// 加载 Sprite
var asset = Asset.Load(pathToAsset, typeof(Sprite));
var sprite = asset.asset as Sprite;
// 加载 Texture
var asset = Asset.Load(pathToAsset, typeof(Texture));
var texture = asset.asset as Texture;
// 加载 prefab
var asset = Asset.Load(pathToAsset, typeof(Object));
var prefab = asset.asset as Object;
// 如果要在场景中创建 prefab 的 GameObject 可以这样:
var gameObject = GameObject.Instantiate(prefab);
// 加载 音频
var asset = Asset.Load(pathToAsset, typeof(AudioClip));
var clip = asset.asset as AudioClip;
// 加载 ScriptableObject
var asset = Asset.Load(pathToAsset, typeof(ScriptableObject));
var so = asset.asset as ScriptableObject;
这里限于篇幅,这里暂且列举这么多,可以参考 AssetDatabase.LoadAssetAtPath 的使用方法来使用 Asset.Load(Async)。
Scene.Load(Async)
此接口用于场景加载,并且不论是 ScenesInBuild 中的场景,还是打包 AssetBundle 的场景,都可以使用。
以下是一些调用此接口的代码示例:
// 异步加载一个独立场景
Scene.LoadAsync(pathToScene);
// 同步加载一个叠加场景
Scene.Load(pathToScene, true);
// 延迟激活
var scene = Scene.LoadAsync("Welcome.unity");
scene.allowSceneActivation = false;
yield return scene;
yield return new WaitForSeconds(3);
scene.load.allowSceneActivation = true;
注意
每次加载一个新的独立场景后,之前加载的所有场景将会自动释放。所以独立场景不需要主动调用 Release,而叠加场景如果不需要使用的时候,可以主动调用 Release 释放场景。
RawAsset.LoadAsync
此接口主要针对按原始格式打包的二进制数据进行单独加载,只提供了异步加载接口,以下调用此接口的代码示例:
var asset = RawAsset.LoadAsync(pathToRawAsset);
yield return asset;
var savePath = asset.savePath;
var bytes = File.ReadAllBytes(savePath); // 读取二进制数据
不过,一般不需要使用此接口,建议使用预加载的方式把需要的内容下载到本地,然后通过加载路径获取实际保存的路径。在代码中通过加载路径获取保存路径的方式是:
var bundle = Versions.GetBundle(path2Asset);
var savePath = Downloader.GetDownloadDataPath(bundle.nameWithAppendHash);