102 lines
2.8 KiB
C#
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);
|
|
}
|
|
} |