zoukankan      html  css  js  c++  java
  • unreal3对象管理模块分析二

    上一篇主要记了UClass的创建,现在总结一下UObject的创建,可以从几个不同角度来理解。

    从途径上看,可以根据UObject的构造函数来分个类:

        // Constructors.
        UObject();
        UObject( const UObject& Src );
        UObject( ENativeConstructor, UClass* InClass, const TCHAR* InName, const TCHAR* InPackageName, EObjectFlags InFlags );
        UObject( EStaticConstructor, const TCHAR* InName, const TCHAR* InPackageName, EObjectFlags InFlags );

    其中2是拷贝构造函数与初始创建无关,3基本没见过(从注释看应是动态链接时才有用,且与4作用类似),最重要的是1和4两种。

    4就是UClass这一特殊子类在构造时调用的基类构造函数了,其中InName就是类名。

    1则是默认构造函数,通常在UObject::StaticConstructObject()中,即动态创建某类对象时调用,用来先生成一个空对象,可以说其它的UObject子类,基本都是通过这种方式创建了。

    对于1来说,其调用上下文又有几种:

    一是直接以new TClass的方式出来,如

    Result = new( InOuter, FName(*InName, FNAME_Add, TRUE), RF_Public )UPackage;

    二是以UObject::StaticConstructObject动态创建出来,它会先调StaticAllocateObject分配内存,然后通过InternalConstructor在前者返回的对象地址上进行初始化:

    // Allocate the object.
        UObject* Result = StaticAllocateObject( InClass, InOuter, InName, InFlags, InTemplate, Error, NULL, SubobjectRoot, InstanceGraph );
    
        if( Result )
        {
            {
                TGuardValue<UBOOL> IsAffectingCDO(GIsAffectingClassDefaultObject,(InFlags&RF_ClassDefaultObject)!=0);
    
                // call the base UObject class constructor if the class is misaligned (i.e. a native class that is currently being recompiled)
                if ( !InClass->IsMisaligned() )
                {
                    (*InClass->ClassConstructor)( Result );
                }
                else
                {
                    (*UObject::StaticClass()->ClassConstructor)( Result );
                }
            }

    其中InClass->ClassConstructor是UClass中的一个属性,它就指向其代表的类中的InternalConstructor函数,每个类中都有一个该函数,就是在上一篇提过的DECLARE_CLASS宏里定义的:

    static void InternalConstructor( void* X ) 
            { new( (EInternal*)X )TClass; }

    举例:当要创建某类对象的时候,通常会先拿到它的UClass,然后调用SpawnActor来创建。以游戏逻辑核心类GameInfo来说:

  • 相关阅读:
    oracleI基础入门(6)sql语句Substring Crazy
    oracleI基础入门(7)table约束 Crazy
    oracleI基础入门(7)table视图 Crazy
    SQL附加分离数据库(命令)
    双截棍 C语言版 (超搞笑)
    AspNetPage分页(repeater),自己做的例子基本代码
    记录
    RegularExpressionValidator控件中正则表达式用法
    20 个经典的 Ajax + CSS 表格
    GridView各个事件中,怎样获取主键值
  • 原文地址:https://www.cnblogs.com/wellbye/p/5076765.html
Copyright © 2011-2022 走看看