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 StartAsync() { Log("StartAsync - Loading mining scene"); // 获取管理器 _gatherManager = GContext.container.Resolve(); _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(); 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(); } Log($"挖矿控制器初始化完成: {_miningController.name}"); } /// /// 绑定UI与控制器的关系 /// private void BindUIAndControllers() { Log("开始绑定UI与控制器关系"); // 验证UI对象是否存在 if (_drawUI == null) { Log("错误: 抽奖UI对象为空,无法进行组件绑定"); return; } // 获取UI组件 _drawPanelComponent = _drawUI.GetComponent(); 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与控制器关系绑定完成"); } /// /// 验证组件绑定是否正确 /// 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("⚠ 部分组件绑定验证失败,可能影响游戏功能"); } } /// /// 初始化数据同步 /// 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); } } } /// /// 设置好友UI的事件绑定 /// 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; } /// /// 清理组件之间的绑定关系 /// 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; } } /// /// 进入采集界面(从好友界面切换到抽奖界面) /// public void OnEnterGather() { Log("进入采集界面"); if (_friendsUI != null) _friendsUI.SetActive(false); if (_drawUI != null) _drawUI.SetActive(true); // 同步最新数据到UI RefreshUIData(); } /// /// 刷新UI数据显示 /// 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($"EventPartnerGatherMiningAct => {message}"); } /// /// 关闭事件,退出到上一个Act /// public void OnCloseEvent() { Log("关闭事件,准备退出Act"); // 发送退出事件 GContext.Publish(new UnloadActToNextAct()); } /// /// 获取挖矿控制器引用(供外部调用) /// public EventPartnerMiningSceneController GetMiningController() { return _miningController; } /// /// 获取抽奖UI面板引用(供外部调用) /// public EventPartnerDrawMiningPanel GetDrawPanel() { return _drawPanelComponent; } }