using UnityEngine; using UnityEngine.UI; /// /// 管理首页 -> 模式选择页 -> 固定方式选择页 -> 实验界面 的切换。 /// 挂在 Canvas 上,与 UIManager 协同工作。 /// public class PageController : MonoBehaviour { [Header("=== 三个主页面 ===")] [SerializeField] private GameObject _homePagePanel; [SerializeField] private GameObject _modeSelectPanel; [SerializeField] private GameObject _fixationPanel; [Header("=== 实验内 UI(由 UIManager 管理)===")] [SerializeField] private UIManager _uiManager; [Header("=== 首页控件 ===")] [SerializeField] private Button _btnStart; [SerializeField] private Button _btnExit; [Header("=== 模式选择页控件 ===")] [SerializeField] private Button _btnBack; [SerializeField] private Button _btnPracticeMode; [SerializeField] private Button _btnExamMode; [SerializeField] private Text _modeDescText; [Header("=== 固定方式选择页控件 ===")] [SerializeField] private Button _btnFixationBack; [SerializeField] private Button _btnLimbFixation; [SerializeField] private Button _btnSplintFixation; [Header("=== 模式说明文案 ===")] [SerializeField] [TextArea(2, 4)] private string _practiceModeDesc = "● 模拟练习模式:不限时长,可反复练习。系统不评分,帮助您熟悉实验流程和操作步骤。"; [SerializeField] [TextArea(2, 4)] private string _examModeDesc = "● 考核评估模式:限定时间,完成后系统自动评分,并提供详细反馈报告。"; private enum Page { Home, ModeSelect, Fixation, Experiment } private Page _currentPage = Page.Home; private ExperimentMode _selectedMode = ExperimentMode.Learn; private void Start() { // 绑定首页按钮 if (_btnStart != null) _btnStart.onClick.AddListener(OnStartClicked); if (_btnExit != null) _btnExit.onClick.AddListener(OnExitClicked); // 绑定模式选择页按钮 if (_btnBack != null) _btnBack.onClick.AddListener(OnModeBackClicked); if (_btnPracticeMode != null) _btnPracticeMode.onClick.AddListener(() => OnModeSelected(ExperimentMode.Learn)); if (_btnExamMode != null) _btnExamMode.onClick.AddListener(() => OnModeSelected(ExperimentMode.Exam)); // 绑定固定方式选择页按钮 if (_btnFixationBack != null) _btnFixationBack.onClick.AddListener(OnFixationBackClicked); if (_btnLimbFixation != null) _btnLimbFixation.onClick.AddListener(() => OnFixationSelected(FixationMethod.LimbFixation)); if (_btnSplintFixation != null) _btnSplintFixation.onClick.AddListener(() => OnFixationSelected(FixationMethod.SplintFixation)); // 初始化模式说明文字 if (_modeDescText != null) { _modeDescText.text = _practiceModeDesc + "\n\n" + _examModeDesc; } // 初始显示首页 ShowPage(Page.Home); } #region 页面切换 private void ShowPage(Page page) { _currentPage = page; if (_homePagePanel != null) _homePagePanel.SetActive(page == Page.Home); if (_modeSelectPanel != null) _modeSelectPanel.SetActive(page == Page.ModeSelect); if (_fixationPanel != null) _fixationPanel.SetActive(page == Page.Fixation); // 实验内界面:隐藏所有实验 UI,等模式确定后再由 UIManager 激活 if (_uiManager != null) _uiManager.enabled = (page == Page.Experiment); } #endregion #region 按钮回调 private void OnStartClicked() { ShowPage(Page.ModeSelect); } private void OnExitClicked() { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else Application.Quit(); #endif } // 模式选择页 -> 返回首页 private void OnModeBackClicked() { ShowPage(Page.Home); } // 选择模式后 -> 进入固定方式选择页 private void OnModeSelected(ExperimentMode mode) { _selectedMode = mode; // 更新说明文案显示当前选择 if (_modeDescText != null) { _modeDescText.text = mode == ExperimentMode.Learn ? _practiceModeDesc + "\n\n✓ 当前已选择「模拟练习模式」" : _examModeDesc + "\n\n✓ 当前已选择「考核评估模式」"; } ShowPage(Page.Fixation); } // 固定方式选择页 -> 返回模式选择页 private void OnFixationBackClicked() { // 恢复原始说明文案 if (_modeDescText != null) { _modeDescText.text = _practiceModeDesc + "\n\n" + _examModeDesc; } ShowPage(Page.ModeSelect); } // 选择固定方式后 -> 进入实验 private void OnFixationSelected(FixationMethod method) { var gm = GameManager.Instance; if (gm == null) { Debug.LogError("PageController: GameManager.Instance 为空!"); return; } gm.CurrentMode = _selectedMode; gm.CurrentFixationMethod = method; // 切换到实验界面 ShowPage(Page.Experiment); // 启动实验流程 var stepManager = FindObjectOfType(); if (stepManager != null) { stepManager.InitializeFromGameManager(); } } #endregion }