// 锻刀大赛,场景 // 主要是控制 刀光源 // using System; using asap.core; using EventCubeMelt; using EventCubeMelt.UI; using EventCubeMelt.Weapon; using GameCore; using Spine; using UniRx; using UnityEngine; using UnityEngine.AddressableAssets; using Animation = UnityEngine.Animation; namespace EventCubeMelt.Scene { public class EventCubeMeltScene :MonoBehaviour { private Camera camera; // 3d 模型 // [SerializeField] private GameObject _weaponRoot; // private GameObject _modelMin3D; [SerializeField] private LeviathanVideoDecoder videoDecoder; private EventCubeMeltManager _thisEventManager; // private Transform _weaponTrans; // 上部WeaponControler private WeaponController _stageWeaponController; // private WeaponController _showWeapon; private GameObject _exhibitWeapon; private CompositeDisposable disposables = new(); private void Awake() { camera = transform.Find("Camera").GetComponent(); _weaponRoot = transform.Find("weapon_root").gameObject; // _modelMin3D = transform.Find("weaponplane_root").gameObject; _weaponTrans = transform.Find("weapon_root/weapon"); // 数据 _thisEventManager = GContext.container.Resolve(); } private void Start() { ELog("Start()-> "); //LoadMiniModel(); GContext.OnEvent().Subscribe(_ => ShowStageWeapon()).AddTo(disposables); GContext.OnEvent().Subscribe((evt ) => UpdateStageProgress(evt.percent)).AddTo(disposables); GContext.OnEvent().Subscribe(_ => OnWeaponExhibit()).AddTo(disposables); } private void OnDestroy() { disposables?.Dispose(); disposables = null; } #region LOG private static void ELog(string message) { #if UNITY_EDITOR if (!EventCubeMeltLogPolicy.EnableELog) return; Debug.Log($" EventCubeMeltScene => {message} "); #endif } #endregion #region UserFunc private async void LoadMiniModel() { // var d = await Addressables.InstantiateAsync("prop_cubemelt_weapon_3").Task; // d.transform.SetParent(_modelMin3D.transform,worldPositionStays:false); // _stageWeaponController = d.GetComponent(); // if (_stageWeaponController == null) // { // _stageWeaponController = d.AddComponent(); // } // var p = _thisEventManager.GetCollectProgress(); // SetStageProgress(p); } private void ShowStageWeapon() { ELog("ShowStageWeapon"); //LoadMiniModel(); } private void SetStageProgress(float percent) { ELog($"SetStageProgress -> {percent}"); _stageWeaponController?.SetProgress(percent); } // 更新进度 private void UpdateStageProgress(float percent) { ELog($"UpdateStageProgress -> {percent}"); _stageWeaponController?.UpdateToProgress(percent); } private readonly string _weaponShowAnim = "weaponshow"; private async void OnWeaponExhibit() { ELog("OnWeaponExhibit"); var stageId = _thisEventManager.EventData.CurrentStagetId; var prefab = _thisEventManager.EventCubeMeltCollectionData.CollectingPrefab; var d = await Addressables.InstantiateAsync(prefab).Task; d.transform.SetParent(_weaponTrans,worldPositionStays:false); _exhibitWeapon = d; var fxWeapon = _weaponTrans.Find("fx_event_cubemelt_weapon_01"); fxWeapon.gameObject.SetActive(false); await Awaiters.NextFrame; if (fxWeapon) { fxWeapon.gameObject.SetActive(true); var weaponEffController = fxWeapon.GetComponent(); weaponEffController?.SetPositionByIndex(stageId); } _weaponRoot.GetComponent().Play(_weaponShowAnim); await Awaiters.Seconds(3.65f); if (fxWeapon) { fxWeapon.gameObject.SetActive(false); d.gameObject.SetActive(false); } GContext.Publish(new EventCubeMeltWeaponExhibitFinished()); } // private async void OnWeaponExhibitNew() // { // ELog("OnWeaponExhibit"); // var stageId = _thisEventManager.EventData.CurrentStagetId; // var videoBytes = await Addressables.LoadAssetAsync("video_weapon_01").Task; // // if (videoDecoder == null || !videoBytes) return; // // // 软解码器由 PlayVideo 内部创建;下列参数在 Editor/Standalone 等路径下生效 // videoDecoder.PlayVideo( // videoBytes, // LeviathanVideoDecoderBase.PlayAlphaType.None, // None / RightSide / BottomSide / ChromaKey // multithreadedDecode: true, // WebGL 下会被强制为 false(无 C# 线程) // beginFrameIndex: 1, // syncDecodeFirstFrame: true, // false:首帧异步,先隐藏 RawImage,首帧就绪后再显示(见 OnFirstFrameRendered) // fastDecode: true // true:跳过环路滤波,解码更快、画质略降 // ); // var sequence = DOTween.Sequence(); // // // 同时执行(Append 会等前面的完成,Join 会同时执行) // var videoTransform = videoDecoder.transform; // sequence.Append(videoTransform.DOMove(new Vector3(5, 0, 0), 1f)); // sequence.Join(videoTransform.DOScale(Vector3.one * 2, 1f)); // 与上一行同时执行 // // // 停顿 0.5 秒 // sequence.AppendInterval(0.5f); // // 返回原状态 // sequence.Append(transform.DOMove(Vector3.zero, 1f)); // sequence.Join(transform.DOScale(Vector3.one, 1f)); // // // 设置循环和缓动 // sequence.SetLoops(3, LoopType.Restart) // 无限循环 // .SetEase(Ease.InOutSine); // // await Awaiters.Seconds(10f); // // videoTransform.DOKill(); // videoTransform.gameObject.SetActive(false); // GContext.Publish(new EventCubeMeltWeaponExhibitFinished()); // } #endregion } }