133 lines
3.7 KiB
C#
133 lines
3.7 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Playables;
|
|
|
|
public class TimelineManager : MonoBehaviour
|
|
{
|
|
public static TimelineManager Instance { get; private set; }
|
|
|
|
// 使用字典来管理多个PlayableDirector
|
|
private Dictionary<string, PlayableDirector> directors = new Dictionary<string, PlayableDirector>();
|
|
|
|
private void Awake()
|
|
{
|
|
if (Instance == null)
|
|
{
|
|
Instance = this;
|
|
DontDestroyOnLoad(gameObject); // 不销毁
|
|
}
|
|
else
|
|
{
|
|
Destroy(gameObject);
|
|
return;
|
|
}
|
|
|
|
// 自动注册所有子对象中的PlayableDirector
|
|
RegisterAllDirectors();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 自动注册所有子对象中的PlayableDirector
|
|
/// </summary>
|
|
private void RegisterAllDirectors()
|
|
{
|
|
var allDirectors = GetComponentsInChildren<PlayableDirector>();
|
|
foreach (var director in allDirectors)
|
|
{
|
|
if (director.playableAsset != null)
|
|
{
|
|
RegisterDirector(director.playableAsset.name, director);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注册PlayableDirector
|
|
/// </summary>
|
|
/// <param name="name">Timeline的名称</param>
|
|
/// <param name="director">PlayableDirector实例</param>
|
|
public void RegisterDirector(string name, PlayableDirector director)
|
|
{
|
|
if (!directors.ContainsKey(name))
|
|
{
|
|
directors.Add(name, director);
|
|
Debug.Log($"Registered PlayableDirector for {name}");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 播放指定的Timeline并等待其完成
|
|
/// </summary>
|
|
/// <param name="name">Timeline的名称</param>
|
|
// [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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 重置PlayableDirector的时间
|
|
/// </summary>
|
|
/// <param name="name">Timeline的名称</param>
|
|
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.");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 暂停指定的Timeline
|
|
/// </summary>
|
|
/// <param name="name">Timeline的名称</param>
|
|
// [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.");
|
|
}
|
|
}
|
|
} |