이벤트 : Event
- 특정 조건 or 상황 발생 시, 이를 감지하고, 처리하는 기능
- 마우스 클릭/키보드 입력 = 이벤트 발생
- 플레이어 이동 = 이벤트 처리(이벤트 핸들)
- 이벤트의 발동은 이벤트 델리게이트를 선언한 클래스 내에서만 하는 것을 권장
event 키워드
- 델리게이트를 이벤트 목적으로 사용할 때 선언
- event로 선언된 델리게이트는 외부 클래스에서 실행 불가
- 구독 및 해지 가능
class EventListner
{
public delegate void EventHandler();
public event EventHandler MyEvent;
public void OnMyEvent()
{
EventName?.Invoke();
}
}
class SubscriberClass
{
EventLister listner = new EventListenr();
public void Subscribe()
{
listner.MyEvent += SomeMethod
lister.MyEvent?.Invoke();
}
public void SomeMethod(){}
}
이벤트 핸들러 : Event Handler
- 보통 이벤트를 만들 때, 대표적으로 대명사처럼 자주 쓰인다.
- 사실 Unity 이용 빈도보다 Winform(윈도우 프로그램 제작)에서 사용하는 빈도가 크긴 함
- 미리 선언된 델리게이트
- 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");
}
}