From 8cf9a72b57f3ffff03c906ed04b53c309cee94c7 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Mon, 9 Mar 2026 20:55:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(scene-mgmt):=20=E6=B7=BB=E5=8A=A0=20Timeli?= =?UTF-8?q?ne=20=E6=92=AD=E6=94=BE=E6=97=B6=E8=87=AA=E5=8A=A8=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=20CinemachineBrain?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TimelineKit/DirectorHandler.cs | 87 ++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) 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;