340 lines
10 KiB
C#
340 lines
10 KiB
C#
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);
|
||
}
|
||
} |