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

340 lines
10 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 System.Runtime.InteropServices;
using System.Threading.Tasks;
using asap.core;
using DataCenter;
using game;
using GameCore;
using UniRx;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UI.PartnerGather.Mining;
public class EventPartnerGatherAct : AGameAct
{
//
private GameObject _miningScene;
// 好友界面
private GameObject _friendsUI;
// Spin 相关界面
private GameObject _drawUI;
private EventPartnerMiningSceneController _miningController;
private EventPartnerDrawMiningPanel _drawMiningPanel;
private EventPartnerGatherManager _gatherManager;
// UI组件缓存
private EventPartnerDrawMiningPanel _drawPanelComponent;
private Transform _friendsPanelComponent;
public override async Task<bool> StartAsync()
{
Log("StartAsync - Loading mining scene");
// 获取管理器
_gatherManager = GContext.container.Resolve<EventPartnerGatherManager>();
_gatherManager.SetGameAct(this);
await ShowUI();
// 加载挖矿场景
_miningScene = await Addressables.InstantiateAsync("EventPartnerMiningScene").Task;
// 初始化挖矿控制器
InitializeMiningController();
// 绑定UI与控制器关系
BindUIAndControllers();
// 初始化数据同步
InitializeDataSync();
// 显示UI
return await base.StartAsync();
}
private void InitializeMiningController()
{
Log("初始化挖矿场景控制器");
// 查找或添加挖矿场景控制器
_miningController = _miningScene.GetComponentInChildren<EventPartnerMiningSceneController>();
if (_miningController == null)
{
var controllerObject = _miningScene.transform.Find("MiningController");
if (controllerObject == null)
{
controllerObject = new GameObject("MiningController").transform;
controllerObject.SetParent(_miningScene.transform);
}
_miningController = controllerObject.gameObject.AddComponent<EventPartnerMiningSceneController>();
}
Log($"挖矿控制器初始化完成: {_miningController.name}");
}
/// <summary>
/// 绑定UI与控制器的关系
/// </summary>
private void BindUIAndControllers()
{
Log("开始绑定UI与控制器关系");
// 验证UI对象是否存在
if (_drawUI == null)
{
Log("错误: 抽奖UI对象为空无法进行组件绑定");
return;
}
// 获取UI组件
_drawPanelComponent = _drawUI.GetComponent<EventPartnerDrawMiningPanel>();
if (_drawPanelComponent == null)
{
Log("错误: 未找到EventPartnerDrawMiningPanel组件采集功能将不可用");
return;
}
// 1. 绑定采集场景与抽奖UI的关系
if (_miningController != null)
{
try
{
_drawPanelComponent.SetMiningScene(_miningController);
_miningController.SetUIPanel(_drawPanelComponent);
Log("✓ 抽奖UI与采集场景关系绑定成功");
}
catch (System.Exception ex)
{
Log($"错误: 绑定采集场景时发生异常: {ex.Message}");
}
}
else
{
Log("警告: 挖矿控制器为空,无法绑定场景关系");
}
// 2. 绑定管理器与各组件的关系
if (_gatherManager != null)
{
try
{
// 给管理器设置引用
_gatherManager.SetMiningController(_miningController);
_gatherManager.SetDrawPanel(_drawPanelComponent);
Log("✓ 管理器与组件关系绑定成功");
}
catch (System.Exception ex)
{
Log($"错误: 绑定管理器关系时发生异常: {ex.Message}");
}
}
else
{
Log("错误: EventPartnerGatherManager 为空,无法完成组件绑定");
}
// 3. 设置好友UI的事件绑定如果需要
SetupFriendsUIEvents();
// 4. 验证所有关键组件是否正确绑定
ValidateComponentBindings();
Log("所有UI与控制器关系绑定完成");
}
/// <summary>
/// 验证组件绑定是否正确
/// </summary>
private void ValidateComponentBindings()
{
bool allValid = true;
if (_drawPanelComponent == null)
{
Log("验证失败: 抽奖面板组件未正确绑定");
allValid = false;
}
if (_miningController == null)
{
Log("验证失败: 挖矿控制器未正确绑定");
allValid = false;
}
if (_gatherManager == null)
{
Log("验证失败: 采集管理器未正确绑定");
allValid = false;
}
if (allValid)
{
Log("✓ 所有关键组件绑定验证通过");
}
else
{
Log("⚠ 部分组件绑定验证失败,可能影响游戏功能");
}
}
/// <summary>
/// 初始化数据同步
/// </summary>
private void InitializeDataSync()
{
Log("初始化数据同步");
if (_gatherManager?.GatherData != null)
{
// 同步初始数据到UI
if (_drawPanelComponent != null)
{
var data = _gatherManager.GatherData;
_drawPanelComponent.SetPoints(data.CurrentPoints);
_drawPanelComponent.SetMiningProgress(data.CurrentMiningProgress);
_drawPanelComponent.SetTrainProgress(data.TrainProgress, _gatherManager.MaxTrainNodes);
}
}
}
/// <summary>
/// 设置好友UI的事件绑定
/// </summary>
private void SetupFriendsUIEvents()
{
// 如果好友UI有特殊事件需要绑定在这里处理
// 例如:点击进入挖矿按钮等
if (_friendsUI != null)
{
// TODO: 如果好友UI有特定组件需要绑定事件在这里处理
Log("好友UI事件绑定完成");
}
}
private async Task ShowUI()
{
// await Task.Delay(500);
_friendsUI = await UIManager.Instance.ShowUI(new UIType("EventPartnerMiningPanel"));
_drawUI = await UIManager.Instance.ShowUI(new UIType("EventPartnerDrawMiningPanel"));
_drawUI.SetActive(false); // 先隐藏掉
}
public override async Task StopAsync()
{
Log("StopAsync - 清理挖矿场景和组件关系");
// 清理组件关系
CleanupBindings();
// 清理场景
if (_miningScene != null)
{
Addressables.ReleaseInstance(_miningScene);
Destroy(_miningScene);
}
// 清理UI
UIManager.Instance.DestroyUI(new UIType("EventPartnerMiningPanel"));
UIManager.Instance.DestroyUI(new UIType("EventPartnerDrawMiningPanel"));
await Awaiters.NextFrame;
}
/// <summary>
/// 清理组件之间的绑定关系
/// </summary>
private void CleanupBindings()
{
Log("清理组件绑定关系");
// 清理抽奖UI关系
if (_drawPanelComponent != null)
{
_drawPanelComponent.SetMiningScene(null);
}
// 清理挖矿控制器关系
if (_miningController != null)
{
_miningController.SetUIPanel(null);
}
// 清理管理器关系
if (_gatherManager != null)
{
_gatherManager.SetMiningController(null);
_gatherManager.SetDrawPanel(null);
}
}
protected override void OnDestroy()
{
Log("销毁Act清理所有引用");
// 清理组件引用
_miningScene = null;
_miningController = null;
_drawPanelComponent = null;
_friendsPanelComponent = null;
// 清理管理器引用
if (_gatherManager != null)
{
_gatherManager.SetGameAct(null);
_gatherManager = null;
}
}
/// <summary>
/// 进入采集界面(从好友界面切换到抽奖界面)
/// </summary>
public void OnEnterGather()
{
Log("进入采集界面");
if (_friendsUI != null) _friendsUI.SetActive(false);
if (_drawUI != null) _drawUI.SetActive(true);
// 同步最新数据到UI
RefreshUIData();
}
/// <summary>
/// 刷新UI数据显示
/// </summary>
public void RefreshUIData()
{
if (_drawPanelComponent != null && _gatherManager?.GatherData != null)
{
var data = _gatherManager.GatherData;
_drawPanelComponent.SetPoints(data.CurrentPoints);
_drawPanelComponent.SetMiningProgress(data.CurrentMiningProgress);
_drawPanelComponent.SetTrainProgress(data.TrainProgress, _gatherManager.MaxTrainNodes);
Log("已刷新UI数据显示");
}
}
private static void Log(string message)
{
Debug.Log($"<color=cyan>EventPartnerGatherMiningAct => {message}</color>");
}
/// <summary>
/// 关闭事件退出到上一个Act
/// </summary>
public void OnCloseEvent()
{
Log("关闭事件准备退出Act");
// 发送退出事件
GContext.Publish(new UnloadActToNextAct());
}
/// <summary>
/// 获取挖矿控制器引用(供外部调用)
/// </summary>
public EventPartnerMiningSceneController GetMiningController()
{
return _miningController;
}
/// <summary>
/// 获取抽奖UI面板引用供外部调用
/// </summary>
public EventPartnerDrawMiningPanel GetDrawPanel()
{
return _drawPanelComponent;
}
}