using System; using System.Collections.Generic; using System.Linq; using FMOD.Studio; using FMODUnity; using UnityEngine; public class MusicControll : MonoBehaviour { private static MusicControll instance; [Range(0f, 1f)] [SerializeField] private float volume = 1f; [SerializeField] private EventReference musicClip; public List npcCombats; public TypeMusic typeMusicCache = TypeMusic.None; private EventInstance eventInstance; private float oldVolume = -1; public enum TypeMusic { None = -1, Ambient = 0, Combat = 1, } private void Awake() { instance = this; npcCombats = new List(); eventInstance = RuntimeManager.CreateInstance(musicClip); eventInstance.start(); if(Math.Abs(volume - oldVolume) > 0.01f) { oldVolume = volume; eventInstance.setVolume(volume); } } public static void Register(NpcCombatAbstract npc) { if (instance == null) return; if (!instance.npcCombats.Contains(npc)) instance.npcCombats.Add(npc); } public static void UnRegister(NpcCombatAbstract npc) { if (instance == null) return; if (instance.npcCombats.Contains(npc)) instance.npcCombats.Remove(npc); } private void Update() { if(npcCombats == null) { return; } var isCombat = npcCombats.Any(x => x.IsCombat); var typeMusic = isCombat ? TypeMusic.Combat : TypeMusic.Ambient; if(typeMusicCache != typeMusic) { typeMusicCache = typeMusic; eventInstance.setParameterByName("Music", (int)typeMusic, true); } if(Math.Abs(volume - oldVolume) > 0.01f) { oldVolume = volume; eventInstance.setVolume(volume); } } }