이전 학습때 Parkour Component를 제작하고, LineTrace 함수를 작성하여 플레이어의 Forward 방향으로 LineTraceSingle 충돌 검사를 수행하였다.
이번에는 충돌된 객체들의 정보를 저장하여 Parkour Object를 올라갈 수 있는 Climb 기능을 만들어보았다.
💥 CheckTrace_Center 충돌 결과 저장하기 : Hit Result
ParkourComponent 클래스의 CheckTrace_Center 함수에서 LineTrace 함수를 호출하고 난 뒤, 충돌 객체가 저장된 HitResult 배열을 불러왔다.
하나라도 충돌된 객체가 있다면 해당 Actor를 HitObstacle 변수에 저장해놓았다.
충돌된 객체(HitObstacle)의 폭을 판단하여 Climb 할 수 있는 Object인지 구별하기 위해 GetLocalBounds 함수를 사용하였다.
Min Bound 값에서 Max Bound 값을 뺀 절댓값을 구하여 충돌 물체의 폭을 HitObstacleExtent 변수에 저장하고 충돌된 거리 값 또한 HitDistance에 저장해두었다.
🚩 ToFrontYaw
이후, 전방을 바라보는 각도를 구해서 ToFrontYaw 변수에 저장하기 위해, MakeRotFromX 함수를 통해 절대 X방향을 기준으로 축 사잇값을 구하였다.
이때 충돌 객체의 ImpactNormal 값에 마이너스를 곱했는데, 이는 ImpactNormal이 충돌 물체의 바깥쪽으로 향해있지만 내가 구하고자 하는 방향은 밖에서 충돌객체로 향하는 방향이므로 음수를 곱해준다.
함수의 반환값 중 Yaw값만을 가져와서 플레이어의 Center Line이 충돌객체에 충돌된 측면 각도를 구할 수 있었다.
디버깅을 위해 LOG define을 선언하고 #ifdef ~ #endif 를 이용한 로그 프린트를 작성하였다.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
출력된 로그를 보면 Climb를 수행할 Object의 네 면에 섰을 때 ToFrontYaw 값이 각각 0, -90, 180, 90으로 변경되며 출력하는 결과를 확인할 수 있었다.
✔️ 다른 Arrow 방향 모두 CheckTrace 수행
이렇게 CheckTrace_Center 함수가 끝나면 다른 Arrow의 충돌을 추가로 검사하며 실시간으로 Arrow에 충돌되는지를 검사하였다. 이후에는 충돌된 Arrow의 종류에 따라 어떤 Parkour 동작을 수행할 것인지 결정한다.
각 CheckTrace 함수에서는 ArrowType 별 LineTrace를 수행한다.
프로그램을 실행해보면 각 Arrow 방향으로 충돌된 LineTraceSingle의 결과가 잘 출력되고 있는것을 확인할 수 있다.
🕺🏻 Parkour 실행 : DoParkour
마우스 오른쪽 버튼을 누를 때, 무기를 장착하고 있지 않다면 Parkour가 실행되고, 무기 장착중이라면 해당 무기의 스킬(SubAction_Pressed)이 발동되도록 하였다.
DoParkour 함수에서는 CheckTrace_Center에 충돌된 HitObstacle 객체를 한번 더 검사하는 Check_Obstacle 함수를 호출한다. Check_Obstacle 함수에 통과된 이후에는 각 Parkour의 종류마다 가능한지를 다시 한번 검사한 뒤, 해당 Parkour 동작을 수행한다.
Check_Obstacle 함수에서는 HitObstacle이 존재하는지 한번 더 확인한 뒤, Center, Left, Right 방향의 LineTrace가 전부 충돌되어 있어야 Parkour가 가능하도록 하였다.
이후 캐릭터가 HitObstacle의 모서리에 위치하는지를 검사하기 위해 Center, Left, Right Arrow에 충돌된 Object의 Normal 벡터를 불러와서 Center의 Normal 벡터와 동일한지를 검사하였다. Center의 Normal 벡터와 동일하지 않다면 모서리에 위치하는 것이다.
마지막으로는 캐릭터가 HitObstacle을 바라보는 각도를 구해서 Parkour 가능한 각도인지를 확인해보았다.
Center HitObstacle의 ImpactPoint에서 캐릭터의 위치로 향하는 방향벡터의 Yaw 값을 구하고,
Center HitObstacle의 ImpactNormal 벡터를 MakeRotFromX 함수를 수행한 Yaw 값을 구해서 두 float 값의 절댓값 차이를 구했다.
해당 값이 플레이어가 HitObstacle을 바라보고 있는 각도이므로, 기존에 설정한 Parkour 가능한 시야각에 속하는지를 검사한 뒤 모든 조건에 충족하다면 True를 반환해주었다.
DoParkour 함수에서 Check_Obstacle 함수를 통과했다면 가장 먼저 Climb가 가능한 상태인지를 검사하는 Check_ClimbMode 함수를 호출하였다.
Check_ClimbMode 함수에서는 Ceil 방향(머리 위쪽)에 충돌된 Object가 있는지를 검사하고, ParkourData에서 Climb 데이터를 가져와 Climb의 Distance와 Extent 조건이 만족하는지를 검사한다.
ParkourData는 CSV파일로 만들어서 DataTable로 변환해두었는데, 그 내용에 대해선 아래 게시글로 정리해두었다.
2023.06.22 - [🎮Unreal4/C++] - [UE4] CSV 파일 읽어서 DataTable로 만들기 : ParkourData
Check_ClimbMode 함수에도 통과했다면 실제 Parkour를 수행시킬 DoParkour_Climb 함수를 실행시킨다.
Climb은 높은 벽을 오르는 동작이므로 제대로 벽을 오르도록 캐릭터의 위치와 방향을 HitObstacle의 ImpactPoint 앞으로 맞춰놓는다.
이후, DataMap에서 Climb의 몽타주를 가져와 플레이시켰다.
이때 캐릭터의 Movement 상태를 MOVE_Flying으로 설정하여 위로 오르는 몽타주가 실행될 때 실제 캐릭터가 상승하도록 하였다.
End_DoParkour_Climb 함수에서는 Flying 모드였던 CharacterMovement를 다시 Walking 모드로 변경하여 계속해서 하늘로 승천하지 않도록 막았다.
🚩 Parkour Notify 만들기
Parkour 노티파이를 제작하여, Parkour를 수행하는 몽타주 끝쪽에 배치하여 End_Parkour 함수들이 호출될 수 있도록 구현하였다.
위처럼 Parkour 몽타주의 Parkour 기능이 끝나는 부분에 노티파이를 배치해주었다.
컴파일 후 프로젝트를 실행시켜보면 성공적으로 Climb Parkour가 실행되는 것을 확인할 수 있다.
'🎮Unreal4 > C++' 카테고리의 다른 글
[UE4] Parkour System -4 : Short, Normal, Wall Obstacle, Slide (0) | 2023.06.27 |
---|---|
[UE4] Parkour System -3 : Falling, Landed (0) | 2023.06.26 |
[UE4] CSV 파일 읽어서 DataTable로 만들기 : ParkourData (0) | 2023.06.22 |
[UE4] Parkour System -1 : CheckTrace_Center (0) | 2023.06.21 |
[UE4] 활시위(Bow String) 당기기 : Set/GetBoneLocationByName (0) | 2023.06.19 |