Skip to content
This repository was archived by the owner on Jul 11, 2023. It is now read-only.

Commit e95ce41

Browse files
committed
资源以异步加载为主,添加同步加载
1 parent c66465b commit e95ce41

File tree

9 files changed

+338
-116
lines changed

9 files changed

+338
-116
lines changed

Assets/Game/Scripts/Resource/EditorResourceHelper.cs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ public Task<T> LoadAsset<T>(string assetBundleName,string assetName) where T : O
4040
task.SetResult(AssetDatabase.LoadAssetAtPath<T>(assetName));
4141
return task.Task;
4242
}
43+
4344

44-
/// <summary>
45-
/// 卸载资源 主要为卸载AssetBundle
46-
/// </summary>
47-
/// <param name="assetName">资源名称</param>
48-
/// <param name="allAssets">是否卸载调所有资源</param>
49-
public void UnloadAsset(string assetBundleName, bool unload)
45+
/// <summary>
46+
/// 卸载资源 主要为卸载AssetBundle
47+
/// </summary>
48+
/// <param name="assetName">资源名称</param>
49+
/// <param name="allAssets">是否卸载调所有资源</param>
50+
public void UnloadAsset(string assetBundleName, bool unload)
5051
{
5152
}
5253

@@ -77,7 +78,17 @@ public AsyncOperation UnloadSceneAsync(string sceneName)
7778
public void Clear()
7879
{
7980
}
80-
}
81+
82+
public Task<AssetBundle> LoadAssetBundle(string assetBundleName)
83+
{
84+
return null;
85+
}
86+
87+
public T LoadAssetSync<T>(string assetBundleName, string assetName) where T : Object
88+
{
89+
return AssetDatabase.LoadAssetAtPath<T>(assetName);
90+
}
91+
}
8192
}
8293

8394
#endif

Assets/GameFramework/Resource/BundleResourceHelper.cs

Lines changed: 71 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -70,27 +70,78 @@ public void SetResourcePath(PathType pathType, string rootAssetBundle = "AssetBu
7070
LoadPlatformMainfest(rootAbPath);
7171
}
7272

