using UnityEngine; using UnityEngine.UI; public class UIManager : Singleton { [SerializeField] private GameObject menuUI; [SerializeField] private float distanceFromPlayer = 1.5f; [Header("声音设置")] [SerializeField] private Toggle backgroundMusicToggle; [SerializeField] private Toggle narrationToggle; protected override void Awake() { base.Awake(); if (Instance != this) { return; } if (menuUI == null) { menuUI = GameObject.Find("MenuUI"); } if (menuUI != null) { menuUI.SetActive(false); } else { Debug.LogError("UIManager:没有找到 MenuUI。", this); } if (backgroundMusicToggle != null) { backgroundMusicToggle.onValueChanged.AddListener(SetBackgroundMusicEnabled); } if (narrationToggle != null) { narrationToggle.onValueChanged.AddListener(SetNarrationEnabled); } } private void Start() { if (backgroundMusicToggle != null) { SetBackgroundMusicEnabled(backgroundMusicToggle.isOn); } if (narrationToggle != null) { SetNarrationEnabled(narrationToggle.isOn); } } private void OnDestroy() { if (backgroundMusicToggle != null) { backgroundMusicToggle.onValueChanged.RemoveListener(SetBackgroundMusicEnabled); } if (narrationToggle != null) { narrationToggle.onValueChanged.RemoveListener(SetNarrationEnabled); } } private void LateUpdate() { Transform player = GameManager.Instance.Player; if (menuUI == null || menuUI.activeSelf || player == null) { return; } PlaceMenuInFrontOfPlayer(player); } public void ToggleMenu() { if (menuUI == null) { return; } bool shouldShow = !menuUI.activeSelf; if (shouldShow && GameManager.Instance.Player != null) { PlaceMenuInFrontOfPlayer(GameManager.Instance.Player); } menuUI.SetActive(shouldShow); } private void SetBackgroundMusicEnabled(bool isEnabled) { AudioManager.Instance.SetBackgroundMusicEnabled(isEnabled); } private void SetNarrationEnabled(bool isEnabled) { AudioManager.Instance.SetNarrationEnabled(isEnabled); } private void PlaceMenuInFrontOfPlayer(Transform player) { menuUI.transform.position = player.position + player.forward * distanceFromPlayer; menuUI.transform.forward = player.forward; } }