Files
back_cantanBuilding/Assets/Scripts/UI/Challenge/EventChallengePanel.cs
2026-05-26 16:15:54 +08:00

382 lines
13 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 asap.core;
using DG.Tweening;
using game;
using GameCore;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UniRx;
// 继续
public class FishingChallengeContinueEvent
{
}
// 结算界面
// 显示前往钓鱼按钮的UI
public class EventChallengePanel : MonoBehaviour
{
//
private Button btn_questionmark;
private TMP_Text text_title;
private CanvasGroup canvasGroup;
private TMP_Text text_people;
private TMP_Text text_time;
private Button btn_enter;
private Button btn_close;
// private RewardItemNew reward;
// 数据
private Timer timer;
private int curNum;
private int _challengeState;
private int oldStep;
private int newStep;
private List<ItemData> itemDataList;
private List<EventChallengeHead> success_head_list = new();
// private IDisposable _disposable;
private CompositeDisposable _disposable = new();
private FishingChallengeManager _fishingChallengeManager;
// 处理单元奖励中
private bool _isStageRewardLogic = false;
private void Awake()
{
_fishingChallengeManager = GContext.container.Resolve<FishingChallengeManager>();
// 先全部屏蔽按钮
canvasGroup = transform.Find("root").GetComponent<CanvasGroup>();
canvasGroup.blocksRaycasts = false;
//
btn_questionmark = transform.Find("root/title/btn_questionmark").GetComponent<Button>();
text_title = transform.Find("root/title/text_title").GetComponent<TMP_Text>();
text_people = transform.Find("root/title/info/people/text_people").GetComponent<TMP_Text>();
text_time = transform.Find("root/title/info/time/text_time").GetComponent<TMP_Text>();
btn_enter = transform.Find("root/btn_enter/btn_green").GetComponent<Button>();
btn_close = transform.Find("root/btn_close").GetComponent<Button>();
// reward = transform.Find("root/reward").GetComponent<RewardItemNew>();
_disposable = new CompositeDisposable();
GContext.OnEvent<ShowResidueNumEvent>().Subscribe(ShowResidueNumEvent).AddTo(_disposable);
GContext.OnEvent<FishingChallengeContinueEvent>().Subscribe(OnStageLogicContinue).AddTo(_disposable);
GContext.OnEvent<ChallengeLevelTipsEvent>().Subscribe(OnShowLevelTips).AddTo(_disposable);
_challengeState = _fishingChallengeManager.ChallengeState();
}
private void Start()
{
_fishingChallengeManager.IsFirstOpen = false;
OnAddEvents();
SetTitle();
SetEliminateNumber();
GContext.container.Resolve<GuideDataCenter>().InspectTriggerGuide("EventChallengePanel");
_ = ShowNewGuide(0.5f);
}
public async Task ShowNewGuide(float delaySeconds)
{
await Awaiters.Seconds(delaySeconds);
var openKey = _fishingChallengeManager.GetOpenEventKey();
if (!string.IsNullOrEmpty(openKey))
{
var isOpen = PlayerPrefs.GetInt(openKey,0);
if (isOpen == 0)
{
isOpen = 1;
PlayerPrefs.SetInt(_fishingChallengeManager.GetOpenEventKey(), isOpen);
var uiName = _fishingChallengeManager.eventChallengeConfig.InfoPanel;
var uiType = new UIType(uiName,5);
_ = UIManager.Instance.ShowUI(uiType);
}
}
}
private void OnAddEvents()
{
btn_enter.onClick.AddListener(Enter);
btn_close.onClick.AddListener(OnClose);
btn_questionmark.onClick.AddListener(() =>
{
var uiName = _fishingChallengeManager.eventChallengeConfig.InfoPanel;
var uiType = new UIType(uiName);
_ = UIManager.Instance.ShowUI(uiType);
});
}
private void SetTitle()
{
if (_challengeState != 2)
{
var timeSpan = _fishingChallengeManager.GetTimeSpan();
var seconds = timeSpan.TotalSeconds;
timer = this.AttachTimer((float)seconds, null,
async (elapsed) =>
{
// var now = endTime - ZZTimeHelper.UtcNow().UtcNowOffset();
var now = _fishingChallengeManager.GetTimeSpan();
text_time.text = ConvertTools.ConvertTime2(now.Days, now.Hours, now.Minutes, now.Seconds);
if (now.TotalMilliseconds < 0)
{
if (canvasGroup.blocksRaycasts)
{
canvasGroup.blocksRaycasts = false;
Settle(); // 活动结束了
// await OnFail();
// await OnSettleFinished(false);
canvasGroup.blocksRaycasts = true;
}
}
}, useRealTime: true);
}
}
private void SetEliminateNumber()
{
// 进入当前界面的时候更新UI
oldStep = _fishingChallengeManager.fishingChallengeData.step;
newStep = _fishingChallengeManager.GetNewStep();
Log($"SetEliminateNumber {oldStep},{newStep}");
var isSuccess = _fishingChallengeManager.IsStepFinished(newStep);
//显示关卡
SetEliminateNumber(isSuccess);
}
private void ShowResidueNumEvent(ShowResidueNumEvent showResidueNumEvent)
{
DOTween.To(() => curNum, x => curNum = x, showResidueNumEvent.num, 0.5f).OnUpdate(() =>
{
text_people.text = $"{curNum}/{_fishingChallengeManager.PlayerFullNumber}";
});
}
private async Task OnFail()
{
// //失败自己跳水动画
var challengeFailEvent = new ChallengeFailEvent() { oldStep = oldStep };
GContext.Publish(challengeFailEvent);
await challengeFailEvent.tcs.Task;
var view = await UIManager.Instance.ShowUI(UITypes.EventChallengeRewardPopupPanel);
if (view)
{
view.GetComponent<EventChallengeRewardPopupPanel>().OnFailed();
}
}
private async Task OnSuccess()
{
Log("OnSuccess");
var view = await UIManager.Instance.ShowUI(UITypes.EventChallengeRewardPopupPanel);
view.GetComponent<EventChallengeRewardPopupPanel>().OnSuccess();
}
private async void SetEliminateNumber(bool isSuccess)
{
Log($"SetEliminateNumber => {isSuccess}");
//剩余人数
curNum = _fishingChallengeManager.GetCurResidualNumber();
text_people.text = $"{curNum}/{_fishingChallengeManager.PlayerFullNumber}";
//显示人物头像
var challengeShowPlayerEvent = new ChallengeShowPlayerEvent { oldStep = oldStep };
GContext.Publish(challengeShowPlayerEvent);
await Awaiters.Seconds(1.0f);
//TODO:LF 未结算,要一直往后走
// var maxScore = _fishingChallengeManager.GetMaxScoreByStep(oldStep);
var oldScore = _fishingChallengeManager.fishingChallengeData.ProcessedScore;
var newScore = _fishingChallengeManager.fishingChallengeData.Score;
// if (oldScore == newScore && newScore = )
// {
// Log("Score Not Change");
// return;
// }
_fishingChallengeManager.OnChallengeSceneEnter();
var levelTipsEvent = new ChallengeLevelTipsEvent
{
oldScore = oldScore,
newScore = newScore,
};
GContext.Publish(levelTipsEvent);
await levelTipsEvent.tcs.Task;
Log($"BeforeSetProcessedScore {oldStep} {newStep}");
//
_fishingChallengeManager.SetProcessedScore(newScore);
_fishingChallengeManager.SetStep(newStep);
if (oldStep != newStep)
{
_fishingChallengeManager.EventTracking();
}
_isStageRewardLogic = _fishingChallengeManager.PlayGetStageReward();
await CheckStageRewardFinished();
// 如果step 没变,不需要 走下面逻辑
// if (newStep == oldStep && newStep != _fishingChallengeManager.GetFullStep())
// {
// return;
// }
//不能点击
// 更新数据
await Awaiters.Seconds(0.5f);
Log($"_challengeState: {_challengeState} isSuccess: {isSuccess}");
//
// 如果需要结算
// 处理奖品逻辑
// 状态有变化了,
// if (_challengeState == 2 || isSuccess)
// {
// Settle();
// }
if (_fishingChallengeManager.IsSettleState())
{
Settle();
}
// 播放动画逻辑
// await OnProcessAni();
await OnSettleFinished(isSuccess);
canvasGroup.blocksRaycasts = true;
}
// 屏蔽按钮
// 递归的层数比较浅,注意深了可能会爆栈
private async void OnShowLevelTips(ChallengeLevelTipsEvent tipsEvent)
{
canvasGroup.blocksRaycasts = false;
await tipsEvent.tcs.Task;
canvasGroup.blocksRaycasts = true;
}
private void OnStageLogicContinue(FishingChallengeContinueEvent evt)
{
Log("OnStageLogicContinue-> ");
_isStageRewardLogic = false;
}
// private int _waitCounts = 5;
private async Task CheckStageRewardFinished()
{
if (!_isStageRewardLogic) return;
while (true) // while true 很恐怖,看看延时几秒关掉可不可以呢
{
if (!_isStageRewardLogic)
return;
await Awaiters.Seconds(1f);
// _waitCounts--;
}
// UIManager.Instance.DestroyUI(UITypes.RewardPopupPanel);
// GContext.Publish(new RewardPanelClose());
// await Awaiters.NextFrame;
}
private async Task OnSettleFinished(bool isSuccess)
{
if (isSuccess)
{
Log($"OnSettleFinished -> true");
await OnSuccess();
_fishingChallengeManager.OnSettleFinished(true);
}
else if (_challengeState == 1 && !_fishingChallengeManager.IsTimeAllow())
{
Log($"OnSettleFinished -> Fail");
await OnFail();
_fishingChallengeManager.OnSettleFinished(false);
}
else
{
Log($"OnSettleFinished Error ---- {_challengeState} {false}");
}
// _fishingChallengeManager.EventTracking();
}
// private async Task OnProcessAni()
// {
// if (oldStep != newStep)
// {
// //跳水动画
// //await PlayAni();
// var cspe = new ChallengePlayAniEvent() { oldStep = oldStep, newStep = newStep };
// GContext.Publish(cspe);
// await cspe.tcs.Task;
// oldStep = newStep;
// }
// }
private void Settle()
{
timer?.Cancel();
timer = null;
text_time.text = LocalizationMgr.GetText("UI_EventRankPopupPanel_13");
//结算
_fishingChallengeManager.OnSettle();
}
private async void Enter()
{
// canvasGroup.blocksRaycasts = false;
// cfg.Tables tables = GContext.container.Resolve<cfg.Tables>();
// var mapData = tables.TbMapData.DataMap[_fishingChallengeManager.challengeMapData.ID];
// ILoadResourceService loadResourceService = GContext.container.Resolve<ILoadResourceService>();
// bool isCanEnter = await loadResourceService.Load(mapData.EnvName);
// if (isCanEnter)
{
EnterMap();
}
// else
// {
// var panel = await UIManager.Instance.ShowUI(UITypes.CloudTransitionPanel);
// panel.GetComponent<CloudTransitionPanel>().SetBtn(true, EnterMap);
// //var panel = await UIManager.Instance.ShowUI(UITypes.FishingDownLoadPopupPanel);
// //panel.GetComponent<FishingDownLoadPopupPanel>().SetBtn(null, EnterMap);
// canvasGroup.blocksRaycasts = true;
// }
}
private void EnterMap()
{
// GContext.container.Resolve<PlayerData>().currentMapId = _fishingChallengeManager.challengeMapData.ID;
OnClose();
}
private void OnClose()
{
//if (itemDataList != null)
//{
// GContext.Publish(new ShowData(itemDataList));
//}
GContext.Publish(new UnloadActToNextAct(transitionPanel: new UIType(_fishingChallengeManager.eventChallengeConfig.MatchPanel)));
btn_enter.onClick.RemoveAllListeners();
btn_close.onClick.RemoveAllListeners();
}
private void OnDestroy()
{
_disposable?.Dispose();
_disposable = null;
timer?.Cancel();
timer = null;
}
private static void Log(object t)
{
Debug.Log($"<color=blue>EventChallengePanel -> {t} </color>");
}
}