반응형
C, C++에서의 함수 포인터를 C#에서는 delegate를 이용한다.
심플 이벤트 핸들러에서 event 변경에 따라 함수를 실행하고 싶다고 하자.
함수 포인터를 사용하지 않는다면 CURRENT_EVENT를 if/else로 매번 처리해서 이벤트를 실행해야 한다.
string currentEvent
{
set
{
if (CURRENT_EVENT == value) return;
CURRENT_EVENT = value;
if (CURRENT_EVENT == "이벤트 시작") startEvent();
else if (CURRENT_EVENT == "이벤트 종료") endEvent();
/* ... */
}
get
{
return CURRENT_EVENT;
}
}
Dictionary와 delegate를 이용해 위의 코드를 더 간단히 만들어보자.
delegate를 하나 선언하고, string을 key로 delegate를 value로 하는 Dictionary를 선언한다.
delegate void eventFunc();
Dictionary<string, eventFunc> eventDictionary = new Dictionary<string, eventFunc>();
스크립트가 실행되면 Add 메서드로 eventDictionary에 이벤트를 추가한다.
void startEvent()
{
Debug.Log("이벤트가 시작되었습니다.");
}
void endEvent()
{
Debug.Log("이벤트가 종료되었습니다.");
}
private void Start()
{
eventDictionary.Add("이벤트 시작", startEvent);
eventDictionary.Add("이벤트 종료", endEvent);
}
프로퍼티에서는 ContainsKey 메서드를 이용하여 key가 존재하는 경우, value에 해당하는 delegate를 실행한다.
string currentEvent
{
set
{
if (CURRENT_EVENT == value) return;
CURRENT_EVENT = value;
if (eventDictionary.ContainsKey(CURRENT_EVENT)) eventDictionary[CURRENT_EVENT]();
}
get
{
return CURRENT_EVENT;
}
}
이제 새로운 EVENT가 추가되더라도 Start에 Add로 등록해주기만 하면 모든 이벤트를 처리할 수 있다.
최종 코드는 아래와 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SimpleEventHandler : MonoBehaviour
{
delegate void eventFunc();
Dictionary<string, eventFunc> eventDictionary = new Dictionary<string, eventFunc>();
string EVENT = "";
string CURRENT_EVENT = "";
string currentEvent
{
set
{
if (CURRENT_EVENT == value) return;
CURRENT_EVENT = value;
if (eventDictionary.ContainsKey(CURRENT_EVENT)) eventDictionary[CURRENT_EVENT]();
}
get
{
return CURRENT_EVENT;
}
}
private void OnMouseDown()
{
EVENT = "이벤트 시작";
}
private void OnMouseUp()
{
EVENT = "이벤트 종료";
}
void startEvent()
{
Debug.Log("이벤트가 시작되었습니다.");
}
void endEvent()
{
Debug.Log("이벤트가 종료되었습니다.");
}
private void Start()
{
eventDictionary.Add("이벤트 시작", startEvent);
eventDictionary.Add("이벤트 종료", endEvent);
}
void Update()
{
currentEvent = EVENT;
}
}
이벤트가 정상 실행되는 것을 알 수 있다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
유니티 Color Picker로 오브젝트 색깔 변경하기 (0) | 2022.03.20 |
---|---|
유니티 색상 변경 에디터 만들기 (Circle Color Picker) (0) | 2022.03.20 |
유니티 - 변수 변경시 이벤트 발생 (Simple Event Handler) (0) | 2022.03.18 |
유니티 Attribute - Requirecomponent로 Component 강제 설정하기 (0) | 2022.03.17 |
유니티 Attribute - 직렬화로 Inspector에 보여주기 (0) | 2022.03.15 |
댓글