情景再现
假定你有一个Unity工程,使用了HybridCLR和Addressable,SO文件存放在Addressable中。热更加载后进入游戏场景出现了SO文件读取报错:
UnityEngine.AddressableAssets.InvalidKeyException: Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown. No Asset found with for Key=Inventory Model Database. Key exists as Type=System.Object, which is not assignable from the requested Type=InventorySystem.Models.InventoryModelDatabase
UnityEngine.AddressableAssets.Addressables:LoadAssetAsync(Object)
可能原因
读取SO文件时,文件绑定的脚本并没有成功还原出来。见官方文档。
解决办法
加载SO文件的代码时不要声明具体的类型,改用System.Object,成功后进行强转。
Before:
cs
Addressables.LoadAssetAsync<InventoryModelDatabase>("Inventory Model Database").Completed += handle =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
_inventoryModelDatabase = handle.Result;
Debug.Log($"[{GetType()}] Inventory Model Database loaded!");
}
else
Debug.LogError($"[{GetType()}] Failed to load Inventory Model Database!");
};
After:
cs
Addressables.LoadAssetAsync<System.Object>("Inventory Model Database").Completed += handle =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
_inventoryModelDatabase = handle.Result as InventoryModelDatabase;
Debug.Log($"[{GetType()}] Inventory Model Database loaded!");
}
else
Debug.LogError($"[{GetType()}] Failed to load Inventory Model Database!");
};
问题解决。