Dodge(Roll)을 구현해 보자
지난 글에서는 MotionMatching과 ChooserTable을 활용해서 기본적인 Locomotion을 구현하는 데 성공했었다. ChooserTable에 사용한 변수들의 가짓수가 적고 세세하게 분류하지 않아서 아직 엉성한 블랜딩을 보여주지만 이는 차후에 다듬는 걸로 하고 오늘은 구르기(Roll, Dodge)를 한번 구현해보려고 한다. 사실 지난 주말과 월요일에는 기존에 작성했던 CHT_PoseSearchDatabase에 PSD_Dodge를 구성하여 WantsToDodge 변수가 true일 때 선택되도록 하여 구현을 해 보았으나 애니메이션이 재생 중에 해당 변수가 false가 되면서 다른 애니메이션이 재생되는 문제가 생겨 해당 방법으로 구현은 내 얕은 지식으로는 사실상 불가능하다는 결론을 내렸다. 그렇기에 새로운 방식을 고안했다.
Chooser를 사용하되 다른 방식으로 구현하자
ChooserTable의 장점은 여러 애셋 중에서 상황에 적절한 애셋을 적절히 선택하여 재생하다는 것이 가능하다는 것이다. 내가 갖고 있는 애니메이션 애셋에는 8방향으로의 구르기 애니메이션이 포함된 애셋이기 때문에 이 부분을 살리고 싶은 마음이 있었다 그렇기에 C++로 이전에 작성한 PlayerInputState 구조체에 DodgeDirection이라는 Enum을 추가하여 플레이어가 마지막으로 입력한 값의 방향을 구해 해당 각도에 일치하는 Enum 값을 Chooser가 받아서 해당하는 애니메이션을 재생하게끔 로직을 구성해 보았다.
실전으로 들어가 보자
일단 핵심이 될 Enum을 기존 구조체에 정의해 주도록 하자
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "PlayerInputState.generated.h"
UENUM(BlueprintType)
enum class EDodgeDirection : uint8
{
Forward,
ForwardRight,
Right,
BackRight,
Back,
BackLeft,
Left,
ForwardLeft,
Neutral
};
USTRUCT(BlueprintType)
struct PROJECTM_API FPlayerInputState
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerInputState")
bool bWantsToMove =false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerInputState")
bool bWantsToDodge = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerInputState")
bool bIsAiming = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerInputState")
bool bIsFalling = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerInputState")
bool ShouldSpinTransition = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerInputState")
float CurrentSpeed = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerInputState")
float FallingSpeed = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerInputState")
EDodgeDirection DodgeDirection = EDodgeDirection::Neutral;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "PlayerInputState")
float InputYawOffset = 0.0f;
};
Enum을 추가해 주고 구조체에 해당 Enum 자료형 변수를 추가해 준 다음 Dodge함수와 Dodge의 각도를 계산해 Enum에 등록된 값 중 하나를 방향변수에 대입해 줄 GetDodgeDirection을 다음처럼 작성해 준다.
void AProjectMCharacter::Dodge(const FInputActionValue& Value)
{
if (PlayerInputState.bWantsToDodge == false)
{
PlayerInputState.bWantsToDodge = true;
float CurrentAngle = PlayerInputState.InputYawOffset;
PlayerInputState.DodgeDirection = GetDodgeDirection(CurrentAngle);
OnDodgeTriggered();
}
}
EDodgeDirection AProjectMCharacter::GetDodgeDirection(float Angle) const
{
if (GetLastMovementInputVector().IsZero()) return EDodgeDirection::Neutral;
if (Angle >= -22.5f && Angle < 22.5f) return EDodgeDirection::Forward;
if (Angle >= 22.5f && Angle < 67.5f) return EDodgeDirection::ForwardRight;
if (Angle >= 67.5f && Angle < 112.5f) return EDodgeDirection::Right;
if (Angle >= 112.5f && Angle < 157.5f) return EDodgeDirection::BackRight;
if (Angle >= -67.5f && Angle < -22.5f) return EDodgeDirection::ForwardLeft;
if (Angle >= -112.5f && Angle < -67.5f) return EDodgeDirection::Left;
if (Angle >= -157.5f && Angle < -112.5f) return EDodgeDirection::BackLeft;
return EDodgeDirection::Back;
}
그리고 CHT_Dodge를 생성해 주고 출력 결과를 애님 몽타주로 설정해 주고 애님 몽타주를 각도별로 등록해 준 다음다음처럼 세팅해 준다.

이제 BP_Character로 이동해서 UFUNCTION(BlueprintImplementableEvent)를 통해서 Blueprint 이벤트로 등록한 함수를 호출해 준 다음다음처럼 노드를 구성해 준다.

이제 영상으로 결과를 확인해 보자
주말 2일을 포함해 이것저것 강의 영상도 찾아보고 공식 문서도 찾아보면서 어떻게 구르기 구현까지는 구현할 수 있게 되었다. 하지만 영상을 보면 알지만 무조건 정면 구르기만 재생되고 있는 것을 볼 수 있다. 다음 시간에는 이동 중 방향전환과 제자리 방향전환의 여부를 판단할 변수를 Chooser에 추가해서 자연스러움 방향별 애니메이션이 재생될 수 있도록 한번 해보도록 하겠다.
'unreal 5기' 카테고리의 다른 글
| 260127 언리얼엔진 본캠프 116일차 디테일한 Chooser을 위한 변수 작업 (0) | 2026.01.27 |
|---|---|
| 260122 언리얼엔진 본캠프 113일차 GASP(7) (0) | 2026.01.22 |
| 260116 언리얼엔진 본캠프 109일차 GASP(5) ChooserTable-1 (1) | 2026.01.16 |
| 260115 언리얼엔진 본캠프 109일차 GASP(4) MotionMatching (1) | 2026.01.15 |
| 260114 언리얼엔진 본캠프 108일차 GASP(3) (0) | 2026.01.14 |