이전 글에서 입력을 받아 캐릭터를 이동해봤다.
하지만 마우스, 키보드에 대해서의 입력만 상정하고 작성했기 때문에,
만약 게임패드를 통해 입력을 받는다면 이상할게 작동할 것이다.
가정. 게임패드에 대한 입력을 받기위해 게임패드의 대하여 매핑을 해보자
위 사진은 이전 글에서 매핑한 입력에 게임패드의 입력을 추가한 상태이다.
실제로 플레이해보며 확인해보면 정상적으로 작동하는 것처럼 보인다.
하지만 프레임 속도때문에 그렇지않다.
마우스를 일정한 속도로 움직인다고 했을때 30fps에서는 10씩 3번 입력이 들어간다.
그리고 60fps에서는 프레임을 2배 더 자주 표시하기때문에 10의 반인 5씩 6번입력이 들어간다.
-> 컴퓨터의 속도와 상관없이 일정하게 값을 입력받는다.
하지만 게임패드의 경우 30fps에서 1씩 3번입력받는다고 할때
60fps에서는 1값이 그대로인 상태에서 30fps의 2배인 6번입력을 받는다.
->컴퓨터의 속도에 따라 입력값이 일정하지 않는다.
때문에 프레임 속도에 독립성을 부여해야한다.
프레임 속도의 독립성
회전 속도(게임 패드)를 조절하기 위해 Delta Tme을 곱해줘야한다.
AddControllerPitchInput함수(카메라 상하)와 AddControllerYawInput함수(카메라 좌우)에 대해여 프레임과 독립된 속도를 넣어줘야한다.
먼저 바인딩 시킬 함수를 작성한다.
//ゲームパットカメラ上下移動
void AShooterCharacter::LookUpRate(float AxisValue)
{
//距離 = 速度 * 移動時間
AddControllerPitchInput(AxisValue * RotateRate * GetWorld()->DeltaTimeSeconds);
}
//ゲームパットカメラ上下移動
void AShooterCharacter::LookRightRate(float AxisValue)
{
//距離 = 速度 * 移動時間
AddControllerYawInput(AxisValue * RotateRate * GetWorld()->DeltaTimeSeconds);
}
함수 내부는 이전 글에서 작성한 LookUp함수와 LookRight함수와는 다르게 AxisValue를 그대로 전달하고 있지않다.
프레임과 독립된 속도를 전달하기 위해 계산된 값을 전달하고 있다.
여기서 AxisValue는 게임패드를 통해 입력받은 값이고 RotateRate는 헤더파일에 정의해둔 회전속도가 된다.
마지막으로 DeltaTimeSeconds를 곱하는 것으로 실제로 게임패드를 통해 이동한 거리가 된다.
작성한 함수를 바인딩한다.
// Called to bind functionality to input
void AShooterCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
//マウスに関するBind
PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &AShooterCharacter::MoveForward);
PlayerInputComponent->BindAxis(TEXT("MoveRight"), this, &AShooterCharacter::MoveRight);
PlayerInputComponent->BindAxis(TEXT("LookUp"), this, &APawn::AddControllerPitchInput);
PlayerInputComponent->BindAxis(TEXT("LookRight"), this, &APawn::AddControllerYawInput);
PlayerInputComponent->BindAction(TEXT("Jump"), EInputEvent::IE_Pressed, this, &ACharacter::Jump);
//ゲームパットに関するBind
PlayerInputComponent->BindAxis(TEXT("LookUpRate"), this, &AShooterCharacter::LookUpRate);
PlayerInputComponent->BindAxis(TEXT("LookRightRate"), this, &AShooterCharacter::LookRightRate);
}
추가한 코드는 아래의 두줄이된다.
매핑 텍스트 LookUp과 LookRight의 경우 마우스를 통해 입력받은 값이 그대로 AddControllerPitchInput함수와 AddControllerYawInput함수에 전달되기때문에 따로 함수 작성없이 부모(&APawn)의 함수를 직접사용하고 있다.
하지만 매핑텍스트 LookUpRate와 LookRightRate의 경우 게임패드를 통해 입력받은 값을 통해 프레임과 독립된 속도가 필요하기 때문에 따로 작성한 LookUpRate함수와 LookRightRate함수에게 매핑을 시켜준다.
'UnrealEngine' 카테고리의 다른 글
Unreal Egine) 콜리전 Collision (0) | 2024.02.21 |
---|---|
Unreal Engine5) 카메라 & 스프링 암 (0) | 2024.01.20 |
Unreal Engine5 캐릭터 이동1 (0) | 2024.01.09 |
UnrealEngine5 캐릭터 빙의 (0) | 2024.01.07 |
UnrealEngine5 캐릭터(Character)와 폰(Pawn) (0) | 2024.01.07 |