MIF_E31230837/Assets/Script/MusicManager.cs

108 lines
2.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class MusicManager : MonoBehaviour
{
public static MusicManager Instance;
[Header("Audio")]
public AudioClip musikMenu;
public AudioClip musikQuiz;
private AudioSource audioSource;
public bool musikAktif = true;
void Awake()
{
if (Instance != null)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
// ✅ MusicManager punya Audio Listener sendiri
AudioListener al = gameObject.GetComponent<AudioListener>();
if (al == null) gameObject.AddComponent<AudioListener>();
audioSource = gameObject.AddComponent<AudioSource>();
audioSource.loop = true;
audioSource.playOnAwake = false;
audioSource.clip = musikMenu;
if (musikAktif) audioSource.Play();
SceneManager.sceneLoaded += OnSceneLoaded;
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (scene.name == "Menu Kuis")
{
GantiMusik(musikQuiz);
}
else
{
GantiMusik(musikMenu);
}
// ✅ Kalau di Menu AR, matikan Audio Listener ARCamera
if (scene.name == "Menu AR")
{
StartCoroutine(MatikanARListener());
}
}
IEnumerator MatikanARListener()
{
// Tunggu 1 frame biar ARCamera keburu ke-load
yield return null;
AudioListener[] listeners = FindObjectsByType<AudioListener>(FindObjectsSortMode.None);
foreach (AudioListener al in listeners)
{
// ✅ Matikan semua Audio Listener kecuali punya MusicManager
if (al.gameObject != this.gameObject)
{
al.enabled = false;
Debug.Log("MusicManager: matikan AudioListener di " + al.gameObject.name);
}
}
}
void GantiMusik(AudioClip clip)
{
if (clip == null) return;
if (audioSource.clip == clip)
{
if (musikAktif && !audioSource.isPlaying) audioSource.Play();
return;
}
audioSource.clip = clip;
if (musikAktif) audioSource.Play();
}
public float GetVolume() => audioSource.volume;
public void SetVolume(float v) => audioSource.volume = Mathf.Clamp01(v);
public void KlikToggleMusik()
{
musikAktif = !musikAktif;
if (musikAktif)
audioSource.Play();
else
audioSource.Stop();
}
void OnDestroy()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
}