🎮Unreal4/C++

[UE4] SubAction - Niagara Thorn 스킬 : SetNiagaraVariableObject, BoxExtent, ReceiveParticleData_Implementation

공대 컴린이 2023. 6. 13. 15:37
728x90

뾰족한 고드름 나이아가라를 수정하여 하늘에서 고드름을 여러 개 떨어뜨려 Enemy를 공격하는 스킬을 구현해보았다.

 

고드름같은 가시 객체는 CThornObject 클래스를 통해 제작해주었다.

💻CThornObject 클래스

가시 객체에는 충돌체의 크기를 구하기 위한 Static Mesh와, Mesh를 회전시킬 방향(NiagaraMeshRotation), 충돌 시 나타날 Effect, 충돌 Effect의 Transform의 속성을 지정해주었고, 

Root 컴포넌트 아래 Niagara 컴포넌트를 배치시켜주었다.

 

ThornObject의 생성자에선 컴포넌트를 생성한 뒤, BeginPlay 함수에서는 Niagara의 OnSystemFinished 델리게이트를 등록해주었다. 

SetNiagaraVariableObject 함수는 클래스에 등록한 Niagara Component에서 "Collision"이라는 Export  파라미터를 Object 형식으로 불러와 Niagara 변수에 저장할 수 있는 기능을 제공한다.

 

사용하고자 하는 Niagara Effect객체에 사용자 파라미터로 Collision을 추가해두었다.

 

즉, SetNiagaraVariableObject 함수를 통해 해당 Collision 변수의 Object값으로 CThornObject 객체를 this로 전달하여 할당한다는 뜻이다.

 

이후, Niagara Mesh가 존재한다면, 해당 Mesh의 크기를 토대로 충돌처리를 수행할 범위 BoxExtent를 설정해주었다.

Mesh의 크기를 GetBoundingBox() 함수를 이용해 충돌체의 크기를 가져올 수 있고, 해당 박스의 Max값에서 Min 값을 빼어 절댓값을 취하고 0.5를 곱하면 충돌체 Box의 폭이 도출된다.

💥 Niagara 충돌처리

ReceiveParticleData_Implementation 함수는 Niagara 시스템 내에서 파티클 데이터가 생성되거나 업데이트될 때 자동으로 호출된다.

 

매개변수로 받아오는 FBasicParticleData 배열파티클에서 Spawn되는 데이터 갯수만큼 배열로 전달되기 때문에, 해당 Data의 개수가 0이라면 파티클이 Spawn 되지 않았다는 의미로 볼 수 있다.

 

BoxTrace 검사 시 사용되는 ignore 배열 static으로 선언하였다. Tick 함수처럼 업데이트가 지속적으로 일어나는 함수에서 반복되는 함수나 변수들은 static으로 선언하여 초기 한번만 할당 후 사용하는 것이 효율적이다.

 

이후, 파티클이 업데이트 되는 중간에 충돌되어 삭제될 수 있으므로, NULL 에러를 피하기 위해 마지막 Data에서부터 for문을 거꾸로 돌리며 충돌처리를 수행하였다.

 

각 가시(Thorn) 객체들의 위치(Data[i].Position)에 파티클이 Spawn된 위치(GetActorLocation)을 더하여 충돌 Position을 설정하고, 

파티클의 Scale을 Export 파라미터에서 Velocity로 전달하였기 때문에 Box의 폭에 Data[i].Velocity값을 곱해 크기를 설정해주었다.

 

이후, 각 가시 객체마다의 BoxTrace를 수행하며 무언가에 충돌되었다면 Collision Effect를 Spawn하여 출력하고, 충돌된 객체가 Character라면 Send Damage를 호출하여 데미지를 입혔다.

 

마지막으로 나이아가라 시스템이 끝났을 때 호출되는 OnSystemFinished 함수에서는 ThornObject 객체를 Destroy 하도록 작성하였다.

 

컴파일 후 CThornObject 클래스 기반으로 블루프린트 클래스를 생성하였고, Hit Data와, Static Mesh, 충돌 시 나타날 Collision Effect를 각각 설정해주었다.

 

Niagara Component에는 Export Parameter 값과, 위에서 아래로 여러 개의 가시가 떨어지도록 조정한 나이아가라 애셋을 설정해주었다.

💻 CSubAction_Around 클래스

만들어진 ThornObject 클래스를 통해 Around 무기의 SubAction 클래스를 생성해주었다.

 

Begin_SubAction함수에서는 만들어진 ThornObject 클래스를 통해 Thorn 액터를 스폰하였고, 

End_SubAction 함수에서는 Owner Character의 상태를 Idle로 변경해주었다.

 

컴파일 후 CSubAction_Around 기반 블루프린트를 생성하여 Object Class 속성에 BP_CThornObject 클래스를 설정해주었다.

 

728x90