NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Timeline/InstantiatePlayable.cs

102 lines
2.8 KiB
C#

using PhxhSDK;
using UnityEditor;
using UnityEngine;
using UnityEngine.Playables;
public class InstantiatePlayable : PlayableBehaviour
{
/// <summary>
/// 道具路径
/// </summary>
private string itemPath;
/// <summary>
/// 轨道名
/// </summary>
private string trackName;
/// <summary>
/// Timeline
/// </summary>
private PlayableDirector playableDirector;
/// <summary>
/// 演出Timeline管理
/// </summary>
private ShowTimelineController showTimelineController;
/// <summary>
/// 目标物体
/// </summary>
private GameObject go;
#region 属性
/// <summary>
/// 道具路径
/// </summary>
public string ItemPath { set { itemPath = value; } }
/// <summary>
/// 轨道名
/// </summary>
public string TrackName { set { trackName = value; } }
/// <summary>
/// Timeline
/// </summary>
public PlayableDirector PlayableDirector { set { playableDirector = value; } }
/// <summary>
/// 演出Timeline管理
/// </summary>
public ShowTimelineController ShowTimelineController { set { showTimelineController = value; } }
#endregion
public override async void OnGraphStart(Playable playable)
{
if (playableDirector == null)
{
DebugUtil.LogError("目标没有playableDirector");
return;
}
if (go == null)
{
GameObject goTemp;
#if UNITY_EDITOR
if (Application.isPlaying)
goTemp = AssetDatabase.LoadAssetAtPath<GameObject>(itemPath);
else
goTemp = await AssetManager.Instance.LoadAssetAsync<GameObject>(itemPath);
#else
goTemp = await AssetManager.Instance.LoadAssetAsync<GameObject>(itemPath);
#endif
if (goTemp != null)
go = UnityEngine.Object.Instantiate(goTemp, playableDirector.gameObject.transform.parent);
}
if (go == null)
return;
go.transform.position = playableDirector.gameObject.transform.position + go.transform.localPosition;
showTimelineController.Add(go);
foreach (PlayableBinding playableBinding in playableDirector.playableAsset.outputs)
{
if (playableBinding.streamName.Equals(trackName))
{
Animator animator = go.GetComponentInChildren<Animator>();
playableDirector.SetGenericBinding(playableBinding.sourceObject, animator);
break;
}
}
}
public override void OnPlayableDestroy(Playable playable)
{
if (go == null)
return;
showTimelineController.Remove(go);
UnityEngine.Object.DestroyImmediate(go);
AssetManager.Instance.Unload(itemPath);
}
}