using UnityEngine; using UnityEngine.UI; using TMPro; /// /// 主菜单:实验类型选择 + 模式选择 + 固定方式选择。 /// 挂在主菜单场景的 Canvas 上。 /// public class MainMenu : MonoBehaviour { [Header("主标题")] [SerializeField] private TMP_Text _titleText; [Header("实验选择按钮 - 底部图标")] [SerializeField] private Button _btnCPR; [SerializeField] private Button _btnFracture; [SerializeField] private Button _btnSprain; [SerializeField] private Button _btnBleeding; [SerializeField] private Button _btnTransport; [Header("模式选择")] [SerializeField] private TMP_Text _tipText; [SerializeField] private Button _btnLearnMode; [SerializeField] private Button _btnExamMode; [SerializeField] private TMP_Text _selectedModeLabel; [Header("固定方式选择(仅骨折固定)")] [SerializeField] private GameObject _fixationPanel; [SerializeField] private Button _btnLimbFixation; [SerializeField] private Button _btnSplintFixation; [SerializeField] private TMP_Text _selectedFixationLabel; [Header("开始按钮")] [SerializeField] private Button _btnStart; [Header("提示")] [SerializeField] private TMP_Text _selectionTip; // 当前选择 private ExperimentType _selectedType = ExperimentType.FractureFixation; private ExperimentMode _selectedMode = ExperimentMode.Learn; private FixationMethod _selectedFixation = FixationMethod.LimbFixation; private void Start() { BindExperimentButtons(); _btnLearnMode?.onClick.AddListener(() => SelectMode(ExperimentMode.Learn)); _btnExamMode?.onClick.AddListener(() => SelectMode(ExperimentMode.Exam)); _btnLimbFixation?.onClick.AddListener(() => SelectFixation(FixationMethod.LimbFixation)); _btnSplintFixation?.onClick.AddListener(() => SelectFixation(FixationMethod.SplintFixation)); _btnStart?.onClick.AddListener(StartExperiment); // 默认选中骨折固定 SelectExperiment(ExperimentType.FractureFixation); SelectMode(ExperimentMode.Learn); SelectFixation(FixationMethod.LimbFixation); } private void BindExperimentButtons() { _btnCPR?.onClick.AddListener(() => SelectExperiment(ExperimentType.CPR)); _btnFracture?.onClick.AddListener(() => SelectExperiment(ExperimentType.FractureFixation)); _btnSprain?.onClick.AddListener(() => SelectExperiment(ExperimentType.SprainBandaging)); _btnBleeding?.onClick.AddListener(() => SelectExperiment(ExperimentType.BleedingBandaging)); _btnTransport?.onClick.AddListener(() => SelectExperiment(ExperimentType.CasualtyTransport)); } private void SelectExperiment(ExperimentType type) { _selectedType = type; // 骨折固定显示固定方式面板 bool isFracture = type == ExperimentType.FractureFixation; if (_fixationPanel != null) _fixationPanel.SetActive(isFracture); if (_selectionTip != null) _selectionTip.text = isFracture ? "Tip:请选择固定方式" : ""; UpdateStartButton(); } private void SelectMode(ExperimentMode mode) { _selectedMode = mode; if (_selectedModeLabel != null) _selectedModeLabel.text = mode == ExperimentMode.Learn ? "学习模式" : "考核模式"; UpdateStartButton(); } private void SelectFixation(FixationMethod fixation) { _selectedFixation = fixation; if (_selectedFixationLabel != null) _selectedFixationLabel.text = fixation == FixationMethod.LimbFixation ? "肢体固定" : "夹板固定"; UpdateStartButton(); } private void UpdateStartButton() { if (_btnStart == null) return; _btnStart.interactable = true; } private void StartExperiment() { var gm = GameManager.Instance; if (gm == null) { Debug.LogError("MainMenu: GameManager.Instance 为空!请确保场景中有 GameManager。"); return; } gm.CurrentExperimentType = _selectedType; gm.CurrentMode = _selectedMode; gm.CurrentFixationMethod = _selectedFixation; // 加载实验场景(所有实验共用一个场景,StepManager 根据配置区分) UnityEngine.SceneManagement.SceneManager.LoadScene("Experiment"); } }