ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Unity | 델리게이트를(delegate) 활용한 이벤트(Event System)
    다시한번 개발자도전! 2026. 2. 25. 09:46

    1. 이벤트(event)란?

    이벤트는 델리게이트를 기반으로 하지만, 객체지향의 캡슐화(Encapsulation)를 지키기 위해 접근 권한을 제한한 "특수한 대리자".

    • 한 줄 요약: 외부에서는 구독(+=)과 해지(-=)만 가능하고, 실행(Invoke)은 오직 그 주인만 할 수 있게 만든 보안 장치임.
    • 클래스 간의 결합도를 낮추기 위해 사용을  권장

     


    2. 왜 이벤트를 사용하는지?

    • 델리게이트만 쓰면 데이터 유실이나 권한 침해의 위험이 있음. 이때 event 키워드를 붙이면 유니티가 이 코드를 컴파일 에러로 막아줌.
    public class SkillCaster : MonoBehaviour {
        public Action onSkillUsed; // 델리게이트 선언
    }
    
    public class OtherClass : MonoBehaviour {
        void Start() {
            // 실수로 += 가 아니라 = 을 써버리면?
            caster.onSkillUsed = MyFunction; // 기존에 등록된 다른 모든 함수가 삭제
            
            // 밖에서 맘대로 스킬 사용을 강제할수있음
            caster.onSkillUsed.Invoke(); 
        }
    }

     


    3. 이벤트 사용방법

     

    Step 1: 이벤트 선언

    Action 앞에 event 키워드를 붙임.

    public class PlayerStatus : MonoBehaviour 
    {
        // 플레이어의 체력이 변했을 때 알리는 이벤트
        public event Action<float> onHealthChanged;
    }

     

    Step 2: 이벤트 발생 (내부에서만)

    외부에서 부를 수 없으므로, 내부 함수를 통해 실행함.

    public void TakeDamage(float damage) 
    {
        hp -= damage;
        onHealthChanged?.Invoke(hp);
    }

     

    Step 3: 이벤트 구독 (외부)

    외부 클래스는 등록만 가함.

    public class HealthUI : MonoBehaviour {
        void Start() {
            // += 로 구독 ( = 은 사용 불가)
            player.onHealthChanged += UpdateHeartUI;
        }
    
        void UpdateHeartUI(float currentHp) {
            // UI 갱신 로직
        }
    }

     


    4. 델리게이트 vs 이벤트 차이

    특징 델리게이트 (Delegate / Action) 이벤트 (event)
    대입 연산 (=) 가능 (기존 리스트 초기화 위험) 불가능 (오직 +=, -=만 가능)
    외부 호출 (Invoke) 어디서든 가능 (보안 취약) 오직 선언된 클래스 내부에서만 가능
    용도 콜백 함수, 데이터 가공 상태 변화 알림 (옵저버 패턴)
Designed by Tistory.