1. 인풋 액션과 컨텍스트 만들기
향상된 인풋 기능을 이용해서 캐릭터의 이동을 구현해보겠다.
향상된 인풋을 이용하기 위해서는 인풋액션과 인풋 매핑 컨텍스트가 필요하다.
인풋 액션을 만들자.
이동 액션을 먼저 만들 것이다.
밸류타입을 백터2D로 설정한다.
이제 이것을 컨텍스트에 연결하면 된다.
액션과 키보드 입력을 매핑해준다.
키보드 D의 입력은 X방향으로 이동한다. 액션의 가장 기본이 되는 부분이기 때문에 무언가 건드릴 필요가 없다.
A는 D와 반대방향으로 이동한다. 모디파이어를 추가하여 네거티브 밸류를 받을 수 있어야 한다.
A키의 경우 Y와 Z축에는 관심이 없다. X축만 선택한뒤 이것을 Negate하자.
W키의 경우 Y축을 우선으로 값을 받아야 한다.
YXZ 축으로 Swizzle 하자. Swizzle이 무슨 뜻인지 궁금해서 찾아봤는데 휘젓는 느낌의 동사인듯하다. 이 경우에는 Y방향으로 휘젓는다는 뜻일까?
어쨋든 다음은 S키다. S키는 Y축 방향으로 값을 받아야하는데 이때 마이너스 값을 받아야 한다. Swizzle과 Negate 둘 다 설정해주면 된다.
Y축과 Z축 값은 필요없다.
이제 이 데이터를 이용해서 캐릭터를 이동시킬 수 있다. 캐릭터의 이동은 어디서 담당해야할까? 캐릭터 클래스에서 담당하게 할 수도 있지만 캐릭터 클래스를 너무 무겁게 만들고 싶지 않다.
그렇기 때문에 플레이어 컨트롤러 클래스가 이를 다룰 수 있도록 할 것이다.
커스텀 플레이어 컨트롤러 클래스를 만들도록 하자.
2. 플레이어 컨트롤러 설정하기
플레이어 컨트롤러 클래스를 만들었다. 이제 이 컨트롤러에 매핑 컨텍스트와 액션들을 추가하여 바인딩할 것이다.
public:
AAuraPlayerController();
protected:
virtual void BeginPlay() override;
생성자와 비긴플레이 함수를 각각 만들어주자.
AAuraPlayerController::AAuraPlayerController()
{
bReplicates = true;
}
생성자에서 다음과 같이 설정한다. 해당 설정은 클래스가 서버에서 클라이언트로 복제가 되도록 설정하는 것이다. 멀티플레이 게임을 생각해두고 만드는 것이기 때문에 복제가 일어나도록 설정을 하였다.
사실 플레이어 컨트롤러는 클라이언트와 서버에 오직 하나씩만 존재하는데 왜 복제를 해야하는지 정확한 이유는 모르겠다. 일단 강의에서 하라니깐 해보려고 한다.
이제 BeginPlay를 설정해보자. 여기서는 매핑컨텍스트를 설정할 것이고 그렇게 하기 위해서는 이를 저장할 변수가 필요하다.
private:
UPROPERTY(EditAnywhere, Category="Input")
TObjectPtr<UInputMappingContext> AuraContext;
이렇게 하고 빌드를 하면 오류가 발생한다. 헤더파일을 가져오려해도 가져오지 못할 것이다. 향상된 인풋 모듈을 설정하지 않았기 때문이다.
빌드.cs 파일로 들어가 "EnhancedInput" 모듈을 추가하자.
이제 비긴 플레이에서 이 컨텍스트가 정상적으로 설정되어있는지 먼저 볼 것이다.
void AAuraPlayerController::BeginPlay()
{
Super::BeginPlay();
check(AuraContext);
}
check 매크로를 사용할 것인데, 해당 값이 false 일 경우 (여기서는 nullptr) 즉시 실행을 멈추고 해당 지점을 알려주는 매크로 이다.
매핑 컨텍스트의 경우 반드시 설정해야하고 설정을 안하는 것 자체가 오류기 때문에 이 매크로를 사용하였다. check매크로는 개발 모드에서만 실행되는 매크로이다.
UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer());
이제 UEnhancedInputLocalPlayerSubsystem 포인터를 만들어준다.
Enhanced Input System에서 입력 매핑(Input Mapping)과 관련된 작업을 관리하는 로컬 플레이어용 서브시스템입니다.
이 서브시스템은 특정 로컬 플레이어에 대해 다음과 같은 작업을 수행합니다:
**입력 매핑 컨텍스트(Input Mapping Context)**의 추가, 제거, 우선순위 설정입력 장치의 처리 (예: 키보드, 마우스, 게임패드 등)
그렇다고 한다.
여기서 계속 설정을 할 것인데 솔직히 코드 작성법을 다 외우는 건 비효율적이라고 생각한다. 게임을 만들면서 이러한 작업은 단 한번만 하고 프로젝트 내내 할 일이 없기 때문이다.. 그렇기 때문에 그냥 외우기 보다는 언리얼 샘플에 있는 3인칭 게임 프로젝트에서 C++ 파일로 들어가 이부분을 복사해 오는 것이 효율적일 수도 있다고 생각한다.
if (Subsystem)
{
Subsystem->AddMappingContext(AuraContext, 0);
}
서브시스템이 존재하는지 확인하고 매핑 컨텍스트를 추가해주자. 매핑 컨텍스트를 더 만들 일이 (아마) 없을 것이기 때문에 우선순위는 0(최우선)으로 지정해주었다.
bShowMouseCursor = true;
DefaultMouseCursor = EMouseCursor::Default;
그 다음 설정은 마우스 커서를 보이게 한뒤 마우스 모양을 기본으로 하는 것이다. 해당 게임은 마우스 이동을 기반으로 할 것이기 때문에 마우스를 보이게 할 것이다.
물론 지금 매핑 하고 있는 것은 키보드 입력(W, A, S, D)이다. 이부분은 실제 게임 개발이 아니라 강의이기 둘다 설정하는 중이다.
FInputModeGameAndUI InputModeData;
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
InputModeData.SetHideCursorDuringCapture(false);
SetInputMode(InputModeData);
FInputModeGameAndUI 구조체는 게임의 액터 제어 및 UI 제어 모두 입력 처리를 할 수 있게 하는 구조체라고 한다. 즉 메뉴창 조작이나 캐릭터 조작 모두 가능하게 해주는 것이다.
그리고 나서 마우스 입력을 뷰포트에 고정시키지 않는 설정을 해주고 뷰포트가 마우스를 캡쳐할때 마우스를 숨기지 않도록 설정해주었다. 캡쳐란 마우스 조작하여 입력 메세지를 보내는 동안 일어나는 것을 말한다.
마지막으로 이러한 인풋게임모드를 설정해준다.
이렇게 매핑컨텍스트를 플레이어 컨트롤러에 성공적으로 바인딩 했으니 다음에는 이어서 콜백함수랑 인풋액션을 바인딩 하는 작업을 할 것이다.
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습2] 6. 게임모드를 만들고 플레이어 이동 구현하기 (0) | 2024.11.28 |
---|---|
[실습2] 5. 인풋 매핑하기 (0) | 2024.11.28 |
[실습2] 3. 애니메이션 블루프린트 만들기 (0) | 2024.11.27 |
[실습2] 2. 캐릭터 클래스 세팅 (0) | 2024.11.27 |
[실습2] 1. 캐릭터 클래스 만들기 (0) | 2024.11.27 |