UE5 Common Input으로 입력받는 장치 판별하기

유영준·2023년 3월 30일
0

UE5 정보

목록 보기
4/5

언리얼 엔진에서는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에서 구현을 하였지만, 실제로 활용할때는 입력을 받는 순간에 사용할 수 있다

결과를 확인해보자

이렇게 오늘은 키보드와 게임패드를 입력받는 방법에 대해 알아보았다

profile
토비폭스가 되고픈 게임 개발자

0개의 댓글