using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using AibisDream.Kit; namespace AibisDream { public class TimelineCenter : Singleton, ITimelineCenter { private readonly Dictionary _timelineDict = new(); public override void OnSingletonInit() { RegisterAllDirector(); } private void RegisterAllDirector() { var allDirectorHandlers = GetComponentsInChildren(true); foreach (var directorHandler in allDirectorHandlers) { _timelineDict.Add(directorHandler.timelineName, directorHandler); } } // -------------------------- 播放控制 -------------------------- /// /// 播放 Timeline(带完成回调的重载) /// public void PlayTimeline(string timelineName, Action onComplete = null) { if (!_timelineDict.TryGetValue(timelineName, out var directorHandler)) { Debug.LogError($"Timeline {timelineName} not found"); return; } directorHandler.gameObject.SetActive(true); directorHandler.Play(onComplete); } public IEnumerator PlayTimelineAsync(string name) { if (!_timelineDict.TryGetValue(name, out var directorHandler)) { Debug.LogError($"Timeline {name} not found"); yield break; } directorHandler.gameObject.SetActive(true); yield return directorHandler.PlayAsync(); } public void StopTimeline(string timelineName) { if (!_timelineDict.TryGetValue(timelineName, out var directorHandler)) { Debug.LogError($"Timeline {timelineName} not found"); return; } directorHandler.Stop(); } public void PauseTimeline(string timelineName) { if (!_timelineDict.TryGetValue(timelineName, out var directorHandler)) { Debug.LogError($"Timeline {timelineName} not found"); return; } directorHandler.Pause(); } public void ResumeTimeline(string timelineName) { if (!_timelineDict.TryGetValue(timelineName, out var directorHandler)) { Debug.LogError($"Timeline {timelineName} not found"); return; } directorHandler.Resume(); } public void ResetTimeline(string timelineName) { if (!_timelineDict.TryGetValue(timelineName, out var directorHandler)) { Debug.LogError($"Timeline {timelineName} not found"); return; } directorHandler.Reset(); } public void HideTimeline(string timelineName) { if (!_timelineDict.TryGetValue(timelineName, out var directorHandler)) { Debug.LogError($"Timeline {timelineName} not found"); return; } directorHandler.gameObject.SetActive(false); } #region 状态查询 public double GetPlaybackTime(string name) { if (!_timelineDict.TryGetValue(name, out var directorHandler)) { Debug.LogError($"Timeline {name} not found"); return 0; } return directorHandler.GetPlaybackTime(); } public double GetDuration(string name) { if (!_timelineDict.TryGetValue(name, out var directorHandler)) { Debug.LogError($"Timeline {name} not found"); return 0; } return directorHandler.GetDuration(); } #endregion #region 扩展操作 public void SetPlaybackSpeed(string name, float speed) { if (!_timelineDict.TryGetValue(name, out var directorHandler)) { Debug.LogError($"Timeline {name} not found"); return; } directorHandler.SetPlaybackSpeed(speed); } public void SeekToTime(string name, double time) { if (!_timelineDict.TryGetValue(name, out var directorHandler)) { Debug.LogError($"Timeline {name} not found"); return; } directorHandler.SeekToTime(time); } #endregion #region 批量操作 public void PauseAll() { foreach (var directorHandler in _timelineDict.Values) { directorHandler.Pause(); } } public void StopAll() { foreach (var directorHandler in _timelineDict.Values) { directorHandler.Stop(); } } public void ResetAll() { foreach (var directorHandler in _timelineDict.Values) { directorHandler.Reset(); } } #endregion } public interface ITimelineCenter { void PlayTimeline(string timelineName, Action onComplete = null); IEnumerator PlayTimelineAsync(string name); void StopTimeline(string timelineName); void PauseTimeline(string timelineName); void ResumeTimeline(string timelineName); void ResetTimeline(string timelineName); #region 状态查询 /// /// 获取当前播放时间 /// /// Timeline 名称 /// 当前播放时间 double GetPlaybackTime(string name); /// /// 获取总时长 /// /// Timeline 名称 /// 总时长 double GetDuration(string name); #endregion #region 扩展操作 /// /// 设置播放速度 /// /// Timeline 名称 /// 播放速度 void SetPlaybackSpeed(string name, float speed); /// /// 跳转到指定时间点 /// /// Timeline 名称 /// 时间点(秒) void SeekToTime(string name, double time); #endregion #region 批量操作 /// /// 暂停所有 Timeline /// void PauseAll(); /// /// 停止所有 Timeline /// void StopAll(); /// /// 重置所有 Timeline /// void ResetAll(); #endregion } }