3. 향상된 입력을 이용한 캐릭터 이동

2023. 9. 9. 01:23·[게임 개발] 개발 일지/RPG

서론

언리얼 엔진 5.1부터 적용된 향상된 입력을 이용하여 캐릭터 이동을 구현해 보려고 합니다.
만약 언리얼 엔진 5 이전 버전에서 사용 시 플러그인을 직접 추가해야 한다고 합니다.

Input Action 파일 생성 및 설정

컨트롤러의 입력에 따라 캐릭터를 움직이기 위해서

Enhanced Input을 이용해서 입력과 움직임을 구현하기로 하였습니다.

 

입력과 관련된 파일들은 Input 폴더를 만들어서 폴더 내부에 생성했습니다.

 

InputAction을 이용해서 구현하고자 하는 입력들을 생성합니다.

InputAction의 이름을 따서 접두사는 IA로 설정하였습니다.

 

Move와 Look은 밸류 타입을 Vector2D로 설정하고

Jump는 점프버튼이 눌렸는지만 확인하면 돼서 bool으로 설정했습니다.


Input Mapping Context 파일 생성 및 설정

EnhancedInput의 기능을 사용하기 위해서 InputMappingContext 파일도 추가하였습니다.

MappingContext는 InputAction파일들의 관리자 같은 역할을 하게 됩니다.
접두사는 IMC로 설정하였습니다.

 

매핑 컨텍스트를 열어서 먼저 점프에 대한 키설정을 해주었습니다.

 

다음으로 움직임에 대한 방향키를 각각 설정 해주었습니다.

 

각 이동 방향에 대한 모디파이어 설정이 필요한데 언리얼 공식 도큐먼트의 다음과 같은 표를 보고 설정하였습니다.

 

마지막으로 Look을 설정해주었는데 마우스의 움직임에 따라 화면 이동이 되게 하고

Modifiers를 Negate로 설정 후 Y만 체크해서 마우스의 입력으로 인한 시점의 상하 이동을 반대로 설정하였습니다.


C++ 코드 작성

RPGCharacter.h

캐릭터의 헤더파일을 수정하여 키입력에 따른 행동들을 추가하도록 하겠습니다.

	UPROPERTY(EditAnyWhere, BlueprintReadOnly, Category = Input, Meta = (AllowPrivateAccess = "true"))
	TObjectPtr<class UInputMappingContext> DefaultMappingContext;

	UPROPERTY(EditAnyWhere, BlueprintReadOnly, Category = Input, Meta = (AllowPrivateAccess = "true"))
	TObjectPtr<class UInputAction> JumpAction;

	UPROPERTY(EditAnyWhere, BlueprintReadOnly, Category = Input, Meta = (AllowPrivateAccess = "true"))
	TObjectPtr<class UInputAction> MoveAction;

	UPROPERTY(EditAnyWhere, BlueprintReadOnly, Category = Input, Meta = (AllowPrivateAccess = "true"))
	TObjectPtr<class UInputAction> LookAction;

헤더 파일을 include 를 하게 되면 컴파일 시간이 증가하게 되므로, 

전방선언을 해주었습니다.

 

그리고 Move와 Look 액션의 수정을 위해 함수 선언을 하였는데

FInputActionValue를 사용하기 위해서는 다음과 같은 헤더파일이 필요합니다.

 

#include "InputActionValue.h"

FInputActionValue는 구조체이며, 포인터 변수로 받지 않기 때문에

헤더파일 include로 추가 해주었습니다.

 

또한 ~.Build.cs 에 EnhancedInput모듈을 추가하여 향상된 입력을 사용가능하게 만들었습니다.

 

이 부분에서 #include "InputActionValue.h" 가 include 안되는 버그가 있었는데
3인칭 샘플로 프로젝트를 생성 후 다시 시도하니 해결 되었습니다.

RPGCharacter.cpp

	// 입력
	static ConstructorHelpers::FObjectFinder<UInputMappingContext>DEFAULT_CONTEXT
	(TEXT("/Game/Input/IMC_Default.IMC_Default"));
	if (DEFAULT_CONTEXT.Succeeded())
		DefaultMappingContext = DEFAULT_CONTEXT.Object;

	static ConstructorHelpers::FObjectFinder<UInputAction>IA_JUMP
	(TEXT("/Game/Input/IA_Jump.IA_Jump"));
	if (IA_JUMP.Succeeded())	
		JumpAction = IA_JUMP.Object;

	static ConstructorHelpers::FObjectFinder<UInputAction>IA_LOOK
	(TEXT("/Game/Input/IA_Look.IA_Look"));
	if (IA_LOOK.Succeeded())
		LookAction = IA_LOOK.Object;

	static ConstructorHelpers::FObjectFinder<UInputAction>IA_MOVE
	(TEXT("/Game/Input/IA_Move.IA_Move"));
	if (IA_MOVE.Succeeded())
		MoveAction = IA_MOVE.Object;

DefaultContext와 InputAction들을 불러오기 위해

캐릭터의 생성자에서 ConstructorHelpers::FObjectFinder를 이용하였습니다.

 

불러오기 위해서는 다음과 같은 헤더파일이 필요합니다.

#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "InputMappingContext.h"

 

