[Unity] Action vs static event Action 완벽 차이점 정리

정광훈(Unity_9기)·2026년 2월 23일

TIL (Today I Learned)

목록 보기
106/110

유니티 프로젝트를 진행하다 보면 객체 간의 소통을 위해 Action을 자주 사용하게 됩니다.
하지만 단순히 public Action을 사용하는 것과 public static event Action을 사용하는 것은
큰 차이가 있습니다. 각 특징과 사용 이유를 정리해 보았습니다.


1. static (정적) 키워드 유무: 접근성

  • public Action: 특정 객체(인스턴스)에 속합니다.
    신호를 보낼 대상을 직접 참조(Reference)해야만 구독할 수 있습니다.
  • public static Action: 클래스 자체에 귀속됩니다. Player.OnAction += ... 처럼
    어디서든 클래스 이름으로 접근할 수 있어 참조를 일일이 연결할 필요가 없습니다.

2. event 키워드 유무: 안전성 (캡슐화)

event 키워드는 외부 클래스에서 이벤트를 함부로 조작하지 못하게 막는 '방어막' 역할을 합니다.

기능Action (event 없음)event Action
외부에서 구독/해제 (+=, -=)가능가능
외부에서 강제 호출 (Invoke)가능 (위험)불가능 (내부에서만 호출 가능)
외부에서 초기화 (= null)가능 (매우 위험)불가능

왜 event를 써야 할까?
event가 없다면 다른 스크립트에서 실수로 player.myAction = null;을 실행하는 순간,
기존에 걸려있던 모든 UI나 시스템의 구독 정보가 사라져 버립니다.
event를 붙이면 오직 신호의 주인만이 호출(Invoke)할 수 있어 안전합니다.


3. 요약 및 권장 사용법

구분public Actionpublic 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에서 해제해 주는 것을 잊지 마세요!

0개의 댓글