ํ๋ก๊ทธ๋จ์ด ์คํ์๊ฐ์ ์๊ธฐ ์์ ์ ์กฐ์ฌํ๋ ๊ธฐ๋ฅ, ์ธ๋ฆฌ์ผ ํ ํฌ๋๋ก์ง์ ๊ธฐ๋ณธ
๋ฆฌํ๋ ์ ์ ๊ฐ์ง ์ ์๋ ์ค๋ธ์ ํธ๋ ์ด๊ฑฐํ UENUM(), ํด๋์ค UCLASS(), ๊ตฌ์กฐ์ฒด USTRUCT(), ํจ์ UFUNCTION(), ๋ฉค๋ฒ ๋ณ์ UPROPERTY()
์ค๋ธ์ ํธ๊ฐ ๋ฆฌํ๋ ์ ์ ๊ฐ์ง๋ฉด ๋ํ ์ผ ํจ๋, ์ง๋ ฌํ, ๊ฐ๋น์ง ์ฝ๋ ์ , ๋คํธ์ํฌ ๋ฆฌํ๋ฆฌ์ผ์ด์ , ๋ธ๋ฃจํ๋ฆฐํธ ๋ฑ ์ธ๋ฆฌ์ผ ์์ง์ ์ ์ฉํ ์์คํ ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๋ฆฌํ๋ ์ ์ ๊ฐ์ง๊ฒ ํ๋ ค๋ฉด ์ค๋ธ์ ํธ๊ฐ ํฌํจ๋ C++ ํด๋์ค ํค๋ ํ์ผ์ "๋ชจ๋๋ช ".generated.h ํค๋๋ฅผ ํฌํจํด์ผ ํ๋ค. ํด๋น ํค๋๋ฅผ ๊ฐ์ ธ์ผ ๋ฆฌํ๋ ์ ์ด ์๋ ์์คํ ์์ ํด๋น ํด๋์ค๋ฅผ ๊ณ ๋ คํด์ผ ํ๊ณ ์์คํ ๊ตฌํ์ด ํ์ํจ์ ์ธ๋ฆฌ์ผ ํค๋ ํด UHT์ ์๋ฆฐ๋ค.
๋ชจ๋ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ ํด๋์ค ์ ๋ณด์ ํจ๊ปํ๋ค.
ํด๋์ค๋ฅผ ์ฌ์ฉํด ์์ ์ด ๊ฐ์ง ํ๋กํผํฐ์ ํจ์ ์ ๋ณด๋ฅผ ์ปดํ์ผ ํ์๊ณผ ๋ฐํ์์ ์กฐํ ๊ฐ๋ฅํ๋ค.
๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ๋ NewObjectAPI๋ฅผ ์ฌ์ฉํด ์์ฑํด์ผ ํ๋ค.
ํด๋์ค ๊ธฐ๋ณธ ์ค๋ธ์ ํธ (CDO)
์ธ๋ฆฌ์ผ ๊ฐ์ฒด๊ฐ ๊ฐ์ง ๊ธฐ๋ณธ ๊ฐ์ ๋ณด๊ดํ๋ ํ ํ๋ฆฟ ๊ฐ์ฒด
ํ ํด๋์ค๋ก๋ถํฐ ๋ค์์ ๋ฌผ์ฒด๋ฅผ ์์ฑํด ๊ฒ์ ์ฝํ ์ธ ์ ๋ฐฐ์นํ ๋ ์ผ๊ด์ฑ์๊ฒ ๊ธฐ๋ณธ ๊ฐ์ ์กฐ์ ํ๋๋ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
CDO๋ ํด๋์ค ์ ๋ณด๋ก๋ถํฐ GetDefaultObject ํจ์๋ฅผ ํตํด ์ป์ ์ ์์
UClass ๋ฐ CDO๋ ์์ง ์ด๊ธฐํ ๊ณผ์ ์์ ์์ฑ๋๋ฏ๋ก ์ฝํ ์ธ ์ ์์์ ์์ฌํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅ
์์
์ด๋ค ํ๊ต์์ ํ์๊ณผ ๊ต์๊ฐ ํจ๊ฒ ์์ ํ๋ ์ํฉ ๊ตฌํ
ํ๊ต ์ ๋ณด = GameInstance์์ ์ง์
์ธ๋ฌผ ํด๋์ค(Person) = ํ์ ํด๋์ค(Student), ์ ์ ํด๋์ค(Teacher)
์ธ๋ฆฌ์ผ ์๋ฌ๋ก๊ทธ ์์1 - check ์ฌ์ฉ์
์ธ๋ฆฌ์ผ ์๋ฌ๋ก๊ทธ ์์2 - ensure ์ฌ์ฉ์
ํค๋์ ๋ฆฌํ๋ ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์์ฑ์ ์ฝ๋์ CDO ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ
์๋ํฐ๋ฅผ ์ข ๋ฃํ ๋ค์ ์ปดํ์ผ ํ ํ ๋ค์ ์๋ํฐ๋ฅผ ์ผ์ผ ์์ ํ๋ค.
MyGameInstance ํค๋
class OBJECTREFLECTION_API UMyGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
UMyGameInstance();
virtual void Init() override;
private:
UPROPERTY();
FString SchoolName;
};
MyGameInstance ์์ค์ฝ๋
UMyGameInstance::UMyGameInstance() // ์์ฑ์ ์ฝ๋
{
SchoolName = TEXT("๊ธฐ๋ณธํ๊ต"); // CDO์ ๊ธฐ๋ณธ๊ฐ ์ค์
}
void UMyGameInstance::Init()
{
Super::Init();
UE_LOG(LogTemp, Log, TEXT("==========================="));
UClass* ClassRuntime = GetClass();
UClass* ClassCompile = UMyGameInstance::StaticClass();
//check(ClassRuntime != ClassCompile); // ๊ฒ์ฆ ์ ๊ทน์ ์ผ๋ก ํ์ฉ, ๋ฌธ์ ๋ฐ์์ ์๋ํฐ ์ข
๋ฃ๋จ
//ensure(ClassRuntime != ClassCompile); // ์๋ํฐ ์ข
๋ฃ๋์ง ์๊ณ ๊ฒ์ฆ ๊ฐ๋ฅ
//ensureMsgf(ClassRuntime != ClassCompile, TEXT("์ผ๋ถ๋ฌ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ ์ฝ๋")); // ์๋ํฐ ์ข
๋ฃX + ๋ฉ์ธ์ง ๋จ๊ธธ ์ ์์
UE_LOG(LogTemp, Log, TEXT("ํ๊ต๋ฅผ ๋ด๋นํ๋ ํด๋์ค ์ด๋ฆ : %s"), *ClassRuntime->GetName());
SchoolName = TEXT("์ฒญ๊ฐ๋ฌธํ์ฐ์
๋ํ๊ต"); // ๊ธฐ๋ณธ ๊ฐ์ฒด์ ๋ฌด๊ดํ๊ฒ ์์ฑ๋ MyGameInstance์ ์ค์
UE_LOG(LogTemp, Log, TEXT("ํ๊ต ์ด๋ฆ : %s"), *SchoolName); // ์ฒญ๊ฐ๋ฌธํ
UE_LOG(LogTemp, Log, TEXT("ํ๊ต ์ด๋ฆ ๊ธฐ๋ณธ๊ฐ : %s"), *GetClass()->GetDefaultObject<UMyGameInstance>()->SchoolName); // ๊ธฐ๋ณธํ๊ต
UE_LOG(LogTemp, Log, TEXT("==========================="));
}
CDO ์์ฑ์์
์์ง์ด ์ด๊ธฐํ๋๋ ๊ณผ์ ์์ CDO ๋ฐ UClass ์ ๋ณด๋ค์ด ๋ง๋ค์ด์ง๋ค. ๊ฐ๋์ด ๋ ํ์ ๊ฒ์ ์คํ๋๋ค.
์ ๋ฆฌ
์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ์๋ ํญ์ ํด๋์ค ์ ๋ณด๋ฅผ ๋ด์ UClass ๊ฐ์ฒด๊ฐ ๋งค์นญ๋์ด ์๋ค.
UClass๋ก๋ถํฐ ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ์ ์ ๋ณด๋ฅผ ํ์ ๊ฐ๋ฅํ๋ค.
UClass์๋ CDO๊ฐ ์ฐ๊ฒฐ๋์ด ์์ด ์ด๋ฅผ ํ์ฉํด ๊ฐ๋ฐ์ ์์ฐ์ฑ ํฅ์ ๊ฐ๋ฅ
ํด๋์ค ์ ๋ณด์ CDO๋ ์์ง ์ด๊ธฐํ ๊ณผ์ ์์ ์์ฑ๋๋ฏ๋ก ๊ฒ์ ๊ฐ๋ฐ์์ ์์ ํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
ํค๋ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์์ฑ์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์๋ํฐ๋ฅผ ๋๊ณ ์ปดํ์ผํ๋ ๊ฒ์ด ์์ ์ ์ด๋ค.
๋ฆฌํ๋ ์ ์์คํ ์ ์ฌ์ฉํด ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ์ ํน์ ์์ฑ๊ณผ ํจ์๋ฅผ ์ด๋ฆ์ผ๋ก ๊ฒ์ ๊ฐ๋ฅ
๋ฆฌํ๋ ์ ์์คํ ์ ์ฌ์ฉํด ์ ๊ทผ ์ง์์์ ๋ฌด๊ดํ๊ฒ ๊ฐ ์ค์ ๊ฐ๋ฅ
๋ฆฌํ๋ ์ ์์คํ ์ ์ฌ์ฉํด ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ์ ํจ์ ํธ์ถ ๊ฐ๋ฅ
์ธ๋ฆฌ์ผ ์์ง์ ๊ธฐ๋ณธ ํ๋ ์์์ ๋ฆฌํ๋ ์ ์ ํ์ฉํด ๊ตฌ์ถ๋์ด ์์ผ๋ฏ๋ก ์ธ๋ฆฌ์ผ ์์ง์ ์ดํดํ๊ธฐ ์ํด์ ๋ฆฌํ๋ ์ ์์คํ ์ ์ดํดํด์ผ
'โ๏ธ ์์ง > ๐ซ ์ธ๋ฆฌ์ผ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unreal] ์์ํด์ ์ธ๋ฆฌ์ผ2022 ์ ๋ฆฌ (1) | 2024.05.01 |
---|---|
[Unreal] ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ ๋ฆฌํ๋ ์ ์์คํ 2 (0) | 2024.03.31 |
[Unreal] ์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ (0) | 2024.03.29 |
[Unreal] ์ธ๋ฆฌ์ผ C++ ๊ธฐ๋ณธ ํ์ ๊ณผ ๋ฌธ์์ด ์ฒ๋ฆฌ (0) | 2024.03.28 |
[Unreal] ํฌ๋ก ์ธ๋ฆฌ์ผ | ๋ช ๋ช ๊ท์น (0) | 2024.03.28 |