Files
VFSUnity/Assets/Scripts/UI/PageController.cs
T
yangbear a6a7fd06d4 feat: WebGL打包配置 + UI页面系统完善
- WebGL Build: 全屏1920x1080,Build文件夹gitignore
- 导入Arial.ttf字体解决WebGL打包字体问题
- 修复PageController所有按钮绑定(BtnExamMode等)
- ModeSelectPanel添加ModeDesc描述文字
- 删除PageControllerEditor.cs(Editor脚本导致WebGL编译失败)
- 场景模型资源导入(Environment/playground)
2026-06-24 05:24:09 +08:00

162 lines
5.3 KiB
C#

using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 管理首页 -> 模式选择页 -> 固定方式选择页 -> 实验界面 的切换。
/// 挂在 Canvas 上,与 UIManager 协同工作。
/// </summary>
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<StepManager>();
if (stepManager != null)
{
stepManager.InitializeFromGameManager();
}
}
#endregion
}