Unity코드 아키텍처와 품질

ScriptableObject 이벤트 채널

오브젝트끼리 직접 참조하지 않고 메시지를 연결하기 위한 ScriptableObject 기반 이벤트 채널 패턴을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

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