프로그래밍 / C++ / 언리얼

Programming/C | C++ | Unreal

[언리얼 엔진] FPS게임 움직임 구현

아트성 2022. 3. 1. 14:02

언리얼 엔진은 캐릭터의 움직임을 1인칭으로 구현할수있고,  Camera-SpringArm과같은 툴을 이용해 3인칭 형식으로 구현할수있다.

 

바인딩은 GTA나 3인칭 슈팅게임등 FPS게임에서 필수로 쓰이므로 꼭 알아두어야 하는 개념이다.

 

 

WASD 움직임 구현하기   

 

우선 에디터내에서 키값을 세팅해주어야하는데, Edit - ProjectSettings - Input - Bindings 에 들어가면 키셋팅을 할 수있다.

 

MoveForward는 W, S, MoveRight는 A, D 방향키를 담당.

Scale은 1.0 단위로 설정하는데, 이값은 각 함수의 매개변수인 AxisValue값에 대응된다

 

 

 

[헤더파일 선언]

 

헤더파일에는 MoveForward, MoveRight 함수를 선언한다.

SetupPlayerInputComponent는 언리얼에서 c++파일생성시 public에 나타나는데, 사용자 입력을 받는함수다. UInputComponent클래스의 인스턴스를 매개변수로 받는다. 

// public
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
// private
void MoveForward(float AxisValue); 
void MoveRight(float AxisValue);

 

 

 

[Cpp파일 선언]

 

AddMovementInput : 액터 위치 업데이트

GetActorForwardVector() : 엑터가 향하는 방향기준 x축 상의 좌표를 벡터로 반환

GetActorActorRightVector() : 엑터가 향하는 방향기준 y축 상의 좌표를 벡터로 반환

 

사용자가 키보드를 입력할대, BindAxis로 바인딩처리가 되고, MoveForward, MoveRight함수의 이벤트가 발생해서 캐릭터를 움직이게 할 수 있다. 

 

// SetupPlayerInputComponent
PlayerInputComponent->BindAxis(TEXT("MoveFoward"), this, &AShooterCharacter::MoveForward);
PlayerInputComponent->BindAxis(TEXT("MoveRight"), this, &AShooterCharacter::MoveRight);
void AShooterCharacter::MoveForward(float AxisValue)
{
	AddMovementInput(GetActorForwardVector() * AxisValue);
}

void AShooterCharacter::MoveRight(float AxisValue)
{
	AddMovementInput(GetActorRightVector() * AxisValue);
}

 

 

 

 

 

 

 

마우스로 화면 전환하기   

 

먼저 아까와같이 에디터상에서 마우스Y와 마우스X를 세팅해주도록 한다. 스케일은 1.0으로 동일하게 설정한다.

 

 

[Cpp파일 선언]

 

방향키는 사용자가 직접 함수로 정의해야하는데, 마우스컨트롤러는 APawn의 멤버함수들을 이용해 손쉽게 움직음을 구현할 수 있다. SetupPlayerInputComponent함수 내에서 바인딩을 정의한다.

 

AddControllerPitchInput, AddControllerYawInputAPawn의 멤버함수로써, 각각 Value값이 들어오면 pitch와 Yaw를 컨트롤 할 수 있게끔한다.

// SetupPlayerInputComponent
PlayerInputComponent->BindAxis(TEXT("LookUp"), this, &APawn::AddControllerPitchInput);
PlayerInputComponent->BindAxis(TEXT("LookRight"), this, &APawn::AddControllerYawInput);

 

컴파일을 진행하면 마우스가 움직임에 따라 화면이 전환되는것을 확인할 수 있다.

(왼쪽 그림과 같이 캐릭터가 X축을 바라본다고 가정했을때 Mouse Y는 Pitch에 대응되고, MouseX는 Yaw에 대응된다.)

 

 

 

BindAxis에 관한 설명은 아래 링크에서 확인 가능하다.

 

[언리얼 엔진] PlayerInput, BindAxis 움직임 구현

tank.h #pragma once #include "CoreMinimal.h" #include "Tank.generated.h" UCLASS() class TOONTANKS_API ATank : public ABasePawn { GENERATED_BODY() public: // Called to bind functionality to input vir..

artsung410.tistory.com

 

 

 

 

점프 구현하기   

 

BindAxis와는 다르게 점프기능은 Action으로 간주해서, 에디터상에서 BindAxis 대신 BindAction으로 정의해야한다.

 

 

[cpp파일 선언]

 

마우스컨트롤러와 비슷하게, ACharacter멤버함수인 Jump를 이용해서 캐릭터의 Value값을 받아 점프를 구현할 수 있다.

 

마찬가지로 SetupPlayerInputComponent함수 내에서 바인딩을 정의한다. 

// SetupPlayerInputComponent
PlayerInputComponent->BindAction(TEXT("Jump"), EInputEvent::IE_Pressed, this, &ACharacter::Jump);

 

 

 

 

 

총정리   

 

[헤더파일 선언]

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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"

UCLASS()
class SIMPLESHOOTER_API AMyCharacter : public ACharacter
{
	GENERATED_BODY()

public:
	// Sets default values for this character's properties
	AMyCharacter();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

private:
	void MoveForward(float AxisValue);
	void MoveRight(float AxisValue);
	// void LookUp(float AxisValue);
};

[cpp파일 선언]

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


#include "MyCharacter.h"

// Sets default values
AMyCharacter::AMyCharacter()
{
 	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AMyCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	// BindAction 점프나 위아래 보는동작
	PlayerInputComponent->BindAxis(TEXT("MoveFoward"), this, &AMyCharacter::MoveForward); // 사용자 정의
	PlayerInputComponent->BindAxis(TEXT("MoveRight"), this, &AMyCharacter::MoveRight); // 사용자 정의
	PlayerInputComponent->BindAxis(TEXT("LookUp"), this, &APawn::AddControllerPitchInput); //마우스 컨트롤은 Apawn
	PlayerInputComponent->BindAxis(TEXT("LookRight"), this, &APawn::AddControllerYawInput); //Apawn
	PlayerInputComponent->BindAction(TEXT("Jump"), EInputEvent::IE_Pressed, this, &ACharacter::Jump); // 점프기능은 Acharacter
}

void AMyCharacter::MoveForward(float AxisValue)
{
	AddMovementInput(GetActorForwardVector() * AxisValue);
}

void AMyCharacter::MoveRight(float AxisValue)
{
	AddMovementInput(GetActorRightVector() * AxisValue);
}

 

 

 

 

반응형