feat(scene-mgmt): 添加 Timeline 播放时自动绑定 CinemachineBrain

This commit is contained in:
2026-03-09 20:55:33 +08:00
parent 80f51677eb
commit 8cf9a72b57
@@ -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<PlayableAsset> _addressableHandle;
private PlayableAsset _savedPlayableAsset;
@@ -69,6 +75,75 @@ namespace AibisDream
_addressableHandle = default;
}
/// <summary>
/// 自动绑定 CinemachineBrain 到 Timeline 中的所有 CinemachineTrack
/// </summary>
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<CinemachineBrain>();
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");
}
/// <summary>
/// 播放 Timeline
/// </summary>
@@ -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;