우선 본 작성자는 아마추어 개발자이고 본문의 내용은 본인의 개인적 경험을 인용한 것이며, 결코 업계 표준의 방식인지 알 수 없다는 점을 알아주시길 바랍니다.
https://store.steampowered.com/app/2693250/Way_Nd_Choice/
Save 20% on Way Nd Choice on Steam
Way Nd Choice is a game that combines a resource management adventure with a text adventure, AI Illusts, AI Illusts. Explore the world and complete the given objectives by consuming health, sanity, and gold appropriately. It's important to choose your opti
store.steampowered.com
영상을 보면 각종 UI에 마우스를 올리면 작게 딸깍거리는 효과음을 들을 수 있습니다.
이 기능은 오브젝트마다 Audiosource를 부착한 것이 아니라 싱글톤 기능을 활용해 AudioManager에 부착된 여러 AudioSource들을 필요에 따라 하나씩 불러와 효과음을 출력한 것입니다.

[SerializeField] private GameObject SFXAudio = null;
private List<AudioChanel> sfxaudios = new List<AudioChanel>();
private List<AudioChanel> SFXAudios
{
get
{
if (sfxaudios.Count == 0)
{
var _sources = SFXAudio.GetComponents<AudioSource>().ToList();
for (int i = 0; i < _sources.Count; i++)
sfxaudios.Add(new AudioChanel(_sources[i], ""));
}
return sfxaudios;
}
}
//최초 사용 시 미리 넣어둔 오브젝트에서 GetComponents로 AudioSource들을 모두 찾아
//List에 저장
public class AudioChanel
{
public AudioSource Audio = null;
public string Channel = "";
public AudioChanel(AudioSource audio,string chanel)
{
Audio = audio;
Channel = chanel;
}
}
채널 관리용 클래스를 만들어 게임 시작 시 SFXAudio에 부착된 AudioSource 컴포넌트들을 불러와 하나씩 할당합니다.
public void PlaySFX(int index)
{
foreach(var audio in SFXAudios)
{
if (audio.Audio.isPlaying) continue;
audio.Audio.clip = SFXs[index];
audio.Audio.Play();
audio.Channel = "";
break;
}
}
이후 PlaySFX를 호출할 때마다 SFXAudios들 중 작동하고 있지 않는 오디오를 찾아 활성화합니다.
private void OpenPreviewPanel(GameObject panel,Vector2 pivot,RectTransform rect)
{
//대충 UI 기능
UIManager.Instance.AudioManager.PlaySFX(0, "preview");
}
위 영상의 경우 마우스를 올려 정보 패널이 활성화될 때마다 UIManager에 할당된 AudioManager에게 특정 효과음 활성 신호를 보냅니다.
public void PlaySFX(AudioClip clip, string chanel)
{
if (BlockedChanels.Contains(chanel)) return;
foreach (var audio in SFXAudios)
{
if (audio.Channel == chanel && audio.Audio.isPlaying)
{
audio.Audio.Stop();
audio.Audio.clip = clip;
audio.Audio.Play();
return;
}
}
foreach (var audio in SFXAudios)
{
if (audio.Audio.isPlaying) continue;
audio.Audio.clip = clip;
audio.Audio.Play();
audio.Channel = chanel;
break;
}
}
효과음 외에도 string형 채널 ID를 인수로 보내 해당 채널 ID를 가진 다른 효과음과 중첩되지 않도록 할 수도 있습니다.
특정 상황에서 효과음이 겹치지 않도록 조정하는데 사용했습니다.
예시: 체력 손실 효과음이랑 골드 손실 효과음이 동시에 나오면 듣기 좀 그러니까 먼저 재생되고 있는 효과음만 나오게 하기
public class ButtonSoundScript :MonoBehaviour, IPointerEnterHandler,IPointerClickHandler
{
[SerializeField] private AudioClip EnterSound = null;
[SerializeField] private AudioClip ClickSound = null;
public void OnPointerEnter(PointerEventData eventData)
{
if (EnterSound == null) return;
UIManager.Instance.AudioManager.PlaySFX(EnterSound, "button");
}
public void OnPointerClick(PointerEventData eventData)
{
if(ClickSound == null) return;
UIManager.Instance.AudioManager.PlaySFX(ClickSound, "button");
}
}

일부 오브젝트들은 IPointerHandler 인터페이스를 이용해 단순히 마우스 인식만으로 버튼 효과음을 내도록 만들기도 했습니다.

그리고 효과음들은 순차적으로 정렬해 필요에 따라 int형 인수만으로 원하는 효과음을 불러와 재생하기 편하도록 만들었습니다.
'C#,Unity' 카테고리의 다른 글
| Unity - Coroutine을 변수로 사용하기 (0) | 2024.05.09 |
|---|---|
| Unity UI - 화면을 벗어나지 않은 UI 만들기 (0) | 2024.05.08 |
| C# - 텍스트 모듈화를 도와주는 String.Format (0) | 2024.05.06 |
| Unity UI - 스크롤을 넣어주는 Scroll View 사용하기 (0) | 2024.05.06 |
| Unity UI - 깔끔한 사이즈 변경을 도와주는 Image Type (0) | 2024.05.06 |