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