유니티 프로젝트를 진행하다 보면 객체 간의 소통을 위해 Action을 자주 사용하게 됩니다.
하지만 단순히 public Action을 사용하는 것과 public static event Action을 사용하는 것은
큰 차이가 있습니다. 각 특징과 사용 이유를 정리해 보았습니다.
Player.OnAction += ... 처럼event 키워드는 외부 클래스에서 이벤트를 함부로 조작하지 못하게 막는 '방어막' 역할을 합니다.
| 기능 | Action (event 없음) | event Action |
|---|---|---|
외부에서 구독/해제 (+=, -=) | 가능 | 가능 |
외부에서 강제 호출 (Invoke) | 가능 (위험) | 불가능 (내부에서만 호출 가능) |
외부에서 초기화 (= null) | 가능 (매우 위험) | 불가능 |
왜 event를 써야 할까?
event가 없다면 다른 스크립트에서 실수로player.myAction = null;을 실행하는 순간,
기존에 걸려있던 모든 UI나 시스템의 구독 정보가 사라져 버립니다.
event를 붙이면 오직 신호의 주인만이 호출(Invoke)할 수 있어 안전합니다.
| 구분 | public Action | public static event Action |
|---|---|---|
| 참조 방식 | 인스턴스 참조 필요 | 클래스 이름으로 즉시 접근 |
| 안전성 | 낮음 (외부에서 초기화 가능) | 높음 (외부 조작 불가) |
| 용도 | 1:1 관계, 특정 객체 간 소통 | 시스템 전체 방송 (전역 이벤트) |
안드로이드 파츠 완성 시 스탯을 올리고 UI를 띄우는 것과 같은 전역적인 사건에는
public static event Action을 사용하는 것이 가장 정석입니다.
public class Player : MonoBehaviour
{
// 정적 이벤트 선언: 어디서든 접근 가능하며 안전함
public static event Action OnAndroidCompleted;
private void CheckParts()
{
if (partsCount == 3)
{
// 신호 발송: 오직 Player 내부에서만 가능
OnAndroidCompleted?.Invoke();
}
}
}
구독하는 UI 측에서는 OnEnable에서 구독하고, OnDisable에서 해제해 주는 것을 잊지 마세요!