[Unity] 加载 Addressable 包返回成功,能够打印实例化结果不为空,但是在场景中却没有看到实例化结果的可能原因:实例化到了即将被删除的场景

490 阅读1分钟

InstantiateAsync 能够执行,没有报错,能够返回 Succeeded。

如果我取 handle.Result 打印到控制台上,控制台上也能显示这个物体的名字,但是当我运行游戏的时候就是看不到他

对于我这个情况,出现这个问题的原因是,我在具有多个场景的时候执行了 InstantiateAsync,这个物体被实例化到当前激活的场景中,这可以用 Debug.LogError(SceneManager.GetActiveScene().name); 来查看当前激活的场景的名字

然后我在代码中很快就卸载了当前激活的场景,因此我刚刚实例化出来的物体就随着这个场景一起被删除了

对于我而言:

旧代码:

private void InitGame()
{
    GameController.Instance.BeginGame();
    Addressables.UnloadSceneAsync(lastLoadHandle);
}

我的 lastLoadHandle 是加载 Loading 界面的 handle,然后我希望是在加载完新界面的所有东西之后,才卸载 Loading 界面。这就会导致一个问题,当前激活场景是 Loading 场景,我实例化的新物体都会实例化到 Loading 场景中

然后我新场景完成加载之后,删掉了 Loading 界面,就顺便删掉了 Loading 场景里面的新物体

作为对比,新代码:

private void InitGame()
{
    Debug.LogError(SceneManager.GetActiveScene().name);
    Addressables.UnloadSceneAsync(lastLoadHandle);
    
    GameController.Instance.BeginGame();
}

这样就可以顺利看到新物体在新场景中了

如果要达成我之前的想法,就是

private void InitGame()
{
    Debug.LogError(SceneManager.GetActiveScene().name);
    
    SceneManager.SetActiveScene(newScene);
    
    Debug.LogError(SceneManager.GetActiveScene().name);
    
    GameController.Instance.BeginGame();
    
    // Game 场景加载完时卸载 loading 场景
    GameController.Instance.OnGameInitCompleted += () => { Addressables.UnloadSceneAsync(lastLoadHandle); };
}

在控制台也能看到激活的场景的变化跟我的判断是一样的