Character

groot616·2024년 3월 26일
0

언리얼5공부복습용

목록 보기
5/22

우선 GameMode Blueprint Class에 설정해둔 Default Pawn을 Character Blueprint class로 변경한다.
Pawn과 동일하게 이동과 회전 관련 함수를 추가해주고, SkeletalMesh도 추가해준다.

캐릭터 회전 관련

Character SkeletalMesh Component 회전 해결

우선 회전 발생시 캐릭터의 skeletal mesh의 회전을 방지하기 위해 전부 비활성화 시킨다.

bUseControllerRotationPitch = false;
bUseControllerRotationYaw = false;
bUseControllerRotationRoll =false;

비활성화시키지 않을 경우 슈퍼맨이 나는 것처럼 지면에 수평인 상태로 캐릭터가 회전하게 된다.
코드로는 아래와 같이 작성 가능하다.
Character skeletal mesh의 회전이 아닌 카메라의 회전을 통해 캐릭터가 회전하듯이 느끼도록 하기 위해서 회전 발생시 SprignArm이 회전하도록 구현해야 한다.
SpringArmComponent의 Details 패널에서 UsePawnControlRotaion을 활성화시켜주면 회전 발생시 캐릭터가 아닌 SpringArm이 회전하는 자연스러운 회전이 가능하다.

2. Controller의 회전에 따라 캐릭터의 이동방향 변경

기존에는

...
// 전후 이동 함수
void CLASS_NAME::MoveForward(float Value)
{
	if((Controller != nullptr) && (Value != 0.f))
    {
    	FVector ForwardVector = GetActorForwardVector();
        AddMovementInput(ForwardVector, Value);
    }
}
// 좌우 이동 함수
void CLASS_NAME::MoveRight(float Value)
{
	if((Controller != nullptr) && (Value != 0.f))
    {
    	FVector RightVector = GetActorRightVector();
        AddMovementInput(RightVector, Value);
    }
}
...

와 같은 코드를 사용하여 캐릭터의 움직임을 구현하였지만, 문제점이 있다.
Controller를 좌우로 회전시켜도 Character는 자기자신의 전방방향으로만 움직인다.
이를 해결하기 위해서는 회전행렬을 사용한다.
코드는 아래와 같다.

...
// 전후 이동 함수
void CLASS-NAME::MoveForward(float Value)
{
	if((controller != nullptr) && (Value != 0.f))
    {
    	// Controller의 Pitch, Yaw, Roll 회전값을 할당
    	const FRotator ControlRotation = GetControlRotation();
        // Controller의 Yaw 기준 회전값만 할당
        const FRotator YawRotation(0.f, ControlRotation.Yaw, 0.f);
        // 회전행렬을 통해 좌표계를 회전시키고, 해당 좌표계의 X축에 대한 unit vector를 할당
        const FVector ChangedDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
        // 얻어낸 새로운 벡터방향으로 이동
        AddMovementIntput(ChangedDirection, Value);
    }
}
// 좌우 이동 함수
void CLASS_NAME::MoveRight(float Value)
{
	if((Controller != nullptr) && (Value != 0.f))
    {
    	const FRotator ContorolRotation = GetControlRotation();
        const FRotator YawRotation(0.f, ControlRotation.Yaw, 0.f);
        // 나머지는 MoveForward함수와 동일하나, 좌우 이동이므로 단위벡터가 y축 기준
        const FVector ChangedDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
        AddMovementInput(ChangedDirection, Value);
    }
}
...

3. Controller 방향으로 이동시 캐릭터 회전

실행시키면 Controller의 회전에 따라 캐릭터의 진행방향이 변하는건 가능하지만 캐릭터는 계속 전방만 주시하고 있으므로 이를 해결해야 한다.

Blueprint에서 구현

Character Movement Component의 Details 패널에 있는 Orient Rotation to Movement를 활성화시킨다.
필요에 따라 회전속도 변경을 위해 위 값을 변경시킬수도 있다.

cpp에서 구현

cpp에서 구현하려면 CharacterMovementComponent를 사용하기 위해 헤더파일을 include해야 한다.

...
#include "GameFramework/CharacterMovementCompoent.h"
...
A_CLASS_NAME::A_CLASS_NAME()
{
	...
    GetCharacterMovement()->bOrientRotationToMovement = true;
    GetcharacterMovement()->RotationRate = FRotator(0.f, 400.f, 0.f);
    ...
}

0개의 댓글