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

使用UI Toolkit与异步加载场景时SendMessage警告问题求助

问题:UI Toolkit搭配异步加载场景时持续触发「SendMessage cannot be called during Awake...」警告

使用UI Toolkit开发项目时,运行后持续触发「SendMessage cannot be called during Awake...」警告。当前采用SceneManager.LoadSceneAsync()以Additive模式异步加载场景,不确定是否与此相关。

加载场景实现代码如下:

public void LoadScene(string sceneName, bool displayLoadingScreen = true)
{
    // TODO: Use Reflection to find Classes that implement IInitializer
    // When Loading a Scene, go through all IInitializer classes and check their IsDone and Progress properties ?

    if (displayLoadingScreen)
    {
        _loadingScreen.gameObject.SetActive(true);
    }

    _loadingScenes.Clear();
    _loadingScenes.Add(UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync(_currentScene));
    _loadingScenes.Add(UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive));

    StartCoroutine(GetSceneLoadingProgress(sceneName));
}

private IEnumerator GetSceneLoadingProgress(string sceneName)
{
    foreach (var scene in _loadingScenes)
    {
        while (!scene.isDone)
        {
            yield return null;
        }
    }

    // yield return new WaitForSeconds(5);

    _loadingScreen.gameObject.SetActive(false);
    _currentScene = sceneName;
}

已在官方论坛搜索但未找到可行解决方案,恳请提供解决思路,如需完整SceneManager.cs文件可补充。


解决思路

  • 调整场景加载/卸载的时序:当前代码同时启动卸载旧场景和加载新场景的异步操作,可能导致旧场景对象销毁时,UI Toolkit仍在尝试发送消息。可以修改逻辑,等待旧场景完全卸载后再启动新场景加载:
    private IEnumerator GetSceneLoadingProgress(string sceneName)
    {
        // 先等待旧场景卸载完成
        var unloadOp = _loadingScenes[0];
        while (!unloadOp.isDone)
        {
            yield return null;
        }
        // 再等待新场景加载完成
        var loadOp = _loadingScenes[1];
        while (!loadOp.isDone)
        {
            yield return null;
        }
    
        _loadingScreen.gameObject.SetActive(false);
        _currentScene = sceneName;
    }
    
  • 排查UI Toolkit的生命周期绑定:如果UI Toolkit的控件绑定逻辑在Awake/OnEnable阶段调用了SendMessage相关方法,而此时场景正处于加载/卸载过渡状态,就会触发警告。可以将UI初始化逻辑延迟到Start()或OnSceneLoaded回调中执行。
  • 卸载前清理UI事件绑定:在卸载旧场景前,遍历场景中的UI Toolkit相关对象,手动取消事件绑定或暂停消息发送逻辑,避免对象销毁时触发错误。
  • 使用场景加载回调控制时序:注册SceneManager.sceneLoaded和SceneManager.sceneUnloaded事件,在场景完全加载/卸载完成后再处理UI相关操作,确保所有对象状态稳定后再执行交互逻辑。

内容的提问来源于stack exchange,提问作者Dobromir Ivanov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:52:39