Unity报Attempting to load AssetReference that has already been loaded错误求助
报错触发原因
这个错误由Unity Addressable资源管理系统抛出,核心原因是你对同一个已经处于加载完成/加载中状态的AssetReference,重复调用了LoadAssetAsync方法。
结合你的代码逻辑:你在SpawnObstacle的循环中,每次随机从possibleObstacles数组抽取AssetReference,极大概率抽到同一个资源,当第一次对该资源的加载请求还没完成、或者加载完成后没有释放对应句柄时,第二次调用LoadAssetAsync就会触发该报错。
修复方案
你可以从下面几个方法中选择合适的实现:
- 调用加载接口前先判断资源加载状态
在调用LoadAssetAsync之前,先通过IsValid方法判断AssetReference是否已经持有有效加载句柄,如果已经有就直接取结果,不用重复加载,修改后的SpawnFromAssetReference代码如下:
private IEnumerator SpawnFromAssetReference(AssetReference reference, TrackSegment segment, int posIndex) { AsyncOperationHandle op; // 先判断是否已经加载过/正在加载 if (!reference.IsValid()) { op = reference.LoadAssetAsync<GameObject>(); yield return op; } else { op = reference.OperationHandle; } GameObject obj = op.Result as GameObject; if (obj != null) { Obstacle obstacle = obj.GetComponent<Obstacle>(); if (obstacle != null) yield return obstacle.Spawn(segment, segment.obstaclePositions[posIndex]); } }
- 改用通用Addressables加载接口
不使用AssetReference自带的LoadAssetAsync,改用Addressables.LoadAssetAsync<GameObject>(reference),该接口支持重复调用,会自动返回同一个加载句柄,同时自动维护引用计数,不会触发重复加载报错。 - 用完资源及时释放
如果该障碍物资源用完后不需要常驻内存,在障碍物销毁逻辑里添加资源释放代码:reference.ReleaseAsset()或者Addressables.Release(op),避免资源句柄一直驻留导致后续加载报错。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

