UCLASS와 USTRUCT의 차이?
- 각 매크로는 Reflection 시스템에 클래스와 구조체를 등록하는 데 사용한다
- Unreal Editor가 사용자 정의의 클래스 또는 구조체를 인식하기 위한 방법이다
- 메모리 관리 시스템에 포함시켜 Garbage Collection할 수 있도록 한다
- UHT(Unreal Header Tool)이 C++ 헤더 파일을 찾고, Unreal 매크로 관련 코드를 생성한다
- 결과 코드를 C++ 컴파일러가 컴파일한다
UCLASS
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
// UHT에 의해 생성된 코드를 포함
#include "TutoProjectCollectable.generated.h"
UCLASS(Blueprinatble, BlueprintType)
class TUTOPROJECT_API UTestUClass : public UObject
{
// UHT에서 자동으로 constructor 를 declaration & define
GENERATED_BODY()
};
- Blueprinatble
- 이 Class를 상속해서 새로운 Blueprint를 생성할 수 있다
- BlueprintType
- 이 Class를 Blueprinte의 멤버 변수 설정할 수 있다
USTRUCT
USTRUCT(BlueprintType)
struct FStructExample
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int32 IntegerVariable;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float FloatVariable;
//Other variables...
};
게임에서 UObject, Actor xkdlqdml 객체를 순회하는 방법
Actor 순회
// 특정 타입의 Actor를 순회할 때
for (TActorIterator<AActor> ActorIt(GetWorld()); ActorIt; ++ActorIt)
{
AActor* MyActor = *ActorIt;
}
// 또는
for (const auto& ActorIt: TActorRange<AActor>())
{
AActor* MyActor = *ActorIt;
}
// 모든 Actor를 순회할 때
for (FActorIterator(GetWorld()) ActorIt; ActorIt; ++ActorIt)
{
AActor* MyActor = *ActorIt;
}
// 또는
for (const auto& ActorIt: FActorRange(GetWorld()))
{
AActor* MyActor = *ActorIt;
}
- Unreal은 Built-In Actor Iteractor가 있다
- 당연히 매 프레임 사용하지 않는다
- 로딩 씬 등에서만 사용한다
UObject 순회
// 특정 타입의 Object를 순회
const UWorld* MyWorld = GetWorld();
for (TObjectIterator<UObject> ObjectIter; ObjectIter; ++ObjectIter)
{
if (ObjectIter->GetWorld() != MyWorld)
{
continue;
}
else
{
// do something...
}
}
// 또는
for (const auto& ObjectIter: TObjectRange<UObject>(GetWorld()))
{
if (ObjectIter->GetWorld() != MyWorld)
{
continue;
}
else
{
// do something...
}
}
// 모든 Object를 순회할 때
for (FObjectIterator ObjectIter; ObjectIter; ++ObjectIter)
{
if (ObjectIter->GetWorld() != MyWorld)
{
continue;
}
else
{
// do something...
}
}
// 또는
for (const auto& ObjectIter: FObjectRange(GetWorld()))
{
if (ObjectIter->GetWorld() != MyWorld)
{
continue;
}
else
{
// do something...
}
}
- UObject Iterator는 UWorld를 참조하지 않고, 메모리상에 존재하는 모든 UObject를 순호한다
- 에디터에서 실행중인 게임이라면 editor-only object, 멀티 게임 중이라면 다른 클라이언트의 Object 등까지도 순회하는 데 쓰일 수 있다
- 그러나 일반적으로는 사용자 게임에서 존재하는 Object만 참조하는 경우가 많으므로, World를 확인하고 로컬에만 한정하도록 필터링할 수 있다
UE에서 사용하는 타입 이름의 Prefix
Coding Stanrad
권장하는 에셋 명명 규칙
- 탬플릿 클래스 - T
- UObject에서 파생 - U
- AActor에서 파생 - A
- SWidget에서 파생 - S
- Abstract Interface 파생 - I
- 열거형 - E
- bool 변수 - b
- C++ 베이스 - F
출처