입력 장치를 구분하기
게임을 할 때 입력 장치를 키보드와 마우스를 사용하거나 게임패드를 사용하면 입력 장치에 따라 UI가 바뀌는 것을 볼 수 있습니다.
또는 입력 장치에 따라 캐릭터의 이동방식이 변하기도 합니다. 원신의 경우 키보드를 입력 장치로 하여 이동 시 기본적으로 달리기 상태로 이동하지만 별도의 입력으로 걷기 상태로 이동합니다. 게임패드를 입력 장치로 하여 이동 시 조이스틱의 기울기가 전체의 1/3 이상일 경우 달리기 상태로 이동하고 미만일 경우 걷기 상태로 이동합니다.
이처럼 사용자의 입력 장치를 구분하여 여러 방식으로 활용할 수 있습니다. 그러면 사용자의 입력 장치를 구분할 수 있는 방법을 언리얼 엔진 5의 EnhancedInput System을 사용해서 알아보겠습니다. 게임패드의 입력을 구분하기 위한 간단한 코드를 플레이어 컨트롤러 클래스에서 다음과 같이 구현했습니다.
코드
.h
public:
/** 플레이어 컨트롤러가 게임패드를 사용 중인지 확인하는 함수입니다. */
UFUNCTION(BlueprintCallable, Category = "InputDevice")
bool IsUsingGamepad() const;
bool APRPlayerController::IsUsingGamepad() const
{
UInputDeviceSubsystem* InputDeviceSubsystem = GetGameInstance()->GetEngine()->GetEngineSubsystem<UInputDeviceSubsystem>();
if(InputDeviceSubsystem)
{
// 현재 플랫폼 사용자 ID를 통해 가장 최근에 사용한 하드웨어 디바이스를 가져오고,
// 이 디바이스의 주 디바이스 유형이 게임패드인지 확인합니다.
FHardwareDeviceIdentifier MostRecentDevice = InputDeviceSubsystem->GetMostRecentlyUsedHardwareDevice(GetPlatformUserId());
if(MostRecentDevice.PrimaryDeviceType == EHardwareDevicePrimaryType::Gamepad)
{
return true;
}
}
return false;
}
위의 함수를 사용하여 true일 경우 입력 장치고 게임패드를 사용한다는 것을 알 수 있습니다. false일 경우 게임패드가 아닌 마우스와 키보드를 사용한다고 보시면 됩니다.
/**
* What is the primary use of an input device type?
* Each hardware device can only be one primary type.
*/
UENUM(BlueprintType)
enum class EHardwareDevicePrimaryType : uint8
{
Unspecified,
KeyboardAndMouse,
Gamepad,
Touch,
MotionTracking,
RacingWheel,
FlightStick,
Camera,
Instrument,
// Some custom devices that can be used for your game specific hardware if desired
CustomTypeA,
CustomTypeB,
CustomTypeC,
CustomTypeD,
};
그 밖에 다른 입력 장치를 추가하고 싶으시다면 조건문을 사용해서 추가하시면 됩니다.
코드 적용하기
코드가 정상적으로 작동하는지 확인해보겠습니다.
InputAction을 생성한 후 값 타입을 Digital(bool)로 설정해 줍니다.
InputMappingContext에 위에서 생성한 InputAction을 추가하여 매핑을 아무 키로 설정합니다.
플레이어 컨트롤러에서 다음과 같은 노드를 작성해줍니다.
'Unreal Engine > C++' 카테고리의 다른 글
[Unreal Engine C++] 에디터의 디테일 패널에서 속성을 수정할 때 호출되는 함수 PostEditChangeProperty / PostEditChangeChainProperty (1) | 2024.07.12 |
---|---|
[Unreal Engine C++] EnhancedInputSystem의 입력 값 구하기 (1) | 2024.03.15 |
[Unreal Engine C++] C++에서 인터페이스 변수 사용하기 (0) | 2024.01.12 |
[Unreal Engine C++] Widget Animation Delegate (1) | 2024.01.09 |
[Unreal Engine 4 C++] TimeStop (시공단열/초산 회피) (0) | 2023.08.02 |