使用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
相关产品推荐
相关产品推荐

