[Unity/C#]이벤트 핸들러(EventHandler)

강동현·2024년 1월 23일
0

Unity/C#

목록 보기
14/26

이벤트 : Event

  • 특정 조건 or 상황 발생 시, 이를 감지하고, 처리하는 기능
  • 마우스 클릭/키보드 입력 = 이벤트 발생
  • 플레이어 이동 = 이벤트 처리(이벤트 핸들)
  • 이벤트의 발동이벤트 델리게이트를 선언한 클래스 내에서만 하는 것을 권장

event 키워드

  • 델리게이트를 이벤트 목적으로 사용할 때 선언
  • event로 선언된 델리게이트는 외부 클래스에서 실행 불가
  • 구독 및 해지 가능
class EventListner
{
    // 구독할 델리게이트 
    public delegate void EventHandler();
    // event를 통해서 MyEvent는 내부에서만 호출 가능해진다.
    public event EventHandler MyEvent;
    public void OnMyEvent()
    {
        // ? : EventName null check
        EventName?.Invoke();
    }
}
class SubscriberClass
{
	EventLister listner = new EventListenr();
    public void Subscribe()
    {
    	listner.MyEvent += SomeMethod
        // Cannot Call delegate
        lister.MyEvent?.Invoke();
    }
    public void SomeMethod(){}
}

이벤트 핸들러 : Event Handler

  • 보통 이벤트를 만들 때, 대표적으로 대명사처럼 자주 쓰인다.
    • 사실 Unity 이용 빈도보다 Winform(윈도우 프로그램 제작)에서 사용하는 빈도가 크긴 함
  • 미리 선언델리게이트
    • System 헤더파일에 존재
      • using System; 필수
    • Object 타입의 메일과 EventArgs 타입인자를 가지는 void 리턴형델리게이트
      • sender: 이벤트를 실행시키는 객체(보통 this)
      • EventArgs: 이벤트 실행 시, 전달하고 싶은 정보가 있는 경우 사용
        • EventArgs.Empty: 전달하고 싶은 정보가 없는 경우 사용
        • EventArgs상속을 이용해서 사용
public class EventMail : EventArgs{
	public  string _name;
    public EventMail(string name){
    	_name = name;
    }
}
using System;
public delegate void EventHandler(object sender, EventArgs e);
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventMail : EventArgs
{
    public string _name;
    public EventMail(string name)
    {
        _name = name;
    }
}
public class EventHandlerTest1 : MonoBehaviour
{
    public event EventHandler eventHandler;
    private void Start()
    {
        EventMail mail = new EventMail("Event Mail Test1");
        eventHandler += Test;
        eventHandler.Invoke(this, mail);//자동 형변환 수행
    }
    void Test(object o, EventArgs e)
    {
        Debug.Log(((EventMail)e)._name);
    }
}

이벤트 핸들러의 간단 사용법

  • 제너릭 이벤트 핸들러 사용
  • EventArgs를 사용하지 않고, 제네릭 타입[TEventArgs]를 바로 사용
  • 불필요한 형변환 및 상속 필요 X
using System;
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EventTest
{
    public string _name;
    public EventTest(string name)
    {
        _name = name;
    }
}
public class EventHandlerTest2 : MonoBehaviour
{
    public event EventHandler<EventTest> eventHandler;
    private void Start()
    {
        EventTest eventTest = new EventTest("EventTest");
        eventHandler += Test;
        eventHandler.Invoke(this, eventTest);
    }
    void Test(object o, EventTest e)
    {
        Debug.Log(e._name);
    }
}

이벤트 핸들러 add & remove

  • 이벤트 핸들러프로퍼티처럼 사용 시, get & set 대신 add & remove 사용
  • add: 해당 이벤트 구독 시, 실행
  • remove: 해당 이벤트 구독 해지 시, 실행
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Event : EventArgs
{
    private EventHandler _eventHandler;
    public event EventHandler eventHandler
    {
        add
        {
            Debug.Log("ADD");
            _eventHandler += value;
        }
        remove
        {
            Debug.Log("REMOVE");
            _eventHandler -= value;
        }
    }
    public void StartEvent()
    {
        _eventHandler.Invoke(this, EventArgs.Empty);
    }
}
public class EventHandlerTest3 : MonoBehaviour
{
    private void Start()
    {
        Event myEvent = new Event();
        myEvent.eventHandler += Test;
        myEvent.StartEvent();
    }
    void Test(object sender, EventArgs e)
    {
        Debug.Log("TEST");
    }
}
profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글