feat(scene-mgmt): 添加 Timeline 播放时自动绑定 CinemachineBrain
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user