🎮Unreal4/C++

[UE4] Warp : 순간이동 (UDecalComponent, GetHitResultUnderCursorByChannel)

공대 컴린이 2023. 5. 30. 21:47
728x90

💻 BP_CAttachment_Warp 블루프린트 생성

Warp 기능을 구현하기 위해 무기 역할을 대체하는 BP_CAttachment_Warp를 생성하였다.

 

BP_CAttachment_Warp 에는 Decal을 추가하여 플레이어가 순간이동 할 위치(지점)을 그려주었고,

Warp 무기를 장착한 경우(On Begin Equip 호출)에만 Decal의 Visibility가 활성화되도록 설정하였다.

🖱️ 입력 키 추가

ACPlayer::SetupPlayerInputComponent

플레이어의 SetupPlayerInputComponent 함수에서는 Warp 무기를 장착하는 키(숫자 4)를 추가해주었다.

💻 CDoAction_Warp 클래스

핵심적인 Warp 기능을 구현하기 위한 DoAction_Warp 클래스를 생성해주었다.

순간이동 위치를 지정하는 UDecalComponent와, 마우스의 2D 위치를 가져와 3D 게임 상에 Decal이 나타나도록 하는 GetCursorLocationAndRotation 함수를 작성하였다.

 

BeginPlay가 호출될 때는 InAttachment를 통해 BP_CAttachment_Warp 객체에서 생성해두었던 DecalComponent를 가져왔다.

🚩 GetCursorLocationAndRotation 

GetCursorLocationAndRotation 함수에서는 PlayerController의 GetHitResultUnderCursorByChannel 함수를 이용하여 마우스 커서 아래의 객체들에 대한 충돌을 검사하였다.

 

이후, hitResult 값이 존재한다면 해당 hitResult의 위치 ImpactNormal의 방향을 Decal의 위치와 방향으로 설정하였다.

 

 Warp의 DoAction 함수에서는 GetCursorLocationAndRotation 함수를 통해 받아온 위치와 방향으로 플레이어의 yaw 회전값을 초기화하고, 캐릭터의 절반 위치만큼 위로 올린 위치 값을 재초기화 해 주었다.

 

Begin_DoAction 함수에서는 초기화한 위치값을 바탕으로 Owner Character의 위치를 변경해주었다.

 

이렇게 완성된 CDoAction_Warp 클래스를 블루프린트 기반 클래스로 생성해준 뒤, DataAsset_Warp에 설정해주었다.

 

Warp의 DataAsset에서는 Warp 기능(스킬)을 사용하기 위한 무기 BP_CAttachment_Warp와 Warp 기능을 수행하는 BP_CDoAction_Warp를 설정해준 뒤, DoActionData를 하나 추가해주었다.

 

프로젝트 실행 결과 성공적으로 Warp 기능이 수행되는것을 확인할 수 있었다.

 

728x90