언리얼 엔진에서는UCommonInputSubsystem 이라는 클래스가 존재한다
이 클래스 안에 있는 함수인 GetCurrentInputType을 통해 입력받는 장치가 무엇인지 판별하고자 한다
UCommonInputSubsystem
은 CommonInput 모듈에 속한 클래스이다
이 클래스는 기본적으로 언리얼 엔진에 속한 모듈이 아니기에 build.cs 파일을 통해 추가해주도록 하자
InfiniteFighter.build.cs
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class InfiniteFighter : ModuleRules
{
public InfiniteFighter(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore",
"HeadMountedDisplay", "EnhancedInput", "CommonInput" });
}
}
이번에는 간단하게 Character 클래스에서 CommonInputSubsystem을 선언하는 방법을 알아보도록 하겠다
IFCharacter.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "InputActionValue.h"
#include "IFCharacter.generated.h"
UCLASS()
class INFINITEFIGHTER_API AIFCharacter : public ACharacter
{
GENERATED_BODY()
public:
// Sets default values for this character's properties
AIFCharacter();
...
private:
...
UPROPERTY()
TObjectPtr<class UCommonInputSubsystem> InputSubsystem;
전방 선언을 통해 선언해주고 cpp에서 헤더를 추가하는 방식으로 설계하였다
IFCharacter.cpp
#include "IFCharacter.h"
#include "CommonInputSubsystem.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
// Sets default values
AIFCharacter::AIFCharacter()
{
...
}
void AIFCharacter::BeginPlay()
{
Super::BeginPlay();
if (APlayerController* PlayerController = Cast<APlayerController>(GetController()))
{
...
InputSubsystem = ULocalPlayer::GetSubsystem<UCommonInputSubsystem>(PlayerController->GetLocalPlayer());
}
전에 Enhanced Input을 코드로 구현하는 방식을 보았다면, 그와 완벽하게 동일하다는 것을 알 수 있을 것이다
이렇게 선언해준 InputSubsystem을 통해 input 타입을 알아보도록 하자
void AIFCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (InputSubsystem->GetCurrentInputType() == ECommonInputType::Gamepad)
{
UE_LOG(LogTemp, Log, TEXT("Gamepad"));
}
else if (InputSubsystem->GetCurrentInputType() == ECommonInputType::MouseAndKeyboard)
{
UE_LOG(LogTemp, Log, TEXT("MouseAndKeyboard"));
}
}
지금은 간단하게 Tick에서 구현을 하였지만, 실제로 활용할때는 입력을 받는 순간에 사용할 수 있다
결과를 확인해보자
이렇게 오늘은 키보드와 게임패드를 입력받는 방법에 대해 알아보았다