195 lines
4.8 KiB
C#
195 lines
4.8 KiB
C#
|
using UnityEngine;
|
||
|
using UnityEngine.UI;
|
||
|
using UnityEngine.SceneManagement;
|
||
|
using Polyart;
|
||
|
using TMPro;
|
||
|
public class InGameMenu : MonoBehaviour
|
||
|
{
|
||
|
[Header("Menu UI")]
|
||
|
public GameObject menuPanel;
|
||
|
public Button resumeButton;
|
||
|
public Button mainMenuButton;
|
||
|
public Slider volumeSlider;
|
||
|
public TextMeshProUGUI volumeValueText;
|
||
|
[Header("Settings")]
|
||
|
public KeyCode menuKey = KeyCode.Escape;
|
||
|
public string mainMenuSceneName = "MainMenu";
|
||
|
|
||
|
private bool isMenuOpen = false;
|
||
|
private AudioManager audioManager;
|
||
|
private FirstPersonController_Polyart playerController;
|
||
|
|
||
|
void Start()
|
||
|
{
|
||
|
// Find references
|
||
|
audioManager = FindFirstObjectByType<AudioManager>();
|
||
|
playerController = FirstPersonController_Polyart.instance;
|
||
|
|
||
|
// Initialize menu state
|
||
|
if (menuPanel != null)
|
||
|
menuPanel.SetActive(false);
|
||
|
|
||
|
// Setup UI events
|
||
|
if (resumeButton != null)
|
||
|
resumeButton.onClick.AddListener(ResumeGame);
|
||
|
|
||
|
if (mainMenuButton != null)
|
||
|
mainMenuButton.onClick.AddListener(ReturnToMainMenu);
|
||
|
|
||
|
if (volumeSlider != null)
|
||
|
{
|
||
|
// Initialize volume slider with current volume
|
||
|
float currentVolume = PlayerPrefs.GetFloat("MusicVolume", 1f);
|
||
|
volumeSlider.value = currentVolume;
|
||
|
volumeSlider.onValueChanged.AddListener(OnVolumeChanged);
|
||
|
UpdateVolumeText(currentVolume);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Update()
|
||
|
{
|
||
|
// Check for menu toggle input
|
||
|
if (Input.GetKeyDown(menuKey))
|
||
|
{
|
||
|
ToggleMenu();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void ToggleMenu()
|
||
|
{
|
||
|
isMenuOpen = !isMenuOpen;
|
||
|
|
||
|
if (menuPanel != null)
|
||
|
menuPanel.SetActive(isMenuOpen);
|
||
|
|
||
|
// Control game state
|
||
|
if (isMenuOpen)
|
||
|
{
|
||
|
OpenMenu();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CloseMenu();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void OpenMenu()
|
||
|
{
|
||
|
// Pause game
|
||
|
Time.timeScale = 0f;
|
||
|
|
||
|
// Enable cursor
|
||
|
Cursor.lockState = CursorLockMode.None;
|
||
|
Cursor.visible = true;
|
||
|
|
||
|
// Disable player movement
|
||
|
if (playerController != null)
|
||
|
playerController.SetCanMove(false);
|
||
|
|
||
|
// Enable menu panel
|
||
|
if (menuPanel != null)
|
||
|
menuPanel.SetActive(true);
|
||
|
}
|
||
|
|
||
|
private void CloseMenu()
|
||
|
{
|
||
|
// Resume game
|
||
|
Time.timeScale = 1f;
|
||
|
|
||
|
// Disable cursor
|
||
|
Cursor.lockState = CursorLockMode.Locked;
|
||
|
Cursor.visible = false;
|
||
|
|
||
|
// Enable player movement
|
||
|
if (playerController != null)
|
||
|
playerController.SetCanMove(true);
|
||
|
|
||
|
// Disable menu panel
|
||
|
if (menuPanel != null)
|
||
|
menuPanel.SetActive(false);
|
||
|
}
|
||
|
|
||
|
public void ResumeGame()
|
||
|
{
|
||
|
if (isMenuOpen)
|
||
|
{
|
||
|
ToggleMenu();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void ReturnToMainMenu()
|
||
|
{
|
||
|
// Resume time scale before loading new scene
|
||
|
Time.timeScale = 1f;
|
||
|
|
||
|
// Load main menu scene
|
||
|
if (LoadingScene.Instance != null)
|
||
|
{
|
||
|
LoadingScene.Instance.FadeAndLoad(mainMenuSceneName);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SceneManager.LoadScene(mainMenuSceneName);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void OnVolumeChanged(float value)
|
||
|
{
|
||
|
// Update audio manager volume
|
||
|
if (audioManager != null)
|
||
|
{
|
||
|
audioManager.SetVolume(value);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Fallback: directly save to PlayerPrefs
|
||
|
PlayerPrefs.SetFloat("MusicVolume", value);
|
||
|
|
||
|
// Try to find and update any audio sources with music
|
||
|
AudioSource[] audioSources = FindObjectsByType<AudioSource>(FindObjectsSortMode.None);
|
||
|
foreach (AudioSource source in audioSources)
|
||
|
{
|
||
|
if (source.gameObject.name.ToLower().Contains("music") ||
|
||
|
source.gameObject.name.ToLower().Contains("background"))
|
||
|
{
|
||
|
source.volume = value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
UpdateVolumeText(value);
|
||
|
}
|
||
|
|
||
|
private void UpdateVolumeText(float value)
|
||
|
{
|
||
|
if (volumeValueText != null)
|
||
|
{
|
||
|
volumeValueText.text = Mathf.RoundToInt(value * 100) + "%";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Public method to open menu from other scripts
|
||
|
public void OpenMenuExternal()
|
||
|
{
|
||
|
if (!isMenuOpen)
|
||
|
{
|
||
|
ToggleMenu();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Public method to close menu from other scripts
|
||
|
public void CloseMenuExternal()
|
||
|
{
|
||
|
if (isMenuOpen)
|
||
|
{
|
||
|
ToggleMenu();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void OnDestroy()
|
||
|
{
|
||
|
// Ensure time scale is reset when this object is destroyed
|
||
|
Time.timeScale = 1f;
|
||
|
}
|
||
|
}
|