基于C++代码的UE4学习(二十九)——因属性改变而引发的事件

 

如题,当一个类中的属性发生了改变,从而引发的事件。

这里我们定义一个属性show,当这个属性发生改变的时候,引发了模型的visibility事件。

virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;由父类继承而来,专门处理属性改变的事件。

 

 1 // Fill out your copyright notice in the Description page of Project Settings.
 2 
 3 #pragma once
 4 
 5 #include "CoreMinimal.h"
 6 #include "Engine/StaticMeshActor.h"
 7 #include "UObject/ConstructorHelpers.h"
 8 #include "Host.generated.h"
 9
13 UCLASS() 
14 class MYPROJECT11_API AHost : public AStaticMeshActor 
15 { 
16  GENERATED_BODY() 
17 
18 public: 
19      AHost(); 
20      UPROPERTY(EditAnywhere) 
21      bool show; 
22      virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; 
23      UStaticMeshComponent* myMesh; 
24 };

 

源文件:

 

1 // Fill out your copyright notice in the Description page of Project Settings.
 2 
 3 
 4 #include "Host.h"
 5 #include "Components/StaticMeshComponent.h"
 6 
 7 AHost::AHost() {
 8     PrimaryActorTick.bCanEverTick = true;
 9     show = true;
10     myMesh = GetStaticMeshComponent();
11 
12     auto asset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("StaticMesh'/Engine/BasicShapes/Cone.Cone'"));
13 
14     if (asset.Succeeded()) {
15         myMesh->SetStaticMesh(asset.Object);
16         myMesh->SetGenerateOverlapEvents(true);
17         myMesh->SetVisibility(show);
18         myMesh->SetMobility(EComponentMobility::Movable);
19         myMesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
20         myMesh->SetCollisionObjectType(ECC_WorldDynamic);
21     }
22 
23 }
24 
25 void AHost::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
26 {
27     if (PropertyChangedEvent.Property != nullptr) {
28         const FName PropertyName = PropertyChangedEvent.Property->GetFName();   //获得该类所有属性的名字
29 
30         //const FString PropertyName = PropertyChangedEvent.Property->GetName();
31         //PropertyName == GET_MEMBER_NAME_STRING_CHECKED(AHost,show)
32 
33         if (PropertyName == GET_MEMBER_NAME_CHECKED(AHost,show)) {   //当这个属性名字属于AHost类,且属性名字为show时候,myMesh改变visibility。
34             myMesh->SetVisibility(show);
35         }
36     }
37     Super::PostEditChangeProperty(PropertyChangedEvent); //调用父类的PostEditChangeProperty方法。
38 
39 }

 

 

 

 

其实很多情况可以直接通过包含来完成,这种方式只是更加安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值