2026-06-24 05:24:09 +08:00
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using UnityEngine.UI;
|
|
|
|
|
|
|
|
|
|
|
|
public class PageController : MonoBehaviour
|
|
|
|
|
|
{
|
|
|
|
|
|
[Header("=== 三个主页面 ===")]
|
|
|
|
|
|
[SerializeField] private GameObject _homePagePanel;
|
|
|
|
|
|
[SerializeField] private GameObject _modeSelectPanel;
|
|
|
|
|
|
[SerializeField] private GameObject _fixationPanel;
|
|
|
|
|
|
|
2026-06-25 04:55:41 +08:00
|
|
|
|
[Header("=== 实验页面 ===")]
|
|
|
|
|
|
[SerializeField] private GameObject _experimentPanel;
|
|
|
|
|
|
[SerializeField] private Button _btnExperimentBack;
|
|
|
|
|
|
|
2026-06-24 05:24:09 +08:00
|
|
|
|
[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 =
|
2026-06-25 04:55:41 +08:00
|
|
|
|
"模拟练习模式:不限时长,可反复练习。系统不评分,帮助您熟悉实验流程和操作步骤。";
|
2026-06-24 05:24:09 +08:00
|
|
|
|
[SerializeField] [TextArea(2, 4)] private string _examModeDesc =
|
2026-06-25 04:55:41 +08:00
|
|
|
|
"考核评估模式:限定时间,完成后系统自动评分,并提供详细反馈报告。";
|
2026-06-24 05:24:09 +08:00
|
|
|
|
|
2026-06-24 06:05:55 +08:00
|
|
|
|
[Header("=== 编辑器预览(仅 Editor 模式有效)===")]
|
|
|
|
|
|
[SerializeField] private EditorPreviewPage _editorPreview = EditorPreviewPage.None;
|
|
|
|
|
|
|
|
|
|
|
|
public enum Page { Home, ModeSelect, Fixation, Experiment }
|
|
|
|
|
|
public enum EditorPreviewPage { None, Home, ModeSelect, Fixation, Experiment }
|
|
|
|
|
|
|
2026-06-24 05:24:09 +08:00
|
|
|
|
private Page _currentPage = Page.Home;
|
|
|
|
|
|
private ExperimentMode _selectedMode = ExperimentMode.Learn;
|
2026-07-12 12:17:06 +08:00
|
|
|
|
private int _lastReturnHomeFrame = -1;
|
2026-06-24 05:24:09 +08:00
|
|
|
|
|
|
|
|
|
|
private void Start()
|
|
|
|
|
|
{
|
2026-06-27 13:25:58 +08:00
|
|
|
|
Debug.Log("=== PageController 初始化开始 ===");
|
|
|
|
|
|
|
2026-07-08 09:38:42 +08:00
|
|
|
|
// 一开始就隐藏鞋子,以免在主页或开场动画时穿帮
|
|
|
|
|
|
HideShose();
|
|
|
|
|
|
|
2026-07-01 21:56:12 +08:00
|
|
|
|
// 关掉多余AudioListener(只留Main Camera的)
|
|
|
|
|
|
var cam2 = GameObject.Find("camera2"); if (cam2 != null) { var al = cam2.GetComponent<AudioListener>(); if (al != null) al.enabled = false; }
|
|
|
|
|
|
var cam3 = GameObject.Find("camera3"); if (cam3 != null) { var al = cam3.GetComponent<AudioListener>(); if (al != null) al.enabled = false; }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
AutoAssignButtonsByName();
|
|
|
|
|
|
|
2026-06-24 05:24:09 +08:00
|
|
|
|
// 绑定首页按钮
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (_btnStart != null) { _btnStart.onClick.RemoveAllListeners(); _btnStart.onClick.AddListener(OnStartClicked); Debug.Log("PageController: _btnStart 绑定成功"); }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
else Debug.LogError("PageController: _btnStart 未赋值!");
|
2026-06-27 13:25:58 +08:00
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (_btnExit != null) { _btnExit.onClick.RemoveAllListeners(); _btnExit.onClick.AddListener(OnExitClicked); Debug.Log("PageController: _btnExit 绑定成功"); }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
else Debug.LogError("PageController: _btnExit 未赋值!");
|
2026-06-24 05:24:09 +08:00
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (_btnBack != null) { _btnBack.onClick.RemoveAllListeners(); _btnBack.onClick.AddListener(OnModeBackClicked); Debug.Log("PageController: _btnBack 绑定成功"); }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
else Debug.LogError("PageController: _btnBack 未赋值!");
|
2026-06-27 13:25:58 +08:00
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (_btnPracticeMode != null) { _btnPracticeMode.onClick.RemoveAllListeners(); _btnPracticeMode.onClick.AddListener(() => OnModeSelected(ExperimentMode.Learn)); Debug.Log("PageController: _btnPracticeMode 绑定成功"); }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
else Debug.LogError("PageController: _btnPracticeMode 未赋值!");
|
2026-06-24 05:24:09 +08:00
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (_btnExamMode != null) { _btnExamMode.onClick.RemoveAllListeners(); _btnExamMode.onClick.AddListener(() => OnModeSelected(ExperimentMode.Exam)); Debug.Log("PageController: _btnExamMode 绑定成功"); }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
else Debug.LogError("PageController: _btnExamMode 未赋值!");
|
2026-06-24 05:24:09 +08:00
|
|
|
|
|
2026-06-30 23:42:26 +08:00
|
|
|
|
if (_btnFixationBack == null && _fixationPanel != null) { var fb = _fixationPanel.transform.Find("BtnBack"); if (fb != null) { _btnFixationBack = fb.GetComponent<Button>(); Debug.Log("PageController: 自动绑定 FixationPanel/BtnBack"); } }
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (_btnFixationBack != null) { _btnFixationBack.onClick.RemoveAllListeners(); _btnFixationBack.onClick.AddListener(OnFixationBackClicked); Debug.Log("PageController: _btnFixationBack 绑定成功"); }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
else Debug.LogError("PageController: _btnFixationBack 未找到!");
|
2026-06-27 13:25:58 +08:00
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (_btnLimbFixation != null) { _btnLimbFixation.onClick.RemoveAllListeners(); _btnLimbFixation.onClick.AddListener(() => OnFixationSelected(FixationMethod.LimbFixation)); Debug.Log("PageController: _btnLimbFixation 绑定成功"); }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
else Debug.LogError("PageController: _btnLimbFixation 未赋值!");
|
2026-06-27 13:25:58 +08:00
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (_btnSplintFixation != null) { _btnSplintFixation.onClick.RemoveAllListeners(); _btnSplintFixation.onClick.AddListener(() => OnFixationSelected(FixationMethod.SplintFixation)); Debug.Log("PageController: _btnSplintFixation 绑定成功"); }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
else Debug.LogError("PageController: _btnSplintFixation 未赋值!");
|
2026-06-27 13:25:58 +08:00
|
|
|
|
|
2026-06-30 23:42:26 +08:00
|
|
|
|
if (_btnExperimentBack == null && _experimentPanel != null) { var eb = _experimentPanel.transform.Find("Navbar/BtnBack"); if (eb != null) { _btnExperimentBack = eb.GetComponent<Button>(); Debug.Log("PageController: 自动绑定 ExperimentPanel/Navbar/BtnBack"); } }
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (_btnExperimentBack != null) { _btnExperimentBack.onClick.RemoveAllListeners(); _btnExperimentBack.onClick.AddListener(OnExperimentBackClicked); Debug.Log("PageController: _btnExperimentBack 绑定成功"); }
|
2026-06-30 23:42:26 +08:00
|
|
|
|
else Debug.LogError("PageController: _btnExperimentBack 未找到!");
|
2026-06-25 04:55:41 +08:00
|
|
|
|
|
2026-06-24 05:24:09 +08:00
|
|
|
|
ShowPage(Page.Home);
|
2026-06-27 13:25:58 +08:00
|
|
|
|
Debug.Log("=== PageController 初始化完成 ===");
|
2026-06-24 05:24:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
private void AutoAssignButtonsByName()
|
|
|
|
|
|
{
|
|
|
|
|
|
_btnStart = FindChildButton(_homePagePanel, "BtnStart", _btnStart);
|
|
|
|
|
|
_btnExit = FindChildButton(_homePagePanel, "BtnExit", _btnExit);
|
|
|
|
|
|
_btnBack = FindChildButton(_modeSelectPanel, "BtnBack", _btnBack);
|
|
|
|
|
|
_btnPracticeMode = FindChildButton(_modeSelectPanel, "BtnPracticeMode", _btnPracticeMode);
|
|
|
|
|
|
_btnExamMode = FindChildButton(_modeSelectPanel, "BtnExamMode", _btnExamMode);
|
|
|
|
|
|
_btnFixationBack = FindChildButton(_fixationPanel, "BtnBack", _btnFixationBack);
|
|
|
|
|
|
_btnLimbFixation = FindChildButton(_fixationPanel, "BtnLimbFixation", _btnLimbFixation);
|
|
|
|
|
|
_btnSplintFixation = FindChildButton(_fixationPanel, "BtnSplintFixation", _btnSplintFixation);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Button FindChildButton(GameObject parent, string buttonName, Button fallback)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (parent == null) return fallback;
|
|
|
|
|
|
|
|
|
|
|
|
var buttons = parent.GetComponentsInChildren<Button>(true);
|
|
|
|
|
|
foreach (var button in buttons)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (button != null && button.name == buttonName)
|
|
|
|
|
|
return button;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return fallback;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
private void Update()
|
2026-06-24 06:05:55 +08:00
|
|
|
|
{
|
2026-07-12 06:59:39 +08:00
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
|
if (!Application.isPlaying)
|
2026-06-24 06:05:55 +08:00
|
|
|
|
{
|
2026-07-12 06:59:39 +08:00
|
|
|
|
if (_editorPreview != EditorPreviewPage.None)
|
2026-06-24 06:05:55 +08:00
|
|
|
|
{
|
2026-07-12 06:59:39 +08:00
|
|
|
|
Page targetPage = (Page)((int)_editorPreview - 1);
|
|
|
|
|
|
ShowPage(targetPage);
|
2026-06-24 06:05:55 +08:00
|
|
|
|
}
|
2026-07-12 06:59:39 +08:00
|
|
|
|
}
|
2026-06-24 06:05:55 +08:00
|
|
|
|
#endif
|
2026-07-12 06:59:39 +08:00
|
|
|
|
}
|
2026-06-24 05:24:09 +08:00
|
|
|
|
|
2026-06-25 04:55:41 +08:00
|
|
|
|
private void ShowPage(Page page)
|
2026-06-24 05:24:09 +08:00
|
|
|
|
{
|
|
|
|
|
|
_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);
|
2026-06-25 04:55:41 +08:00
|
|
|
|
if (_experimentPanel != null) _experimentPanel.SetActive(page == Page.Experiment);
|
2026-06-27 13:25:58 +08:00
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
if (page == Page.ModeSelect && _modeDescText != null)
|
|
|
|
|
|
_modeDescText.text = "";
|
2026-07-12 12:17:06 +08:00
|
|
|
|
|
|
|
|
|
|
var audioManager = FindObjectOfType<AudioManager>();
|
|
|
|
|
|
if (audioManager != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (page == Page.Experiment) audioManager.PlayExperimentBg();
|
|
|
|
|
|
else audioManager.PlayHomeBg();
|
|
|
|
|
|
}
|
2026-07-12 06:59:39 +08:00
|
|
|
|
|
|
|
|
|
|
Debug.Log($"PageController: 页面切换 -> [{page}]");
|
2026-06-29 20:25:57 +08:00
|
|
|
|
}
|
2026-06-24 05:24:09 +08:00
|
|
|
|
|
|
|
|
|
|
#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;
|
2026-07-12 06:59:39 +08:00
|
|
|
|
if (_modeDescText != null)
|
|
|
|
|
|
_modeDescText.text = (mode == ExperimentMode.Learn) ? _practiceModeDesc : _examModeDesc;
|
|
|
|
|
|
|
|
|
|
|
|
GameManager.Instance.CurrentMode = mode;
|
|
|
|
|
|
GameManager.Instance.CurrentExperimentType = ExperimentType.FractureFixation;
|
2026-06-24 05:24:09 +08:00
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
if (mode == ExperimentMode.Learn)
|
|
|
|
|
|
{
|
|
|
|
|
|
var examFlow = FindObjectOfType<ExamFlowManager>();
|
|
|
|
|
|
if (examFlow != null) examFlow.StopExam();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-24 05:24:09 +08:00
|
|
|
|
ShowPage(Page.Fixation);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OnFixationBackClicked()
|
|
|
|
|
|
{
|
|
|
|
|
|
ShowPage(Page.ModeSelect);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OnFixationSelected(FixationMethod method)
|
|
|
|
|
|
{
|
2026-07-12 06:59:39 +08:00
|
|
|
|
GameManager.Instance.CurrentFixationMethod = method;
|
2026-06-24 05:24:09 +08:00
|
|
|
|
|
2026-06-29 20:25:57 +08:00
|
|
|
|
var openingFlow = FindObjectOfType<OpeningFlowController>();
|
|
|
|
|
|
if (openingFlow != null)
|
2026-06-24 05:24:09 +08:00
|
|
|
|
{
|
2026-07-12 06:59:39 +08:00
|
|
|
|
ShowPage(Page.Experiment);
|
|
|
|
|
|
openingFlow.PlayOpeningFlow(() =>
|
2026-06-29 20:25:57 +08:00
|
|
|
|
{
|
2026-07-12 06:59:39 +08:00
|
|
|
|
if (_uiManager != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_uiManager.gameObject.SetActive(true);
|
|
|
|
|
|
}
|
2026-06-29 20:25:57 +08:00
|
|
|
|
|
|
|
|
|
|
var stepManager = FindObjectOfType<StepManager>();
|
|
|
|
|
|
if (stepManager != null)
|
|
|
|
|
|
{
|
2026-07-12 06:59:39 +08:00
|
|
|
|
stepManager.InitializeFromGameManager();
|
2026-06-29 20:25:57 +08:00
|
|
|
|
}
|
2026-07-12 06:59:39 +08:00
|
|
|
|
StartCoroutine(StartInitialVoiceAndCameraRoutine());
|
2026-06-29 20:25:57 +08:00
|
|
|
|
});
|
2026-06-27 13:25:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2026-06-29 20:25:57 +08:00
|
|
|
|
ShowPage(Page.Experiment);
|
2026-07-12 06:59:39 +08:00
|
|
|
|
if (_uiManager != null) _uiManager.gameObject.SetActive(true);
|
2026-06-29 20:25:57 +08:00
|
|
|
|
|
|
|
|
|
|
var stepManager = FindObjectOfType<StepManager>();
|
2026-07-12 06:59:39 +08:00
|
|
|
|
if (stepManager != null) stepManager.InitializeFromGameManager();
|
|
|
|
|
|
StartCoroutine(StartInitialVoiceAndCameraRoutine());
|
2026-06-24 05:24:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-12 20:34:49 +08:00
|
|
|
|
private void StartExamFlowIfNeeded()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GameManager.Instance == null) return;
|
|
|
|
|
|
if (GameManager.Instance.CurrentMode != ExperimentMode.Exam) return;
|
|
|
|
|
|
if (GameManager.Instance.CurrentFixationMethod != FixationMethod.LimbFixation) return;
|
|
|
|
|
|
|
|
|
|
|
|
var examFlow = FindObjectOfType<ExamFlowManager>();
|
|
|
|
|
|
if (examFlow != null) examFlow.BeginExam();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
private void OnExperimentBackClicked()
|
2026-06-30 02:19:13 +08:00
|
|
|
|
{
|
2026-07-12 06:59:39 +08:00
|
|
|
|
ReturnToHome();
|
2026-06-30 23:42:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-25 04:37:45 +08:00
|
|
|
|
public void ReturnToHome()
|
|
|
|
|
|
{
|
2026-07-12 12:17:06 +08:00
|
|
|
|
if (_lastReturnHomeFrame == Time.frameCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("PageController: 返回首页已在本帧执行,跳过重复调用");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_lastReturnHomeFrame = Time.frameCount;
|
|
|
|
|
|
Debug.Log("PageController: 返回首页,开始完整复位流程");
|
|
|
|
|
|
|
|
|
|
|
|
StopAllCoroutines();
|
|
|
|
|
|
ActionHistory.Clear();
|
|
|
|
|
|
|
|
|
|
|
|
if (_uiManager != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
_uiManager.HideVideo();
|
|
|
|
|
|
_uiManager.HideEndPanel();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
HideCanvasPanel("VideoPanel");
|
|
|
|
|
|
HideCanvasPanel("EndPanel");
|
|
|
|
|
|
HideCanvasPanel("DialogueBubble");
|
|
|
|
|
|
HideCanvasPanel("GradeResult");
|
|
|
|
|
|
HideCanvasPanel("TipPanel");
|
2026-06-30 02:19:13 +08:00
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
// --- 核心修复:退出时彻底清理并隐藏所有交互物体 ---
|
2026-07-12 12:17:06 +08:00
|
|
|
|
foreach (var handler in GetSceneObjectsOfType<PingClickHandler>())
|
2026-07-08 09:38:42 +08:00
|
|
|
|
{
|
2026-07-12 12:17:06 +08:00
|
|
|
|
handler.ResetState(false);
|
|
|
|
|
|
handler.ForceHideOutline();
|
|
|
|
|
|
handler.gameObject.SetActive(false);
|
|
|
|
|
|
Debug.Log($"PageController: 已隐藏 Ping {handler.name}");
|
2026-07-08 09:38:42 +08:00
|
|
|
|
}
|
2026-07-12 12:17:06 +08:00
|
|
|
|
|
|
|
|
|
|
foreach (var handler in GetSceneObjectsOfType<ChanraoTuibuHandler>())
|
2026-07-08 09:38:42 +08:00
|
|
|
|
{
|
2026-07-12 12:17:06 +08:00
|
|
|
|
handler.ResetState(false);
|
|
|
|
|
|
handler.ForceHideOutline();
|
|
|
|
|
|
handler.gameObject.SetActive(false);
|
|
|
|
|
|
Debug.Log($"PageController: 已隐藏 ChanraoTuibu {handler.name}");
|
2026-07-08 09:38:42 +08:00
|
|
|
|
}
|
2026-07-12 12:17:06 +08:00
|
|
|
|
|
|
|
|
|
|
HideSceneObjectsByNamePrefix("chanrao");
|
|
|
|
|
|
|
|
|
|
|
|
// 找到 Shose 重置并彻底隐藏
|
|
|
|
|
|
var shose = FindSceneObject("Shose");
|
2026-07-08 09:38:42 +08:00
|
|
|
|
if (shose != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var h = shose.GetComponent<ShoseClickHandler>();
|
2026-07-12 12:17:06 +08:00
|
|
|
|
if (h != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
h.ResetState(false);
|
|
|
|
|
|
h.ForceHideOutline();
|
|
|
|
|
|
}
|
2026-07-12 06:59:39 +08:00
|
|
|
|
|
|
|
|
|
|
// 关键:返回主页时,必须禁用点击组件,并隐藏物体
|
|
|
|
|
|
if (h != null) h.enabled = false;
|
|
|
|
|
|
shose.SetActive(false);
|
2026-07-12 12:17:06 +08:00
|
|
|
|
Debug.Log("PageController: 已隐藏 Shose");
|
2026-07-08 09:38:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
// 把 touchArray 里的点也关掉
|
|
|
|
|
|
var touchArray = GameObject.Find("touchArray");
|
|
|
|
|
|
if (touchArray != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (Transform t in touchArray.transform)
|
|
|
|
|
|
{
|
2026-07-12 12:17:06 +08:00
|
|
|
|
var point2Handler = t.GetComponent<Point2ClickHandler>();
|
|
|
|
|
|
if (point2Handler != null) point2Handler.ResetState(false);
|
2026-07-12 06:59:39 +08:00
|
|
|
|
t.gameObject.SetActive(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-07-12 12:17:06 +08:00
|
|
|
|
|
|
|
|
|
|
var woman = GameObject.Find("woman");
|
|
|
|
|
|
if (woman != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var anim = woman.GetComponent<Animator>();
|
|
|
|
|
|
if (anim != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
anim.SetBool("IsCheck", false);
|
|
|
|
|
|
anim.SetBool("isCrouch", false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var manInjury = GameObject.Find("manInjury");
|
|
|
|
|
|
if (manInjury != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var anim = manInjury.GetComponent<Animator>();
|
|
|
|
|
|
if (anim != null) anim.SetBool("CheckFoot", false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var audioManager = FindObjectOfType<AudioManager>();
|
|
|
|
|
|
if (audioManager != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
audioManager.StopVoice();
|
|
|
|
|
|
audioManager.StopSfx();
|
|
|
|
|
|
audioManager.ResetCamerasToHome();
|
|
|
|
|
|
}
|
2026-07-12 06:59:39 +08:00
|
|
|
|
// ------------------------------------------------
|
|
|
|
|
|
|
2026-06-25 04:37:45 +08:00
|
|
|
|
ShowPage(Page.Home);
|
2026-07-12 12:17:06 +08:00
|
|
|
|
Debug.Log("PageController: 返回首页复位完成");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void HideCanvasPanel(string panelName)
|
|
|
|
|
|
{
|
|
|
|
|
|
var panel = FindSceneObject(panelName);
|
|
|
|
|
|
if (panel != null) panel.SetActive(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private GameObject FindSceneObject(string objectName)
|
|
|
|
|
|
{
|
|
|
|
|
|
var found = GameObject.Find(objectName);
|
|
|
|
|
|
if (found != null) return found;
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var t in Resources.FindObjectsOfTypeAll<Transform>())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (t == null || !t.gameObject.scene.IsValid()) continue;
|
|
|
|
|
|
if (t.name == objectName) return t.gameObject;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private T[] GetSceneObjectsOfType<T>() where T : Component
|
|
|
|
|
|
{
|
|
|
|
|
|
var all = Resources.FindObjectsOfTypeAll<T>();
|
|
|
|
|
|
var list = new System.Collections.Generic.List<T>();
|
|
|
|
|
|
foreach (var item in all)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item == null || !item.gameObject.scene.IsValid()) continue;
|
|
|
|
|
|
list.Add(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
return list.ToArray();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void HideSceneObjectsByNamePrefix(string prefix)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var t in Resources.FindObjectsOfTypeAll<Transform>())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (t == null || !t.gameObject.scene.IsValid()) continue;
|
|
|
|
|
|
if (!t.name.StartsWith(prefix, System.StringComparison.OrdinalIgnoreCase)) continue;
|
|
|
|
|
|
t.gameObject.SetActive(false);
|
|
|
|
|
|
Debug.Log($"PageController: 已隐藏残留对象 {t.name}");
|
|
|
|
|
|
}
|
2026-06-25 04:37:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-08 09:38:42 +08:00
|
|
|
|
private System.Collections.IEnumerator StartInitialVoiceAndCameraRoutine()
|
|
|
|
|
|
{
|
|
|
|
|
|
float waitTime = 1f; // 默认等1秒
|
|
|
|
|
|
var am = FindObjectOfType<AudioManager>();
|
|
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
// 隐藏视频面板
|
2026-07-10 04:41:26 +08:00
|
|
|
|
var allT = Resources.FindObjectsOfTypeAll<Transform>();
|
|
|
|
|
|
foreach (var t in allT)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (t.name == "VideoPanel" && t.parent != null && t.parent.name == "Canvas")
|
|
|
|
|
|
{
|
|
|
|
|
|
t.gameObject.SetActive(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
// 找鞋子
|
2026-07-12 12:17:06 +08:00
|
|
|
|
var shose = FindSceneObject("Shose");
|
2026-07-11 04:50:21 +08:00
|
|
|
|
|
2026-07-11 05:06:16 +08:00
|
|
|
|
var point2 = GameObject.Find("touchArray/point2");
|
2026-07-11 04:50:21 +08:00
|
|
|
|
if (point2 == null)
|
|
|
|
|
|
{
|
2026-07-11 05:06:16 +08:00
|
|
|
|
var touchArray = GameObject.Find("touchArray");
|
|
|
|
|
|
if (touchArray != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var p2 = touchArray.transform.Find("point2");
|
|
|
|
|
|
if (p2 != null) point2 = p2.gameObject;
|
|
|
|
|
|
}
|
2026-07-11 04:50:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-08 09:38:42 +08:00
|
|
|
|
if (shose != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var h = shose.GetComponent<ShoseClickHandler>();
|
|
|
|
|
|
if (h == null) h = shose.AddComponent<ShoseClickHandler>();
|
|
|
|
|
|
h.targetPoint = GameObject.Find("ShosePoint")?.transform;
|
2026-07-11 05:52:25 +08:00
|
|
|
|
|
2026-07-12 12:17:06 +08:00
|
|
|
|
var ping004 = FindFirstPingStepObject();
|
2026-07-11 05:52:25 +08:00
|
|
|
|
h.nextObject = ping004;
|
|
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
// 鞋子出现,但默认不开组件(不可点击)
|
2026-07-11 05:15:23 +08:00
|
|
|
|
h.enabled = false;
|
2026-07-11 05:21:23 +08:00
|
|
|
|
shose.SetActive(true);
|
2026-07-11 04:50:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (point2 != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var oldHandler = point2.GetComponent<TouchPositionHandler>();
|
|
|
|
|
|
if (oldHandler != null) Destroy(oldHandler);
|
|
|
|
|
|
|
|
|
|
|
|
var h2 = point2.GetComponent<Point2ClickHandler>();
|
|
|
|
|
|
if (h2 == null) h2 = point2.AddComponent<Point2ClickHandler>();
|
|
|
|
|
|
if (h2.nextObject == null) h2.nextObject = shose;
|
|
|
|
|
|
|
2026-07-11 05:15:23 +08:00
|
|
|
|
point2.SetActive(false);
|
2026-07-08 09:38:42 +08:00
|
|
|
|
}
|
2026-07-01 21:18:34 +08:00
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
// 1. 强制播放第一句语音
|
2026-07-08 09:38:42 +08:00
|
|
|
|
if (am != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
|
var autoClip = UnityEditor.AssetDatabase.LoadAssetAtPath<AudioClip>("Assets/Audio/people/周围环境安全,我是救护志愿者,我可以帮助您吗.mp3");
|
|
|
|
|
|
if (autoClip != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
am.PlayVoice(autoClip);
|
|
|
|
|
|
waitTime = autoClip.length + 1f;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Debug.Log($"PageController: 开始等待 {waitTime} 秒以切换摄像机并激活鞋子");
|
2026-07-10 02:51:52 +08:00
|
|
|
|
|
2026-07-10 23:58:43 +08:00
|
|
|
|
var tipPanel = GameObject.Find("TipPanel");
|
|
|
|
|
|
if (tipPanel == null)
|
|
|
|
|
|
{
|
2026-07-12 06:59:39 +08:00
|
|
|
|
foreach(var t in allT) { if (t.name == "TipPanel") { tipPanel = t.gameObject; break; } }
|
2026-07-10 23:58:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
if (tipPanel != null) tipPanel.SetActive(true);
|
|
|
|
|
|
|
2026-07-08 09:38:42 +08:00
|
|
|
|
yield return new WaitForSeconds(waitTime);
|
|
|
|
|
|
|
2026-07-10 23:58:43 +08:00
|
|
|
|
if (tipPanel != null) tipPanel.SetActive(false);
|
2026-07-08 09:38:42 +08:00
|
|
|
|
if (am != null) am.SwitchToCamera3();
|
2026-07-11 05:15:23 +08:00
|
|
|
|
|
|
|
|
|
|
if (point2 != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
point2.SetActive(true);
|
|
|
|
|
|
Debug.Log("PageController: 镜头切换到camera3,point2 已显示");
|
|
|
|
|
|
}
|
2026-07-12 20:34:49 +08:00
|
|
|
|
|
|
|
|
|
|
StartExamFlowIfNeeded();
|
2026-07-08 09:38:42 +08:00
|
|
|
|
}
|
2026-07-01 21:18:34 +08:00
|
|
|
|
|
2026-07-08 09:38:42 +08:00
|
|
|
|
private void HideShose()
|
|
|
|
|
|
{
|
2026-07-12 12:17:06 +08:00
|
|
|
|
var shose = FindSceneObject("Shose");
|
2026-07-08 09:38:42 +08:00
|
|
|
|
if (shose != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
shose.SetActive(false);
|
|
|
|
|
|
}
|
2026-07-01 21:18:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-12 12:17:06 +08:00
|
|
|
|
private GameObject FindFirstPingStepObject()
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var ping in GetSceneObjectsOfType<PingClickHandler>())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (ping != null && ping.name == "ping.004") return ping.gameObject;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var ping in GetSceneObjectsOfType<PingClickHandler>())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (ping != null && ping.pingIndex == 0) return ping.gameObject;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-08 09:38:42 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
2026-07-12 06:59:39 +08:00
|
|
|
|
}
|