阅读量:0
0. 基础
0.1 不同加载模式 测试用
编辑器模式;打包模式;更新模式
public enum GameMode { EditorMode, PackageBundle, UpdateMode, }
0.2 加载资源步骤与接口
private void LoadAsset(string assetName, Action<Object> action) { if (AppConst.GameMode == GameMode.EditorMode) { #if UNITY_EDITOR EditorLoadAsset(assetName, action); #else Debug.LogError("Editor mode is not supported in the built version."); #endif } else { StartCoroutine(LoadBundleAsync(assetName, action)); } }
0.3 解析版本文件
/// <summary> /// 解析版本文件 /// </summary> public void ParseVersionFile() { //版本文件路径 string url = Path.Combine(PathUtil.BundleResourcePath, AppConst.FileListName); string[] data = File.ReadAllLines(url); //解析文件信息 for (int i = 0; i < data.Length; i++) { string[] info = data[i].Split('|'); BundleInfo bundleinfo = new BundleInfo() { AssetsName = info[0], BundleName = info[1] }; //list特性:本质是数组但可动态扩容 bundleinfo.Dependences = new List<string>(info.Length - 2); for (int j = 2; j < info.Length; j++) { bundleinfo.Dependences.Add(info[j]); } m_BundleInfos.Add(bundleinfo.AssetsName, bundleinfo); } }
1. 打包模式加载资源
递归异步加载资源:
根据资源的依赖关系递归加载所有需要的资源包,并最终加载目标资源,加载完成后调用回调函数处理加载资源。
/// <summary> /// 递归异步加载资源 /// </summary> /// <param name="assetName"></param> /// <param name="action"></param> /// <returns></returns> IEnumerator LoadBundleAsync(string assetName, Action<Object> action = null) { string bundleName = m_BundleInfos[assetName].BundleName; string bundlePath = Path.Combine(PathUtil.BundleResourcePath, bundleName); List<string> dependences = m_BundleInfos[assetName].Dependences; if (dependences != null && dependences.Count > 0) { for (int i = 0; i < dependences.Count; i++) { yield return LoadBundleAsync(dependences[i]); } } AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(bundlePath); yield return request; AssetBundleRequest bundleRequest = request.assetBundle.LoadAssetAsync(assetName); yield return bundleRequest; //Log Debug.LogFormat("Package Bundle Mode Load Resource : {0}", assetName); action?.Invoke(bundleRequest?.asset); }
2. 编辑器模式加载资源
/// <summary> /// 编辑器模式加载资源 /// </summary> /// <param name="assetName"></param> /// <param name="actioin"></param> #if UNITY_EDITOR void EditorLoadAsset(string assetName, Action<Object> actioin = null) { //Log Debug.LogFormat("Editor Mode Load Resource : {0}", assetName); Object obj = UnityEditor.AssetDatabase.LoadAssetAtPath(assetName, typeof(Object)); if (obj == null) Debug.LogError("Asset name is not exist" + assetName); actioin?.Invoke(obj); } #endif
3. 更新模式加载资源
详见3 热更新