🎮Unreal4/C++

[UE4] SubAction-Sword 일섬(一閃) 스킬 : BoxTrace, LineTrace, 새 프로파일 만들기

공대 컴린이 2023. 5. 23. 21:51
728x90

이번 학습에서는 Sword의 스킬인 SubAction을 구현해보았다.

Sword의 스킬로는 일섬을 구현하였는데, 일섬이란 번개같은 속도로 순간이동처럼 돌진하며 적을 베는 공격을 의미한다.

📦 SubAction 실행 구조

Player 클래스의 SetupPlayerInputComponent 함수에서 SubAction 키(마우스 오른쪽 클릭)를 추가해주었고, WeaponComponent의 SubAction_Pressed, Released 함수를 호출해주었다.

 

WeaponComponent에서는 SubAction 객체가 존재한다면 해당 객체의 Pressed 함수와 Released 함수를 호출하도록 하였다.

 

SubAction 클래스는 만들고자하는 스킬들이 SubAction을 부모로 상속받아 사용할 수 있도록 가상함수로 구성하였다.

 

또한 SubAction의 시작(Begin)과 끝(End)을 지정하여 사용할 수 있도록 Notify State로 구현하였다.


⚔️ Sword SubAction(일섬 스킬) 만들기 

먼저, 일섬스킬을 구현하기 위해 UCSubAction을 상속받는 UCSubAction_Sword 클래스를 생성해주었다.

일섬스킬이 시작되면 앞으로 달려나갈 거리(Distance), 달려나가는 속도(Speed) 등을 지정하기 위한 변수를 선언해주었다.

 

일섬 스킬의 핵심은 LineTrace를 이용하여 Line에 충돌되는 StaticMesh가 존재할때까지 Maximum Distance를 움직인다는 것이다. LineTrace에 충돌되는 Pawn들(캐릭터들)은 그대로 통과하고, 벽과 같은 StaticMesh만 Block 되도록 구현하였다.

 

UCSubAction_Sword.h

일섬 스킬로 이동중인지를 나타낼 bMoving 변수와 이동 지점을 관할하는 Start, End FVector를 선언하고, 일섬으로 Overlap 충돌된 캐릭터 객체들을 담을 배열도 선언하였다.

👣 Tick 함수 - 시작지점에서 끝지점으로 이동하기

SubAction_Sword의 Tick 함수에서는 bMoving 변수가 true라면 시작지점인 FVector Start에서 FVector End까지 위치를 더하며 이동하도록 하였다.

 

AddActorWorldOffset 함수를 이용하여 Start->End 방향으로 Speed 속도로 이동하도록 하였다.

 

이때 Owner의 위치가 End 위치에 Owner의 캡슐 반지름만큼의 반경속에 도달했다면 bMoving을 false로 설정하여 더이상 Tick 함수로 인한 이동이 발생하지 않도록 하였다.

👣 Begin SubAction

일섬 스킬인 SubAction_Sword 클래스가 시작될 때 바로 이동할 수 있도록 bMoving을 true로 설정해주었다.

또한 시작지점과 끝지점을 설정하고 Owner의 정보를 바탕으로 반지름, 높이, 방향을 설정하였다.

👣 Begin SubAction : Box Trace

UCSubAction_Sword::Begin_SubAction_Implementation

또한 Begin 함수에서는 스킬에 대한 충돌처리를 수행하는데, 먼저 일섬 스킬에 Hit 되는 Character를 찾아내기 위한 Box Trace를 진행하였다.

 

EObjectTypeQuery 중 Pawn에 해당하는 ObjectTypeQuery3을 지정하여 캐릭터만 충돌 검사하도록 하였다.

 

시작 지점부터 끝 지점까지 플레이어 높이와 너비의 박스크기를 설정하여 충돌을 검사하였고, 해당 Box Trace에 충돌된 Pawn들을 ACharacter로 형변환하였다.

 

이러한 Character들은 임시로 "Sword_SubAction"이라는 프로파일로 Collision Profile을 바꾸어놓았다.

Character들을 일섬공격으로 통과하기위해 Collision을 그냥 NoCollision으로 바꿔버리면 Hit 처리가 전부 무시되기 때문에 별도의 프로파일을 생성하여 설정해 준 것이다.

이후, 다시 원상복구 할 수 있도록 프로파일을 바꾼 Character들을 Overlapped 배열에 저장해두었다.

🚨 새 프로파일 만들기

일섬 충돌에 사용되는 프로파일은 벽과 같은 WorldStatic만 블록처리하고, WorldDynamic과 Pawn만 겹침 처리하여 캐릭터나 물체는 통과할 수 있도록 하였다.

👣 Begin SubAction : Line Trace

UCSubAction_Sword::Begin_SubAction_Implementation

일섬 스킬로 인해 앞으로 빠르게 이동하면서 벽에 부딪혔을때는 제대로 멈추어야 한다.

별다른 처리를 하지않고 Collsion의 블록 처리로만 멈춤을 구현하면 캐릭터가 살짝 벽에 박힌채로 멈추는 상황이 발생하여 벽에 닿았을 때 위치를 한번 재조정해주는 과정을 추가하였다.

 

LineTrace를 통해 Visibility인 객체를 모두 검사하였고, 충돌된 객체가 있다면 이동하던 방향은 그대로 두고, 캐릭터 반지름의 2배만큼의 뒤쪽에 위치를 재조정하였다.

 

이후, 디버깅용으로 멈춤 기능이 작동된것을 확인하기 위해 Shpere를 그려주었다.

👣 End SubAction

스킬의 작동이 끝났을때는, bMoving을 false로 하여 더이상 이동하지 않도록 Tick을 멈추고, Overlap 되었던 캐릭터들의 Collision Profile을 다시 Pawn으로 원상복구 시켜주었다.

🚩마무리 : SubAction_Sword 블루프린트 생성 및 적용하기

만들어두었던 CSubAction_Sword 클래스 기반의 블루프린트를 생성하고, 적절한 속성값들을 초기화 해 주었다.

 

DA_Sword

이후, DA_Sword의 데이터 애셋의 Sub Action Class에 생성한 BP_CSubAction_Sword를 설정해주었다.

 

최종결과물을 확인해보면 아래와 같이 Sword의 일섬 스킬이 진행되면서 Enemy를 뚫고 지나가며 Hit 처리하고, 벽에는 막혀지는 기능이 정상작동하는것을 확인할 수 있었다.

 

728x90