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

340 lines
10 KiB
C#
Raw Permalink 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 System.Collections.Generic;
using System.Threading.Tasks;
using asap.core;
using DataCenter;
using EventPartnerGather;
using GameCore;
using TMPro;
using UniRx;
using UnityEngine;
using UnityEngine.UI;
using EEventBuildState = EventPartnerGatherRequests.EEventBuildState;
public class HomeBtnPartnerGather : EventButtonResource
{
//
private EventPartnerGatherManager _gatherManager;
// UI组件
private Image _iconImage;
private GameObject _redpoint;
private Button _btnEnter;
private TMP_Text _textTime;
private Timer _timer;
private Transform _redpointsInvite;
private Transform _fxUIPartnerminingBtnUp;
private CompositeDisposable _disposables = new();
private void Awake()
{
// 尝试解析管理器
try
{
_gatherManager = GContext.container.Resolve<EventPartnerGatherManager>();
}
catch (Exception e)
{
LogError($"ResolveGatherManagerFailed error={e.Message}");
gameObject.SetActive(false);
return;
}
// 查找UI组件使用安全检查
var iconTransform = transform.Find("icon");
if (iconTransform)
_iconImage = iconTransform.GetComponent<Image>();
var redpointTransform = transform.Find("redpoint");
if (redpointTransform)
_redpoint = redpointTransform.gameObject;
_btnEnter = transform.GetComponent<Button>();
var timeTransform = transform.Find("text_time");
if (timeTransform)
_textTime = timeTransform.GetComponent<TMP_Text>();
_redpointsInvite = transform.Find("redpoints_invite");
_fxUIPartnerminingBtnUp = transform.Find("fx_ui_partnermining_btn_up");
// 订阅事件
// _disposables ??= new CompositeDisposable();
// GContext.OnEvent<EventPartnerGatherRefreshEvent>().Subscribe(OnRefreshByEvent).AddTo(_disposables);
// GContext.OnEvent<EventPartnerGatherPartnerAddScore>().Subscribe(OnAddScore).AddTo(_disposables);
}
private void OnEnable()
{
// 检查管理器是否存在
if (_gatherManager == null)
{
LogWarning("OnEnableSkipped reason=ManagerUnavailable");
gameObject.SetActive(false);
return;
}
var bRet = _gatherManager.CheckOpen();
if (!bRet)
{
gameObject.SetActive(false);
return;
}
var data = GContext.container.Resolve<EventPartnerStatueTokenExchangeData>();
var context = GContext.container.Resolve<IEventPartnerTokenExchangeContext>();
var hasPendingScore = (data.PendingScoreUiCount > 0 && context is EventPartnerGatherExchangeContext);
if (!hasPendingScore)
{
_gatherManager.SetRedPoint();
}
// _gatherManager.SetRedPoint();
var eventPartnerMineMainData = _gatherManager.EventPartnerMineMainData;
if (eventPartnerMineMainData == null)
{
gameObject.SetActive(false);
return;
}
AddEvents();
CheckVisual();
StartCountDown();
//
var resList = new List<string>()
{
eventPartnerMineMainData.Icon,
};
resList.AddRange(eventPartnerMineMainData.Addressable);
CheckResource(resList);
}
private void AddEvents()
{
var rtService = GContext.container.Resolve<IRTService>();
_disposables = new CompositeDisposable()
{
rtService.OnEvent<EventPartnerGatherRequests.EventPartnerGatherPartnerEvt>(OnPartnerChange),
rtService.OnEvent<EventPartnerGatherRequests.EventPartnerGatherScoreEvt>(OnPartnerBuild)
};
GContext.OnEvent<EventPartnerGatherRefreshEvent>().Subscribe(OnRefreshByEvent).AddTo(_disposables);
}
private void RemoveEvent()
{
_disposables?.Dispose();
_disposables = null;
}
private async void OnPartnerChange(EventPartnerGatherRequests.EventPartnerGatherPartnerEvt e)
{
ELog($"OnPartnerChange evtType={e.EvtType}");
await Awaiters.NextFrame;
var partnerInfoManager = _gatherManager.PartnerInfoManager;
switch (e.EvtType)
{
case 0: //Invited
partnerInfoManager.AddRequestPartner(e.PartnerInfo);
break;
}
_redpointsInvite.gameObject.SetActive(_gatherManager.PartnerInfoManager.HasRequestPartners);
}
private async void OnPartnerBuild(EventPartnerGatherRequests.EventPartnerGatherScoreEvt e)
{
// 保证在主线程
await Awaiters.NextFrame;
ELog($"OnPartnerBuild partnerId={e.PartnerId} score={e.Score}");
var partnerInfoManager = _gatherManager.PartnerInfoManager;
var bRet = partnerInfoManager?.UpdatePartnerScore(e.PartnerId, e.Score) ?? false;
if (bRet)
{
_fxUIPartnerminingBtnUp?.gameObject.SetActive(partnerInfoManager.HasMoreScore);
}
}
private async void CheckVisual()
{
_gatherManager.LoadPlayFabData();
_ = await _gatherManager.GetEventDetail();
// if (ret)
{
_redpointsInvite.gameObject.SetActive(_gatherManager.PartnerInfoManager.HasRequestPartners);
_fxUIPartnerminingBtnUp.gameObject.SetActive(_gatherManager.PartnerInfoManager.HasMoreScore);
}
}
private void Start()
{
_btnEnter.onClick.AddListener(OnBtnEnter);
}
private void OnDisable()
{
RemoveEvent();
}
private void StartCountDown()
{
StopCountDown();
var timeSpan = _gatherManager.GetRemainingTime();
UpdateTimeDisplay(timeSpan);
var seconds = timeSpan.TotalSeconds;
_timer = this.AttachTimer((float)seconds, null,
elapsed =>
{
var now = _gatherManager.GetRemainingTime();
UpdateTimeDisplay(now);
if (now.TotalMilliseconds < 0)
{
OnCountDownFinished();
}
}, useRealTime: true);
}
private void UpdateTimeDisplay(TimeSpan timeSpan)
{
if (_textTime == null) return;
if (timeSpan.TotalMilliseconds > 0)
{
_textTime.text = ConvertTools.ConvertTime2(timeSpan.Days, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);
}
else
{
_textTime.text = LocalizationMgr.GetText("UI_EventRankPopupPanel_13");
}
}
private void StopCountDown()
{
_timer?.Cancel();
_timer = null;
}
private void OnCountDownFinished()
{
gameObject.SetActive(false);
StopCountDown();
}
private async void OnBtnEnter()
{
var dataRes = await LoadData();
if (!dataRes)
{
// Debug.Log($"<color=red>[EventPartner] LoadData Failed.</color>");
LogWarning("LoadDataFailed");
ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_107"));
return;
}
if (await LoadAssetBundle())
_gatherManager.EnterGatherScene();
else
{
var panel = await UIManager.Instance.ShowUI(UITypes.CloudTransitionPanel);
panel.GetComponent<CloudTransitionPanel>().SetBtn(true, () => _gatherManager.EnterGatherScene());
}
RemoveEvent();
// _gatherManager.SubscribeEvent();
// StartCountDown();
// _homeCanvasGroup.blocksRaycasts = true;
// 进入游戏场景
// _gatherManager.EnterGatherScene();
StopCountDown();
// 更新红点
// if (_redpoint)
// _redpoint.SetActive(false);
}
private async Task<bool> LoadAssetBundle()
{
// var _data = GContext.container.Resolve<EventPartnerData>();
var data = _gatherManager.EventPartnerMineMainData;
var loadResourceService = GContext.container.Resolve<ILoadResourceService>();
var isCurrentAssetLoaded = await loadResourceService.Loads(data.Addressable);
return isCurrentAssetLoaded;
}
private async Task<bool> LoadData()
{
// 注销掉前一个RtEvent
GContext.container.Resolve<EventPartnerData>().UnsubscribeRtEvent();
_gatherManager.LoadPlayFabData();
// var service = GContext.container.Resolve<EventPartnerService>();
// var resp = await service.GetEventDetail(_gatherManager.EventId);
return await _gatherManager.GetEventDetail(true);
}
private void OnRefreshByEvent(EventPartnerGatherRefreshEvent evt)
{
// 刷新显示
if (!_gatherManager.CheckOpen())
{
gameObject.SetActive(false);
}
}
// 刷新UI
private void OnAddScore(EventPartnerGatherPartnerAddScore evt)
{
ELog("OnAddScore");
_fxUIPartnerminingBtnUp?.gameObject.SetActive(_gatherManager.PartnerInfoManager.HasMoreScore);
}
protected override void OnDestroy()
{
base.OnDestroy();
if (_btnEnter != null)
_btnEnter.onClick.RemoveAllListeners();
StopCountDown();
_disposables?.Dispose();
_disposables = null;
}
private static void Log(object message)
{
Debug.Log($"<color=cyan>HomeBtnPartnerGather => {message}</color>");
}
private static void ELog(object message)
{
#if UNITY_EDITOR
Debug.Log($"<color=cyan>HomeBtnPartnerGather => {message}</color>");
#endif
}
private static void LogWarning(object message)
{
Debug.LogWarning($"<color=yellow>HomeBtnPartnerGather => {message}</color>");
}
private static void LogError(object message)
{
Debug.LogError($"<color=red>HomeBtnPartnerGather => {message}</color>");
}
protected override void OnLoadEventResource()
{
if (!_gatherManager.CheckOpen())
{
gameObject.SetActive(false);
return;
}
var eventPartnerMineMainData = _gatherManager.EventPartnerMineMainData;
if (eventPartnerMineMainData == null)
{
gameObject.SetActive(false);
return;
}
gameObject.SetActive(true);
var iconName = eventPartnerMineMainData.Icon;
if (_iconImage)
GContext.container.Resolve<IUIService>().SetImageSprite(_iconImage, iconName);
}
}