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; [Header("风格设置")] [SerializeField] private Dropdown visualStyleDropdown; [SerializeField] private Renderer[] floorRenderers; [SerializeField] private Renderer[] wallRenderers; [SerializeField] private Material[] floorMaterials; [SerializeField] private Material[] wallMaterials; 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); } if (visualStyleDropdown != null) { visualStyleDropdown.onValueChanged.AddListener(ApplyVisualStyle); } } private void Start() { if (backgroundMusicToggle != null) { SetBackgroundMusicEnabled(backgroundMusicToggle.isOn); } if (narrationToggle != null) { SetNarrationEnabled(narrationToggle.isOn); } if (visualStyleDropdown != null) { ApplyVisualStyle(visualStyleDropdown.value); } } private void OnDestroy() { if (backgroundMusicToggle != null) { backgroundMusicToggle.onValueChanged.RemoveListener(SetBackgroundMusicEnabled); } if (narrationToggle != null) { narrationToggle.onValueChanged.RemoveListener(SetNarrationEnabled); } if (visualStyleDropdown != null) { visualStyleDropdown.onValueChanged.RemoveListener(ApplyVisualStyle); } } 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 ApplyVisualStyle(int styleIndex) { ApplyMaterial(floorRenderers, floorMaterials, styleIndex); ApplyMaterial(wallRenderers, wallMaterials, styleIndex); } private static void ApplyMaterial(Renderer[] renderers, Material[] materials, int styleIndex) { if (renderers == null || materials == null || styleIndex < 0 || styleIndex >= materials.Length || materials[styleIndex] == null) { return; } foreach (Renderer targetRenderer in renderers) { if (targetRenderer != null) { targetRenderer.sharedMaterial = materials[styleIndex]; } } } private void PlaceMenuInFrontOfPlayer(Transform player) { menuUI.transform.position = player.position + player.forward * distanceFromPlayer; menuUI.transform.forward = player.forward; } }