using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Playables; using Yarn.Unity; public class TimelineManager : MonoBehaviour { public static TimelineManager Instance { get; private set; } // 使用字典来管理多个PlayableDirector private Dictionary directors = new Dictionary(); private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); // 不销毁 } else { Destroy(gameObject); return; } // 自动注册所有子对象中的PlayableDirector RegisterAllDirectors(); } /// /// 自动注册所有子对象中的PlayableDirector /// private void RegisterAllDirectors() { var allDirectors = GetComponentsInChildren(); foreach (var director in allDirectors) { if (director.playableAsset != null) { RegisterDirector(director.playableAsset.name, director); } } } /// /// 注册PlayableDirector /// /// Timeline的名称 /// PlayableDirector实例 public void RegisterDirector(string name, PlayableDirector director) { if (!directors.ContainsKey(name)) { directors.Add(name, director); Debug.Log($"Registered PlayableDirector for {name}"); } } /// /// 播放指定的Timeline并等待其完成 /// /// Timeline的名称 [YarnCommand("play_timeline")] public IEnumerator PlayTimeline(string name) { if (directors.TryGetValue(name, out var director)) { director.Play(); Debug.Log($"Timeline {name} playing."); // 等待Timeline播放完成 bool isPlaying = true; director.stopped += (PlayableDirector aDirector) => { isPlaying = false; }; while (isPlaying) { yield return null; } Debug.Log($"Timeline {name} finished."); director.Stop(); // 启动重置时间的协程,但不等待其完成 StartCoroutine(ResetDirectorTimeCoroutine(name)); } else { Debug.LogError($"PlayableDirector for {name} not found."); } } private IEnumerator ResetDirectorTimeCoroutine(string name) { yield return new WaitForSeconds(2f); ResetDirectorTime(name); } /// /// 重置PlayableDirector的时间 /// /// Timeline的名称 public void ResetDirectorTime(string name) { if (directors.TryGetValue(name, out var director)) { director.time = 0; director.Evaluate(); // 评估以应用时间重置 Debug.Log($"Timeline {name} time reset."); } else { Debug.LogError($"PlayableDirector for {name} not found."); } } /// /// 暂停指定的Timeline /// /// Timeline的名称 // [YarnCommand("pause_timeline")] public void PauseTimeline(string name) { if (directors.TryGetValue(name, out var director)) { director.Pause(); Debug.Log($"Timeline {name} paused."); } else { Debug.LogError($"PlayableDirector for {name} not found."); } } }