🎮Unreal4/C++

[UE4] 델리게이트 활용한 Trigger 구현 (DECLARE_DELEGATE), 단일 델리게이트/반환값과 매개변수가 있는 델리게이트

공대 컴린이 2023. 3. 3. 01:07
728x90

이전에 공부한 델리게이트의 기능을 사용하여 Trigger를 구현해보았다.

💡 델리게이트 활용-1. Component 오버랩 시 Point Light 켜주기

먼저 델리게이트의 자료형을 선언해주었다.

 

델리게이트의 자료형명관례상 F로 시작하여 FBoxLightOverlap으로 이름을 지정해주었다.

해당 델리게이트는 Return 타입이 void이고, 함수명 뒤에 매개변수가 하나도 없는 함수를 연결해줄 수 있다.

또한 MULTICAST가 붙지 않았기 때문에 SINGLECAST이다. 이는 함수와 델리게이트가 1:1로 작동한다.

 

이후 외부에서 편하게 사용할 수 있도록 public 인 델리게이트 변수를 선언해주었다.

 

델리게이트는 Componenet Overlap이 호출될 때 IsBound 함수를 통해 연결된 함수가 있는지 확인한 뒤, 존재한다면 Execute 해주었다.

 

이후 Light 라는 클래스를 만들어 해당 클래스에서 델리게이트를 실행시켜보았다.

 

Light 클래스에는 Point Light 객체가 2개 생성되어있고, Light의 On/Off 기능과 랜덤 색상으로 출력되는 OnRandomColor 함수를 구현해놓았다.

 

두 개의 Point Light는 위와 같이 초기화해두었는데, 여기서 Intensity를 특이한 수치로 초기화하였다.

이는 매직넘버라고 부르는데 e 앞에있는 수를 곱하고, e를 10으로 보고 뒤에 있는 수를 지수로 두어 표기하는 방법이다.

즉, 1e+4f1 * 10^4 이고, 1e-6f1 * 10^-6 과 같다.

 

이후 델리게이트가 존재하는 액터를 찾기 위해 현재 레벨(Get Current Level)에 존재하는 Actor들을 전부 검사하였다.

GetCurrentLevel 함수ActorsTArray 형태 월드 아웃라이너에 존재하는 모든 액터 정보를 반환한다.

 

상속구조를 Is A 관계로 보기 때문에 actor의 IsA 함수를 이용하여 델리게이트가 있는 액터(AC04_Trigger)인지를 검사하였다.

 

이와 같이 특정 Actor를 찾는 함수를 템플릿화하여 정리해두었다.

 

이렇게 만들어진 FindActor 함수를 통해 trigger가 존재하는 액터를 찾았고, 델리게이트를 등록해주었다.

델리게이트는 Dynamic 이 아닌 Single형으로 만들었기 때문에 이전에 사용해봤던 AddDynamic이 아닌 BindUFunction 함수를 사용하였다.

 

trigger 액터에 OnBoxLight Begin/End Overlap 이벤트가 호출되면 현재 클래스(Light)의 OnLight 함수와 OffLight 함수도 함께 실행되도록 등록해 준 것이다.

즉, 흐름을 보면 trigger의 OnBoxLight~Overlap 함수가 호출되면 안에서 IsBound 를 검사하여 등록된 함수 OnLight/OffLight가 존재하므로  Execute되면서 On/Off 함수들이 실행되는 것이다.

💡 델리게이트 활용-2. Point Light의 색상을 매개변수로 전달하여 랜덤하게 켜주기

이후 Trigger 클래스에서 박스 콜라이더에 Overlap 되었을 때 랜덤 색상을 Light Point에 출력하기 위한 델리게이트를 하나 더 생성하였다.

위 델리게이트는 Return 타입으로 FString을 가지고, 파라미터가 FLinearColor 하나라는 뜻이며 가운데 FBoxLightColorOverlap델리게이트의 자료형이다.

 

이후 FBoxLightColorOverlap OnBoxLightColorOverlap; 라는 델리게이트 변수를 생성한 후, Begin Overlap에서 랜덤 색상을 만들어 매개변수로 전달하며 Excute 해주었다. 이때 델리게이트의 반환값으로 FString을 설정했기 때문에 Excute 함수의 반환값을 FString str로 저장해두었다.

 

Light 클래스에서 해당 델리게이트에 OnRandomColor 함수를 등록해주고 두번째 Point Light에 색상을 지정해주었다.

 

테스트 결과, 왼쪽 Point Light는 Begin Overlap 시 켜지고, End Overlap 시 꺼지며,

오른쪽 Point Light는 Begin Overlap 시 랜덤 색상이 출력되며 해당 정보가 Log로 출력되는 것을 확인할 수 있었다.

728x90