Unity 개발일지

[Unity] Delegate(대리자)와 Event, Action 그리고 Callback 본문

Unity 개발

[Unity] Delegate(대리자)와 Event, Action 그리고 Callback

아머르 2024. 6. 27. 21:24

[Delegate란?]

C# 언어에서 사용되는 일종의 형식(type)으로, 메서드 참조를 저장하고 실행할 수 있는 기능을 제공한다. 델리게이트는 함수 포인터와 유사하지만, 더 안전하고 유연한 방식으로 메서드를 가리킬 수 있다. 델리게이트는 주로 콜백(callback) 메서드를 정의하거나, 이벤트 기반 프로그래밍을 구현할 때 사용됩니다.

 

<요약>

콜백 메서드를 정의하고 메서드를 대신 호출.

메서드를 매개변수로 전달가능하다.

 

SetGold라는 함수를 delegate로 선언을 해주고,

event 등록을 함으로써 매개변수처럼 사용을 할 수 있게된다.

 

SetGoldEvent라는 함수는 매개변수로 넘어온 함수(event등록을 한 SetGold형식의 변수) 를 체인으로 구독,

 

구독한 함수를 매개변수로 사용할 수 있다.

 

 

그렇다면 Event란 무엇일까?

 

[Event]

특정 조건이 발생했을 때 이를 알리고, 해당 이벤트에 반응하도록 하는 메커니즘. 이벤트를 사용하면 객체 간의 느슨한 결합을 유지하면서 상호작용을 할 수 있다. 구독자에게 작업을 전달(옵저버), 키워드를 통해 클래스 내 필드처럼 정의할 수 있다. (작업 시작을 알리기 위해 보내는 메시지)

 

[UnityAction]

유니티에서 사용할수 있는 Delegate로는 UnityAction도 있다. UnityAction은 제네릭으로 사용할 수 있게 유니티에서 제공해주는 delegate event로 주로 UI 요소나 특정 이벤트가 발생했을 때 실행되어야 하는 함수들을 연결하는 데 사용된다. UnityEngine.Events 네임스페이스에 포함되어 있으며, 특정 이벤트가 발생했을 때 호출할 메서드를 정의할 수 있다.

 

[델리게이트의 다양한 용도]

1. 이벤트(Event) : 델리게이트는 이벤트를 정의하고 처리하는 데 사용된다.

2. 콜백(Callback) : 특정 이벤트나 작업이 완료된 후 호출될 함수로, 동기 또는 비동기일 수도 있다.

 * 비동기(asynchronous) : 작업이 즉시 완료되지 않고, 다른 작업을 차단하지 않으며, 나중에 완료될 수 있는 방식.

 비동기 작업이란 네트워크 요청, 파일 I/O 작업, 타이머 이벤트 등과 같이 시간이 오래 걸리는 작업을 말하며, 비동기 작업의 주된 목적은 메인 스레드를 차단하지 않고, 다른 작업을 계속할 수 있도록 하는 것이다.

3. 메서드 그룹 변환 : 여러 메서드를 하나의 델리게이트 인스턴스에 연걸하여 한번에 호출할 수 있다.

 

[델리게이트 예시]

1. 델리게이트 정의

 

2. 델리게이트 인스턴스 생성 및 사용

Method라는 string형식의 message를 WriteLine해주는 함수에 Delegate 타입을 정의해서,

MyMethod를 매개변수로 받는 메서드를 가리킬 수 있는 del이라는 델리게이트를 정의 해주었다.

del 이라는 델리게이트를 호출하여 문자열을 출력할 수 있게 되었다.

 

[Event 사용 예시]

Action은 C#에서 제공하는 델리게이트 타입 중 하나로, 반환 값이 없고 매개변수가 없는 메서드를 참조할 수 있다.

Action<T>는 매개변수가 하나인 메서드를, Action<T1, T2>는 매개변수가 두개인 메서드를 참조할 수 있다.

Event에 사용되는 Action은 이벤트가 발생했을 때 실행될 메서드를 지정하는 데 사용된다.

이벤트 헨들러의 메서드의 시그니처가 Action 델리게이트 타입과 일치해야 한다.

 

Button 클래스에 OnClick이라는 이벤트를 정의한다.

버튼을 클릭할 때 일어날 Click이라는 메서드를 정의한다.

Click메서드는 이벤트가 연결되 메서드를 호출(Invoke)한다.

 

Onclick의 뒤에 붙은 ?C#의 null 조건부 연산자로 호출 대상이 null인지 확인한 후에 null이 아닌 경우에만 해당 메서드를 호출한다. 이를 통해 null 참조 예외를 방지할 수 있다.

 

button 인스턴스를 생성하고, button의 Onclick 이벤트에 ButtonClicked라는 메서드를 연결해준다.
button.Click(); 메서드를 호출하면 Click 메서드가 호출되고, Click 메서드는 Onclick이라는 Action을 Invoke해준다.

Onclick에 ButtonClicked라는 메서드를 연결(구독) 하였으므로

ButtonClick 메서드가 호출되어 "Button was clicked!" 텍스트가 출력된다.

 

[Callback 사용 예시]

Callback은 특정 이벤트나 작업이 완료된 후 실행될 함수를 가리키며, 콜백 함수는 주로 비동기 작업이나 이벤트 기반 프로그래밍에서 사용된다. 함수나 메서드가 다른 함수나 메서드의 인수로 전달되어, 특정 시점에 호출될 수 있는 구조를 의미한다.

간단한 Callback 예시

 

다음 예시는 내일배움캠프에서 진행했던 Input System을 예시이다.

PlayerController라는 class를 정의했다.

Awake에서 PlayerInputActions를 정의해주었다.

playerInputAction(입력 액션)을 활성화하고

Player.Jump.performed 에 OnJump 메서드를 연결한다.

InputAction.CallbackContext는 Unity의 InputSystem에서 콜백 함수에 전달되는 컨텍스트 정보이다. 이 컨텍스트를 통해 입력 이벤트와 관련되 ㄴ다양한 정보를 얻을 수 있다. CallbackContext는 입력 이벤트가 발생했을 때의 상태, 값, 시간 정보 등을 포함한다. 입력 이벤트가 발생하면 설정한 Callback 메서드가 호출된다.

 

<InputAction.CallbackContext의 주요 프로퍼티와 메서드>

1. action : 이 이벤트가 발생한 InputAction을 반환한다.

2. control : 이 이벤트를 트리거한 InptuControl을 반환한다.

3. phase : 현재 입력 액션의 상태를 나타내는 InputActionPhase값을 반환한다.

 예를들면, Started(눌렀을 때), Performed(누른 상태를 유지했을 때), Canceled(떼었을 때) 가 있다.

4. ReadValue<T>() : 제네릭 메서드로, 입력 값의 타입을 지정하여 값을 읽어온다.

5. startTime : 입력 액션이 시작된 시간을 반환한다.

6. time : 이벤트가 발생한 시간을 반환한다.

7. duration : 입력 액션이 지속된 시간을 반환한다.

 

 

OnEnable : 스크립트나 GameObject가 활성화될 때 호출되며, Awake와 Start함수가 호출된 후에 발생

OnCisable : 스크립트나 GameObject가 비활성화될 때 호출

 

유니티 생명주기

 

Delegate와 Event, Action을 사용하는 것은 많이 봤지만 정확한 이해까지는 하지 못했었다.

이번 TIL을 통해 Event와 Action에 대해 정리해보았고,

앞으로는 명확하게 코드에 대해 이해하고, 로직을 구상할 수 있을 것 같다.

반응형