일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스택
- delegate
- soundmanager
- skybox
- 배열
- UI
- script
- InputManager
- 직렬화
- c#
- 인터페이스
- 비선형자료구조
- 프로그래머스
- 유한상태머신
- invokec#events
- inputsystem
- Generic
- 코루틴
- 유니티
- 장애물달리기
- 자료구조
- 스파르타내일배움캠프
- ObjectPool
- 효과음
- 메서드
- unity
- 람다식
- BGM
- LINQ
- FSM
- Today
- Total
Unity 개발일지
[Unity] Delegate(대리자)와 Event, Action 그리고 Callback 본문
[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은 특정 이벤트나 작업이 완료된 후 실행될 함수를 가리키며, 콜백 함수는 주로 비동기 작업이나 이벤트 기반 프로그래밍에서 사용된다. 함수나 메서드가 다른 함수나 메서드의 인수로 전달되어, 특정 시점에 호출될 수 있는 구조를 의미한다.
다음 예시는 내일배움캠프에서 진행했던 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에 대해 정리해보았고,
앞으로는 명확하게 코드에 대해 이해하고, 로직을 구상할 수 있을 것 같다.
'Unity 개발' 카테고리의 다른 글
[Unity] 코루틴(Coroutine) 실습하기 (수정필요) (1) | 2024.07.16 |
---|---|
[Unity] MonoBehaviour와 Unity 생명주기 실습하기 (3) | 2024.07.16 |
[Unity] 동적 생성을 해보자 (0) | 2024.06.26 |
[Unity] Invoke C# Events를 이용한 InputManager만들기 - 4 - (0) | 2024.06.25 |
[Unity] Invoke C# Events를 이용한 InputManager만들기 - 3 - (0) | 2024.06.19 |