c# simple-code delegate
유니티 이벤트
using UnityEngine.Events;
public UnityEvent onPlayerDead; //이벤트 선언
void Start(){
onPlayerDead.Invoke; //이벤트 발생
}
Addlistener
- 참고 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=pxkey&logNo=221366003568
using UnieyEngine.UI;
public Button btnVisible;
void Awake(){
btnVisible.Addlistener(activeFunction); //버튼의 OnClick 이벤트 받기
btnVisible.RemoveAllListeners(); //전체 이벤트 삭제
btnVisible.RemoveListener(activeFuncion); //특정 이벤트 삭제
}
public void activeFunction(){
Debug.Log("active");
}
btnVisible.Addlistener(()=>activeFuncion()) //람다식
btnVisible.Addlistener(()=>{/* 소스코드 */})
btnVisible.Addlistener(()=>massageFunction("인자값")) //인자값을 전달해야 하는 경우
public void massageFunction(string msg){
}
Event Handler
*참고 : https://coderzero.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-C-%EA%B0%95%EC%A2%8C-17-%EC%9D%B4%EB%B2%A4%ED%8A%B8Event-%EB%8C%80%EB%A6%AC%EC%9E%90-%EB%8D%B8%EB%A6%AC%EA%B2%8C%EC%9D%B4%ED%8A%B8-Delegate
using System;
using UnityEngine;
class EventSender{
public event EventHandler _handler; //이벤트 정의
_handler(this, EventArgs.Empty); //이벤트 핸들러 호출
}
class EventGetter{
public EventSender _sender = new EventSender();
_sender.Click = new EventHandler(clickFunction);
void clickFunction(object sender, EventArgs e){
Debug.Log("버튼 클릭");
}
}
이벤트 등록, 호출 (인자값 없음)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class EventSender
{
public event EventHandler _handler; //이벤트 정의
private static EventSender _instance;
public static EventSender instance{
get{
if (object.ReferenceEquals(_instance, null))
{
_instance = new EventSender(); //인스턴스가 없다면 생성해서 제공
}
return _instance; //있다면 그냥 제공
}
}
public void sendEvent()
{
if (this._handler != null)
{
_instance._handler(this, EventArgs.Empty); //샌드 이벤트를 이용하여 이벤트 호출
}
}
}
public class TestEvent : MonoBehaviour
{
private void Awake()
{
EventSender.instance._handler += new EventHandler(activeFunction); //이벤트 등록
}
private void Start()
{
EventSender.instance.sendEvent(); //이벤트 호출
}
void activeFunction(object sender, EventArgs e)
{
Debug.Log("이벤트 호출됨");
}
}
- 생성자 있는 싱글톤
이벤트 송수신기 Simple code
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public enum ContentEventType
{
Chapter1,
Chapter2
}
public class EventSender
{
public EventMathod[] _handlers = new EventMathod[System.Enum.GetValues(typeof(ContentEventType)).Length];
private static EventSender _instance;
public static EventSender instance{
get{
if (object.ReferenceEquals(_instance, null))
{
_instance = new EventSender(); //인스턴스가 없다면 생성해서 제공
}
return _instance; //있다면 그냥 제공
}
}
public void CallEvent(ContentEventType target_event)
{
int event_number = (int)target_event;
if (this._handlers[event_number] != null)
{
_instance._handlers[event_number](); //샌드 이벤트를 이용하여 이벤트 호출
}
}
public delegate void EventMathod();
public void AddEvent(EventMathod target_method, ContentEventType event_type)
{
int event_number = (int)event_type;
_handlers[event_number] += new EventMathod(target_method);
}
}
public class TestEvent : MonoBehaviour
{
private void Awake()
{
//EventSender.instance._handler += new EventHandler(activeFunction); //이벤트 등록
EventSender.instance.AddEvent(activeFunction, ContentEventType.Chapter1); //이벤트 등록
EventSender.instance.AddEvent(activeFunction2, ContentEventType.Chapter2); //이벤트 등록
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.K)) EventSender.instance.CallEvent(ContentEventType.Chapter1); //이벤트 호출
if (Input.GetKeyDown(KeyCode.L)) EventSender.instance.CallEvent(ContentEventType.Chapter2); //이벤트 호출
}
void activeFunction()
{
Debug.Log("이벤트 호출됨");
}
void activeFunction2()
{
Debug.Log("이벤트 호출됨2");
}
}
EventSender.instance.AddEvent(함수, 컨텐츠이벤트타입); //이벤트 등록
EventSender.instance.CallEvent(컨텐츠이벤트타입); //이벤트 호출