195 lines
4.8 KiB
C#
Raw Normal View History

2025-07-25 15:29:14 +05:00
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;
}
}