You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:57:03