UE4 C++入门之路6-PostEditChangeProperty以及和PostInitProperties的区别

Posted 珞珈大胖强TURBO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 C++入门之路6-PostEditChangeProperty以及和PostInitProperties的区别相关的知识,希望对你有一定的参考价值。

PostEditChangeProperty

前言

之前讲属性初始化的时候说到,如果某个属性需要在设计师在编辑器界面初始化一些值后,依据这些值来计算得出别的属性,或者说有一个函数是在属性初始化后执行的,介绍了PostInitProperties函数可以做这件事,就比如属性有A,B,C,C要在A,B初始化后通过A/B计算得出,那么写在PostInitProperties函数中即可,那么如果我们需要A已经初始化了,但是A只要在编辑器中改变,C就会重新计算需要怎么做呢?这就引出了今天的主角PostEditChangepROPITY----

PostEditChangeProperty

三个属性

	UPROPERTY(EditAnywhere,BlueprintReadOnly,Transient)
	int32 TotalDamage1 = 56;

	UPROPERTY(EditAnywhere, Category = "Damege")
	float TotalDamageWithCategory;
	
	UPROPERTY(EditAnywhere,BlueprintReadWrite, Category = "Damege")
	float TotalDamageWithCategoryPublicToBp;

需要在.h中覆盖此虚方法

virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;

然后cpp中实现

#if WITH_EDITOR
void ABpExpendActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)

	Super::PostEditChangeProperty(PropertyChangedEvent);

	TotalDamageWithCategoryPublicToBp = TotalDamage / TotalDamageWithCategory;

#endif

加#if WITH_EDITOR的原因是,此方法只有在编辑器模式下才有用,他是为了适应设计师的数据设计而产生的代码,所以在游戏模式下此代码不需要编译,#if WITH_EDITOR这种代码块包围住的代码就是此意思,非编辑器界面不需要编译。
效果如下

当我们在编辑器模式下改变TotalDamage ,TotalDamageWithCategoryPublicToBp 即会随之改变

结束!如果觉得我写的还不错,不要吝啬一个赞奥,这是对我的最大支持了,谢谢大家,下篇再见!

以上是关于UE4 C++入门之路6-PostEditChangeProperty以及和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宏详解