73-
/// <summary>
74-
/// 加载资源
75-
/// </summary>
76-
/// <typeparam name="T"></typeparam>
77-
/// <param name="assetBundleName"></param>
78-
/// <param name="assetName"></param>
79-
/// <returns></returns>
80-
public async Task<T> LoadAsset<T>(string assetBundleName, string assetName) where T : Object
73+
/// <summary>
74+
/// 加载ab包
75+
/// </summary>
76+
/// <param name="assetBundleName"></param>
77+
/// <returns></returns>
78+
public async Task<AssetBundle> LoadAssetBundle(string assetBundleName)
79+
{
80+
//加载Assetbundle
81+
AssetBundle assetBundle;
82+
KeyValuePair<AssetBundle, string[]> assetBundles;
83+
if (!_allAssetBundles.ContainsKey(assetBundleName))
84+
{
85+
string assetBundlePath = Path.Combine(_readPath, assetBundleName);
86+
if (!File.Exists(assetBundlePath))
87+
throw new GamekException("AssetBundle is Null");
88+
//加载assetbundle
89+
assetBundle = await LoadAssetBundleFromPath(assetBundlePath);
90+
//存储资源名称
91+
string[] assetNames = assetBundle.GetAllAssetNames();
92+
if (assetBundle.isStreamedSceneAssetBundle)
93+
assetNames = assetBundle.GetAllScenePaths();
94+
foreach (var name in assetNames)
95+
{
96+
if (!_allAssets.ContainsKey(name))
97+
_allAssets.Add(name, assetBundle);
98+
}
99+
//存储assetbundle
100+
assetBundles = new KeyValuePair<AssetBundle, string[]>(assetBundle, assetNames);
101+
_allAssetBundles[assetBundleName] = assetBundles;
102+
}
103+
return assetBundles.Key;
104+
}
105+
106+
/// <summary>
107+
/// 加载资源 同步加载
108+
/// </summary>
109+
/// <typeparam name="T"></typeparam>
110+
/// <param name="assetBundleName"></param>
111+
/// <param name="assetName"></param>
112+
/// <returns></returns>
113+
public T LoadAssetSync<T>(string assetBundleName, string assetName) where T : Object
114+
{
115+
AssetBundle assetBundle;
116+
if (_allAssets.TryGetValue(assetName, out assetBundle))
117+
{
118+
return assetBundle.LoadAsset<T>(assetName);
119+
}
120+
return null;
121+
}
122+
123+
/// <summary>
124+
/// 加载资源
125+
/// </summary>
126+
/// <typeparam name="T"></typeparam>
127+
/// <param name="assetBundleName"></param>
128+
/// <param name="assetName"></param>
129+
/// <returns></returns>
130+
public async Task<T> LoadAsset<T>(string assetBundleName, string assetName) where T : Object
81131
{
82132
//转小写
83133
assetName = assetName.ToLower();
84134

85135
//加载Assetbundle
86136
AssetBundle assetBundle;
137+
87138
if (!_allAssets.TryGetValue(assetName, out assetBundle))
88139
{
89140
string assetBundlePath = Path.Combine(_readPath, assetBundleName);
90141
if (!File.Exists(assetBundlePath))
91142
throw new GamekException("AssetBundle is Null");
92143
//加载assetbundle
93-
assetBundle = await LoadAssetBundle(assetBundlePath);
144+
assetBundle = await LoadAssetBundleFromPath(assetBundlePath);
94145
//存储资源名称
95146
string[] assetNames = assetBundle.GetAllAssetNames();
96147
if (assetBundle.isStreamedSceneAssetBundle)
@@ -105,7 +156,8 @@ public async Task<T> LoadAsset<T>(string assetBundleName, string assetName) wher
105156
}
106157

107158
//加载依赖项
108-
LoadDependenciesAssetBundel(assetBundleName);
159+
await LoadDependenciesAssetBundel(assetBundleName);
160+
109161
//加载资源
110162
var asset = await assetBundle.LoadAssetAsync(assetName);
111163

@@ -148,9 +200,9 @@ public async Task<AsyncOperation> LoadSceneAsync(string assetBundleName, string
148200
{
149201
string assetBundlePath = Path.Combine(_readPath, assetBundleName);
150202

151-
AssetBundle assetBundle = await LoadAssetBundle(assetBundlePath);
203+
AssetBundle assetBundle = await LoadAssetBundleFromPath(assetBundlePath);
152204
//加载依赖项
153-
LoadDependenciesAssetBundel(assetBundleName);
205+
await LoadDependenciesAssetBundel(assetBundleName);
154206

155207
asyncOperation = SceneManager.LoadSceneAsync(sceneName, mode);
156208
//场景加载完成卸载相关的引用
@@ -202,7 +254,7 @@ private async void LoadPlatformMainfest(string rootBundlePath)
202254
{
203255
try
204256
{
205-
AssetBundle mainfestAssetBundle = await LoadAssetBundle(rootBundlePath);
257+
AssetBundle mainfestAssetBundle = await LoadAssetBundleFromPath(rootBundlePath);
206258
_mainfest = mainfestAssetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
207259
mainfestAssetBundle.Unload(false);
208260
}
@@ -211,10 +263,9 @@ private async void LoadPlatformMainfest(string rootBundlePath)
211263
Debug.LogError(ex.ToString());
212264
}
213265
}
214-
215-
216-
//同步加载AssetBundle
217-
private async Task<AssetBundle> LoadAssetBundle(string path)
266+
267+
//同步加载AssetBundle
268+
private async Task<AssetBundle> LoadAssetBundleFromPath(string path)
218269
{
219270
if (!File.Exists(path))
220271
throw new Exception("assetbundle not found :" + path);
@@ -236,28 +287,9 @@ private async Task<AssetBundle> LoadAssetBundle(string path)
236287

237288
return mainfestAssetBundle;
238289
}
239-
240-
//异步加载AssetBundle
241-
private AssetBundleCreateRequest LoadAssetBundleAsync(string path)
242-
{
243-
if (!File.Exists(path))
244-
throw new Exception("assetbundle not found :" + path);
245-
AssetBundleCreateRequest assetBundleCreateRequest;
246-
if (_enciphererkeyAsset != null)
247-
{
248-
byte[] datas = Encipherer.AESDecrypt(File.ReadAllBytes(path), _enciphererkeyAsset);
249-
assetBundleCreateRequest = AssetBundle.LoadFromMemoryAsync(datas);
250-
}
251-
else
252-
assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(path);
253-
254-
return assetBundleCreateRequest;
255-
}
256-
257-
258-
290+
259291
//加载引用的assetbundle --引用的assetbundle不卸载
260-
private async void LoadDependenciesAssetBundel(string assetBundleName)
292+
private async Task LoadDependenciesAssetBundel(string assetBundleName)
261293
{
262294
//加载相关依赖 依赖暂时不异步加载了
263295
string[] dependencies = _mainfest.GetAllDependencies(assetBundleName);
@@ -267,7 +299,7 @@ private async void LoadDependenciesAssetBundel(string assetBundleName)
267299
continue;
268300

269301
string dependenciesBundlePath = Path.Combine(_readPath, item);
270-
AssetBundle assetBundle= await LoadAssetBundle(dependenciesBundlePath);
302+
AssetBundle assetBundle= await LoadAssetBundleFromPath(dependenciesBundlePath);
271303

272304
//存储资源名称
273305
string[] assetNames = assetBundle.GetAllAssetNames();

Assets/GameFramework/Resource/IResourceHelper.cs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,30 @@ public interface IResourceHelper
2222
/// <param name="path"></param>
2323
void SetResourcePath(PathType pathType, string rootAssetBundle = "AssetBundles/AssetBundles", bool isEncrypt = false);
2424

25-
/// <summary>
26-
/// 加载资源
27-
/// </summary>
28-
/// <typeparam name="T"></typeparam>
29-
/// <param name="assetBundleName"></param>
30-
/// <param name="assetName"></param>
31-
/// <param name="unload"></param>
32-
/// <returns></returns>
33-
Task<T> LoadAsset<T>(string assetBundleName,string assetName) where T : UnityEngine.Object;
25+
/// <summary>
26+
/// 加载assetbundle
27+
/// </summary>
28+
/// <param name="assetBundleName"></param>
29+
/// <returns></returns>
30+
Task<AssetBundle> LoadAssetBundle(string assetBundleName);
31+
32+
/// <summary>
33+
/// 加载资源 -- 同步加载
34+
/// </summary>
35+
/// <typeparam name="T"></typeparam>
36+
/// <param name="assetName"></param>
37+
/// <returns></returns>
38+
T LoadAssetSync<T>(string assetBundleName, string assetName) where T : UnityEngine.Object;
39+
40+
/// <summary>
41+
/// 加载资源
42+
/// </summary>
43+
/// <typeparam name="T"></typeparam>
44+
/// <param name="assetBundleName"></param>
45+
/// <param name="assetName"></param>
46+
/// <param name="unload"></param>
47+
/// <returns></returns>
48+
Task<T> LoadAsset<T>(string assetBundleName,string assetName) where T : UnityEngine.Object;
3449

3550
/// <summary>
3651
/// 卸载资源 主要为卸载AssetBundle

0 commit comments

Comments
 (0)