diff --git a/Assets/Scripts/SceneManagement/TimelineKit/DirectorHandler.cs b/Assets/Scripts/SceneManagement/TimelineKit/DirectorHandler.cs index e1880a4c7..ca684d986 100644 --- a/Assets/Scripts/SceneManagement/TimelineKit/DirectorHandler.cs +++ b/Assets/Scripts/SceneManagement/TimelineKit/DirectorHandler.cs @@ -1,8 +1,10 @@ using System; using System.Collections; +using Cinemachine; using UnityEngine; using UnityEngine.Playables; using UnityEngine.ResourceManagement.AsyncOperations; +using UnityEngine.Timeline; using AibisDream.Framework; namespace AibisDream @@ -14,6 +16,10 @@ namespace AibisDream public string timelineName; [SerializeField] private PlayableDirector director; + [Header("Cinemachine 自动绑定")] + [Tooltip("加载新 Timeline 时自动绑定 CinemachineBrain")] + [SerializeField] private bool autoBindCinemachineBrain; + private Action _onCompleteCallback; private AsyncOperationHandle _addressableHandle; private PlayableAsset _savedPlayableAsset; @@ -69,6 +75,75 @@ namespace AibisDream _addressableHandle = default; } + /// + /// 自动绑定 CinemachineBrain 到 Timeline 中的所有 CinemachineTrack + /// + private void AutoBindCinemachineBrain() + { + Debug.Log($"[DirectorHandler] {timelineName}: AutoBindCinemachineBrain 被调用,autoBindCinemachineBrain={autoBindCinemachineBrain}"); + + if (!autoBindCinemachineBrain) + { + Debug.Log($"[DirectorHandler] {timelineName}: autoBindCinemachineBrain 为 false,跳过绑定"); + return; + } + + if (director == null) + { + Debug.LogError($"[DirectorHandler] {timelineName}: director 为 null"); + return; + } + + if (director.playableAsset == null) + { + Debug.LogError($"[DirectorHandler] {timelineName}: director.playableAsset 为 null"); + return; + } + + // 获取目标 CinemachineBrain + var mainCamera = Camera.main; + if (mainCamera == null) + { + Debug.LogError($"[DirectorHandler] {timelineName}: Camera.main 为 null"); + return; + } + + var brain = mainCamera.GetComponent(); + if (brain == null) + { + Debug.LogWarning($"[DirectorHandler] {timelineName}: 主摄像机上找不到 CinemachineBrain,无法自动绑定"); + return; + } + + Debug.Log($"[DirectorHandler] {timelineName}: 找到 CinemachineBrain,准备绑定"); + + // 遍历所有输出轨道,找到 CinemachineTrack 并绑定 + var timelineAsset = director.playableAsset as TimelineAsset; + if (timelineAsset == null) + { + Debug.LogError($"[DirectorHandler] {timelineName}: playableAsset 不是 TimelineAsset"); + return; + } + + int trackCount = 0; + int boundCount = 0; + foreach (var track in timelineAsset.GetOutputTracks()) + { + trackCount++; + Debug.Log($"[DirectorHandler] {timelineName}: 检查轨道 {track.name},类型: {track.GetType().Name}"); + + // 直接检查轨道类型 + if (track is CinemachineTrack) + { + director.SetGenericBinding(track, brain); + boundCount++; + Debug.Log($"[DirectorHandler] {timelineName}: 成功绑定轨道 {track.name}"); + } + } + + Debug.Log($"[DirectorHandler] {timelineName}: 共检查 {trackCount} 个轨道,绑定了 {boundCount} 个 CinemachineTrack"); + } + /// /// 播放 Timeline /// @@ -94,7 +169,10 @@ namespace AibisDream { director.stopped += OnDirectorStopped; } - + + // 自动绑定 CinemachineBrain + AutoBindCinemachineBrain(); + director.Play(); } @@ -115,6 +193,9 @@ namespace AibisDream director.Stop(); } + // 自动绑定 CinemachineBrain + AutoBindCinemachineBrain(); + director.Play(); // 等待播放完成 @@ -186,7 +267,11 @@ namespace AibisDream _savedPlayableAsset = director.playableAsset; director.playableAsset = loadedAsset; + director.RebuildGraph(); + + // 自动绑定 CinemachineBrain(必须在 RebuildGraph 之后) + AutoBindCinemachineBrain(); _addressableHandle = loadedHandle;