숫자야구게임 정리
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에서 해당 부분을 접을 수 있도록 해주는 코드
비슷한거끼리 묶어서 접고 펴는 정리용 코드
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 회전
위 코드와 같이 하면, 컨트롤러의 회전은 스프링암만 회전시켜, 폰을 기준으로 카메라를 돌려줌. 그리고 폰은 이동하는 방향에 따라서만 회전함
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를 누르면 캐릭터는 북쪽으로 움직임