Choose your operating system:
Windows
macOS
Linux
입력 매핑에는 액션 및 축, 두 종류가 있습니다.
-
액션 매핑 은 마우스나 조이스틱의 버튼처럼 "예 / 아니오" 입력으로 생각하면 좋습니다. 누르거나 떼거나 더블클릭하거나 잠시 누르고 있거나 할 때 보고합니다. 점프, 슈팅, 오브젝트 상호작용 등 별도의 동작이 이러한 매핑 유형에 좋은 후보가 됩니다.
-
축 매핑 은 연속적인 것으로, 마우스 커서의 위치나 조이스틱의 막대처럼 "일정량"의 입력으로 생각해 보면 좋습니다. 움직이지 않더라도 매 프레임마다 그 값을 보고합니다. 걷기, 둘러보기, 탈것의 조향처럼 세기나 방향이 있는 것들이 보통 이런 식으로 처리됩니다.
코드에서 직접 입력 매핑을 정의할 수는 있지만, 보통은 언리얼 엔진 에디터 안에서 정의하게 되니, 이 튜토리얼에서는 그 방식을 따르겠습니다.
-
언리얼 엔진 에디터에서 편집 드롭다운 메뉴 아래 프로젝트 세팅 옵션을 클릭합니다.
-
거기서 왼편의 엔진 섹션의 입력 옵션을 선택합니다. 오른편에 나타나는 바인딩 카테고리를 펼친 다음 액션 매핑 하나와 축 매핑 을 두 개 추가합니다.
액션 매핑 또는 축 매핑 섹션 제목줄 옆의 더하기 부호로 새 매핑을 추가합니다. 왼편의 확장 화살표를 사용해서 매핑을 표시하거나 숨길 수 있습니다. 매핑에 부가 입력을 추가하려면, 그 매핑 옆의 더하기 부호를 클릭합니다. 다음은 필요한 매핑과 입력입니다. "S" 와 "A" 입력에 음수 값을 눈여겨 보세요.
액션 매핑
Grow
Space Bar
축 매핑
MoveX
W
1.0
S
-1.0
MoveY
A
-1.0
D
1.0
-
입력 환경설정이 완료되었으니, 레벨에 MyPawn 을 구성합시다. 콘텐츠 브라우저 에 보이는 MyPawn 클래스를 레벨 에디터 로 끌어놓으면 됩니다.
-
MyPawn 구성에는 한 단계가 더 필요합니다. 게임에서 볼 수 있으려면 스태틱 메시 를 줘야지요. 방금 만든 MyPawn 을 선택한 다음 디테일 패널 에서 "OurVisibleComponent (Inherited)" 라는 컴포넌트를 선택하고, 스태틱 메시 카테고리의 드롭다운 박스를 통해 애셋을 할당해 주면 됩니다. 이 튜토리얼에서는 "Shape_Cylinder" 애셋을 사용하면 좋습니다.
-
이제 레벨을 저장하고 Visual Studio 로 돌아가 배치한 MyPawn 이 정의한 입력에 반응하도록 코드를 작성해 주면 됩니다.
이제 Visual Studio 에서 MyPawn 클래스 코딩을 마무리해 주면 됩니다.
작업중 코드
MyPawn.h
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
#pragma once
#include "GameFramework/Pawn.h"
#include "MyPawn.generated.h"
UCLASS()
class HOWTO_PLAYERINPUT_API AMyPawn : public APawn
{
GENERATED_BODY()
public:
// Sets default values
AMyPawn();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick( float DeltaSeconds ) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;
UPROPERTY(EditAnywhere)
USceneComponent* OurVisibleComponent;
};
MyPawn.cpp
// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.
#include "HowTo_PlayerInput.h"
#include "MyPawn.h"
// Sets default values
AMyPawn::AMyPawn()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
// Set this pawn to be controlled by the lowest-numbered player
AutoPossessPlayer = EAutoReceiveInput::Player0;
// Create a dummy root component we can attach things to.
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
// Create a camera and a visible object
UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("OurCamera"));
OurVisibleComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("OurVisibleComponent"));
// Attach our camera and visible object to our root component. Offset and rotate the camera.
OurCamera->SetupAttachment(RootComponent);
OurCamera->SetRelativeLocation(FVector(-250.0f, 0.0f, 250.0f));
OurCamera->SetRelativeRotation(FRotator(-45.0f, 0.0f, 0.0f));
OurVisibleComponent->SetupAttachment(RootComponent);
}
// Called when the game starts or when spawned
void AMyPawn::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AMyPawn::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
}
// Called to bind functionality to input
void AMyPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
{
Super::SetupPlayerInputComponent(InputComponent);
}