feat: VFS 虚拟仿真实验核心框架 v2

- 加权评分系统:每步独立 ScoreWeight,满分 100,SequenceClick 按子项比例计分
- StepData 新增 DetailedContent(学习模式详细操作说明)和 SubStepCount
- 伤情检查步骤扩展为 5 子项序列(视觉检查→肿胀→疼痛→生命体征→神经评估)
- 夹板固定模式完整评分(选择夹板→放置衬垫→夹板固定→固定后检查)
- Doc/ 文件夹归档三份文档:项目大纲、文案、评分标准
- README 更新评分权重表和夹板固定流程
This commit is contained in:
yangbear
2026-06-24 02:07:43 +08:00
commit a11e003fcd
23 changed files with 2377 additions and 0 deletions
+117
View File
@@ -0,0 +1,117 @@
using UnityEngine;
using UnityEngine.UI;
using TMPro;
/// <summary>
/// 主菜单:实验类型选择 + 模式选择 + 固定方式选择。
/// 挂在主菜单场景的 Canvas 上。
/// </summary>
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");
}
}