Fix full flow reset cleanup for outlines and residual objects, adjust EndPanel buttons
This commit is contained in:
@@ -44,6 +44,7 @@ public class PageController : MonoBehaviour
|
||||
|
||||
private Page _currentPage = Page.Home;
|
||||
private ExperimentMode _selectedMode = ExperimentMode.Learn;
|
||||
private int _lastReturnHomeFrame = -1;
|
||||
|
||||
private void Start()
|
||||
{
|
||||
@@ -114,6 +115,13 @@ public class PageController : MonoBehaviour
|
||||
|
||||
if (page == Page.ModeSelect && _modeDescText != null)
|
||||
_modeDescText.text = "";
|
||||
|
||||
var audioManager = FindObjectOfType<AudioManager>();
|
||||
if (audioManager != null)
|
||||
{
|
||||
if (page == Page.Experiment) audioManager.PlayExperimentBg();
|
||||
else audioManager.PlayHomeBg();
|
||||
}
|
||||
|
||||
Debug.Log($"PageController: 页面切换 -> [{page}]");
|
||||
}
|
||||
@@ -198,40 +206,64 @@ public class PageController : MonoBehaviour
|
||||
|
||||
public void ReturnToHome()
|
||||
{
|
||||
Debug.Log("PageController: 返回首页");
|
||||
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");
|
||||
|
||||
// --- 核心修复:退出时彻底清理并隐藏所有交互物体 ---
|
||||
var manInjury = GameObject.Find("manInjury");
|
||||
if (manInjury != null)
|
||||
foreach (var handler in GetSceneObjectsOfType<PingClickHandler>())
|
||||
{
|
||||
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
|
||||
handler.ResetState(false);
|
||||
handler.ForceHideOutline();
|
||||
handler.gameObject.SetActive(false);
|
||||
Debug.Log($"PageController: 已隐藏 Ping {handler.name}");
|
||||
}
|
||||
|
||||
foreach (var handler in GetSceneObjectsOfType<ChanraoTuibuHandler>())
|
||||
{
|
||||
handler.ResetState(false);
|
||||
handler.ForceHideOutline();
|
||||
handler.gameObject.SetActive(false);
|
||||
Debug.Log($"PageController: 已隐藏 ChanraoTuibu {handler.name}");
|
||||
}
|
||||
|
||||
HideSceneObjectsByNamePrefix("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; } }
|
||||
}
|
||||
var shose = FindSceneObject("Shose");
|
||||
if (shose != null)
|
||||
{
|
||||
var h = shose.GetComponent<ShoseClickHandler>();
|
||||
if (h != null) h.ResetState();
|
||||
if (h != null)
|
||||
{
|
||||
h.ResetState(false);
|
||||
h.ForceHideOutline();
|
||||
}
|
||||
|
||||
// 关键:返回主页时,必须禁用点击组件,并隐藏物体
|
||||
if (h != null) h.enabled = false;
|
||||
shose.SetActive(false);
|
||||
Debug.Log("PageController: 已隐藏 Shose");
|
||||
}
|
||||
|
||||
// 把 touchArray 里的点也关掉
|
||||
@@ -240,12 +272,84 @@ public class PageController : MonoBehaviour
|
||||
{
|
||||
foreach (Transform t in touchArray.transform)
|
||||
{
|
||||
var point2Handler = t.GetComponent<Point2ClickHandler>();
|
||||
if (point2Handler != null) point2Handler.ResetState(false);
|
||||
t.gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
// ------------------------------------------------
|
||||
|
||||
ShowPage(Page.Home);
|
||||
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}");
|
||||
}
|
||||
}
|
||||
|
||||
private System.Collections.IEnumerator StartInitialVoiceAndCameraRoutine()
|
||||
@@ -264,11 +368,7 @@ public class PageController : MonoBehaviour
|
||||
}
|
||||
|
||||
// 找鞋子
|
||||
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 shose = FindSceneObject("Shose");
|
||||
|
||||
var point2 = GameObject.Find("touchArray/point2");
|
||||
if (point2 == null)
|
||||
@@ -287,14 +387,7 @@ public class PageController : MonoBehaviour
|
||||
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; } }
|
||||
}
|
||||
var ping004 = FindFirstPingStepObject();
|
||||
h.nextObject = ping004;
|
||||
|
||||
// 鞋子出现,但默认不开组件(不可点击)
|
||||
@@ -350,13 +443,28 @@ public class PageController : MonoBehaviour
|
||||
|
||||
private void HideShose()
|
||||
{
|
||||
var shose = GameObject.Find("Shose");
|
||||
var shose = FindSceneObject("Shose");
|
||||
if (shose != null)
|
||||
{
|
||||
shose.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ public class UIManager : MonoBehaviour
|
||||
private void Start()
|
||||
{
|
||||
Debug.Log("=== UIManager 初始化开始 ===");
|
||||
AutoFindPanels();
|
||||
HideVideo();
|
||||
if (_endPanel != null) _endPanel.SetActive(false);
|
||||
|
||||
@@ -56,6 +57,24 @@ public class UIManager : MonoBehaviour
|
||||
Debug.Log("=== UIManager 初始化完成 ===");
|
||||
}
|
||||
|
||||
private void AutoFindPanels()
|
||||
{
|
||||
var canvas = GameObject.Find("Canvas")?.transform;
|
||||
if (canvas == null) return;
|
||||
|
||||
if (_videoPanel == null)
|
||||
{
|
||||
var t = canvas.Find("VideoPanel");
|
||||
if (t != null) _videoPanel = t.gameObject;
|
||||
}
|
||||
|
||||
if (_endPanel == null)
|
||||
{
|
||||
var t = canvas.Find("EndPanel");
|
||||
if (t != null) _endPanel = t.gameObject;
|
||||
}
|
||||
}
|
||||
|
||||
private void BindNavbarButtons()
|
||||
{
|
||||
var experimentPanel = GameObject.Find("ExperimentPanel");
|
||||
@@ -146,26 +165,43 @@ public class UIManager : MonoBehaviour
|
||||
|
||||
public void ShowVideo(string fileName)
|
||||
{
|
||||
AutoFindPanels();
|
||||
if (_videoPanel != null)
|
||||
{
|
||||
_videoPanel.SetActive(true);
|
||||
var vp = _videoPanel.GetComponentInChildren<UnityEngine.Video.VideoPlayer>(true);
|
||||
if (vp != null) vp.Play();
|
||||
Debug.Log("UIManager: 显示并播放 VideoPanel");
|
||||
}
|
||||
}
|
||||
|
||||
public void HideVideo()
|
||||
{
|
||||
AutoFindPanels();
|
||||
if (_videoPanel != null)
|
||||
{
|
||||
var vp = _videoPanel.GetComponentInChildren<UnityEngine.Video.VideoPlayer>(true);
|
||||
if (vp != null) vp.Stop();
|
||||
_videoPanel.SetActive(false);
|
||||
Debug.Log("UIManager: 隐藏 VideoPanel");
|
||||
}
|
||||
}
|
||||
|
||||
public void HideEndPanel()
|
||||
{
|
||||
AutoFindPanels();
|
||||
if (_endPanel == null)
|
||||
{
|
||||
var t = GameObject.Find("Canvas")?.transform.Find("EndPanel");
|
||||
if (t != null) _endPanel = t.gameObject;
|
||||
}
|
||||
|
||||
if (_endPanel != null) _endPanel.SetActive(false);
|
||||
}
|
||||
|
||||
public void ShowEndPanel()
|
||||
{
|
||||
AutoFindPanels();
|
||||
if (_endPanel == null)
|
||||
{
|
||||
var t = GameObject.Find("Canvas")?.transform.Find("EndPanel");
|
||||
@@ -176,12 +212,12 @@ public class UIManager : MonoBehaviour
|
||||
{
|
||||
_endPanel.SetActive(true);
|
||||
|
||||
// 绑定 BtnYes:关闭 EndPanel
|
||||
// 绑定 BtnYes:结束后返回首页
|
||||
var btnYes = _endPanel.transform.Find("BtnYes")?.GetComponent<Button>();
|
||||
if (btnYes != null)
|
||||
{
|
||||
btnYes.onClick.RemoveAllListeners();
|
||||
btnYes.onClick.AddListener(() => { _endPanel.SetActive(false); });
|
||||
btnYes.onClick.AddListener(OnReturnClicked);
|
||||
}
|
||||
|
||||
// 绑定 BtnBack:关闭 EndPanel(如果你希望点它也是单纯关面板而不是退回到首页的话)
|
||||
@@ -270,8 +306,7 @@ public class UIManager : MonoBehaviour
|
||||
|
||||
private void OnReturnClicked()
|
||||
{
|
||||
// 先隐藏面板
|
||||
if (_endPanel != null) _endPanel.SetActive(false);
|
||||
HideEndPanel();
|
||||
|
||||
var pageCtrl = FindObjectOfType<PageController>();
|
||||
if (pageCtrl != null) pageCtrl.ReturnToHome();
|
||||
|
||||
Reference in New Issue
Block a user