通了一版
This commit is contained in:
@@ -7,6 +7,8 @@ using UnityEngine;
|
||||
using UnityEngine.Playables;
|
||||
using Yarn.Unity;
|
||||
using System.Collections;
|
||||
using UnityEngine.Timeline;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace AibisDream
|
||||
{
|
||||
@@ -26,11 +28,6 @@ namespace AibisDream
|
||||
FixSystemCenter.SystemDic.Register(this);
|
||||
var virtualCam = transform.Find("Op Camera").GetComponent<ICinemachineCamera>();
|
||||
CameraKit.Instance.RegisterCamera(CameraEnum.Op, virtualCam);
|
||||
|
||||
// 组装
|
||||
// deepInClock.OnClockReached += PlayFadeIn;
|
||||
// fadeInPlayable.stopped += PlayDeepIn;
|
||||
// deepIn.OnFinished += Finished;
|
||||
}
|
||||
|
||||
public void Update()
|
||||
@@ -67,6 +64,8 @@ namespace AibisDream
|
||||
// }
|
||||
public void PlayOpenTimeline()
|
||||
{
|
||||
// 在播放Timeline之前绑定DialogController
|
||||
BindDialogController();
|
||||
OpenAnima.SetActive(true);
|
||||
OpenPlayable.Play();
|
||||
}
|
||||
@@ -82,6 +81,104 @@ namespace AibisDream
|
||||
{
|
||||
DialogController.Instance.StartDialogNode("DeepInEnd");
|
||||
}
|
||||
public void SwitchToBodyModule()
|
||||
{
|
||||
StartCoroutine(FixSystemCenter.StateMachine.SwitchState(FixState.BodyModule));
|
||||
Debug.Log("SwitchToBodyModule");
|
||||
}
|
||||
|
||||
// 添加动态绑定方法
|
||||
public void BindTimelineTarget(string trackName, Object target)
|
||||
{
|
||||
if (OpenPlayable == null) return;
|
||||
|
||||
var timeline = OpenPlayable.playableAsset as TimelineAsset;
|
||||
if (timeline == null) return;
|
||||
|
||||
foreach (var track in timeline.GetOutputTracks())
|
||||
{
|
||||
if (track.name == trackName)
|
||||
{
|
||||
OpenPlayable.SetGenericBinding(track, target);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 添加DialogController绑定方法
|
||||
private void BindDialogController()
|
||||
{
|
||||
if (OpenPlayable == null) return;
|
||||
|
||||
var timeline = OpenPlayable.playableAsset as TimelineAsset;
|
||||
if (timeline == null) return;
|
||||
|
||||
// 遍历所有轨道
|
||||
foreach (var track in timeline.GetOutputTracks())
|
||||
{
|
||||
// 检查轨道类型是否为Signal Track或其他需要DialogController的轨道
|
||||
if (track is SignalTrack || track.name.Contains("Dialog"))
|
||||
{
|
||||
// 绑定DialogController实例
|
||||
OpenPlayable.SetGenericBinding(track, DialogController.Instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 通用的Timeline播放方法
|
||||
public IEnumerator PlayTimeline(string timelinePath, Dictionary<string, Object> bindings = null)
|
||||
{
|
||||
// 加载Timeline资源
|
||||
var timelineAsset = Resources.Load<TimelineAsset>(timelinePath);
|
||||
if (timelineAsset == null)
|
||||
{
|
||||
Debug.LogError($"找不到Timeline资源: {timelinePath}");
|
||||
yield break;
|
||||
}
|
||||
|
||||
// 创建临时PlayableDirector
|
||||
var director = gameObject.AddComponent<PlayableDirector>();
|
||||
director.playableAsset = timelineAsset;
|
||||
|
||||
// 处理绑定
|
||||
if (bindings != null)
|
||||
{
|
||||
foreach (var track in timelineAsset.GetOutputTracks())
|
||||
{
|
||||
// 尝试从bindings中找到匹配的绑定
|
||||
if (bindings.TryGetValue(track.name, out var binding))
|
||||
{
|
||||
director.SetGenericBinding(track, binding);
|
||||
}
|
||||
// 特殊处理DialogController
|
||||
else if (track is SignalTrack || track.name.Contains("Dialog"))
|
||||
{
|
||||
director.SetGenericBinding(track, DialogController.Instance);
|
||||
}
|
||||
// 尝试在场景中查找同名物体
|
||||
else
|
||||
{
|
||||
var targetObj = GameObject.Find(track.name);
|
||||
if (targetObj != null)
|
||||
{
|
||||
director.SetGenericBinding(track, targetObj);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 播放Timeline
|
||||
director.Play();
|
||||
|
||||
// 等待Timeline播放完成
|
||||
while (director.state == PlayState.Playing)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
// 清理
|
||||
Destroy(director);
|
||||
}
|
||||
}
|
||||
|
||||
public static class OpenYarnCommand
|
||||
@@ -103,14 +200,43 @@ namespace AibisDream
|
||||
public static IEnumerator RunTimeline()
|
||||
{
|
||||
OpenSystem.PlayOpenTimeline();
|
||||
yield return null;
|
||||
|
||||
if (true)
|
||||
// if (true)
|
||||
// {
|
||||
// while (OpenSystem.OpenPlayable.state == PlayState.Playing)
|
||||
// {
|
||||
// yield return null;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
[YarnCommand("play_timeline")]
|
||||
public static IEnumerator PlayTimeline(string timelinePath)
|
||||
{
|
||||
yield return OpenSystem.PlayTimeline(timelinePath);
|
||||
}
|
||||
|
||||
[YarnCommand("play_timeline_with_bindings")]
|
||||
public static IEnumerator PlayTimelineWithBindings(string timelinePath, string[] bindingNames)
|
||||
{
|
||||
var bindings = new Dictionary<string, Object>();
|
||||
|
||||
// 解析绑定名称并查找对应物体
|
||||
foreach (var bindingName in bindingNames)
|
||||
{
|
||||
while (OpenSystem.OpenPlayable.state == PlayState.Playing)
|
||||
var targetObj = GameObject.Find(bindingName);
|
||||
if (targetObj != null)
|
||||
{
|
||||
yield return null;
|
||||
bindings[bindingName] = targetObj;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning($"找不到绑定物体: {bindingName}");
|
||||
}
|
||||
}
|
||||
|
||||
yield return OpenSystem.PlayTimeline(timelinePath, bindings);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user