분류에 맞게 다양한 enum
을 사용하는데, 함수의 매개변수를 그에 맞게 다 나누기보다 제네릭 함수를 활용하여 다양한 열거형 자료에 맞는 유연한 하나의 함수로 개발하면 더 컴팩트한 코드가 될 생각으로 진행하게 되었다.
다양한 주제의 효과음을 열거형으로 구분하여 효과음 배열 인덱스에 맞춰 저장하지만, 그에 대한 효과음 관리 및 재생은 switch문
으로 분류 제어하고 있었다 -> 열거형의 존재는 단순 매개변수에 대한 편의밖에 제공하고 있질 않음을 불편하게 여김.
위 처럼 SoundType
이라는 대분류 열거형이 있고 소분류 열거형은 대분류에 따른 효과음의 종류들을 정의한다. 이에 맞춰 효과음을 저장하는 클래스에 AudioClip 데이터를 배치해준다.
[System.Serializable]
public class ClipType {
public SoundType myType;
public AudioClip[] effectClips;
}
public List<ClipType> effects; // 최종 인스펙터에서 보이는 변수
효과음을 저장하는 클래스의 구조는 인스펙터에서 쉽게 컨트롤하기 위해 직렬화 클래스로 만들어줬다.
다양한 분류에 대응하는 함수는 제네릭을 사용하였는데, T clip 이라는 매개변수에 원하는 소분류 열거형을 넣으면, 그에 맞는 값을 Parse해주는 Enum 클래스의 기능으로 손 쉽게 사용할 수 있었다.
▶️ Object Enum.Parse(열거형의 타입, 해당 타입의 열거형 문자열)
⛔️ 만약 문자열에 오타가 있다면ArgumentException
에러가 발생합니다.using System; public void SetEffectSound<T>(SoundType _type, T clip) where T : Enum { int clipIdx = (int)Enum.Parse(clip.GetType(), clip.ToString()); PlayEffectSound(effects[(int)_type].effectClips[clipIdx]); // 효과음 저장 클래스 형식대로 원하는 효과음 플레이 }
이렇게 하면 어떤 형식의 열거형이 와도 원하는 결과를 뱉어준다. 그럼 반환값이 Object
이기 때문에 int으로의 casting이 가능해지고 원하는 형태로 활용이 될 수 있다.
SoundManager.instance.SetEffectSound(SoundType.Player, PlayerSfx.Breath);
SoundManager.instance.SetEffectSound(SoundType.Monster, MonsterSfx.Damage);
SoundManager.instance.SetEffectSound(SoundType.UI, UISfx.Snap);
즉 원하는 파일에 맞춰 enum을 등록해주고 위의 코드처럼 분류에 맞춰 원하는 시점에 호출해주면 된다.
참고로 C#의 7.3버전부터 Enum 클래스를 제네릭의 한정자로 받아줄 수 있게 되었다고 한다.
Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
[Microsoft_C#] Enum.Parse 메서드