개요
언리얼 엔진에서의 프로그래밍은 게임의 기능을 만드는 것을 의미한다.
캐릭터가 어떻게 조작되어 움직이고, 어떤 규칙으로 목적을 달성해야 게임에서 승리하게 되는지 등
이런 전반적인 것을 프로그래밍 언어나 다른 여러 가지 방법으로 만드는 것이다.
언리얼 엔진에서 게임 기능을 만드는 방법은 C++와 블루프린트 이렇게 두 가지가 있다.
C++ 클래스로만 게임을 제작하거나 블루프린트 클래스만을 이용해서 게임을 제작하는 것도 충분히 가능하지만,
이 두 방법을 완전히 따로 사용하는 것 보다는 프로그래머가 C++로 베이스가 되는 게임 기능을 만들고,
디자이너가 블루프린트를 이용해서 그 기본 게임 기능을 가지고 게임의 재미를 위한 기능들을 제작하는 방식으로
함께 사용할 때 시너지를 발휘한다.
C++ 클래스와 블루프린트 클래스를 적절히 활용하면서 언리얼 엔진에서 게임 기능을 만드는 방법을 배워나가려 한다.
C++ 클래스 생성
c++ 클래스를 생성하는 방법은 여러가지가 있다.
이를 클릭하면 추가할 클래스의 부모 클래스를 선택할 수 있는 창이 뜬다.
생성한 클래스 살펴보기
액터 클래스를 선언하였다.
액터 클래스는 레벨에 배치할 수 있는 오브젝트를 의미한다.
보통 레벨에 배치되어 동작할 오브젝트를 만들 때는 이 액터 클래스를 상속받아서 클래스를 구현하면 된다.
MyActor.h 헤더 파일은 클래스를 선언하고, 클래스에 속하는 변수와 함수의 원형을 선언하는 용도의 파일이다.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class UE_CPP_BEGIN_API AMyActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};
헤더 파일의 클래스에서는 함수의 원래 형태만 알려주는 것이기에
함수의 내용은 없고 세미콜론으로 함수가 끝나는 것을 확인할 수 있다.
이 함수의 몸체는 소스 파일에서 구현된다.
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyActor.h"
// Sets default values
AMyActor::AMyActor()
{
// Set this actor 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 AMyActor::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
처음 만들어진 액터 클래스에는 클래스 이름과 같은 이름을 가진 생성자, BeginPlay 함수, Tick 함수가 생성되어 있다.
클래스 이름과 같은 이름을 가진 생성자는 클래스의 객체가 생성될 때 한 번 호출되는 함수이며
주로 생성된 액터의 프로퍼티, 즉 변수의 기본 값을 설정해주는데 사용된다.
BeginPlay 함수는 액터가 배치된 월드에서 게임이 시작되거나 액터가 월드에 스폰되었을 때,
한 번 호출되는 함수로 게임 플레이 로직을 초기화시키는데 사용된다.
Tick 함수는 매 프레임마다 한 번씩 호출되는 함수이다.
이는 Actor가 활성화되어 있는 동안 계속해서 호출되기 때문에 주로 게임의 로직을 처리하는 기능을
구현하는데 사용된다.
하지만 지금 만드는 클래스에 매 프레임 호출되는 Tick 함수가 필요하지 않다면, Tick 함수를 제거해서
게임의 퍼포먼스를 상승시킬 수도 있다.
Actor의 Tick 함수를 비활성화하기 위해서는 헤더 파일과 소스 파일에서 Tick 함수를 제거하고
소스 파일의 생성자에서 PrimaryActorTick.bCanEverTick = true 코드를 제거하면 된다.
앞서 말한 이 코드는 이 Actor가 Tick 함수를 매 프레임 호출하도록 설정하는 코드이다.
기본 이벤트 함수 호출 확인
언리얼 C++ 클래스의 생성자와 기본 이벤트 함수들이 언제 호출되는지 확인해보기 위해 간단한 로그를 남겨보겠다.
언리얼에서 로그를 남기기 위해서는 UE_LOG라는 매크로 함수를 사용한다.
UE_LOG(LogTemp, Log, TEXT())
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyActor.h"
// Sets default values
AMyActor::AMyActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
UE_LOG(LogTemp, Log, TEXT("Constructor"));
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();
UE_LOG(LogTemp, Log, TEXT("BeginPlay"));
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
UE_LOG(LogTemp, Log, TEXT("Tick"));
}
생성자에서는 Constructor을 출력하게 하고
BeginPlay 이벤트 함수에서는 BeginPlay를,
Tick 이벤트 함수에서는 Tick이라는 문자열을 출력하게 코드를 작성했다.
이를 모두 작성하면 코드를 저장하고 변경한 코드의 내용이 언리얼 에디터에 적용될 수 있게
컴파일을 진행해야한다.
언리얼 에디터를 종료하지 않고 컴파일 하기 위해서는 Ctrl + Alt + F11 단축키를 눌러 라이브 코딩 기능을 사용해야 한다.
MyActor 하나를 씬에 배치하고 게임을 플레이시켜 아웃 로그를 확인해보자.
게임을 일시정지하고 로그를 거슬러 올라가면 Play In Editor 모드가 초기화 될 때 MyActor의 생성자가
실행되어서 Construct 로그가 출력되고,
PIE 모드가 시작되면서 BeginPlay 로그가 출력된 것을 볼 수 있다.
그리고 그 아래로는 매 프레임 Tick 로그가 출력된 것을 확인할 수 있다.
'Unreal Engine' 카테고리의 다른 글
[UE5] ActivateAbility (0) | 2024.05.18 |
---|---|
[UE5] TObjectPtr (0) | 2024.05.17 |
[UE5] AActor (0) | 2024.05.14 |
[UE5] 속성 기반 수정자 (0) | 2024.04.16 |
[UE5] GAS(GameplayAbilitySystem) I (0) | 2024.03.25 |