也许在工作或者学习中,我们会遇到PostInitProperties函数,本文旨在讲清楚PostInitProperties函数的作用以及一些衍生的知识
作为UE4 C++编码过程中,还是那句话,类由属性和方法组成,之前说过属性到蓝图的暴漏,那么属性的初始值一般是怎么设置的呢,构造函数是一种,其实PostInitProperties也是一种,他们的具体差距为何,话不多说,进主题----
最通俗易懂的方式,也是最容易写出来的代码,TotalDamage 也能拿到初始值
class STUDYPROJECT1_1_1_API ABpExpendActor : public AActor { GENERATED_BODY() public: UPROPERTY(EditAnywhere,BlueprintReadOnly,Transient) int32 TotalDamage = 56;
构造函数赋值,经过测试,一,二一起写的时候,是会被赋值构造函数中的,所以一的写法应该是更早赋值的
ABpExpendActor::ABpExpendActor() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; TotalDamage = 240; TotalDamageWithCategory = 0.1f; }
和经典C++一样,初始化列表赋值
ABpExpendActor::ABpExpendActor():TotalDamage(250),TotalDamageWithCategory(2.f) { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; TotalDamageWithCategory = 0.1f; }
由结果也可知初始化列表赋值早于构造函数赋值
下赋一些C++的知识点
1 必须使用成员初始化的四种情况
2 成员初始化列表做了什么
① 编译器会一一操作初始化列表,以适当的顺序在构造函数之内安插初始化操作,并且在任何显示用户代码之前;
② list中的项目顺序是由类中的成员声明顺序决定的,不是由初始化列表的顺序决定的;
最后一个知识点
如果某个属性需要在设计师在编辑器界面初始化一些值后,依据这些值来计算得出,那么怎么做呢,只需要实现PostInitProperties虚方法即可
virtual void PostInitProperties() override;
void ABpExpendActor::PostInitProperties() { Super::PostInitProperties(); TotalDamageWithCategoryPublicToBp = TotalDamage / TotalDamageWithCategory; }
这样写之后TotalDamageWithCategoryPublicToBp 就会在另两个值设置后计算得出,关于此函数的追踪,我们可以尝试一下
首先ABpExpendActor为Actor,继承自UObject,在UObject中,刚好找到这个虚函数的定义
下图中英语的翻译,意思即为
此函数在构造函数之后,并且在所有属性初始化之后(包括从配置文件中读出的情况)
在一些序列化或其他设置发生之前调用的
例子如下
对于此类的蓝图,我们设置后面两个数为300和1,当此蓝图被拖进游戏窗口,也就是创建对象的时候,TotalDameage会通过PostInitProperties中的代码计算出来,原理就是在构造函数调用之后执行PostInitProperties方法
如下
结束!不要吝啬一个赞奥,写的真累,下篇再见!