using UnityEngine; using UnityEngine.UI; namespace GameFramework { /// /// 主菜单 UI 控制器。 /// 支持开始游戏、设置、制作人员、退出游戏。 /// 修复:场景重载后自动重新查找 UI 引用,避免 DontDestroyOnLoad 导致的空引用问题。 /// public class MainMenuUIController : MonoBehaviour { [Header("Buttons")] [SerializeField] Button startButton; [SerializeField] Button settingsButton; [SerializeField] Button creditsButton; [SerializeField] Button quitButton; [SerializeField] Button storyReplayButton; [Header("剧情 PV")] [SerializeField] StoryPVPlayer storyPVPlayer; [Header("Settings Panel")] [SerializeField] GameObject settingsPanel; [SerializeField] Button settingsBackButton; [Header("Credits Panel")] [SerializeField] GameObject creditsPanel; [SerializeField] Button creditsCloseButton; [Header("新手引导")] [SerializeField] GameObject guidePanel; [SerializeField] Button guideStartButton; void Start() { // 自动查找(解决场景重载后引用失效问题) if (startButton == null) startButton = FindButton("StartButton"); if (settingsButton == null) settingsButton = FindButton("SettingsButton"); if (creditsButton == null) creditsButton = FindButton("CreditsButton"); if (quitButton == null) quitButton = FindButton("QuitButton"); if (storyReplayButton == null) storyReplayButton = FindButton("StoryReplayButton"); if (storyPVPlayer == null) { // 使用 FindObjectsByType 包含 inactive 对象,避免找不到隐藏的 VideoOverlay var players = FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None); if (players.Length > 0) storyPVPlayer = players[0]; } if (settingsPanel == null) settingsPanel = GameObject.Find("SettingsPanel"); if (settingsBackButton == null && settingsPanel != null) settingsBackButton = settingsPanel.GetComponentInChildren