微调
This commit is contained in:
@@ -19,17 +19,42 @@ namespace Ichni
|
||||
|
||||
public IntReactiveProperty waitingBundleAmount;
|
||||
|
||||
// 只记录本 Manager 通过 AssetBundle.LoadFromFileAsync 加载的 Theme Bundle。
|
||||
// Addressables(包括 Unity Localization)拥有自己的 Bundle 引用计数,绝不能通过
|
||||
// AssetBundle.UnloadAllAssetBundles 代替各系统分别释放资源。
|
||||
private readonly List<AssetBundle> loadedAssetBundles = new List<AssetBundle>();
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
instance = this;
|
||||
|
||||
loadedThemeBundleList = new List<ThemeBundle>();
|
||||
AssetBundle.UnloadAllAssetBundles(true);
|
||||
LoadAllThemeBundlesAbstract();
|
||||
//LoadThemeBundle("basic");
|
||||
//LoadThemeBundle("departure_to_multiverse");
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
// 仅卸载本实例拥有的 Theme Bundle,不影响 Addressables 管理的 Locale、String Table
|
||||
// 或其它系统加载的 AssetBundle。
|
||||
foreach (AssetBundle bundle in loadedAssetBundles)
|
||||
{
|
||||
if (bundle != null)
|
||||
{
|
||||
bundle.Unload(true);
|
||||
}
|
||||
}
|
||||
|
||||
loadedAssetBundles.Clear();
|
||||
loadedThemeBundleList?.Clear();
|
||||
|
||||
if (instance == this)
|
||||
{
|
||||
instance = null;
|
||||
}
|
||||
}
|
||||
|
||||
public bool TryGetThemeBundle(string themeBundleName, out ThemeBundle themeBundle)
|
||||
{
|
||||
themeBundle = loadedThemeBundleList.Find(bundle => bundle.themeBundleName == themeBundleName);
|
||||
@@ -112,32 +137,51 @@ namespace Ichni
|
||||
AssetBundleCreateRequest createRequest = AssetBundle.LoadFromFileAsync(uri);
|
||||
yield return createRequest;
|
||||
AssetBundle bundle = createRequest.assetBundle;
|
||||
Object[] ob = bundle.LoadAllAssets<Object>();
|
||||
loadedThemeBundleList.Add(new ThemeBundle(themeBundleName));
|
||||
|
||||
for (int i = 0; i < ob.Length; i++)
|
||||
if (bundle == null)
|
||||
{
|
||||
if (ob[i].GetType() == typeof(GameObject))
|
||||
Debug.LogError($"Theme Bundle 加载失败:{uri}");
|
||||
waitingBundleAmount.Value--;
|
||||
yield break;
|
||||
}
|
||||
|
||||
loadedAssetBundles.Add(bundle);
|
||||
|
||||
try
|
||||
{
|
||||
Object[] ob = bundle.LoadAllAssets<Object>();
|
||||
loadedThemeBundleList.Add(new ThemeBundle(themeBundleName));
|
||||
|
||||
for (int i = 0; i < ob.Length; i++)
|
||||
{
|
||||
loadedThemeBundleList[^1].assetList_GameObject.Add(ob[i] as GameObject);
|
||||
}
|
||||
else if (ob[i].GetType() == typeof(Material))
|
||||
{
|
||||
loadedThemeBundleList[^1].assetList_Material.Add(ob[i] as Material);
|
||||
}
|
||||
else if (ob[i].GetType() == typeof(Texture2D))
|
||||
{
|
||||
loadedThemeBundleList[^1].assetList_Texture.Add(ob[i] as Texture2D);
|
||||
}
|
||||
else
|
||||
{
|
||||
loadedThemeBundleList[^1].assetList_Other.Add(ob[i]);
|
||||
if (ob[i].GetType() == typeof(GameObject))
|
||||
{
|
||||
loadedThemeBundleList[^1].assetList_GameObject.Add(ob[i] as GameObject);
|
||||
}
|
||||
else if (ob[i].GetType() == typeof(Material))
|
||||
{
|
||||
loadedThemeBundleList[^1].assetList_Material.Add(ob[i] as Material);
|
||||
}
|
||||
else if (ob[i].GetType() == typeof(Texture2D))
|
||||
{
|
||||
loadedThemeBundleList[^1].assetList_Texture.Add(ob[i] as Texture2D);
|
||||
}
|
||||
else
|
||||
{
|
||||
loadedThemeBundleList[^1].assetList_Other.Add(ob[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (System.Exception exception)
|
||||
{
|
||||
Debug.LogException(exception, this);
|
||||
}
|
||||
finally
|
||||
{
|
||||
waitingBundleAmount.Value--;
|
||||
}
|
||||
|
||||
yield return new WaitForEndOfFrame();
|
||||
print(themeBundleName + " Done!");
|
||||
waitingBundleAmount.Value--;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,4 +297,4 @@ namespace Ichni
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user