通了一版

This commit is contained in:
2025-05-30 11:31:59 +08:00
parent 262ffad009
commit bdb514fc46
36 changed files with 7648 additions and 2422 deletions
+134 -8
View File
@@ -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);
}
}
}