UE4 C++入门之路4-PostInitProperties函数详解(设置属性默认值的四种方法)

Posted 珞珈大胖强TURBO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 C++入门之路4-PostInitProperties函数详解(设置属性默认值的四种方法)相关的知识,希望对你有一定的参考价值。

前言

也许在工作或者学习中,我们会遇到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

最后一个知识点
如果某个属性需要在设计师在编辑器界面初始化一些值后,依据这些值来计算得出,那么怎么做呢,只需要实现PostInitProperties虚方法即可

virtual void PostInitProperties() override;
void ABpExpendActor::PostInitProperties()
{
	Super::PostInitProperties();
	TotalDamageWithCategoryPublicToBp = TotalDamage / TotalDamageWithCategory;
}

这样写之后TotalDamageWithCategoryPublicToBp 就会在另两个值设置后计算得出,关于此函数的追踪,我们可以尝试一下
首先ABpExpendActor为Actor,继承自UObject,在UObject中,刚好找到这个虚函数的定义
下图中英语的翻译,意思即为
此函数在构造函数之后,并且在所有属性初始化之后(包括从配置文件中读出的情况)
在一些序列化或其他设置发生之前调用的

例子如下
对于此类的蓝图,我们设置后面两个数为300和1,当此蓝图被拖进游戏窗口,也就是创建对象的时候,TotalDameage会通过PostInitProperties中的代码计算出来,原理就是在构造函数调用之后执行PostInitProperties方法
如下

结束!不要吝啬一个赞奥,写的真累,下篇再见!

以上是关于UE4 C++入门之路4-PostInitProperties函数详解(设置属性默认值的四种方法)的主要内容,如果未能解决你的问题,请参考以下文章

UE4 C++入门之路5-热重载Compile(编译项目的三种方式)

UE4 C++入门之路3-C++和蓝图的互相调用

UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍

UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍

UE4 C++入门之路7-UObject,AActor,UActorComponent,UStruct介绍,生命周期介绍

UE4 C++入门之路2-C++中的UPROPERTY宏详解