📜  ue4 generated_body 到 generated_uclass_body (1)

📅  最后修改于: 2023-12-03 15:05:42.327000             🧑  作者: Mango

介绍: 从UE4 Generated_Body到Generated_UClass_Body

在UE4中,生成的代码是很常见的。当你在蓝图或代码中定义一个新的类,UE4会自动为你生成一些代码文件。在这些文件中,Generated_BodyGenerated_UClass_Body是两个更常见的文件,人们经常会对它们感到困惑。那么这两个文件有什么不同?它们各自承担着什么样的任务?本文将会对这个问题进行详细的解释。

Generated_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
}
Generated_UClass_Body

在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自动生成的,为了处理类的所有细节并保证正确性,所以我们需要重视它们的作用并执行它们。