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); } }