//void ARPGCharacter::BeginPlay()

	// Input Mapping Context 추가
	if (APlayerController* PlayerController = Cast<APlayerController>(Controller))
	{
		if (UEnhancedInputLocalPlayerSubsystem* Subsystem =
			ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>
			(PlayerController->GetLocalPlayer()))
		{
			Subsystem->AddMappingContext(DefaultMappingContext, 0);
		}
	}

그리고 BeginPlay 함수에서 PlayerController를 캐스팅 하고 성공한다면

Subsystem이라는 인풋 시스템을 가져와서 DefaultMappingContext와 연결하였습니다.

 

//void ARPGCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)

if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent))
{
	//Jump
	EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump);
	EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);

	// Look
	EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &ARPGCharacter::Look);
		
	// Move
	EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &ARPGCharacter::Move);
}

SetupPlayerInputComponent 함수 에서 EnhancedInputComponent를 캐스팅 해주고,

성공한다면 EnhancedInputComponent를 바인딩 합니다.

 

BindAction의 인자로 (InputAction, 트리거 이넘, 대상 오브젝트, 함수의 주소) 을 넘겨줍니다

 

void ARPGCharacter::Look(const FInputActionValue& Value)
{
	FVector2D LookAxisVector = Value.Get<FVector2D>();

	// 마우스의 좌우,상하 입력을 추가
	AddControllerYawInput(LookAxisVector.X);
	AddControllerPitchInput(LookAxisVector.Y);
}

 

void ARPGCharacter::Move(const FInputActionValue& Value)
{
	FVector2D MovementVector = Value.Get<FVector2D>();

	// 캐릭터가 좌우로만 회전
	const FRotator Rotation = Controller->GetControlRotation();	
	const FRotator YawRotation(0, Rotation.Yaw, 0);

	// 벡터 계산
	const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
	const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);

	// MovementVector 값에 따라 이동
	AddMovementInput(ForwardDirection, MovementVector.Y);
	AddMovementInput(RightDirection, MovementVector.X);
}
	// 캐릭터 무브먼트
	GetCharacterMovement()->bOrientRotationToMovement = true;
	GetCharacterMovement()->RotationRate = FRotator(0.0f, 500.0f, 0.0f);

Look 함수와 Move 함수를 추가해서 마우스의 입력에 따라 컨트롤러의 회전을 설정하고,

캐릭터가 키보드 입력 방향에 따라 회전할 때 좌우로만 회전하도록(머리가 땅에 박히게 회전한다던가 하지 않도록..)
설정하고 전진방향과 오른쪽 방향을 얻어와서 AddMovementInput함수를 사용해 캐릭터를 이동시킵니다.

#include "GameFramework/CharacterMovementComponent.h"

또한, 다음과 같은 헤더파일의 포함이 필요합니다.

 

지금까지의 구현을 보여주는 이미지입니다.


 

https://docs.unrealengine.com/5.2/ko/enhanced-input-in-unreal-engine/

 

향상된 입력

향상된 입력 플러그인을 간략하게 살펴봅니다.

docs.unrealengine.com

저작자표시 (새창열림)

'[게임 개발] 개발 일지 > RPG' 카테고리의 다른 글

5. 애니메이션 트리밍 및 문제점 수정  (0) 2023.09.12
4. 캐릭터 상태에 따른 애니메이션 추가  (0) 2023.09.10
2. 카메라 설정  (0) 2023.09.08
1. 게임 모드와 캐릭터 세팅  (0) 2023.09.07
0. 개발 목표 및 개발 일정  (0) 2023.09.07
'[게임 개발] 개발 일지/RPG' 카테고리의 다른 글
  • 5. 애니메이션 트리밍 및 문제점 수정
  • 4. 캐릭터 상태에 따른 애니메이션 추가
  • 2. 카메라 설정
  • 1. 게임 모드와 캐릭터 세팅
람팜팜~
람팜팜~
:)
  • 람팜팜~
    RumPumPum
    람팜팜~
  • 전체
    오늘
    어제
    • 전체 (123)
      • 🎵 일상 (2)
      • JAVA (5)
        • 김영한의 자바 입문 (3)
      • JavaScript (12)
      • ---------------------------.. (0)
      • [게임 개발] 포트폴리오 (2)
        • RPG (1)
        • 슈터-플랫포머 (1)
      • [게임 개발] 개발 일지 (28)
        • RPG (25)
        • TopDownProject (3)
      • [게임 개발] 언리얼엔진 공부 (9)
        • 이득우의 언리얼 프로그래밍 Part.1 (6)
        • 이득우의 언리얼 프로그래밍 Part.2 (1)
        • 개인 메모 (2)
      • [게임 개발] 알고리즘 공부 (60)
        • 프로그래머스 (8)
        • 백준 (52)
        • 개인 메모 (0)
      • [게임 개발] CPP 공부 (2)
        • 이것이 C++ 이다 (1)
        • Effective C++ (0)
        • Effective Modern C++ (0)
        • 홍정모 그래픽스 새싹코스 (1)
      • [게임 개발] CS 공부 (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      슬라이딩 윈도우
      역참조
      투포인터
      해시
      누적합
      dp
      브루트포스
      스레드
      우선순위 큐
      그리디
      참조자
      데드락
      dfs
      문자열
      메모리구조
      context switching
      프로세스
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    람팜팜~
    3. 향상된 입력을 이용한 캐릭터 이동
    상단으로

    티스토리툴바