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

1123 lines
38 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.
/***
**
** Blocks 玩法
** 2025-12-8
**/
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using asap.core;
using cfg;
using DG.Tweening;
using EventCubeMelt;
using EventCubeMelt.Data;
using game;
using Game;
using GameCore;
using TMPro;
using UniRx;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;
using Animation = UnityEngine.Animation;
using Sequence = DG.Tweening.Sequence;
namespace EventCubeMelt.UI
{
public class EventCubeMeltPanel : BasePanel
{
//
private EventCubeMeltManager _thisEventManager;
private EventCubeMeltData _thisEventData;
//
private readonly PlayerItemData _playerItemData = GContext.container.Resolve<PlayerItemData>();
// 显示奖励数量
private int _showRewardCount = 4;
private IDisposable _robotAddScoreSubscription;
private Button _btnClose;
private Button _btnQuestionmark;
private Button _btnAdd;
private Transform root;
private TMP_Text icon_ticket;
private TMP_Text _textTitle;
private TMP_Text _txtTime;
private TMP_Text _txtNum;
private Image _imgTicket; //- 图标
private Transform _stageComplete;
private Transform _nextStageTip;
private TMP_Text _textStage;
private Animation _showAnimation; // 处理显示的Animation
private CanvasGroup _canvasGroup;
private Image _weaponImage;
//- 视频解码器
private Transform _videoPlayer;
//- 引导
private Transform _guide01;
private Button _btnJump;
// 获取奖励逻辑
private bool _isStageRewardLogic = false;
private TaskCompletionSource<bool> _waitStageRewardTcs;
private bool _isFinalRewardLogic = false;
// 最终奖励
private RewardItemNew _rewardFinal;
// Level 复用一下
private SandDigLevel[] _levels;
private RewardItemNew _rewardItem1;
private RewardItemNew _rewardItem2;
// 提出来放到脚本中
private CubeMeltCollectItems[] _collectItems;
// 定时器
private IDisposable _timer;
// 增光特效
private Transform _fxUIEventCubemeltFireIncrease;
#region
[Header("组件引用")][SerializeField] private BoardRenderer boardRenderer;
[SerializeField] private PieceRenderer[] pieceRendererArray;
#endregion
#region
[Header("面板宽度")] public int boardWidth = 8;
[Header("面板高度")] public int boardHeight = 8;
// [Header("下方单元数量")]
// public int pieceNumber = 3;
[Header("下方单元宽")] public int pieceWidth = 5;
[Header("下方单元高")] public int pieceHeight = 5;
[Header("视觉效果")]
[Tooltip("点击的偏移")]
public int pieceOffsetY = 320;
[Tooltip("拖动对象的的缩放")]
public float pieceScaleFactor = 100F / 40;
[Tooltip("拖动对象目标大小,影响计算位置")]
public float pieceTargetSize = 100F;
[Tooltip("滑动比例")]
public float pieceDistanceFactor = 0.2F;
#endregion
// GUide
private Transform moveNode;
private Vector3 moveNodeOriginPos;
private Vector3 moveFinalPos;
private bool _isUpdatingCollect;
#region
private void Awake()
{
ELog("Awake");
_thisEventManager = GContext.container.Resolve<EventCubeMeltManager>();
_thisEventData = _thisEventManager.EventData;
root = transform.Find("root");
_textTitle = transform.Find("root/title/Txt_titleName").GetComponent<TMP_Text>();
_levels = transform.Find("root/title/level").GetComponentsInChildren<SandDigLevel>(true);
_txtTime = transform.Find("root/title/level/Txt_time").GetComponent<TMP_Text>();
_rewardFinal = transform.Find("root/title/level/reward").GetComponent<RewardItemNew>();
_showAnimation = GetComponent<Animation>();
_canvasGroup = GetComponent<CanvasGroup>();
_collectItems = transform.Find("root/TargetObject/CollectObject/CollectList")
.GetComponentsInChildren<CubeMeltCollectItems>(true);
//
_rewardItem1 = transform.Find("root/TargetObject/RewardObject/reward/reward1")
.GetComponent<RewardItemNew>();
_rewardItem2 = transform.Find("root/TargetObject/RewardObject/reward/reward2")
.GetComponent<RewardItemNew>();
_stageComplete = transform.Find("root/StageComplete");
_nextStageTip = transform.Find("root/NextStageTip");
_textStage = transform.Find("root/NextStageTip/txt_stage").GetComponent<TMP_Text>();
_btnClose = transform.Find("p_panel_btn_close").GetComponent<Button>();
_btnQuestionmark = transform.Find("root/title/Btn_questionmark").GetComponent<Button>();
_btnAdd = transform.Find("root/icon_ticket").GetComponent<Button>();
_txtNum = transform.Find("root/icon_ticket/txt_num").GetComponent<TMP_Text>();
_imgTicket = transform.Find("root/icon_ticket/Img_ticket").GetComponent<Image>();
_guide01 = transform.Find("root/guide_01");
_btnJump = transform.Find("root/btn_jump").GetComponent<Button>();
var finalPos = transform.Find("root/EventCubeMeltTablePanel/Guidance/final_pos");
moveNode = _guide01.Find("node");
moveNodeOriginPos = moveNode.position;
moveFinalPos = finalPos.position;
_fxUIEventCubemeltFireIncrease = transform.Find("root/Bg_melt/fx_ui_event_cubemelt_fire_increase");
_weaponImage = transform.Find("root/Bg_melt/weapon").GetComponent<Image>();
_videoPlayer = transform.Find("root/BlockVideoPlayer");
_videoPlayer.gameObject.SetActive(false);
_showRewardCount = _levels.Length;
_btnClose.onClick.AddListener(OnClose);
_btnQuestionmark.onClick.AddListener(() =>
{
var infoPanel = _thisEventManager.EventCubeMeltMainData.InfoPanel;
_ = UIManager.Instance.ShowUI(new UIType(infoPanel));
});
_btnAdd.onClick.AddListener(OnBtnAdd);
_btnJump.onClick.AddListener(() =>
{
_thisEventManager.JumpToStage(11);
});
// 绑定事件
GContext.OnEvent<EventForUpdateCollect>().Subscribe(evtData => { _ = UpdateCollectAsync(); }).AddTo(disposables);
GContext.OnEvent<EventForRefreshCubeMeltPanel>().Subscribe(_ => RefreshUI()).AddTo(disposables);
GContext.OnEvent<EventCubeMeltUpdateTicketCount>().Subscribe(_ => UpdateTickCount()).AddTo(disposables);
GContext.OnEvent<EventCubeMeltShowNeoNormalPack>().Subscribe(_ => ShowNeoPackPanel()).AddTo(disposables);
GContext.OnEvent<EventCubeMeltForNextStage>().Subscribe(evtData => { _ = ShowNextStageAsync(); }).AddTo(disposables);
GContext.OnEvent<FishingChallengeContinueEvent>().Subscribe(_ => OnStageLogicContinue()).AddTo(disposables);
GContext.OnEvent<EventCubeMeltWeaponExhibitFinished>().Subscribe(_ => OnWeaponExhibitFinish())
.AddTo(disposables);
GContext.OnEvent<EventCubeMeltWeaponProgress>().Subscribe((evt) => UpdateWeaponProgress()).AddTo(disposables);
GContext.OnEvent<EventCubeMeltStageFinish>().Subscribe(_ => OnFinishStage()).AddTo(disposables);
GContext.OnEvent<EventCubeMeltGuideFingerHide>().Subscribe(_ => StopGuideMove()).AddTo(disposables);
GContext.OnEvent<EventNewGuideFingerStart>().Subscribe(_ => StartGuideMove()).AddTo(disposables);
GContext.OnEvent<EventNewGuideFingerFinish>().Subscribe(_ => OnNewGuideFingerFinish()).AddTo(disposables);
GContext.OnEvent<EventCubemeltExitAct>().Subscribe(_ => OnClose()).AddTo(disposables);
}
private void OnFinishStage()
{
ELog("OnFinishStage()");
_canvasGroup.blocksRaycasts = false;
foreach (var pieceRenderer in pieceRendererArray)
{
pieceRenderer.RestorePiece();
}
}
private void OnClose()
{
GContext.Publish(new UnloadActToNextAct());
}
private async Task ShowNextStageAsync()
{
ELog("ShowNextStage");
await Awaiters.NextFrame;
_ = ShowCurrentStage();
_showAnimation?.Play("EventCubeMeltSwithShow");
UpdateTopInfo();
UpdateTargetInfo();
UpdateTickCount();
_canvasGroup.blocksRaycasts = true;
}
private void OnStageLogicContinue()
{
ELog($"OnStageLogicContinue isStageRewardLogic={_isStageRewardLogic} isFinalRewardLogic={_isFinalRewardLogic}");
if (_isStageRewardLogic)
{
_isStageRewardLogic = false;
}
else if (_isFinalRewardLogic)
{
_isFinalRewardLogic = false;
}
_waitStageRewardTcs?.TrySetResult(true);
}
private async void OnWeaponExhibitFinish()
{
ELog("OnWeaponExhibitFinish");
var rootAni = root.GetComponent<Animation>();
rootAni.Play("EventCubeMeltFinishRecover");
await Awaiters.Seconds(0.12f);
var bRet = _waitExhibitTcs?.TrySetResult(true) ?? false;
// var success = _changeShowTypeTask.TrySetResult(true);
if (!bRet)
{
LogWarning("WaitExhibitTrySetResultIgnored reason=AlreadyCompleted");
}
else
{
}
}
protected override void Start()
{
base.Start();
_canvasGroup.blocksRaycasts = false;
Initialize();
UpdateTopInfo();
UpdateTargetInfo();
UpdateTickCount();
SetIcon();
_ = ShowCurrentStage();
_timer = Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(UpdateTimer).AddTo(this);
_videoPlayer.gameObject.SetActive(false);
}
private void GuideListener(AddIndexEvent addIndexEvent)
{
ELog($"GuideListener -> {addIndexEvent.guideSubIndex} {addIndexEvent.CompleteGuide}");
if (addIndexEvent.CompleteGuide)
{
if (!this)
{
return;
}
if (_canvasGroup)
{
_canvasGroup.blocksRaycasts = true;
}
RunGuide01Anim();
}
}
private async void RunGuide01Anim()
{
ELog("RunGuide01Anim");
await Awaiters.NextFrame;
_thisEventManager.SetIsInGuideAnim(true);
if (!_guide01)
return;
_guide01.gameObject.SetActive(true);
var trans = _guide01.Find("node/p/CubeGroup_02");
var rootP = _guide01.Find("node/p");
var renderer1 = pieceRendererArray[1];
renderer1.GetComponent<Animation>().Play("CubeMeltGuideCubeAnim");
var pieceRender = trans.GetComponent<PieceRenderer>();
if (!pieceRender)
pieceRender = trans.gameObject.AddComponent<PieceRenderer>();
pieceRender.LoadDataToGrid(renderer1.Data);
rootP.transform.localScale = Vector3.one * pieceRender.ScaleFactor;
StartGuideMove();
}
[SerializeField] private float moveDuration = 1f;
[SerializeField] private float pauseDuration = 0.5f;
private Sequence moveToTarget;
private void StartGuideMove()
{
// StopGuideMove();
_guide01?.gameObject.SetActive(true);
ELog($"StartGuideMove-> ");
var transformNode = moveNode;
// 创建移动动画到目标位置
// transformNode.DOKill();
transformNode.position = moveNodeOriginPos;
moveToTarget?.Kill();
moveToTarget = DOTween.Sequence();
moveToTarget.Append(transformNode.DOMove(moveNodeOriginPos, 0));
moveToTarget.Append(transformNode.DOMove(moveFinalPos, moveDuration));
moveToTarget.AppendInterval(pauseDuration);
moveToTarget.Append(transformNode.DOMove(moveNodeOriginPos, 0f));
moveToTarget.SetLoops(-1);
// 创建返回动画
// var moveBack = DOTween.Sequence();
// moveBack.Append(transformNode.DOMove(moveNodeOriginPos,0f));
// 组合两个序列并循环
// var fullSequence = DOTween.Sequence();
// fullSequence.Append(moveToTarget);
// fullSequence.Append(moveBack);
// fullSequence.SetEase(Ease.InOutQuad);
// fullSequence.SetLoops(-1); // 无限循环
}
private void OnNewGuideFingerFinish()
{
var pieceRenderer = pieceRendererArray[1];
if (pieceRenderer)
{
pieceRenderer.GetComponent<Animation>().Stop();
}
}
private void StopGuideMove()
{
if (moveNode)
{
moveNode.DOKill();
}
moveToTarget?.Kill();
_guide01.gameObject.SetActive(false);
}
protected override void OnDestroy()
{
_timer?.Dispose();
_timer = null;
StopGuideMove();
moveToTarget?.Kill();
base.OnDestroy();
ELog("OnDestroy");
}
private void Update()
{
#if UNITY_EDITOR
if (Input.GetKeyDown(KeyCode.N))
{
boardRenderer.OnRestoreStep();
}
else if (Input.GetKeyDown(KeyCode.B))
{
boardRenderer.OnPrevStep();
}
if (Input.GetKeyDown(KeyCode.K))
{
isShow = !isShow;
}
if (Input.GetKeyDown(KeyCode.J))
{
_thisEventManager.JumpToStage(newStepValue);
}
#endif
}
#if UNITY_EDITOR
private bool isShow = false;
//
private string newStepStr;
private string newLoopStr;
private int newStepValue;
private int newLoopValue;
private async void OnGUI()
{
if (!isShow)
{
return;
}
// Set the button width and height
float buttonWidth = 300; // Replace with your desired width
float buttonHeight = 70; // Replace with your desired height
int fontSize = 40; // Replace with your desired font size
// Set the font size for text fields, buttons, and labels
GUI.skin.textField.fontSize = fontSize;
GUI.skin.button.fontSize = fontSize;
GUI.skin.label.fontSize = fontSize;
// 触发ChallengeShowPlayAniEvent 事件并能输入oldStep和newStep
GUILayout.Label("跳转关卡:");
newStepStr = GUILayout.TextField(newStepStr, GUILayout.Width(buttonWidth), GUILayout.Height(buttonHeight));
int.TryParse(newStepStr, out newStepValue);
if (GUILayout.Button("跳转", GUILayout.Width(buttonWidth), GUILayout.Height(buttonHeight)))
{
var bRet = int.TryParse(newStepStr, out var newStep);
if (bRet)
_thisEventManager.JumpToStage(newStep - 1);
// Event.current.Use();
GUIUtility.hotControl = 0;
GUIUtility.keyboardControl = 0;
}
newLoopStr = GUILayout.TextField(newLoopStr, GUILayout.Width(buttonWidth), GUILayout.Height(buttonHeight));
// int.TryParse(newLoopStr, out newLoopValue);
if (GUILayout.Button("轮数跳转", GUILayout.Width(buttonWidth), GUILayout.Height(buttonHeight)))
{
var bRet = int.TryParse(newLoopStr, out newLoopValue);
if (bRet)
{
// _thisEventManager.JumpToStage(newStep -1);
// var newCycle = (newLoopValue != 0) ? 1 : newLoopValue ;
var newCycle = newLoopValue;
if (newCycle != _thisEventData.Cycle)
{
_thisEventData.Cycle = newCycle;
var step = _thisEventData.CurrentStagetId;
_thisEventManager.JumpToStage(step);
}
}
GUIUtility.hotControl = 0;
GUIUtility.keyboardControl = 0;
}
}
#endif
#endregion
#region LOG
private static void LogWarning(string message)
{
Debug.LogWarning($"<color=yellow>EventCubeMeltPanel => {message}</color>");
}
private static void LogError(string message)
{
Debug.LogError($"<color=red>EventCubeMeltPanel => {message}</color>");
}
private static void ELog(string message)
{
#if UNITY_EDITOR
if (!EventCubeMeltLogPolicy.EnableELog) return;
Debug.Log($"<color=orange>EventCubeMeltPanel => {message}</color>");
#endif
}
#endregion
#region
private async void OnBtnAdd()
{
await Awaiters.NextFrame;
//
ShowNeoPackPanel();
}
private async void ShowNeoPackPanel()
{
var packID = _thisEventManager.EventCubeMeltMainData.PackPackID;
var packData = new EventNeoNormalPackData
{
EventId = _thisEventData.EventId,
PackId = packID,
// Panel = _thisEventManager.EventCubeMeltMainData.PackPanel
};
await EventNeoNormalPackPanel.TryShowAsync(packData);
}
#endregion
#region
private void UpdateTopInfo()
{
ELog("UpdateTopInfo");
_txtTime.text = ConvertTools.ConvertTime2(_thisEventManager.GetRemainingTime());
//LocalizationMgr.GetFormatTextValue("UI_COMMON_end",
//ConvertTools.ConvertTime2(_thisEventManager.GetRemainingTime()));
// var dropId = _thisEventManager.EventCubeMeltMainData.FinalReward;
var dropId = _thisEventManager.GetFinalReward();
var itemData = _playerItemData.GetItemDataByDropIdAndTypeLureInflation(null, dropId);
// _rewardFinal.SetData(itemData[0]);
_rewardFinal.InflationRate = _thisEventData.InflationRate;
_rewardFinal.SetDropIcon("", dropId);
UpdateLevel();
}
private void UpdateTargetInfo()
{
// 奖励
var dropId = _thisEventManager.EventCubeMeltCollectionData.CollectingReward;
var itemData = _playerItemData.GetItemDataByDropIdAndTypeLureInflation(_thisEventData.InflationRate, dropId);
try
{
_rewardItem1.SetData(itemData[0]);
if (itemData.Count > 1)
{
_rewardItem2.SetData(itemData[1]);
}
}
catch (Exception e)
{
LogError($"UpdateTargetInfoFailed error={e.Message}");
}
// 当前完成的收集
UpdateCollectInfo();
UpdateWeapon();
}
private void UpdateWeapon()
{
_weaponImage?.gameObject.SetActive(true);
// if (true)
// {
// _videoPlayer?.gameObject.SetActive(true);
// SetUpProgress();
// return;
// }
var uiService = GContext.container.Resolve<IUIService>();
var sprName = _thisEventManager.EventCubeMeltCollectionData.CollectingIcon;
uiService.SetImageSprite(_weaponImage, sprName);
SetUpProgress();
}
[Header("武器变化周期")]
[SerializeField] private float weaponUpdateDuration = 0.5f;
[Tooltip("火焰变化周期")]
[SerializeField] private float fxIncreaseDuration = 0.8f;
private async void UpdateWeaponProgress()
{
_fxUIEventCubemeltFireIncrease.gameObject.SetActive(true);
var percent = _thisEventManager.GetCollectProgress();
var startValue = _weaponImage.color.r;
var df = weaponUpdateDuration * (percent - startValue);
var newColor = new Color(percent, percent, percent, 1f);
_weaponImage.DOColor(newColor, df);
// 播放火焰特效
await Awaiters.Seconds(fxIncreaseDuration); //
_fxUIEventCubemeltFireIncrease.gameObject.SetActive(false);
}
public void SetUpProgress()
{
var percent = _thisEventManager.GetCollectProgress();
ELog($"SetUpProgress-> {percent}");
var image = _weaponImage.GetComponent<Image>();
image.color = new Color(percent, percent, percent, 1f);
}
private void UpdateCollectInfo()
{
// 注,默认 数值的数量不会超过 UI的数量当前最多是3组
var iCount = _thisEventData.CollectItems.Count;
for (var i = 0; i < iCount; ++i)
{
var item = _thisEventData.CollectItems[i];
_collectItems[i].gameObject.SetActive(true);
_collectItems[i].InitWithData(item);
}
for (var i = iCount; i < _collectItems.Length; ++i)
{
_collectItems[i].gameObject.SetActive(false);
}
}
private void UpdateTickCount()
{
_txtNum.text = _thisEventData.TicketCount.ToString();
}
public RectTransform GetEndRectTransform(int cellTypeValue)
{
var items = _thisEventManager.GetCollectionItems();
var index = 0;
foreach (var kv in items)
{
var itemId = kv.Key;
if (itemId == (int)cellTypeValue)
{
//注意不要超值-
break;
}
index++;
}
if (index >= _collectItems.Length)
return null;
var root = _collectItems[index];
ELog($"GetEndPos ->{index} : {root}");
// return (RectTransform)root.Find("collect_icon").transform;
return root.GetAniTransform();
}
private void UpdateTimer(long _ = 0L)
{
var now = _thisEventManager.GetRemainingTime();
// _txtTime.text = ConvertTools.ConvertTime2(now.Days, now.Hours, now.Minutes, now.Seconds);
// ConvertTools.ConvertTime2(now);
_txtTime.text = ConvertTools.ConvertTime2(now);
// LocalizationMgr.GetFormatTextValue("UI_COMMON_end", ConvertTools.ConvertTime2(now));
if (now.TotalMilliseconds < 0)
{
Settle();
}
}
private void Settle()
{
// timer?.Cancel();
// timer = null;
_txtTime.text = LocalizationMgr.GetText("UI_EventRankPopupPanel_13");
//结算
_thisEventManager.OnSettle();
}
// 设置代币图标
void SetIcon()
{
var itemId = _thisEventManager.EventCubeMeltMainData.ItemID;
var tables = GContext.container.Resolve<Tables>();
var data = tables.TbItem.GetOrDefault(itemId);
var imageData = new ShowImageData(_imgTicket, data.Icon);
GContext.container.Resolve<IUIService>().SetImageSprite(imageData);
}
private void UpdateLevel()
{
// ELog("UpdateLevel-> ");
// var count = _thisEventManager.EventCubeMeltMainData.StageList.Count;
var count = _thisEventManager.StageCount;
var curIndex = (_thisEventData.CurrentStagetId) % count;
var startIndex = 0;
var offsetIndex = count - _showRewardCount;
// curIndex = 14;
ELog($"UpdateLevel-> {curIndex}");
if (curIndex <= 1)
{
startIndex = 0;
}
else if (curIndex > offsetIndex)
{
startIndex = offsetIndex;
}
else
{
startIndex = curIndex - 1;
}
for (var i = 0; i < _showRewardCount - 1; i++)
{
var index = startIndex + i;
if (index >= count)
{
break;
}
var state = 0;
if (index < curIndex)
{
state = 2;
}
else if (index == curIndex)
{
state = 1;
}
_levels[i].SetState(state);
_levels[i].SetTextNum($"{index + 1}");
}
_levels[_showRewardCount - 1].SetTextNum($"{count}");
}
private void RefreshUI()
{
ELog("RefreshUI");
UpdateTopInfo();
UpdateTargetInfo();
UpdateGameContext();
UpdateTickCount();
}
//-
private async Task UpdateCollectAsync()
{
if (_isUpdatingCollect)
{
ELog("UpdateCollectSkip reason=Running");
return;
}
_isUpdatingCollect = true;
ELog("UpdateCollect-> ");
try
{
await Awaiters.NextFrame;
var iCount = _thisEventData.CollectItems.Count;
for (var i = iCount; i < _collectItems.Length; ++i)
{
_collectItems[i].gameObject.SetActive(false);
}
var tasks = new List<Task>();
for (var i = 0; i < iCount; ++i)
{
var item = _thisEventData.CollectItems[i];
tasks.Add(_collectItems[i].UpdateCollectItem(item));
}
// GContext.Publish(new EventUISound("audio_ui_cubemelt_cube_refresh"));
GContext.Publish(new EventCubeMeltWeaponProgress
{
percent = _thisEventManager.GetCollectProgress()
});
await Task.WhenAll(tasks);
await CheckIfCollectFinished();
}
finally
{
_isUpdatingCollect = false;
}
}
private async Task CheckIfCollectFinished()
{
var isFinishThisStage = _thisEventManager.IsThisCollectFinished();
var isGetStageReward = _thisEventManager.IsGetStageReward();
if (isFinishThisStage)
{
#if AGG
using (var e = GEvent.GameEvent("event_cubemelt_complete"))
{
e.AddContent("stage_id",_thisEventData.CurrentStagetId);
}
#else
ELog($"event_cubemelt_complete -> {_thisEventData.CurrentStagetId} ");
#endif
_canvasGroup.blocksRaycasts = false;
if (!isGetStageReward)
{
await RunFinishStage();
await CheckStageRewardsGet();
}
// await CheckFinalRewardsGet();
UpdateToNextStage();
}
}
private async Task CheckStageRewardsGet()
{
_isStageRewardLogic = _thisEventManager.PlayGetStageReward();
if (_isStageRewardLogic)
{
// await CheckStageRewardFinished();
ELog("WaitForStageRewardFinished");
_waitStageRewardTcs = new TaskCompletionSource<bool>();
await _waitStageRewardTcs.Task;
}
}
// private async Task CheckFinalRewardsGet()
// {
// var isFinishAll = _thisEventManager.IsFinishAllStage();
// var isFinalGet = _thisEventManager.IsGetFinalReward();
// if (isFinishAll && !isFinalGet)
// {
// _isFinalRewardLogic = _thisEventManager.PlayGetFinalRewards();
// if (_isFinalRewardLogic)
// {
// await CheckFinalRewardsFinished();
// }
// }
// }
private async Task CheckStageRewardFinished()
{
if (!_isStageRewardLogic) return;
while (true)
{
if (!_isStageRewardLogic)
return;
await Awaiters.Seconds(0.2f);
}
}
private async Task CheckFinalRewardsFinished()
{
if (!_isFinalRewardLogic) return;
while (true)
{
if (!_isFinalRewardLogic)
return;
await Awaiters.Seconds(1f);
}
}
private readonly float _durationForShowFinishView = 1f;
private async Task RunFinishStage()
{
_stageComplete.gameObject.SetActive(true);
await Awaiters.Seconds(2f);
_stageComplete.gameObject.SetActive(false);
await RunWeaponExhibit();
ClearBoardAndPieces();
}
private async Task RunWeaponExhibit()
{
_fxUIEventCubemeltFireIncrease.gameObject.SetActive(true);
await Awaiters.Seconds(fxIncreaseDuration); //
_weaponImage.gameObject.SetActive(false);
_fxUIEventCubemeltFireIncrease.gameObject.SetActive(false);
OnWeaponExhibitNew();
// GContext.Publish(new EventCubeMeltWeaponExhibit());
// audio_ui_cubemelt_complete_show
GContext.Publish(new EventUISound("audio_ui_cubemelt_complete_show"));
await WaitForExhibitFinished();
}
private TaskCompletionSource<bool> _waitExhibitTcs;
private async Task WaitForExhibitFinished()
{
ELog("WaitForExhibitFinished");
_waitExhibitTcs = new TaskCompletionSource<bool>();
await _waitExhibitTcs.Task;
}
private void UpdateToNextStage()
{
ELog("UpdateToNextStage");
// await Awaiters.NextFrame;
_thisEventManager.UpdateToNextStage();
}
private void ClearBoardAndPieces()
{
if (boardRenderer)
{
boardRenderer.ClearBoard();
}
foreach (var pieceRenderer in pieceRendererArray)
{
if (pieceRenderer)
{
pieceRenderer.CleanPiece();
}
}
}
private async void OnWeaponExhibitNew()
{
ELog("OnWeaponExhibitNew");
var rootAni = root.GetComponent<Animation>();
rootAni.Play("EventCubeMeltFinish");
// var stageId = _thisEventManager.EventData.CurrentStagetId;
// var videoBytes = await Addressables.LoadAssetAsync<TextAsset>("video_weapon_01").Task;
// if (_videoDecoder == null || !videoBytes) return;
// _videoPlayer.gameObject.SetActive(true);
// 软解码器由 PlayVideo 内部创建;下列参数在 Editor/Standalone 等路径下生效
// _videoDecoder.PlayVideo(
// videoBytes,
// LeviathanVideoDecoderBase.PlayAlphaType.ChromaKey, // None / RightSide / BottomSide / ChromaKey
// multithreadedDecode: true, // WebGL 下会被强制为 false无 C# 线程)
// beginFrameIndex: 1,
// syncDecodeFirstFrame: true, // false首帧异步先隐藏 RawImage首帧就绪后再显示见 OnFirstFrameRendered
// fastDecode: true // true跳过环路滤波解码更快、画质略降
// );
// _videoDecoder.SetChromaKeyCutoff(1f);
// var sequence = DOTween.Sequence();
//
// // 同时执行Append 会等前面的完成Join 会同时执行)
// var videoTransform = _videoDecoder.transform;
// sequence.Append(videoTransform.DOMove(new Vector3(500, 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(3f);
//
// videoTransform.DOKill();
_videoPlayer.gameObject.SetActive(false);
GContext.Publish(new EventCubeMeltWeaponExhibitFinished());
}
#endregion
#region BlockGame
private void Initialize()
{
// _thisEventManager.SetBoardDimension(new Vector2Int(boardWidth, boardHeight));
_thisEventManager.SetPieceDimension(new Vector2Int(pieceWidth, pieceHeight));
if (boardRenderer)
{
boardRenderer.Initialize(boardHeight, boardWidth, _thisEventData.BoardData);
boardRenderer.TargetCellSize = pieceTargetSize;
}
if (pieceRendererArray.Length > 0)
{
for (var i = 0; i < pieceRendererArray.Length; ++i)
{
ELog($"InitializePieceRenderer index={i} renderer={pieceRendererArray[i]}");
pieceRendererArray[i].Index = i;
pieceRendererArray[i].Initialize(pieceHeight, pieceWidth);
pieceRendererArray[i].ScaleFactor = pieceScaleFactor;
pieceRendererArray[i].OffsetY = pieceOffsetY;
pieceRendererArray[i].TargetSize = pieceTargetSize;
pieceRendererArray[i].DistanceFactor = pieceDistanceFactor;
}
}
}
[Space]
[Header("切关动画每一层显示延时")]
public float delayBetweenCells = 0.1f; // 每个单元格间隔0.3秒
[Header("切关动画格子缩放时间")]
public float scaleDuration = 0.2f; // 缩放动画持续时间
[Header("底部Piece 延时延时")]
public float delayBetweenPiece = 0.1f;
[Header("底部Piece 缩放时间")]
public float pieceScaleDuration = 0.3f;
public void OnEnterAnimationFinished()
{
ELog("OnEnterAnimationFinished()");
_ = RunStageSwitchAnimation();
}
private async Task RunStageSwitchAnimation()
{
var animationSequence = DOTween.Sequence();
var delay = 0f;
if (boardRenderer)
boardRenderer.UpdateBoardWithAnim(animationSequence, scaleDuration, delayBetweenCells, out delay);
for (var i = 0; i < pieceRendererArray.Length; ++i)
{
var pieceRenderer = pieceRendererArray[i];
if (pieceRenderer)
{
pieceRenderer.UpdatePieceWithAnim(animationSequence, pieceScaleDuration, delay + i * delayBetweenPiece);
}
}
// 可选:动画完成后的回调
animationSequence.OnComplete(OnSwitchStageAnimationEnd);
}
private void OnSwitchStageAnimationEnd()
{
_ = OnSwitchStageAnimationEndAsync();
}
private async Task OnSwitchStageAnimationEndAsync()
{
await Awaiters.NextFrame;
ELog("OnSwitchStageAnimationEnd");
OnNewGuide();
// 按钮有效
await CheckIfCollectFinished();
}
private void OnNewGuide()
{
var stageId = _thisEventData?.CurrentStagetId ?? -1;
var cycle = _thisEventData?.Cycle ?? -1;
if (stageId == 0 && cycle == 0)
{
var isGuide = GContext.container.Resolve<GuideDataCenter>().TriggerGuide(nameof(GroupName.Block01), "EventBlockVikingPanel", false, gameObject.name);
if (isGuide)
{
GContext.OnEvent<AddIndexEvent>().Subscribe(GuideListener).AddTo(disposables); ;
}
else
{
// var cycle = _thisEventData?.Cycle ?? -1;
if (_thisEventManager.IsInGuideAnim() && cycle == 0)
{
RunGuide01Anim();
}
else
{
_thisEventManager.SetIsInGuideAnim(false);
}
_canvasGroup.blocksRaycasts = true;
}
}
else
{
_canvasGroup.blocksRaycasts = true;
}
}
private async Task ShowCurrentStage()
{
await Awaiters.NextFrame;
var stage = _thisEventData.CurrentStagetId;
ELog($"ShowCurrentStage-> {stage}");
ClearBoardAndPieces();
GContext.Publish(new EventCubeMeltShowMinWeapon());
}
private void UpdateGameContext()
{
// 更新当前管卡的数据
if (boardRenderer)
{
boardRenderer.UpdateBoard();
}
foreach (var pieceRenderer in pieceRendererArray)
{
if (pieceRenderer)
{
pieceRenderer.UpdatePiece();
}
}
}
#endregion
}
}