나이아가라의 Scale값을 가져와서 Box Component 위치를 조정하기 위한 Data Export 과정을 수행해보았다.
💻 INiagaraParticleCallbackHandler
나이아가라의 데이터를 사용하기 위해 INiagaraParticleCallbackHandler 를 추가 상속받아 주었다.
INiagaraParticleCallbackHandler 인터페이스 안에는 ReceiveParticleData 함수가 존재한다.
ReceiveParticleData 함수는 나이아가라 시뮬레이션 중에 입자 시스템에서 생성된 입자에 대한 데이터를 수신하는 데 사용된다.
UFUNCTION의 속성값이 BlueprintNativeEvent 이므로 이를 상속받는 자식 클래스에서는 Implementation을 붙여 재정의해야한다.
따라서 ACAura 클래스에서 해당 ReceiveParticleData_Implementation 함수를 선언해주었다.
이후, 나이아가라에서는 ReceiveParticleData로 넘겨줄 Data를 생성해주었다.
✨ Niagara Data Export, System Parameter
주된 Slash인 NE_Basic_Mesh에 파티클 업데이트 항목을 선택하여 "Export Particle Data to Blueprint"를 추가해주었다.
해당 속성의 디테일 패널에서 Condition To Export Data 항목을 체크하여 데이터를 넘겨주겠다고 설정하였다.
또한 속성에서 Delay Between Data Exports를 체크하면 설정하는 숫자마다 데이터를 전송하고, 체크하지 않는다면 Tick 단위로 데이터를 전송한다.
다음으로는 시스템 세팅을 클릭하여 "Object"라는 새 파라미터를 추가하였다.
여기서 사용되는 Object가 ReceiveParticleData_Implementation 함수의 첫번째 매개변수인 FBasicParticleData 자료형이다.
Object의 이름은 Mesh_Scale로 변경해주었다.
만들어진 새 파라미터를 Export Particle Data to Blueprint의 Callback Handle Parameter로 설정해주었다.
📦 Cpp에서 Export Data 받기
ACAura 클래스의 BeginPlay 함수에서는 Niagara의 SetNiagaraVariableObject 함수를 이용하여 Export로 전달해주었던 데이터를 Niagara 객체에 받아오도록 하였다.
이후, ReceiveParticleData 함수에서 Data[0]번째의 Position값을 받아 출력해보면
나이아가라 시스템에서 Export한 Scale값이 출력되는것을 볼 수 있었다.
📦 Box Component (Niagara Collision Box) 위치 조정
이후, Slash Mesh의 크기를 확인하여
나이아가라의 Box Component의 크기를 Slash의 크기 절반으로 설정해주었다.
이제, 크기설정까지 완료된 Box Component를 플레이어에서부터 Slash가 발사되는 방향으로 배치될 수 있도록 Relative Scale 값과 RelativeLocation 값을 설정해주었다.
Box Component의 이동 과정이 조금 헷갈렸는데, 정리해서 설명해보자면 위 그림과 같다.
1️⃣ 기본적으로 Box Component는 플레이어의 위치에 생성되기 때문에 플레이어를 중심으로 앞뒤에 Slash 크기로 길게 위치한다. (첫번째 그림)
이때 Box Component를 플레이어의 앞으로 옮기고싶다면, 이론상으론 Box Component의 크기 절반만큼만 X축으로 올리면 될 것 같지만, 사실은 그냥 Box Component의 크기만큼 X축을 올려주면 된다.
이는, 중심점을 기준으로 부피는 항상 2분의 1이기 때문이다.
Box Component의 크기만큼을 Box Component 위치(Position)에 더해주면 절반만 올라가서 플레이어의 전방에 위치하게 된다.
2️⃣ 그러나 이때 SetRelativeLocation으로 Box Component의 크기를 전달해주면 Box Component가 X축만 움직이는것이 아니라, Y축도 함께 움직여지기 때문에 두번째 그림과 같이 오른쪽으로 Box가 이동해져있다.
3️⃣ 따라서 location.Y 의 값은 0으로 설정하여 더해지지 않도록 한 뒤, Location 값을 더해 세번째 그림처럼 원하던 위치에 Box Component를 위치할 수 있었다.
컴파일 후 프로그램을 실행시켜보면 아래와 같이 플레이어의 전방 방향으로 나이아가라와 그 크기에 맞는 Box Component가 배치되는것을 확인할 수 있었다.
'🎮Unreal4 > C++' 카테고리의 다른 글
[UE4] Warp : 순간이동 (UDecalComponent, GetHitResultUnderCursorByChannel) (0) | 2023.05.30 |
---|---|
[UE4] Niagara 충돌처리 (FOnNiagaraSystemFinished) (0) | 2023.05.25 |
[UE4] 나이아가라(Niagara) 출력하기 (UNiagaraComponent, UNiagaraSystem) (0) | 2023.05.24 |
[UE4] SubAction-Sword 일섬(一閃) 스킬 : BoxTrace, LineTrace, 새 프로파일 만들기 (0) | 2023.05.23 |
[UE4] 잔상(GhostTrail) 구현하기 (UPoseableMeshComponent) (0) | 2023.05.22 |