UnityEvent란, C#의 event+delegate를 래핑해 둔 것이다.
C#에서 event는 게시자가 신호를 발신하여, 그 구독자가 해당 신호를 수신하게 하는 것이다. 또한, delegate는 함수를 가리키는 포인터 개념이다.
어떤 event를 구현할 때, 해당 이벤트를 발행하는 주체와 구독하는 주체를 분리하고, 서로가 서로를 인지하지 않도록 하여 기능이 추가될수록 코드가 점점 복잡해지는 것을 막기 위해 사용한다.
엔터 버튼을 누르면 이벤트가 발동되고, 해당 이벤트의 구독자들이 메시지를 출력하는 기능을 만들어 보겠다.
먼저, Event를 발행할 주체에 UnityEvent를 정의하고, 해당 이벤트를 발동시킬 함수를 정의한다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
namespace Event{
public class Publisher : MonoBehaviour
{
public UnityEvent onEventPublished;
public void Update()
{
if (Input.GetKeyDown(KeyCode.Return))
{
Publish();
}
}
public void Publish()
{
onEventPublished.Invoke();
}
}
}
그 다음, 해당 이벤트에 반응할 구독자들을 만든다.
using UnityEngine;
namespace Event
{
public class Subscriber1: MonoBehaviour, ISubscriber
{
public void HandleEvent()
{
Debug.Log("Subscriber 1 handled the event");
}
}
}
using UnityEngine;
namespace Event
{
public class Subscriber2: MonoBehaviour, ISubscriber
{
public void HandleEvent()
{
Debug.Log("Subscriber 2 handled the event");
}
}
}
using UnityEngine;
namespace Event
{
public class Subscriber3: MonoBehaviour, ISubscriber
{
public void HandleEvent()
{
Debug.Log("Subscriber 3 handled the event");
}
}
}
이후, Publisher를 Component로 추가한 GameObject의 Inspector 창에 가서 구독자들을 다음과 같이 등록해 준다.
이후 엔터 버튼을 누르면, 다음과 같이 구독자들이 이벤트에 정상적으로 반응함을 확인할 수 있다.
여기서 이벤트를 발행하는 쪽과 그에 반응하는 쪽 모두 서로의 존재를 알지 못한다. 따라서 코드를 확장하고 이벤트에 반응해야 할 새로운 구독자들을 추가할 때 코드가 복잡해지지 않는다.
'게임개발 > Unity' 카테고리의 다른 글
[Unity] JSON 이용하여 데이터 저장하기 (0) | 2024.08.28 |
---|---|
[Unity] GameObject의 이동(기본) (0) | 2024.06.10 |
[Unity] ScriptableObject (0) | 2024.06.09 |
[Unity] 게임오브젝트의 회전 (1) | 2024.06.08 |
[Unity-UI] Canvas - Render Mode (1) | 2023.11.12 |