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 热更新