Files
VFSUnity/Assets/Scripts/UI/PageController.cs
T

363 lines
14 KiB
C#
Raw Normal View History

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()
{
Debug.Log("=== PageController 初始化开始 ===");
// 一开始就隐藏鞋子,以免在主页或开场动画时穿帮
HideShose();
// 关掉多余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; }
// 绑定首页按钮
if (_btnStart != null) { _btnStart.onClick.AddListener(OnStartClicked); Debug.Log("PageController: _btnStart 绑定成功"); }
else Debug.LogError("PageController: _btnStart 未赋值!");
if (_btnExit != null) { _btnExit.onClick.AddListener(OnExitClicked); Debug.Log("PageController: _btnExit 绑定成功"); }
else Debug.LogError("PageController: _btnExit 未赋值!");
if (_btnBack != null) { _btnBack.onClick.AddListener(OnModeBackClicked); Debug.Log("PageController: _btnBack 绑定成功"); }
else Debug.LogError("PageController: _btnBack 未赋值!");
if (_btnPracticeMode != null) { _btnPracticeMode.onClick.AddListener(() => OnModeSelected(ExperimentMode.Learn)); Debug.Log("PageController: _btnPracticeMode 绑定成功"); }
else Debug.LogError("PageController: _btnPracticeMode 未赋值!");
if (_btnExamMode != null) { _btnExamMode.onClick.AddListener(() => OnModeSelected(ExperimentMode.Exam)); Debug.Log("PageController: _btnExamMode 绑定成功"); }
else Debug.LogError("PageController: _btnExamMode 未赋值!");
if (_btnFixationBack == null && _fixationPanel != null) { var fb = _fixationPanel.transform.Find("BtnBack"); if (fb != null) { _btnFixationBack = fb.GetComponent<Button>(); Debug.Log("PageController: 自动绑定 FixationPanel/BtnBack"); } }
if (_btnFixationBack != null) { _btnFixationBack.onClick.AddListener(OnFixationBackClicked); Debug.Log("PageController: _btnFixationBack 绑定成功"); }
else Debug.LogError("PageController: _btnFixationBack 未找到!");
if (_btnLimbFixation != null) { _btnLimbFixation.onClick.AddListener(() => OnFixationSelected(FixationMethod.LimbFixation)); Debug.Log("PageController: _btnLimbFixation 绑定成功"); }
else Debug.LogError("PageController: _btnLimbFixation 未赋值!");
if (_btnSplintFixation != null) { _btnSplintFixation.onClick.AddListener(() => OnFixationSelected(FixationMethod.SplintFixation)); Debug.Log("PageController: _btnSplintFixation 绑定成功"); }
else Debug.LogError("PageController: _btnSplintFixation 未赋值!");
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"); } }
if (_btnExperimentBack != null) { _btnExperimentBack.onClick.AddListener(OnExperimentBackClicked); Debug.Log("PageController: _btnExperimentBack 绑定成功"); }
else Debug.LogError("PageController: _btnExperimentBack 未找到!");
ShowPage(Page.Home);
Debug.Log("=== PageController 初始化完成 ===");
}
private void Update()
{
#if UNITY_EDITOR
if (!Application.isPlaying)
{
if (_editorPreview != EditorPreviewPage.None)
{
Page targetPage = (Page)((int)_editorPreview - 1);
ShowPage(targetPage);
}
}
#endif
}
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 (page == Page.ModeSelect && _modeDescText != null)
_modeDescText.text = "";
Debug.Log($"PageController: 页面切换 -> [{page}]");
}
#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 : _examModeDesc;
GameManager.Instance.CurrentMode = mode;
GameManager.Instance.CurrentExperimentType = ExperimentType.FractureFixation;
ShowPage(Page.Fixation);
}
private void OnFixationBackClicked()
{
ShowPage(Page.ModeSelect);
}
private void OnFixationSelected(FixationMethod method)
{
GameManager.Instance.CurrentFixationMethod = method;
var openingFlow = FindObjectOfType<OpeningFlowController>();
if (openingFlow != null)
{
ShowPage(Page.Experiment);
openingFlow.PlayOpeningFlow(() =>
{
if (_uiManager != null)
{
_uiManager.gameObject.SetActive(true);
}
var stepManager = FindObjectOfType<StepManager>();
if (stepManager != null)
{
stepManager.InitializeFromGameManager();
}
StartCoroutine(StartInitialVoiceAndCameraRoutine());
});
}
else
{
ShowPage(Page.Experiment);
if (_uiManager != null) _uiManager.gameObject.SetActive(true);
var stepManager = FindObjectOfType<StepManager>();
if (stepManager != null) stepManager.InitializeFromGameManager();
StartCoroutine(StartInitialVoiceAndCameraRoutine());
}
}
private void OnExperimentBackClicked()
{
ReturnToHome();
}
public void ReturnToHome()
{
Debug.Log("PageController: 返回首页");
// --- 核心修复:退出时彻底清理并隐藏所有交互物体 ---
var manInjury = GameObject.Find("manInjury");
if (manInjury != null)
{
foreach (var handler in manInjury.GetComponentsInChildren<PingClickHandler>(true))
{
handler.ResetState();
handler.gameObject.SetActive(false); // 强制隐藏 ping
}
foreach (var handler in manInjury.GetComponentsInChildren<ChanraoTuibuHandler>(true))
{
handler.ResetState();
handler.gameObject.SetActive(false); // 强制隐藏 chanraotuibu
}
// 这里也可以顺带隐藏所有的 man_ba_zi_chan_rao 下的 chanrao
}
// 找到 Shose 重置并彻底隐藏
var shose = GameObject.Find("Shose");
if (shose == null)
{
var allTransforms = Resources.FindObjectsOfTypeAll<Transform>();
foreach(var t in allTransforms) { if (t.parent == null && t.name == "Shose") { shose = t.gameObject; break; } }
}
if (shose != null)
{
var h = shose.GetComponent<ShoseClickHandler>();
if (h != null) h.ResetState();
// 关键:返回主页时,必须禁用点击组件,并隐藏物体
if (h != null) h.enabled = false;
shose.SetActive(false);
}
// 把 touchArray 里的点也关掉
var touchArray = GameObject.Find("touchArray");
if (touchArray != null)
{
foreach (Transform t in touchArray.transform)
{
t.gameObject.SetActive(false);
}
}
// ------------------------------------------------
ShowPage(Page.Home);
}
private System.Collections.IEnumerator StartInitialVoiceAndCameraRoutine()
{
float waitTime = 1f; // 默认等1秒
var am = FindObjectOfType<AudioManager>();
// 隐藏视频面板
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);
}
}
// 找鞋子
var shose = GameObject.Find("Shose");
if (shose == null)
{
foreach(var t in allT) { if (t.parent == null && t.name == "Shose") { shose = t.gameObject; break; } }
}
var point2 = GameObject.Find("touchArray/point2");
if (point2 == null)
{
var touchArray = GameObject.Find("touchArray");
if (touchArray != null)
{
var p2 = touchArray.transform.Find("point2");
if (p2 != null) point2 = p2.gameObject;
}
}
if (shose != null)
{
var h = shose.GetComponent<ShoseClickHandler>();
if (h == null) h = shose.AddComponent<ShoseClickHandler>();
h.targetPoint = GameObject.Find("ShosePoint")?.transform;
// 这里因为你换了绑带模型:我们需要确保拿到正确的 ping.004。
// 只要场景里激活/存在叫 ping.004 的就行
var ping004 = GameObject.Find("ping.004");
if (ping004 == null)
{
// 如果是隐藏状态,用全局查找
foreach(var t in allT) { if (t.name == "ping.004") { ping004 = t.gameObject; break; } }
}
h.nextObject = ping004;
// 鞋子出现,但默认不开组件(不可点击)
h.enabled = false;
shose.SetActive(true);
}
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;
point2.SetActive(false);
}
// 1. 强制播放第一句语音
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} 秒以切换摄像机并激活鞋子");
var tipPanel = GameObject.Find("TipPanel");
if (tipPanel == null)
{
foreach(var t in allT) { if (t.name == "TipPanel") { tipPanel = t.gameObject; break; } }
}
if (tipPanel != null) tipPanel.SetActive(true);
yield return new WaitForSeconds(waitTime);
if (tipPanel != null) tipPanel.SetActive(false);
if (am != null) am.SwitchToCamera3();
if (point2 != null)
{
point2.SetActive(true);
Debug.Log("PageController: 镜头切换到camera3point2 已显示");
}
}
private void HideShose()
{
var shose = GameObject.Find("Shose");
if (shose != null)
{
shose.SetActive(false);
}
}
#endregion
}