199 lines
6.9 KiB
C#
199 lines
6.9 KiB
C#
// 锻刀大赛,场景
|
||
// 主要是控制 刀光源
|
||
//
|
||
|
||
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
|
||
}
|
||
}
|