TIL_071 : pragma region, 컨트롤러 회전값

김펭귄·2025년 11월 26일

Today What I Learned (TIL)

목록 보기
71/107

오늘 학습 키워드

  • 숫자야구게임 정리

  • pragma region

  • 컨트롤러 회전값

1. 숫자야구게임

숫자야구게임 깃허브

2. pragma region

UCLASS()
class DEDICATEDX_API ADXCharacter : public ACharacter
{
	GENERATED_BODY()

#pragma region ACharacter Override
public : 
	ADXCharacter();
	virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent);
	virtual void BeginPlay() override;
#pragma endregion
};
  • visual studio에서 해당 부분을 접을 수 있도록 해주는 코드

  • 비슷한거끼리 묶어서 접고 펴는 정리용 코드

3. 컨트롤러/Pawn 회전값

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

GetCharacterMovement()->bUseControllerDesiredRotation = false;
GetCharacterMovement()->bOrientRotationToMovement = true;

SpringArm->bUsePawnControlRotation = true;
Camera->bUsePawnControlRotation = false;
  • 캐릭터의 생성자에서 위와 같이 회전값 처리를 해줄 수 있다

  • bUseControllerRotation~ : 컨트롤러의 각 축에 대한 회전값에 따라 폰도 회전시킴

  • GetCharacterMovement()->bUseControllerDesiredRotation
    컨트롤러의 회전값에 따라 폰 로테이션 시켜줌

  • GetCharacterMovement()->bOrientedRotationToMovement
    폰의 이동방향에 따라 폰을 로테이션 시켜줌

  • SpringArm->bUsePawnControlRotation : 컨트롤러 회전값에 따라 SpringArm회전

  • Camera->bUsePawnControlRotation : 컨트롤러 회전값에 따라 Camera 회전

  • 위 코드와 같이 하면, 컨트롤러의 회전은 스프링암만 회전시켜, 폰을 기준으로 카메라를 돌려줌. 그리고 폰은 이동하는 방향에 따라서만 회전함

4. 캐릭터 이동 처리

void AMyCharacter::Move(const FInputActionValue& value)
{
	if (!Controller) return;

	const FVector2D MoveInput = value.Get<FVector2D>();

	if (!FMath::IsNearlyZero(MoveInput.X)) 
		AddMovementInput(GetActorForwardVector(), MoveInput.X);
	if (!FMath::IsNearlyZero(MoveInput.Y))
		AddMovementInput(GetActorRightVector(), MoveInput.Y);
}
  • 이 방식은, 현재 캐릭터가 바라보는 방향을 기준으로 움직임

  • 즉, 내 카메라는 북쪽을 바라보고 있고, 캐릭터가 동쪽을 바라보고 있는데, w를 누르면 동쪽으로 이동함

  • 이 방식의 코드는 캐릭터의 방향과 카메라의 방향이 일치할 때 사용해야함

void ADXCharacter::HandleMoveInput(const FInputActionValue& InValue)
{
	if (!IsValid(Controller))
		return;

	FVector2D InMovementVector = InValue.Get<FVector2D>();

	FRotator ControlRotation = Controller->GetControlRotation();
	FRotator YawRotation(0.0f, ControlRotation.Yaw, 0.f);

	FVector FowardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
	FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);

	AddMovementInput(FowardDirection, InMovementVector.X);
	AddMovementInput(RightDirection, InMovementVector.Y);
}
  • 이 방식은, 현재 캐릭터가 바라보는 방향이 아닌, 컨트롤러의 방향을 기준으로 움직임

  • SpringArm->bUsePawnControlRotation = true; 로 설정해주면, 컨트롤러의 회전값에 따라 SpringArm도 같이 회전하고, 카메라는 스프링암 따라 움직임

  • 즉, 컨트롤러의 회전값과 스프링암의 회전값이 동일해지고, 컨트롤러의 ForwardVector는 카메라의 ForwardVector와 동일해짐.
    그래서 아래와 같이 시야처리 함수에서 그냥 컨트롤러에 회전값만 넣어주면 알아서 스프링암이 회전하는 것이었음

void ADXCharacter::HandleLookInput(const FInputActionValue& InValue)
{
	if (!IsValid(Controller))
	{
		UE_LOG(LogTemp, Error, TEXT("Controller is Invalid."));
		return;
	}

	const FVector2D InLookVector = InValue.Get<FVector2D>();
	AddControllerYawInput(InLookVector.X);
	AddControllerPitchInput(InLookVector.Y);
}
  • 다시 돌아와 이 방식은 카메라 기준으로 움직임. 카메라가 북쪽을 바라보고, 캐릭터가 동쪽을 보고있더라고, w를 누르면 캐릭터는 북쪽으로 움직임
profile
반갑습니다

0개의 댓글