플레이어가 스킬을 사용할 때 나타나는 잔상효과를 구현하기 위해 GhostTrail을 구현하였다.
💻 Ghost Trail 클래스 생성
잔상(GhostTrail)을 만들기 위한 클래스 ACGhostTrail을 작성하였다.
속성값으로는 시작하기까지 걸리는 StartDelay 시간과, 잔상이 출력될 간격인 Interval, 잔상의 색상 Color, 잔상의 Material이 안쪽에서 바깥쪽으로 퍼져나가는 정도를 나타내는 Exponent를 지정하였다.
✨ GhostTrail Material
이후, 잔상을 그려나갈 Material을 제작해주었다.
베이스 컬러와 이미시브 컬러, 오파시티 값을 지정하여 투명한 잔상느낌을 낼 수 있도록 구현하였다.
🚨 이때, Material의 Usage속성 값 중 Used with Skeletal Mesh 속성을 체크해야만 플레이어 Skeletal Mesh 형태를 출력해줄 수 있으므로 까먹으면 안된다.
🦾 UPoseableMeshComponent
이후, 잔상은 UPoseableMeshComponent를 이용하여 구현하였다.
UPoseableMeshComponent를 이용하면 Player의 SkeletalMesh의 한 부분을 순간 캡처하여 Bone을 그려낼 수 있다.
또한 만들어냈던 GhostTrail Material을 적용하기 위한 UMaterialInstanceDynamic 객체를 선언하고, 일정 시간동안 잔상을 출력하는 Timer를 만들기 위한 FTimerHandle를 선언하였다.
ACGhostTrail 클래스의 BeginPlay 함수에서는 UMaterialInstanceConstant 객체를 불러오고, UMaterialInstanceDynamic을 생성해주었다. 머티리얼에 선언해두었던 Color와 Exp 매개변수에 값을 전달해준 뒤, 플레이어의 Mesh 정보를 불러와 초기화하였다.
CopyPoseFromSkeletalComponent 함수를 이용하여 플레이어의 포즈를 복사하였고, 플레이어의 스켈레탈 메시가 가지고 있는 Material의 수 만큼 ACGhostTrail 클래스의 Mesh를 GhostTrail 머티리얼로 전부 초기화해주었다.
이는 플레이어의 스켈레탈 메시가 전부 투명화되어 출력될 수 있는 Mesh를 생성한 것이다.
이후, TimerDelegate를 람다식으로 초기화하며 Mesh가 토글 형태로 Interval마다 그려질 수 있도록 ToggleVisibility 함수를 사용하였다.
이때 GhostTrail의 위치와 회전값은 플레이어와 동일하도록 조정해주었다.
Timer의 마지막으로는 Mesh의 CopyPoseFromSkeletalComponent 함수를 이용하여 현재 플레이어의 포즈를 잔상으로 출력해낼 수 있도록 하였다.
이렇게 만들어진 Timer는 World의 TimerManager를 통해 Interval 단위로 발동시켜주었다.
GhostTrail의 출력이 끝났을 때에는 Timer를 삭제해주었다.
👻 Play Ghost Trail
GhostTrail의 출력과 끝을 모두 구현하였으니, 이제 GhostTrail 객체를 손쉽게 생성할 수 있는 Play_GhostTrail 함수를 CHelpers 클래스에 추가해주었다.
(CHelpers 클래스는 복잡한 객체 생성/호출 함수를 간단하게 사용할 수 있도록 static 함수로 만들어둔 클래스이다.)
GhostTrail의 Spawn 파라미터 값을 각각 초기화해주고, vector의 Z값에 Scaled Capsule Half Height 값을 감산하여 플레이어 Mesh가 땅에서부터 제대로 서있을 수 있도록 Location을 초기화시켰다.
이렇게 만들어진 ACGhostTrail 클래스를 이용해 SpawnActor한 객체를 반환해주었다.
▶️ SubAction_Fist 에서 Play
구현된 잔상은 Fist의 스킬이 발동될 때 출력하기 위해 SubAction_Fist 클래스의 Pressed 함수에서 플레이 해 주었다.
마지막으로 CGhostTrail C++ 클래스를 기반으로 블루프린트를 생성하여 만들고자하는 잔상의 속성값을 설정해주고,
SubAction_Fist의 블루프린트에서 생성한 GhostTrail 클래스를 할당해주었다.
이후 프로그램을 실행시켜 Fist의 스킬(SubAction)을 실행시켜보면 아래와 같이 성공적으로 GhostTrail이 출력되는것을 확인할 수 있었다.