Files
ft/Client/Assets/Scripts/EventCubeMelt/Scene/EventCubeMeltScene.cs
2026-06-29 21:18:33 +08:00

199 lines
6.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 锻刀大赛,场景
// 主要是控制 刀光源
//
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<Camera>();
_weaponRoot = transform.Find("weapon_root").gameObject;
// _modelMin3D = transform.Find("weaponplane_root").gameObject;
_weaponTrans = transform.Find("weapon_root/weapon");
// 数据
_thisEventManager = GContext.container.Resolve<EventCubeMeltManager>();
}
private void Start()
{
ELog("Start()-> ");
//LoadMiniModel();
GContext.OnEvent<EventCubeMeltShowMinWeapon>().Subscribe(_ => ShowStageWeapon()).AddTo(disposables);
GContext.OnEvent<EventCubeMeltWeaponProgress>().Subscribe((evt ) => UpdateStageProgress(evt.percent)).AddTo(disposables);
GContext.OnEvent<EventCubeMeltWeaponExhibit>().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($"<color=orange> EventCubeMeltScene => {message} </color>");
#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<WeaponController>();
// if (_stageWeaponController == null)
// {
// _stageWeaponController = d.AddComponent<WeaponController>();
// }
// 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<WeaponEffectController>();
weaponEffController?.SetPositionByIndex(stageId);
}
_weaponRoot.GetComponent<Animation>().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<TextAsset>("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
}
}