📅  最后修改于: 2023-12-03 15:05:42.327000             🧑  作者: Mango
在UE4中,生成的代码是很常见的。当你在蓝图或代码中定义一个新的类,UE4会自动为你生成一些代码文件。在这些文件中,Generated_Body
和Generated_UClass_Body
是两个更常见的文件,人们经常会对它们感到困惑。那么这两个文件有什么不同?它们各自承担着什么样的任务?本文将会对这个问题进行详细的解释。
在UE4的生成代码中, Generated_Body 文件是一个存储着类的一些成员函数的实现代码的文件。这些函数是在编写类的代码时,在头文件中声明的函数。在编译期间,UE4会自动将头文件和.cpp文件合并成单个.cpp文件,这个.cpp文件就是Generated_Body 文件。
在Generated_Body 文件中,会存储着一些基本的函数实现,例如:
void AMyActor::BeginPlay()
{
Super::BeginPlay();
// your code here
}
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// your code here
}
当你在声明这些函数的同时,你也必须在头文件中声明这些函数,这样Generated_Body文件中的实现代码才能生效。此外,你还可以自己定义一些函数在生成的代码中。例如:
void AMyActor::MyCustomFunction()
{
// your code here
}
在UE4的生成代码中,Generated_UClass_Body文件是一个存储着类的元信息的代码文件。这些元信息可能包括:类名、父类名、默认属性的值、在蓝图编辑器中显示用的图标等等。在UE4蓝图或代码中定义一个新的类时,会自动生成一个DerivedDataCache(DDC)缓存,其中存储了这些元信息,同时还会生成Generated_UClass_Body文件。
在Generated_UClass_Body文件中,会存储着类的元信息。例如:
UClass* Z_Construct_UClass_AMyActor_NoRegister()
{
UClass* Class = AMyActor::StaticClass();
static const FNameNativePtrPair Funcs[] = {
{ "MyCustomFunction", &AMyActor::execMyCustomFunction },
};
static const FCppClassTypeInfoStatic StaticCppClassTypeInfo = {
UE4CodeGen_Private::EStaticCppClassType::Class,
"MyActor",
0xFFFFFFFF,
sizeof(AMyActor),
StaticClass,
Funcs,
nullptr,
nullptr,
};
static const UE4CodeGen_Private::FParsedClassCppTypeDescriptorWithTypeName StaticCppClassDeclaredFields[] = {
{ NULL, nullptr, (EPropertyFlags)0x0010000001000021, UE4CodeGen_Private::ECppStructOps::None, 1, "Health", sizeof(float), &UE4CodeGen_Private::FFloatPropertyParams::NewProp_Health, METADATA_PARAMS(nullptr, 0) },
{ NULL, nullptr, (EPropertyFlags)0x0010000001020021, UE4CodeGen_Private::ECppStructOps::None, 1, "MaxHealth", sizeof(float), &UE4CodeGen_Private::FFloatPropertyParams::NewProp_MaxHealth, METADATA_PARAMS(nullptr, 0) },
};
static const FCppClassTypeInfoStatic* StaticCppClassTypeInfo = &StaticCppClassTypeInfo::StaticCppClassTypeInfo;
static void NewStructOpsThunk(void* Obj);
reRegisterWithRuntimeClass(Class, &AMyActor::StaticClass, TEXT("/Script/MyProject"), TEXT("MyActor"), false, nullptr, nullptr, nullptr, nullptr, sizeof(AMyActor), 0, StaticCppClassTypeInfo, StaticCppClassDeclaredFields, StaticCppClassDeclaredFieldCount, &AMyActor::__StaticDependencies_DirectlyUsedAssets, &AMyActor::AdditionalReferencedAssets);
return Class;
}
在上述代码中,我们可以看到元信息的一些属性,例如类名 "MyActor",默认属性 "Health" 和 "MaxHealth" 的值以及类中定义的函数 "MyCustomFunction"。
在UE4中,Generated_Body 文件存储类的成员函数实现,Generated_UClass_Body 文件存储类的元信息。通过 Generated_Body 文件,我们可以自定义一些函数的实现;通过 Generated_UClass_Body 文件,我们可以获取类的元信息。这两个文件都是UE4自动生成的,为了处理类的所有细节并保证正确性,所以我们需要重视它们的作用并执行它们。