【UE4】通過T::StaticClass()獲得對應UObject的UClass的完整代碼調用流程

每個繼承自UObject的對象都有對應的XXX.generated.h和XXXX.gen.cpp文件.
以MySingleton.generate.h和MySingleton.gen.cpp 爲例.

在MySingleton.gen.cpp 中, 使用了StaticClass

    IMPLEMENT_CLASS(UMySingleton, 1249388217);
    template<> UE_DESIGNMODE_API UClass* StaticClass<UMySingleton>()
    {
        return UMySingleton::StaticClass();
    }

在MySingleton.generated.h文件中:

public: \
    DECLARE_CLASS(UMySingleton, UObject, COMPILED_IN_FLAGS(0), CASTCLASS_None, TEXT("/Script/UE_DesignMode"), NO_API) \
    DECLARE_SERIALIZER(UMySingleton)

在DECLARE_CLASS定義了StaticClass

#define DECLARE_CLASS( TClass, TSuperClass, TStaticFlags, TStaticCastFlags, TPackage, TRequiredAPI  ) \
private: \
    TClass& operator=(TClass&&);   \
    TClass& operator=(const TClass&);   \
    TRequiredAPI static UClass* GetPrivateStaticClass(); \
public: \
    /** Bitwise union of #EClassFlags pertaining to this class.*/ \
    enum {StaticClassFlags=TStaticFlags}; \
    /** Typedef for the base class ({{ typedef-type }}) */ \
    typedef TSuperClass Super;\
    /** Typedef for {{ typedef-type }}. */ \
    typedef TClass ThisClass;\
    /** Returns a UClass object representing this class at runtime */ \
    inline static UClass* StaticClass() \
    { \
        return GetPrivateStaticClass(); \
    } \
    /** Returns the package this class belongs in */ \
    inline static const TCHAR* StaticPackage() \
    { \
        return TPackage; \
    } \
    /** Returns the static cast flags for this class */ \
    inline static EClassCastFlags StaticClassCastFlags() \
    { \
        return TStaticCastFlags; \
    } \
    /** For internal use only; use StaticConstructObject() to create new objects. */ \
    inline void* operator new(const size_t InSize, EInternal InInternalOnly, UObject* InOuter = (UObject*)GetTransientPackage(), FName InName = NAME_None, EObjectFlags InSetFlags = RF_NoFlags) \
    { \
        return StaticAllocateObject(StaticClass(), InOuter, InName, InSetFlags); \
    } \
    /** For internal use only; use StaticConstructObject() to create new objects. */ \
    inline void* operator new( const size_t InSize, EInternal* InMem ) \
    { \
        return (void*)InMem; \
    }

GetPrivateStaticClass定義在IMPLEMENT_CLASS中:

// Register a class at startup time.
#define IMPLEMENT_CLASS(TClass, TClassCrc) \
    static TClassCompiledInDefer<TClass> AutoInitialize##TClass(TEXT(#TClass), sizeof(TClass), TClassCrc); \
    UClass* TClass::GetPrivateStaticClass() \
    { \
        static UClass* PrivateStaticClass = NULL; \
        if (!PrivateStaticClass) \
        { \
            /* this could be handled with templates, but we want it external to avoid code bloat */ \
            GetPrivateStaticClassBody( \
                StaticPackage(), \
                (TCHAR*)TEXT(#TClass) + 1 + ((StaticClassFlags & CLASS_Deprecated) ? 11 : 0), \
                PrivateStaticClass, \
                StaticRegisterNatives##TClass, \
                sizeof(TClass), \
                (EClassFlags)TClass::StaticClassFlags, \
                TClass::StaticClassCastFlags(), \
                TClass::StaticConfigName(), \
                (UClass::ClassConstructorType)InternalConstructor<TClass>, \
                (UClass::ClassVTableHelperCtorCallerType)InternalVTableHelperCtorCaller<TClass>, \
                &TClass::AddReferencedObjects, \
                &TClass::Super::StaticClass, \
                &TClass::WithinClass::StaticClass \
            ); \
        } \
        return PrivateStaticClass; \
    }

而IMPLEMENT_CLASS是在MySingleton.gen.cpp 中

    IMPLEMENT_CLASS(UMySingleton, 1249388217);
    template<> UE_DESIGNMODE_API UClass* StaticClass<UMySingleton>()
    {
        return UMySingleton::StaticClass();
    }

這就是我們通過T::StaticClass()獲得對應UObject的UClass的完整代碼調用流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章