블루프린트로 구현했던 Parkour 기능을 C++클래스로 구현해보았다.
2023.02.15 - [🎮Unreal4/BluePrint] - [UE4] Parkour 기능 -1 (파쿠르가 가능한지 검증, Trace Channels)
[UE4] Parkour 기능 -1 (파쿠르가 가능한지 검증, Trace Channels)
🏃♂️ Parkour 플레이어가 자유롭게 높은 담벽을 넘고, 슬라이드하고, 벽을 짚고 기어올라가는 등의 파쿠르 동작을 구현해보았다. 파쿠르 동작을 구현하는데 가장 중요한 요소는 파쿠르가 가
cse-child.tistory.com
2023.02.16 - [🎮Unreal4/BluePrint] - [UE4] Parkour 기능 -2 (Climb, Set Movement Mode, 루트 모션)
[UE4] Parkour 기능 -2 (Climb, Set Movement Mode, 루트 모션)
Parkour 기능을 구현하기 위해 이전 게시글에서 파쿠르가 가능한지 판별하는 검증절차 코드들을 작성하였다. 이제는 파쿠르가 가능한 상황일 때, 다양한 종류의 파쿠르를 실행하도록 실질적인 플
cse-child.tistory.com
2023.02.16 - [🎮Unreal4/BluePrint] - [UE4] Parkour 기능 -3 (Slide, Short/Normal/Wall)
[UE4] Parkour 기능 -3 (Slide, Short/Normal/Wall)
🏃♀️ 파쿠르 Type별 체크하기 : Slide Do Parkour 함수에서 Climb 파쿠르가 아니라면 다음으로는 Slide 모드가 가능한지를 검사한다. 슬라이드를 실행할때는 캐릭터의 발 앞에 붙어있는 Floor Arrow에
cse-child.tistory.com
⬆️ Parkour Arrow 만들기
Parkour 기능의 핵심은 Player의 상하좌우, 중앙, 바닥에 Arrow Component를 붙여서 해당 Arrow 방향으로 LineTrace를 진행하여 충돌 여부를 판단 후, 종류 별 Parkour를 수행시키는 것이다.

따라서 Parkour의 기능을 모아둔 Parkour Component 클래스를 생성한 뒤, Player에게 생성할 Arrow들의 Type을 Enum 클래스로 생성해주었다.

CPlayer 클래스에서는 이러한 Arrow들을 통괄하는 Scene Component (ArrowGroup)을 만들고, Arrow Group아래 들어갈 UArrowComponent 들을 배열로 생성한다.

CPlayer 클래스의 생성자에서 ArrowGroup Scene Component를 생성한 뒤, 자식 컴포넌트로 ArrowComponent들을 생성해서 추가해주었다.
Parkour Component에서 만들어두었던 ArrowType Enum값을 가져와, GetNameStringByIndex 함수를 통해 열거형의 이름대로 UArrowComponent 이름을 초기화하며 생성해주었다.
또한 각 Arrow마다 Debug하며 분류하기 편하도록 임의의 Arrow Color를 지정해주었고, LineTrace로 검사할 위치에 맞게 Location과 Rotation을 조정해주었다.

컴파일 후 CPlayer를 확인해보면 Parkour Component에서 만들어둔 ParkourArrowType Enum 값들의 이름대로 ArrowComponent가 추가된 것을 확인할 수 있었다.
또한 ParkourComponent가 Parkour 라는 이름으로 추가된것을 확인할 수 있었다.
📦 ParkourComponent 클래스

Parkour Component에서는 수행할 Parkour의 종류를 EParkourType 열거형으로 선언하였고,
Parkour 충돌을 검사하는 거리(TraceDistance), 디버깅 시 필요한 EDrawDebugTrace, 측면에서 가능한 Parkour 각도(AvailableFrontAngle)를 속성값으로 선언하였다.

또한 CPlayer에 선언해두었던 Arrows 배열과, Arrow Line Trace에 충돌된 객체를 저장할 HitResults, 충돌된 Parkour Object의 폭을 저장하는 HitObstacleExtent 등의 변수를 선언하였다.

BeginPlay 함수에서는 OwnerCharacter가 가지고있는 ArrowGroup을 찾아 자식에 존재하는 UArrowComponent들을 모두 불러와 Arrows 배열을 초기화하였다.

Tick함수에서는 CheckTrace_Center 함수를 주기적으로 호출한다.
지금은 Parkour 기능의 초기를 구현하는 중이라 Center만 Trace 검사를 진행하고, 추후에는 Center이외에도 다른 Arrow들에 대한 CheckTrace를 진행할 것이다.
✔️ Center Arrow 검사하기 : CheckTrace_Center

CheckTrace_Center 함수에서는 LineTrace 함수를 호출한다.

LineTrace 함수는 Arrows 배열에서 매개변수로 받은 Arrow Type에 해당하는 ArrowComponent를 불러와서 LineTraceSingle 함수에 필요한 매개변수들을 초기화 하였다.
LineTrace를 진행하는 시작점은 Arrow Component의 World Location이고, 끝지점은 시작점에서 TraceDistance 거리만큼 Owner 캐릭터의 앞부분으로 향한 지점이다.
🚩 채널 및 프로파일 생성

충돌 체크에 필요한 새로운 Trace Channels를 생성하였다.
Parkour라는 채널을 생성하여, 기본 반응을 Ignore(무시)로 설정하고, Parkour 프로파일을 생성하여 해당 프로파일에서만 Parkour 채널을 블록으로 설정하였다.

Parkour 프로파일에서만 Parkour 트레이스 유형을 블록(Block)으로 설정하였다.

Parkour Object를 World에 배치하고 나서 콜리전 프리셋을 생성해둔 Parkour로 설정해둬야 LineTrace 함수에 존재하는 LineTraceSingle 검사에 충돌체크 될 수 있다.
컴파일 후 프로그램을 실행시켜보면, 성공적으로 CheckTrace_Center가 수행되는것을 볼 수 있다.
충돌 이후의 Line은 흰색으로 나오고, 충돌 Line은 빨간색으로 나오는것을 확인할 수 있었다.

'🎮Unreal4 > C++' 카테고리의 다른 글
[UE4] Parkour System -2 : Climb, Do Parkour, Check Obstacle (0) | 2023.06.22 |
---|---|
[UE4] CSV 파일 읽어서 DataTable로 만들기 : ParkourData (0) | 2023.06.22 |
[UE4] 활시위(Bow String) 당기기 : Set/GetBoneLocationByName (0) | 2023.06.19 |
[UE4] Arrow 생성/발사 : UProjectileMovementComponent, Attach/Detach (0) | 2023.06.17 |
[UE4] Bow AimOffset, 본마다 레이어로 블렌딩, Camera Pitch 각도제한 (0) | 2023.06.15 |