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

Unity切换新场景后Transition动画无法播放问题求助

问题根因

你代码中持有的transition引用属于旧场景的TransitionManager实例,调用LoadSceneAsync加载新场景后,旧场景的所有对象默认会被自动销毁,你最后一行transition.SetTrigger("End")实际上操作的是已经被销毁的旧对象,新场景中挂载的TransitionManager实例没有收到触发信号,因此入场动画无法播放。

可行解决方案

方案1:全局保留唯一TransitionManager实例(最推荐)

不需要在每个场景都放入TransitionManager预制体,仅在初始启动场景放一次,给TransitionManager加单例逻辑+不销毁标记即可,修改逻辑如下:
首先给TransitionManager脚本添加Awake生命周期逻辑:

public static TransitionManager Instance;
private Animator transition;

private void Awake()
{
    if (Instance == null)
    {
        Instance = this;
        transition = GetComponent<Animator>();
        DontDestroyOnLoad(gameObject);
    }
    else
    {
        Destroy(gameObject);
    }
}

原来的协程代码不需要调整,全程使用全局唯一的TransitionManager实例播放切出、入场动画,不会因为场景销毁丢失引用。

方案2:新场景加载完成后主动获取新实例

如果你坚持要在每个场景都放TransitionManager预制体,可以在场景加载完成后重新获取新场景里的实例再触发动画,修改协程代码如下:

IEnumerator PlayTransitionAndLoadSceneCoro(string sceneName) {
    transition.SetTrigger("Start");
    yield return new WaitForSeconds(transitionTime);

    AsyncOperation asyncSceneLoad = SceneManager.LoadSceneAsync(sceneName);
    while (!asyncSceneLoad.isDone)
        yield return null; 

    // 主动获取新场景中的TransitionManager实例
    var newSceneTransition = FindObjectOfType<TransitionManager>().GetComponent<Animator>();
    newSceneTransition.SetTrigger("End");
}

注意事项

  • 检查Animator的Trigger参数是否开启了Reset On Load,避免参数触发状态异常
  • 确保两段动画的状态机过渡设置没有勾选Has Exit Time,避免触发后等待多余时间无法播放

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:39:04