카테고리 없음
유니티 오디오 매니저로 오디오 관리하기 + enum으로 편하기 사용하기
게발인개발자
2024. 2. 20. 21:00
오디오를 BGM만 넣으면 관리가 쉽지만 효과음(SFX)이 많아지면 관리가 힘들어진다.
그래서 오디오 매니저를 싱글톤화하여 관리를 하기로 했다.
public class AudioManager : MonoBehaviour
{
public static AudioManager instance;
// 배경음에 필요한 변수들
[Header("#BGM")]
public AudioClip BGMclip;
public float bgmVolume;
AudioSource bgmSource;
// 효과음을 관리하기 위한 변수들 + 배열에서 빼서 사용할 수 있도록
[Header("#SFX")]
public AudioClip[] sfxClips;
public float sfxVolume;
public int channels;
private int channelIndex;
AudioSource[] sfxPlayers;
//배열에서 인덱스로 빼면 헷갈릴 것을 염두하여 enum으로 해당 오디오를 가져올 수 있다.
public enum Sfx
{
PlayerAttack, PlayerDamage, PlayerEquip,
PlayerEat, PlayerHarvest, PlayerPulling,
MonsterDamage, ItemCrafting, MakeFood, PlayerMining
}
private void Awake()
{
instance = this;
Init();
PlayBgm();
}
// 모든 오디오 클립을 초기화하여 사용하기 위한 함수
private void Init()
{
//배경음 플레이어 초기화
GameObject bgmObject = new GameObject("BGMPlayer");
bgmObject.transform.parent = transform;
bgmSource = bgmObject.AddComponent<AudioSource>();
bgmSource.playOnAwake = true;
bgmSource.loop = true;
bgmSource.volume = bgmVolume;
bgmSource.clip = BGMclip;
//효과음 플레이어 초기화
GameObject sfxObject = new GameObject("sfxPlayer");
sfxObject.transform.parent = transform;
sfxPlayers = new AudioSource[channels];
for(int i = 0; i < sfxPlayers.Length; i++)
{
sfxPlayers[i] = sfxObject.AddComponent<AudioSource>();
sfxPlayers[i].playOnAwake = false;
sfxPlayers[i].loop = false;
sfxPlayers[i].volume = sfxVolume;
}
}
// 배경음 플레이 함수
public void PlayBgm()
{
bgmSource.Play();
}
// 상황에 맞는 효과음을 사용하기 위한 함수
public void PlaySffx(Sfx sfx)
{
for(int index = 0; index < sfxPlayers.Length;index++)
{
int loopindex = (index + channelIndex) % sfxPlayers.Length;
if (sfxPlayers[loopindex].isPlaying)
continue;
channelIndex = loopindex;
sfxPlayers[loopindex].clip = sfxClips[(int)sfx];
sfxPlayers[loopindex].Play();
break;
}
}