using UnityEngine; using UnityEngine.UI; public class PageController : MonoBehaviour { [Header("=== 三个主页面 ===")] [SerializeField] private GameObject _homePagePanel; [SerializeField] private GameObject _modeSelectPanel; [SerializeField] private GameObject _fixationPanel; [Header("=== 实验页面 ===")] [SerializeField] private GameObject _experimentPanel; [SerializeField] private Button _btnExperimentBack; [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 = "考核评估模式:限定时间,完成后系统自动评分,并提供详细反馈报告。"; [Header("=== 编辑器预览(仅 Editor 模式有效)===")] [SerializeField] private EditorPreviewPage _editorPreview = EditorPreviewPage.None; public enum Page { Home, ModeSelect, Fixation, Experiment } public enum EditorPreviewPage { None, 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 (_btnExperimentBack != null) _btnExperimentBack.onClick.AddListener(OnExperimentBackClicked); // 初始化模式说明文字 if (_modeDescText != null) { _modeDescText.text = _practiceModeDesc + "\n\n" + _examModeDesc; } // 初始显示首页 ShowPage(Page.Home); } #if UNITY_EDITOR private void OnValidate() { if (Application.isPlaying) return; UnityEditor.EditorApplication.delayCall += () => { if (this == null) return; if (Application.isPlaying) return; switch (_editorPreview) { case EditorPreviewPage.None: break; case EditorPreviewPage.Home: ShowPageEditMode(Page.Home); break; case EditorPreviewPage.ModeSelect: ShowPageEditMode(Page.ModeSelect); break; case EditorPreviewPage.Fixation: ShowPageEditMode(Page.Fixation); break; case EditorPreviewPage.Experiment: ShowPageEditMode(Page.Experiment); break; } _editorPreview = EditorPreviewPage.None; }; } private void ShowPageEditMode(Page 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); if (_experimentPanel != null) _experimentPanel.SetActive(page == Page.Experiment); if (_uiManager != null) _uiManager.enabled = (page == Page.Experiment); Debug.Log($"PageController(编辑器预览): 切换到 [{page}]"); } #endif #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); if (_experimentPanel != null) _experimentPanel.SetActive(page == Page.Experiment); 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 OnExperimentBackClicked() { ShowPage(Page.Fixation); } 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(); } } public void ReturnToHome() { ShowPage(Page.Home); } #endregion }