기본 패턴
csharp
[CreateAssetMenu(menuName = "Events/Game Event")]
public class GameEvent : ScriptableObject
{
public Action Raised;
public void Raise() => Raised?.Invoke();
}설명
- Unity 공식 how-to와 기술 자료는 ScriptableObject를 이벤트 허브처럼 써서 시스템 간 결합을 줄이는 패턴을 자주 소개합니다.
- 발신자는 특정 리스너를 몰라도 되고, 수신자는 씬 안의 특정 오브젝트 참조 없이 이벤트 자산만 구독하면 됩니다.
- UI, 사운드, 퀘스트, 전투 연출처럼 여러 시스템이 같은 사건에 반응해야 할 때 특히 유용합니다.
- 옵저버 패턴과 함께 쓰기 좋지만, 이벤트 자산이 너무 많아지면 추적이 어려워질 수 있습니다.
짧은 예제
csharp
public class DamageDealer : MonoBehaviour
{
[SerializeField] private GameEvent onHit;
public void Hit()
{
onHit.Raise();
}
}빠른 정리
| 항목 | 설명 |
|---|---|
| 이벤트 채널 | 오브젝트 간 느슨한 연결 |
| ScriptableObject | 씬 밖 공유 자산으로 이벤트 보관 |
| 발신/수신 분리 | 직접 참조를 줄이기 쉬움 |
| 다중 반응 | 여러 시스템이 한 사건에 반응 가능 |
| 추적성 | 규모가 커지면 규칙 정리가 중요 |
주의할 점
결합을 줄이는 대신 흐름이 눈에 덜 보일 수 있습니다. 이벤트 자산 이름과 사용 규칙을 명확히 정해 두지 않으면 오히려 디버깅이 어려워질 수 있습니다.
참고 링크
2 sources