1단계 : 액터 생성하기
2단계 : 로직 설계하기
3단계 : 구현하기
새로운 엑터를 생성하고 엑터가 spawn 되는 시점에 동작되도록 아래 요구사항대로 동작하도록 코드를 구현 합니다
시작점(0,0) 있는 게임 캐릭터가 랜덤하게 10회 이동 합니다. 각 스텝에서 거쳐간 좌표를 모두 출력하는게 목적입니다.
세부 요구사항은 아래와 같습니다.
필수 기능 구현을 완료한 후 아래 기능을 추가 힙니다.

#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
UCLASS()
class UE_HW05_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;
int32 Step();
void Move();
private:
FVector Start;
};
#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;
Start = FVector(0, 0, 0);
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay();
Move();
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
int32 AMyActor::Step()
{
return FMath::RandRange(0, 1);
}
void AMyActor::Move()
{
UE_LOG(LogTemp, Warning, TEXT("Start Position: (%.0f, %.0f, %.0f)"), Start.X, Start.Y, Start.Z);
for (int32 i = 0; i < 10; ++i)
{
int32 XStep = Step();
int32 YStep = Step();
Start.X += XStep;
Start.Y += YStep;
UE_LOG(LogTemp, Warning, TEXT("Step %d: Position = (%.0f, %.0f, %.0f)"), i + 1, Start.X, Start.Y, Start.Z);
}
}

AMyActor 는 AActor 에서 상속받은 클래스
HW_API 는 모듈 간 사용할 수 있도록 하는 설정
// 이 파일이 프로젝트에 여러 번 포함되지 않게 하는 안전장치
// 항상 맨 위에 자리
#pragma once
// UE에서 자주 쓰는 기본 자료형이나 함수들을 쓸 수 있게 하는 헤더파일
#include "CoreMinimal.h"
// AActor` 언리얼에서 씬에 배치할 수 있는 기본 클래스
// 여기에 `MyActor` 가 상속받고 있으므로 포함
#include "GameFramework/Actor.h"
// 언리얼이 자동으로 내부 처리를 하게 하는 매크로 파일
// 항상 마지막에 자리
#include "MyActor.generated.h"
UCLASS()
class UE_HW05_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;
// Step() 함수: 0 또는 1을 랜덤으로 반환
int32 Step();
// Move() 함수: 10번 이동하며 좌표 출력
void Move();
private:
// 멤버 변수
// 액터의 위치를 저장하는 벡터
// X, Y, Z 3개의 좌표를 가짐
FVector Start; // 시작 위치
};
소수점 0자리까지 출력 → 소수점 표시 안 됨
TEXT("Step %d: Position = (%.0f, %.0f, %.0f)")는 출력할 메시지 형식을 정의하는 부분
%d 는 뒤에서 넘겨줄 정수 값을 출력할 자리 표시자
i + 1 이 이 자리에 들어감
#include "MyActor.h"
// Sets default values
// 클래스가 생성될 때 실행되는 함수
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true; // Tick 함수 활성화
Start = FVector(0, 0, 0); // 시작 위치 (0, 0, 0) = 월드 좌표 원점
}
// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
Super::BeginPlay(); // 부모 클래스인 AActor의 BeginPlay를 먼저 실행
Move(); // 게임 시작 동시에 이동 함수 호출
}
// Called every frame
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// Step(): 랜덤으로 0 또는 1을 반환
int32 AMyActor::Step()
{
return FMath::RandRange(0, 1); // 0 또는 1 반환
}
// Move(): 10번 이동하면서 좌표 출력
void AMyActor::Move()
{
// 시작 위치를 로그로 출력
UE_LOG(LogTemp, Warning, TEXT("Start Position: (%.0f, %.0f, %.0f)"), Start.X, Start.Y, Start.Z);
// 10번 반복해서 이동
for (int32 i = 0; i < 10; ++i)
{
// X, Y축으로 이동 거리 결정
int32 XStep = Step();
int32 YStep = Step();
// 좌표 업데이트
// 현재 좌표에서 X, Y를 각각 이동시킴
Start.X += XStep;
Start.Y += YStep;
// 이동 후 좌표 출력
UE_LOG(LogTemp, Warning, TEXT("Step %d: Position = (%.0f, %.0f, %.0f)"), i + 1, Start.X, Start.Y, Start.Z);
}
}
🤓