Skip to content

UE4中自定义Actor初始化相关备忘

UE4中自定义Actor初始化相关备忘 published on UE4中自定义Actor初始化相关备忘有2条评论

    这段时间在用UE4做一个生成美术素材插件,插件有2个Module一个是Runtime的,一个是Editor的,Runtime插件中我有些自定义的Actor,这些Actor就是用来在场景中显示我生成的游戏素材。

    使用时,我习惯在UE4 Editor中会先新建一个Class Blueprint 也就是类蓝图,派生于我的这个C++的Actor,如果从性能上考虑,这当然是不太好的,但是如果游戏是以原型开发模式来制作,那么做个Class BP就是必须的了,应为最终是策划在用这个东西,可以开放一些可以定制化的参数、暴露一些个接口出来给策划们去折腾。


    这里啰嗦几一句,在刚开始接触UE4的时候,我以为这些能在Content Browser里看到的Blueprint就类似于C++的类,其实这样理解是完全错误错误的,在做这个插件的时候,我才意识到这个BP其实已经是一个实例了。BP这个东西,其实类似Unity3D里的Prefab(预制体),它本身就能持久化存储数据,以至于你没有在Level里使用它,它上边保存的数据也不会丢失。当我们把一个BP拖到场景中的时候,其实它并不仅仅是new了一个新的Actor的实例出来,其实它是以当前这个BP实例作为模板,克隆了一个新的实例,呃……克隆是Unity3D的说法,用UE4的说法是Spawn了一个实例,用C++的说法就应该是对象的深拷贝,当然UE4实现这个过程不是用复制构造函数来做的,它门有一套流程(有兴趣的朋友具体可以跟一下就知道整个流程了)。


    现在扯回来,这个C++ Actor根据不同情况(注意:这里说的是你自定义的C++ Actor,并不是派生出来的BP Actor),可以在几个地方做初始化:


    A、C++的构造函数:

        特点:就是没有特点,是C++类实例化都必须调用此函数。

        这里是最最初级的初始化,万变不离其中嘛,只要是C++的类,都必须经过构造函数。

        在这里你可以创建RootComponent以及它的SubComponent,还可以给你的字段做一些低级基础的初始化工作,比如初始化非UE4架构中的类或者第三方类,可以对应析构中做释放,后面几个初始化函数初始的内容我实在找不到对应的地方做释放,可能做C++养成的坏习惯,比如内存分配这些,我老喜欢用一些成对的函数来做避免产生泄露。而UE4本身其实是做了GC这种事的,好像就是想简化C++开发人员要考虑的事情。

        需要注意的是这里的初始化工作,只会在编辑器或者游戏中关卡被反持久化时有效,如果在后面的函数中覆盖了这些初始化工作,那么这里的初始化其实是无效的。


    B、ACustomActor::PostLoad():

        特点:需要主动调用基类的函数。

        这是个Actor基类所实现过的虚函数,你如果需要override它,请记得调用Super::PostLoad(),切记!切记!

        这个函数有意思的地方在于,它刚好提供了一个反序列化或Spawn之后的构造函数调用的功能,你完全可以在这里初始化你类实例里的一些字段。

        注意:最好不要这里进行增量的行为,在Editor模式下如果做增量行为,当你不自觉的按下Ctrl+S 或者 编辑器AutoSave时,被增量的字段或内容会被永远保存下来,并影响到你所有的派生于此的BP Actor。这个函数是发生在反持久化之后,当Save的时会发生持久化操作。你的一切改变数据的操作,这里都将被永远保存到磁盘上!!!

    C、ACustomActor::PostActorCreated():

        特点:无需主动调用基类的函数,除非你想用基类的实现来做一些事情。

        这是一个Actor基类所拥有的虚函数,但Actor并未实现它。

        它工作在反序列化或者Spawn之后,也就是说你真的想在程序中改变当前实例的值的时候,在这里做才有效的。

        感觉在这里做初始化最好,当然这是我个人看法。


    D、ACustomActor::OnConstruction(const FTransform& Transform):

        特点:在此你可以初始化一些Component数据的初始化工作(包括派生于此的BP Actor的组件到这步也是创建完成了的喔~~~!!!

        这个函数是所有组件、子组件完全创建并初始化完成,也就是说在Editor里,你能在这里改变派生于此类的BP Actor的位置了。(父类控制子类初始化行为)

        比较烦的就是,要多敲一个很烦的参数。

        这个函数比较有意义的地方就是能用父类控制子类初始化行为


    E、ACustomActor::BeginPlay():

        特点:只在Level开始的时候调用一次。

        官方其实比较推荐用的是这个了。

        我觉得有利有弊吧,这个函数可能会在不同的地方被调用,那是不是容易发生重复把一些已经初始化完在使用的数据又给初始化了呢?呃,不过也许是我想多了……


    F、


    G、


    H、……


    这里还有其他几个,有些是Component相关的初始化的,没有太深入研究,以后用到再慢慢补进来吧,先占个位置吧。。。

原创文章,转载请注明: 转载自游戏无界·达秀的黑暗空间

本文链接地址: UE4中自定义Actor初始化相关备忘

本站作品除特殊申明外均为原创,采用知识共享署名-非商业性使用-禁止演绎 3.0 Unported许可协议进行许可。如果需转载请保持文章完整性和标明原文出处,禁止商业用途。