1. 회전 구조체
1.FRotator
- 언리얼 엔진에서 회전(Orientation)을 표현하기 위해 사용하는 구조체
- Yaw, Pitch, Roll로 구성된 3개의 축을 기반으로 3D 공간에서의 회전을 정의
FRotator Rotation(0.0f, 90.0f, 0.0f);
2. FQuat(참고)
- 쿼터니언 기반 회전 표현.
- 회전을 더 부드럽고 정확하게 처리.
- SLERP(구면 선형 보간) 같은 기능이 필요할 때 주로 사용.
FQuat Rotation = FQuat(FRotator(0.0f, 90.0f, 0.0f)); // FQuat로 변환
2. 회전 관련 함수
1. SetControlRotation()
- 설명: 플레이어의 컨트롤러 회전을 설정.
- 사용 시점:
- FPS/TPS 게임에서 카메라의 방향을 변경하고 싶을 때 주로 사용.
- 예를 들어, 마우스를 움직일 때 시점이 변경되도록 구현할 때 사용.
- 특징:
- Pawn의 회전과는 독립적이며, 컨트롤러에만 영향을 미침.
- 보통 카메라 방향을 제어하는 데 적합.
FRotator NewControlRotation = FRotator(0.f, 90.f, 0.f);
Controller->SetControlRotation(NewControlRotation); // 컨트롤러의 방향을 정동쪽으로 설정
2. SetActorRotation()
- 설명: 액터 자체의 월드 기준 회전을 설정합니다.
- 사용 시점:
- 캐릭터나 오브젝트의 전체적인 방향을 설정하고 싶을 때.
- 예를 들어, 캐릭터가 특정 방향을 바라보게 하거나 오브젝트를 특정 각도로 회전시키고 싶을 때.
- 특징:
- 기존 회전값을 덮어씌움.
- 월드 좌표를 기준으로 동작.
FRotator NewActorRotation = FRotator(0.f, 45.f, 0.f);
SetActorRotation(NewActorRotation); // 액터를 북동쪽 방향으로 회전
3. AddActorLocalRotation()
- 설명: 액터의 로컬 좌표계를 기준으로 회전 추가.
- 사용 시점:
- 현재 로컬 방향에 대해 특정 각도를 더하고 싶을 때.
- 예를 들어, 캐릭터가 이동 중일 때 점진적으로 방향을 변경하거나 회전 효과를 추가하고 싶을 때.
- 특징:
- 기존 회전에 값을 더하는 방식으로 동작.
- 로컬 좌표계 기준이므로, 상대적인 방향을 다룰 때 유용.
FRotator RotationDelta = FRotator(0.f, 10.f, 0.f);
AddActorLocalRotation(RotationDelta); // 현재 방향에서 Yaw를 +10도 추가
4. AddControllerYawInput()
- 컨트롤러의 Yaw(좌우 회전)에 입력값을 추가.
- 카메라의 움직임과 캐릭터의 방향 전환을 처리할 때 사용.
AddControllerYawInput(5.0f); // 컨트롤러의 Yaw를 5도 증가
3. 캐릭터 회전 설정 플래그
플래그(Flag): 프로그래밍에서 특정 상태나 동작을 제어하기 위해 사용하는 논리값(boolean 값) 또는 설정 값
1. bUseControllerRotationYaw
- 설명: 캐릭터의 Yaw 회전을 컨트롤러의 Yaw 회전과 동기화할지 여부를 결정.
- 기본값: false
- 사용 시점:
- 캐릭터가 컨트롤러의 방향을 바라보도록 만들고 싶을 때 사용.
- FPS 또는 TPS 게임에서 카메라가 바라보는 방향으로 캐릭터가 즉시 회전하도록 설정.
- 예시:
bUseControllerRotationYaw = true;
- true로 설정하면 캐릭터의 Yaw 회전이 컨트롤러의 Yaw에 맞춰 자동으로 변경.
- 즉, 플레이어가 마우스를 움직여 카메라를 회전하면, 캐릭터도 즉시 해당 방향을 바라보게됨.
2. bUseControllerRotationPitch
- 설명:
- 캐릭터의 Pitch 회전(상하 회전)을 컨트롤러의 Pitch와 동기화할지 결정.
- 기본값: false
- 사용 시점:
- 캐릭터 자체가 상하 회전이 필요할 때(예: 비행 게임에서 캐릭터가 위/아래로 기울어지는 경우).
- 주의점:
- 대부분의 경우 카메라와 컨트롤러는 상하 회전을 하지만, 캐릭터 자체는 상하 회전을 하지 않으므로 false로 유지.
3. bUseControllerRotationRoll
- 설명:
- 캐릭터의 Roll 회전(옆으로 기울어짐)을 컨트롤러의 Roll 값과 동기화할지 결정.
- 기본값: false
- 사용 시점:
- 일반적인 지상 캐릭터에서는 거의 사용되지 않음.
- 비행 게임처럼 캐릭터가 옆으로 기울어지는 동작이 필요할 때 사용 가능.
3.1 참고: CharacterMovementComponent와의 관계
Pawn클래스와 다르게 Character 클래스는 다양한 움직임과 회전 관련 설정을 제공하며, 기본값으로 대부분의 기능이 설정되어 있다. 그래서 bUseControllerRotationYaw = true; 같은 값을 직접 설정하지 않아도, 상황에 따라 기본 동작이 작동한다. 하지만 특정 요구사항이 있을 때는 CharacterMovementComponent에서 더 세부적으로 조정할 수 있다.
1. bOrientRotationToMovement
-
- 설명: 캐릭터의 이동 방향에 따라 자동으로 회전할지 결정.
- 기본값: false
- 사용 시점:
- 캐릭터가 입력된 이동 방향을 자연스럽게 따라 회전하도록 만들고 싶을 때.
- 예: 디펜스 게임이나 모바일 RPG처럼 입력 방향에 따라 이동하는 캐릭터.
- 예시 코드:
- 이 설정을 true로 하면 캐릭터가 입력된 이동 방향으로 부드럽게 회전
GetCharacterMovement()->bOrientRotationToMovement = true;
2. RotationRate
- 설명: 캐릭터가 회전할 때의 속도를 설정.
- 적용: bOrientRotationToMovement와 함께 사용되며, 캐릭터의 회전 속도를 조정할 수 있다.
- 예시:
GetCharacterMovement()->RotationRate = FRotator(0.0f, 720.0f, 0.0f); // 초당 720도 회전
3. UseControllerDesiredRotation
- 설명: 컨트롤러의 회전 값을 기반으로 캐릭터의 방향을 결정할지 여부.
- 사용 시점:
- 컨트롤러가 캐릭터의 방향을 완전히 제어하게 만들고 싶을 때.
3. Look() 함수 구현 과정
1. 컨트롤러 세팅
Controller.h
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
UInputAction* LookAction;
Controller.cpp
ASpartaSpiderController::ASpartaSpiderController()
: InputMappingContext(nullptr),
MoveAction(nullptr),
AscendAction(nullptr),
DescendAction(nullptr),
.
.
.
LookAction(nullptr)
{
}
2. 캐스팅&바인딩
- SetupPlayerInputComponent 함수에서 Enhanced Input Component를 캐스팅한 후,
- 컨트롤러의 LookAction과 Look 함수를 바인딩.
Pawn.h
UFUNCTION()
void Look(const FInputActionValue& value);
Pawn.cpp
ASpartaPawn::ASpartaPawn()
{
bUseControllerRotationYaw = true;
}
void ASpartaPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// Enhanced InputComponent로 캐스팅
if (UEnhancedInputComponent* EnhancedInput = Cast<UEnhancedInputComponent>(PlayerInputComponent))
{
// IA를 가져오기 위해 현재 소유 중인 Controller를 ASpartaPlayerController로 캐스팅
if (ASpartaSpiderController* PlayerController = Cast<ASpartaSpiderController>(GetController()))
{
if (PlayerController->LookAction)
{
// IA_Look 액션 마우스가 "움직일 때" Look() 호출
EnhancedInput->BindAction(
PlayerController->LookAction,
ETriggerEvent::Triggered,
this,
&ASpartaPawn::Look
);
}
}
}
}
3. Look 함수
void ASpartaPawn::Look(const FInputActionValue& value)
{
if (!Controller) return;
FVector2D LookInput = value.Get<FVector2D>();
// 현재 컨트롤러의 회전값 가져오기
FRotator CurrentRotation = Controller->GetControlRotation();
// 새로운 회전값 계산
FRotator NewRotation = CurrentRotation;
NewRotation.Yaw += LookInput.X; // 마우스 X 이동으로 Yaw 변경
NewRotation.Pitch = FMath::Clamp(NewRotation.Pitch + LookInput.Y, -45.0f, 25.0f); // 마우스 Y 이동으로 Pitch 변경 (Pitch는 제한)
// 컨트롤러 회전값 설정
Controller->SetControlRotation(NewRotation);
}
✏️ 회전만 보다 보니까 내가 돌아버리겠다.
'TIL > C++와 UE' 카테고리의 다른 글
Pawn 클래스 캐릭터의 부드러운 움직임 (1) | 2025.02.05 |
---|---|
비행체 움직임 (0) | 2025.01.28 |
충돌 검사 (0) | 2025.01.24 |
Pawn 클래스 다루기 (0) | 2025.01.23 |
언리얼 엔진 클래스 계층 구조 (0) | 2025.01.22 |