108 lines
2.7 KiB
C#
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;
|
|
}
|
|
} |