[UE4] 언리얼 엔진에서 BindAxis의 개념과 사용법
BindAxis 개요
BindAxis는 게임에서 “연속적인 입력”과 “행동”을 연결해 주는 도구입니다. 자동차의 엑셀 페달과 엔진의 관계와 같습니다. 엑셀 페달을 얼마나 밟느냐 (입력)에 따라 엔진의 출력이 달라지는 (행동) 것처럼, 조이스틱을 얼마나 기울이거나 마우스를 얼마나 움직이는지 (입력)에 따라 게임 속 캐릭터가 얼마나 빨리 움직이거나 시점이 얼마나 부드럽게 회전하는지 등의 연속적인 행동 (행동)을 조절할 수 있도록 연결해 주는 것이 바로 BindAxis입니다.
예를 들어, “조이스틱을 오른쪽으로 기울이는 정도”에 따라 “캐릭터가 오른쪽으로 이동하는 속도”를 조절할 수 있습니다. 이때 “조이스틱을 오른쪽으로 기울이는 정도”는 입력, “캐릭터가 오른쪽으로 이동하는 속도”는 행동이 되는 것이죠. BindAxis는 이 둘을 연결해 주는 역할을 합니다.
사용법
BindAxis를 사용하는 방법도 BindAction과 비슷하지만, 연속적인 입력을 처리한다는 점에서 차이가 있습니다. 볼륨 조절기를 돌리는 정도에 따라 소리의 크기가 달라지는 것처럼, 입력 값의 크기에 따라 행동의 정도가 달라집니다.
- 입력 매핑 설정: BindAction과 마찬가지로 프로젝트 설정에서 어떤 입력을 사용할지 정해야 합니다. “Axis Mappings” 메뉴에서 새로운 축 매핑을 추가하고 이름을 붙여줍니다.
예를 들어 “MoveForward”라는 이름으로 “W 키”와 “S 키”를 매핑할 수 있습니다. 이때 “W 키”는 +1, “S 키”는 -1의 값을 가지도록 설정합니다.
이는 마치 볼륨 조절기를 시계 방향으로 돌리면 소리가 커지고, 반시계 방향으로 돌리면 소리가 작아지는 것과 같은 원리입니다. 조이스틱의 경우 기울이는 방향과 정도에 따라 -1부터 +1 사이의 값을 가집니다. - BindAxis 함수 사용: C++ 코드에서 BindAxis 함수를 사용하여 입력과 행동을 연결합니다. SetupPlayerInputComponent 함수 안에서 다음과 같은 형태로 사용합니다.
// "MoveForward"라는 이름의 입력에 "MoveForward" 함수를 연결
InputComponent->BindAxis("MoveForward", this, &ACharacter::MoveForward);
[코드 설명]
"MoveForward": 프로젝트 설정에서 정의한 입력 이름
this: 현재 액터
&ACharacter::MoveForward: 실행할 함수
- 행동 함수 구현: 실제로 어떤 행동을 할지 함수를 만들어야 합니다. 이 함수는 float 타입의 값을 인자로 받습니다. 이 값은 입력의 크기를 나타냅니다.
엑셀 페달을 밟는 정도에 따라 엔진의 출력이 달라지는 것처럼, 입력 값에 따라 행동의 정도를 조절해야 합니다.
void ACharacter::MoveForward(float Value)
{
// 이동 로직 구현
if (Controller != nullptr && Value != 0.0f)
{
// 전진 방향 계산
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
// 이동
AddMovementInput(Direction, Value);
}
}
[간단한 예시]
// 헤더 파일 (Character.h)
// ...
protected:
// ...
void MoveForward(float Value); // 전진/후진 함수 선언
// ...
};
// 소스 파일 (Character.cpp)
void ACharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAxis("MoveForward", this, &ACharacter::MoveForward);
}
void ACharacter::MoveForward(float Value)
{
if (Controller != nullptr && Value != 0.0f)
{
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
AddMovementInput(Direction, Value);
}
}
[응용 버전] : 조이스틱의 기울기에 따라 이동 속도가 달라지는 예시 코드입니다.
// 소스 파일 (Character.cpp)
void ACharacter::MoveForward(float Value)
{
if (Controller != nullptr)
{
// 최대 이동 속도 설정
float MaxSpeed = 500.0f;
// 입력 값에 최대 속도를 곱하여 실제 이동 속도 계산
float CurrentSpeed = Value * MaxSpeed;
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
AddMovementInput(Direction, CurrentSpeed);
}
}