포스트

[Unity] 이벤트 시스템

[Unity] 이벤트 시스템

Unity의 이벤트 시스템


1. 각 용어 개요

용어설명
Action반환값이 없는 메서드를 참조하는 델리게이트 타입
EventHandler이벤트 발생 시 호출할 수 있는 .NET 표준 델리게이트
Delegate사용자가 직접 정의하는 메서드 참조 타입
UnityEventUnity 전용의 직렬화 가능한 이벤트 시스템으로, 인스펙터에서 이벤트를 연결할 수 있음

2. Action (System.Action)

정의

  • System.Action은 반환값이 없는 메서드를 가리킬 수 있는 제네릭 델리게이트 타입입니다.
  • Action매개변수 없이 반환값도 없는 메서드를 참조할 수 있고,
  • Action<T>, Action<T1, T2, ..., T16> 형태로 최대 16개의 매개변수를 지원합니다.

사용 예

1
2
3
4
5
Action sayHello = () => Console.WriteLine("Hello");
sayHello();  // 출력: Hello

Action<int> printNumber = (n) => Console.WriteLine(n);
printNumber(100);  // 출력: 100

특징

  • 매우 간결하고 빠름
  • null 체크 후 호출 (?.Invoke())
  • Unity와 궁합이 좋고 자주 사용됨

주의

  • Action<T>는 이벤트처럼 쓸 수 있지만, event 키워드가 없으므로 외부에서 = null로 초기화하거나 +=/-= 없이도 덮어쓸 수 있어 캡슐화가 약합니다.
  • 안전하게 사용하고 싶다면 event Action<T> 형태로도 선언 가능:
1
public event Action<DamageMessage> OnDamaged;

3. EventHandler

정의

  • .NET에서 표준으로 제공하는 이벤트 델리게이트
  • 시그니처는 void(object sender, EventArgs e)로 고정됨
  • sender는 이벤트를 발생시킨 객체, e는 이벤트 데이터를 포함

예시

1
2
3
4
5
public event EventHandler OnDeath;

void Die() {
    OnDeath?.Invoke(this, EventArgs.Empty);
}

EventHandler 사용 예

1
2
3
4
5
6
7
8
9
10
public class DamageEventArgs : EventArgs {
    public int DamageAmount { get; }
    public DamageEventArgs(int dmg) => DamageAmount = dmg;
}

public event EventHandler<DamageEventArgs> OnDamaged;

void TakeDamage(int dmg) {
    OnDamaged?.Invoke(this, new DamageEventArgs(dmg));
}

특징

  • 이벤트 구조를 정형화하여 일관된 설계 가능
  • 재사용성과 확장성이 뛰어남
  • WPF, WinForms, 외부 .NET 라이브러리에서도 표준으로 사용

4. Delegate

정의

  • 사용자가 직접 정의하는 메서드 참조 타입
  • C#에서 delegate 키워드로 정의
1
2
3
4
public delegate void MyDelegate(string message);
public MyDelegate onMessage;

onMessage += (msg) => Console.WriteLine(msg);

특징

  • 가장 기본적인 델리게이트 방식
  • Action, Func, EventHandler 모두 결국 delegate 기반
  • 자유롭게 시그니처를 정의할 수 있음

5. UnityEvent

정의

  • UnityEngine.Events.UnityEvent
  • Unity 에디터에서 인스펙터를 통해 이벤트를 연결할 수 있는 직렬화 가능 이벤트 시스템

사용 예

1
2
3
4
5
[SerializeField] private UnityEvent onComplete;

void Complete() {
    onComplete.Invoke();
}

특징

  • 비프로그래머도 Unity 에디터에서 이벤트 연결 가능
  • 애니메이션 이벤트, UI 버튼 등과 자연스럽게 연동
  • 성능은 덜하지만 유지보수성과 유연성이 뛰어남

6. 비교표

항목ActionEventHandlerDelegateUnityEvent
반환값voidvoid정의에 따름void
매개변수자유(object, EventArgs)자유제한적
설계 목적간단한 콜백.NET 이벤트 처리사용자 정의 콜백Unity 에디터 연결
사용 대상코드 전용.NET 앱, 라이브러리확장 가능 구조인스펙터 이벤트
직렬화불가불가불가가능
인스펙터 연결불가불가불가가능
Unity 친화도높음낮음중간매우 높음
성능매우 높음높음높음상대적으로 낮음

7. 어떤 것을 언제 사용해야 하나?

상황추천 방식
간단한 콜백 처리Action
.NET 스타일 이벤트 구현EventHandler, EventHandler<T>
사용자 정의 콜백 시그니처delegate
디자이너가 이벤트를 연결해야 함UnityEvent

8. 요약

  • Action: 간단하고 가벼운 코드 콜백 처리에 최적. Unity 내부에서도 자주 사용
  • EventHandler: 정형화된 .NET 이벤트 시스템. 확장성과 일관성이 필요할 때 적합
  • delegate: 특별한 시그니처가 필요한 경우 직접 정의 가능
  • UnityEvent: Unity 인스펙터를 통한 연결이 필요할 때 필수적
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.