본문 바로가기

Unreal

UE 캐릭터 입력 시스템

캐릭터의 기본 구조

  • 캐릭터는 인간형 폰을 구성하도록 언리얼이 제공하는 전문 폰 클래스를 의미
  • 캐릭터는 세 가지 주요 컴포넌트로 구성.
    • 기믹과 상호작용을 담당하는 캡슐 컴포넌트 (루트컴포넌트)
    • 애니메이션 캐릭터를 표현하는 스켈레탈 메시 컴포넌트
    • 캐릭터의 움직임을 담당하는 캐릭터 무브먼트(CharacterMovement) 컴포넌트
  • 캐릭터의 내부 구성
    • 캡슐 컴포넌트(루트 컴포넌트)
    • 스켈레탈 메시 컴포넌트
    • 캐릭터 무브먼트 컴포넌트

 

마네킹 캐릭터 제작하기

 

ABGameMode.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "ABGameMode.generated.h"

/**
 * 
 */
UCLASS()
class ARENABATTLE_API AABGameMode : public AGameModeBase
{
	GENERATED_BODY()

public:
	AABGameMode();

	
};
GameMode 를 해당 Mode로 변경 

GameMode 변경

 

 

실행 시 움직이지 않음.

게임 플레이 화면.(카메라가 없음)

카메라가 존재하지 않기 때문

 

 

마네킹은 존재

카메라가 없지만 마네킹은 존재.

 

 

카메라 지정

  • AABCharacterPlayer.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Character/ABCharacterBase.h"
#include "ABCharacterPlayer.generated.h"

/**
 * 
 */
UCLASS()
class ARENABATTLE_API AABCharacterPlayer : public AABCharacterBase
{
	GENERATED_BODY()

public:
	AABCharacterPlayer();

protected:
	
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, Meta = (AllowPrivateAccess = "true"))
	TObjectPtr<class USpringArmComponent> CameraBoom;

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, Meta = (AllowPrivateAccess = "true"))
	TObjectPtr<class UCameraComponent> FollowCamera;
	
};
Player 객체에 카메라 객체 설정

 

 

 

입력 시스템의 동작 구조 

언리얼 엔진 입력 시스템 동작 구조

 

참조 링크

 

 

입력 시스템 동작 방식

  • 플레이어 입력은 컨트롤러를 통해 폰으로 전달
  • 입력은 컨트롤러가 처리할 수도, 폰이 처리할 수도 있는데, 일반적으로는 폰이 처리하도록 설정.
    • 다양한 사물에 빙의하는 게임의 경우 폰이 유리

 

향상된 입력 시스템 (Enhanced Input System)

  • 기존 입력 시스템을 대체하고 언리얼 5.1부터 새롭게 도입
  • 사용자의 입력 설정 변경에 유연하게 대처할 수 있도록 구조를 재수립
  • 사용자 입력 처리를 네 단계로 세분화하고 각 설정을 독립적인 애셋으로 대체.

 

ABCharacterPlayer.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Character/ABCharacterBase.h"
#include "InputActionValue.h"
#include "ABCharacterPlayer.generated.h"

/**
 * 
 */
UCLASS()
class ARENABATTLE_API AABCharacterPlayer : public AABCharacterBase
{
	GENERATED_BODY()

public:
	AABCharacterPlayer();

protected:
	virtual void BeginPlay() override;

public:
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;


// Camera Section
protected:
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, Meta = (AllowPrivateAccess = "true"))
	TObjectPtr<class USpringArmComponent> CameraBoom;

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, Meta = (AllowPrivateAccess = "true"))
	TObjectPtr<class UCameraComponent> FollowCamera;

// Input Section
protected:
	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;

	void Move(const FInputActionValue& value);
	void Look(const FInputActionValue& value);
};
입력시스템을 이용한 캐릭터 조종 추가
생성자에 입력 시스템에 대한 참조 객체들을 연결해서 사용

 

 

ABCharacterPlayer.cpp

//... 생략
AABCharacterPlayer::AABCharacterPlayer()
{
	// Camera
	CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
	CameraBoom->SetupAttachment(RootComponent);
	CameraBoom->TargetArmLength = 400.0f;
	CameraBoom->bUsePawnControlRotation = true;

	FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
	FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName);
	FollowCamera->bUsePawnControlRotation = false;

	// Input
	static ConstructorHelpers::FObjectFinder<UInputMappingContext> InputMappingContextRef(TEXT("/Script/EnhancedInput.InputMappingContext'/Game/ThirdPerson/Input/IMC_Default.IMC_Default'"));
	if (nullptr != InputMappingContextRef.Object)
	{
		DefaultMappingContext = InputMappingContextRef.Object;
	}

	static ConstructorHelpers::FObjectFinder<UInputAction> InputActionMoveRef(TEXT("/Script/EnhancedInput.InputAction'/Game/ThirdPerson/Input/Actions/IA_Move.IA_Move'"));
	if (nullptr != InputActionMoveRef.Object)
	{
		MoveAction = InputActionMoveRef.Object;
	}

	static ConstructorHelpers::FObjectFinder<UInputAction> InputActionJumpRef(TEXT("/Script/EnhancedInput.InputAction'/Game/ThirdPerson/Input/Actions/IA_Jump.IA_Jump'"));
	if (nullptr != InputActionJumpRef.Object)
	{
		JumpAction = InputActionJumpRef.Object;
	}

	static ConstructorHelpers::FObjectFinder<UInputAction> InputActionLookRef(TEXT("/Script/EnhancedInput.InputAction'/Game/ThirdPerson/Input/Actions/IA_Look.IA_Look'"));
	if (nullptr != InputActionLookRef.Object)
	{
		LookAction = InputActionLookRef.Object;
	}
}

//... 생략
Player에 Input 객체들을 연결하는 과정.

 

DefaultMappingContext

DefaultMappingContext에 설정한 객체에 Jump, Move, Look에 해당하는 동작을 설정합니다.

 

 

참조

 

이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해 | 이득우 - 인프런

청강문화산업대학교에서 언리얼 엔진, 게임 수학, UEFN 게임제작을 가르치고 있습니다. - 이득우의 언리얼 C++ 프로그래밍, 넥슨 코리아 공식 교육 교재 선정 2023 - 스마일게이트 언리얼 프로그래

www.inflearn.com

다음 강의를 수강하고 작성한 글입니다.

'Unreal' 카테고리의 다른 글

UE 캐릭터 컨트롤 설정  (0) 2024.06.28
UE C++ 리플렉션  (0) 2024.06.22
UE 액터 컴포넌트  (1) 2024.06.08
UE C++ 빌드 시스템  (0) 2024.06.01
UE C++ 직렬화  (0) 2024.05.25