설정자와 Delegate로 사운드 온/오프 구현해보기
# Introduce
BGM이나 SFX의 온/오프를 설정자와 Delegate를 이용하여 간단히 제어해 봅시다.
# For example
1. 매니저
우선 매니저 역할을 하는 스크립트에 해당과 같은 Delegate를 추가합니다.
public Action _OnSoundMuted;
public Action _OnSoundUnmuted;
사운드 on/off 여부를 가르키는 변수를 만들어 줍니다.
private bool m_bSoundOn;
사운드 변수에 접근하는 접근자, 설정자를 만들어 줍니다.
설정자에 접근할때(사운드가 켜고 꺼질때) 해당 Delegate가 Invoke 됩니다.
public bool _SoundOn
{
get { return m_bSoundOn; }
set
{
if (value)
{
_OnSoundUnmuted?.Invoke();
}
else
{
_OnSoundMuted?.Invoke();
}
m_bSoundOn = value;
}
}
2. AudioSourceInit
그리고 AudioSource와 항상 함께 붙일 스크립트 하나를 만듭니다.
private void OnEnable()
{
StartCoroutine(Initialize());
GameManager.getInstance._OnSoundMuted += OnSoundMuted;
GameManager.getInstance._OnSoundUnmuted += OnSoundUnmuted;
}
private void OnDisable()
{
GameManager.getInstance._OnSoundMuted -= OnSoundMuted;
GameManager.getInstance._OnSoundUnmuted -= OnSoundUnmuted;
}
private IEnumerator Initialize()
{
yield return null;
if (!GameManager.getInstance._SoundOn)
OnSoundMuted();
else
OnSoundUnmuted();
}
void OnSoundMuted()
{
GetComponent<AudioSource>().mute = true;
}
void OnSoundUnmuted()
{
GetComponent<AudioSource>().mute = false;
}
이후 해당 스크립트를 게임 오브젝트에 붙여 줍니다.
3. 사운드 토글 UI
마지막으로 사운드 토글 UI에 다음과 같은 코드를 적용합니다.
GameManager.getInstance._SoundOn = !GameManager.getInstance._SoundOn;
# Comment
AudioSourceInit의 함수 OnSoundMuted(), OnSoundUnmuted() 를
매니저의 Delegate인 _OnSoundMuted, _OnSoundUnmuted 에 등록하여
사운드 토글 UI에서 토글을 할때 매니저의 설정자를 통해 Delegate를 Invoke합니다.
# Epilogue
설정자와 Delegate로 간편하게 게임 내의 모든 AudioSource를 mute/unmute 해보았습니다.
위의 예시는 사운드의 토글만을 구현해 보았지만, 더 다양한 환경에 응용해볼 수 있습니다.
게시물을 토대로 자신만의 멋진 패턴을 만들어 보세요.
감사합니다.
# Reference
docs.microsoft.com/ko-kr/dotnet/api/system.action?view=netcore-3.1
docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/using-properties
'개발 > Unity3D' 카테고리의 다른 글
Unity에서 슬로우 모션(Slow Motion)효과 주기 - TimeScale/AudioSource (0) | 2020.08.11 |
---|---|
Conditional Attribute (0) | 2020.07.31 |