using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Playables; using UnityEngine.AddressableAssets; namespace AibisDream { public class DirectorHandler : MonoBehaviour { public string timelineName; [SerializeField] private PlayableDirector director; [Header("多条Timeline")] [SerializeField] private AssetReference[] timelineList; private Dictionary _timelineDict = new(); private Action _onCompleteCallback; #if UNITY_EDITOR /// /// 在 Editor 中,当组件创建或 Inspector 变化时自动查找同物体上的 PlayableDirector /// private void OnValidate() { if (director == null) { director = GetComponent(); } } #endif private void Awake() { if (director == null) { director = GetComponent(); } // timelineList转字典 } private void Start() { TimelineCenter.Instance.RegisterDirector(this); } private void OnDestroy() { TimelineCenter.Instance.UnregisterDirector(this); if (director != null) { director.stopped -= OnDirectorStopped; } } /// /// 播放 Timeline /// public void Play(Action onComplete = null) { if (director == null) { Debug.LogError($"DirectorHandler {timelineName}: PlayableDirector is null"); return; } // 先停止再播放 director.stopped -= OnDirectorStopped; if (director.state == PlayState.Playing) { director.Stop(); } _onCompleteCallback = onComplete; // 如果有完成回调,订阅 stopped 事件 if (onComplete != null) { director.stopped += OnDirectorStopped; } director.Play(); } /// /// 异步播放 Timeline(协程版本) /// public IEnumerator PlayAsync() { if (director == null) { Debug.LogError($"DirectorHandler {timelineName}: PlayableDirector is null"); yield break; } // 先停止再播放 if (director.state == PlayState.Playing) { director.Stop(); } director.Play(); // 等待播放完成 while (director.state == PlayState.Playing) { yield return null; } } /// /// 停止播放 /// public void Stop() { if (director == null) return; // 先取消事件订阅,避免 Stop() 触发回调 director.stopped -= OnDirectorStopped; director.Stop(); _onCompleteCallback = null; } /// /// 暂停播放 /// public void Pause() { if (director == null) return; if (director.state == PlayState.Playing) { director.Pause(); } } /// /// 恢复播放 /// public void Resume() { if (director == null) return; if (director.state == PlayState.Paused) { director.Resume(); } } /// /// 重置 Timeline /// public void Reset() { if (director == null) return; // 先取消事件订阅,避免 Stop() 触发回调 director.stopped -= OnDirectorStopped; director.Stop(); director.time = 0; director.Evaluate(); _onCompleteCallback = null; } /// /// 获取当前播放时间 /// public double GetPlaybackTime() { if (director == null) return 0; return director.time; } /// /// 获取总时长 /// public double GetDuration() { if (director == null) return 0; return director.duration; } /// /// 设置播放速度 /// public void SetPlaybackSpeed(float speed) { if (director == null) return; if (director.playableGraph.IsValid()) { director.playableGraph.GetRootPlayable(0).SetSpeed(speed); } else { Debug.LogWarning($"DirectorHandler {timelineName}: PlayableGraph is not valid. Cannot set playback speed."); } } /// /// 跳转到指定时间点 /// public void SeekToTime(double time) { if (director == null) return; director.time = Math.Clamp(time, 0, director.duration); director.Evaluate(); } /// /// Director 停止事件处理 /// private void OnDirectorStopped(PlayableDirector director) { // 立即取消订阅,避免重复触发 director.stopped -= OnDirectorStopped; var callback = _onCompleteCallback; _onCompleteCallback = null; callback?.Invoke(); } // /// // /// 对象销毁时清理事件订阅 // /// // private void OnDestroy() // { // } } }