목표

  • event 키워드에 해새 알아보자

event

  • delegate는 다른 method를 대신 실행해주기 위해 사용된다.

  • event는 자신에게 등록된 delegate를 실행하는데 사용할 수 있다.

  • 1개의 event에, n개의 delegate를 등록하며, event가 호출(Invoke)된다면, 등록된 delegate를 모두 호출한다.

  • event 등록에는 +, 해제에는 -를 사용한다.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 리턴형이 void이고, 파라미터가 string인 델리게이트를 선언한다.
public delegate void MyDelegate(string action);

// 사용자가 어떤 입력을 하기 위해 생성한 클래스
public static class ActionEventHandler
{
    // MyDelegate 타입의 델리케이트를 저장하는 event를 선언한다.
    public static event MyDelegate EventAction;

    // 어떤 입력을 실행한다.
    public static void CallAction(string action)
    {
        // 그 동작에 의해 Event가 호출되면, event에 등록된 delegate가 실행된다. 
        EventAction?.Invoke(action);
    }
}

// 여기서는 이벤트의 구독 여부를 결정한다.
public class EventPublisher
{
    // string을 입력 받으면, 해당 값을 출력하는 델리게이트를 정의한다.
    private MyDelegate myDelegate = (action) =>
    {
        Debug.Log("this is : " + action);
    };

    // 이벤트를 등록한다.
    public void RegisterEvent()
    {
        ActionEventHandler.EventAction += myDelegate;
    }

    // 이벤트를 해제한따.
    public void UnregisterEvent()
    {
        ActionEventHandler.EventAction -= myDelegate;
    }
}

public class SampleSacript : MonoBehaviour
{
    public void Start()
    {
        // EventPublisher 안에는 무명 함수와 연결된 delegate가 준비되어 있다.
        EventPublisher publisher = new EventPublisher();

        // 무명 함수와 연결된 delegate를 event와 연결시킨다.
        publisher.RegisterEvent();    

        // CallAction 함수의 실행으로 인해 event가 호출되면서, event에 연결된 delegate 들이 호출될 것이다.
        ActionEventHandler.CallAction("Start"); 

        // event에 등록된 delegate를 해제한다.
        publisher.UnregisterEvent();

        // 동일하게 event를 호출했지만, 등록된 delegate가 없어서 호출 결과가 없을 것이다.
        ActionEventHandler.CallAction("Stop");

    }
}

+ Recent posts