using PhxhSDK;
using UnityEditor;
using UnityEngine;
using UnityEngine.Playables;
public class InstantiatePlayable : PlayableBehaviour
{
///
/// 道具路径
///
private string itemPath;
///
/// 轨道名
///
private string trackName;
///
/// Timeline
///
private PlayableDirector playableDirector;
///
/// 演出Timeline管理
///
private ShowTimelineController showTimelineController;
///
/// 目标物体
///
private GameObject go;
#region 属性
///
/// 道具路径
///
public string ItemPath { set { itemPath = value; } }
///
/// 轨道名
///
public string TrackName { set { trackName = value; } }
///
/// Timeline
///
public PlayableDirector PlayableDirector { set { playableDirector = value; } }
///
/// 演出Timeline管理
///
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(itemPath);
else
goTemp = await AssetManager.Instance.LoadAssetAsync(itemPath);
#else
goTemp = await AssetManager.Instance.LoadAssetAsync(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();
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);
}
}