
게임 내에서 플레이어에게 정보를 제공하기 위한 화면
플레이어가 현재 상황을 이해하는데 필요한 체력, 미니맵, 퀘스트 업데이트와 같은 데이터 제공
Canvas기반 HUD
UMG(Unreal Motion Graphics)
게임 내에서 불꽃, 연기, 폭발, 먼지 등 다양한 시각적 효과를 구현하기 위한 도구
파티클은 다수의 작은 '입자'들이 모여 움직이면서 특정한 모양, 색상, 혹은 애니메이션 효과를 만들어낸다.
Cascade vs Niagara
Cascade
Niagara
파티클은 반복 생성 시 부하가 커질 수 있다.
불필요하게 많은 파티클이 생성되지 않도록 해야함
필요에따라 Looping옵션을 끄거나 키자
아이템이 이동/회전하는 동안 파티클도 움직여야 한다면 SpawnEmitterAttached()를 사용해 부착 대상 컴포넌트를 지정해줘야 한다.
#include "TestActor.h"
ATestActor::ATestActor()
{
SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
SetRootComponent(SceneRoot);
StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
StaticMeshComp->SetupAttachment(SceneRoot);
static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Game/Resources/Props/SM_Chair.SM_Chair"));
if (MeshAsset.Succeeded())
{
StaticMeshComp->SetStaticMesh(MeshAsset.Object);
}
static ConstructorHelpers::FObjectFinder<UMaterial> MaterialAsset(TEXT("/Game/Resources/Materials/M_Metal_Gold.M_Metal_Gold"));
if (MaterialAsset.Succeeded())
{
StaticMeshComp->SetMaterial(0, MaterialAsset.Object);
}
PrimaryActorTick.bCanEverTick = true;
RotationSpeed = 90.0f;
SpeedZ = 200.0f;
RunningTime = 0.0f;
isBig = false;
}
void ATestActor::BeginPlay()
{
Super::BeginPlay();
SetActorLocation(FVector(0.0f, 0.0f, 0.0f));
SetActorRotation(FRotator(0.0f, 0.0f, 0.0f));
SetActorScale3D(FVector(2.0f));
}
void ATestActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
AddActorLocalOffset(FVector(0.0f, 0.0f, SpeedZ*DeltaTime));
AddActorLocalRotation(FRotator(0.0f, RotationSpeed * DeltaTime, 0.0f));
RunningTime += DeltaTime;
if (RunningTime >= 2.0f)
{
RunningTime = 0.0f;
if (isBig)
{
SetActorScale3D(FVector(2.0f));
isBig = false;
}
else
{
SetActorScale3D(FVector(5.0f));
isBig = true;
}
}
}

ATestGameMode::ATestGameMode()
{
DefaultPawnClass = ATestCharacter::StaticClass();
}
SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
SpringArmComp->SetupAttachment(RootComponent);
SpringArmComp->TargetArmLength = 400.0f;
SpringArmComp->SocketOffset = FVector(0.0f, 0.0f, 200.0f);
SpringArmComp->bUsePawnControlRotation = true;
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
CameraComp->SetupAttachment(SpringArmComp, USpringArmComponent::SocketName);
CameraComp->SetRelativeRotation(FRotator(-15.0f, 0.0f, 0.0f));
CameraComp->bUsePawnControlRotation = false;
AActor -> APawn -> ACharacter
MoveForward = 1.0f; // 생성자에서 초기화
void ATestPawn::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
AddActorLocalOffset(FVector(0.0f, MoveForward, 0.0f));
}

int gcd(int a, int b){
while (b!=0){
int r = a % b;
a = b;
b = r;
}
return a;
}
int lcm(int a, int b){
return (a*b)/gcd(a, b);
}
문자열 관련 기능들을 한번 정리해서 기억해야 할 것 같다.
길이/상태
접근
추가/삭제/수정
탐색/부분문자열
비교
분류
변환
기본 스폰 Pawn 지정