using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; using Gameplay; using PhxhSDK; using UnityEngine; using UnityEngine.Playables; using UnityEngine.SceneManagement; using UnityEngine.Timeline; using Framework; using Gameplay.Common; using Gameplay.Level; using Constants = Framework.Constants; public class FightWinComponent: MonoBehaviour { private Scene _scene; private List _characterIDs; private uint _vehicleID; private GameObject _objRoot; private List _posTransList; private Camera _camera; private PlayableDirector _timelinePlayable; //test private List _testObjs = new List(); private readonly int Vehicle_Model_Index = 5; #region Unity EventFunction private void Awake() { _SetData(); _camera = GameObject.Find("CameraRoot").GetComponent().Camera; _objRoot = GameObject.Find("Content/ObjRoot"); var posRootTrans = GameObject.Find("Content/PosRoot").transform; _posTransList = new List(); for (int i = 0; i < posRootTrans.childCount; i++) { var child = posRootTrans.GetChild(i); _posTransList.Add(child); } EventManager.Instance.Register(EventManager.EventName.FightCmpTimelinePause, _OnPauseEvent); _Load(); } private void OnDestroy() { EventManager.Instance.Unregister(EventManager.EventName.FightCmpTimelinePause, _OnPauseEvent); } #endregion private void _SetData() { SetData(LevelManager.Instance.ShowCharIDs, LevelManager.Instance.ShowVehicleID); } private async void _Load() { await _LoadModels(); await _LoadTimeline(); } private void _OnPauseEvent() { if (_timelinePlayable) { _timelinePlayable.Pause(); } } private async UniTask _LoadModels() { if (_characterIDs != null) { for (int i = 0; i < _characterIDs.Count; i++) { await _AddCharacterModel(_characterIDs[i], i); } } if (_vehicleID != Constants.INVALID_UINT_ID) { await _AddVehicleModel(_vehicleID); } } private async UniTask _AddCharacterModel(uint uid, int idx) { var modelPath = CommonUtils.GetCharacterShowModelPath(uid); if (modelPath != null) { var prefab = await AssetManager.Instance.LoadAssetAsync(modelPath); var model = Instantiate(prefab, _objRoot.transform); var posTrans = _posTransList[idx]; model.transform.SetPositionAndRotation(posTrans.position, posTrans.rotation); model.transform.localScale = posTrans.localScale; model.SetLayerEx(LayerDefine.TeamEdit); } } private async UniTask _AddVehicleModel(uint uid) { var modelPath = CommonUtils.GetVehicleShowModelPath(uid); if (modelPath != null) { var prefab = await AssetManager.Instance.LoadAssetAsync(modelPath); var model = Instantiate(prefab, _objRoot.transform); var posTrans = _posTransList[Vehicle_Model_Index]; model.transform.SetPositionAndRotation(posTrans.position, posTrans.rotation); model.transform.localScale = posTrans.localScale; model.SetLayerEx(LayerDefine.TeamEdit); } } private async UniTask _LoadTimeline() { var timeLineObj = new GameObject("GameTimeLine"); timeLineObj.transform.SetParent(transform); timeLineObj.SetLayerEx(LayerDefine.TeamEdit); var timeline = timeLineObj.AddComponent(); var playableAsset = await AssetManager.Instance.LoadAssetAsync("Assets/Art/Animations/Level/VictoryTimeLine.playable"); var timeLineAsset = playableAsset as TimelineAsset; if (!timeLineAsset) { DebugUtil.LogError("加载的TimeLine资源为空!!!"); return; } timeline.playableAsset = timeLineAsset; timeline.timeUpdateMode = DirectorUpdateMode.GameTime; timeline.playOnAwake = false; _timelinePlayable = timeline; var trackIEnumerable = timeLineAsset.GetOutputTracks(); int index = 0; foreach (var trackAsset in trackIEnumerable) { if (index < _characterIDs.Count) { var child = _objRoot.transform.GetChild(index); if (!child) { continue; } var animObj = child.GetChild(0).gameObject; var anim = animObj.GetComponent(); if (!anim) { DebugUtil.LogError("TimeLine使用的模型未绑定Animator组件!!!"); } timeline.SetGenericBinding(trackAsset, anim); } else if(index == 5) { var anim = _camera.GetComponent(); if (anim) { timeline.SetGenericBinding(trackAsset, anim); } break; } index++; _timelinePlayable.Play(); } } #region API public void SetData(List charIDList) { _characterIDs = charIDList; } public void SetData(uint vehicleID) { _vehicleID = vehicleID; } public void SetData(List charIDList, uint vehicleID) { _characterIDs = charIDList; _vehicleID = vehicleID; } public void StartPlay() { _timelinePlayable.Play(); } #endregion }