UE4 C++ 通过变量名动态修改变量属性

通过变量名动态修改变量属性

UCLASS包含了该类中所有的UPROPERTY以及UFUNCTION

1、在SrcActor.h中定义两个测试变量

public:
	UPROPERTY(EditAnywhere)
		FString Name=“OldName”;
	UPROPERTY(EditAnywhere)
		bool bIsActive;

2、在DecActor.h中定义变量和声明相应函数

public:
	UObject *SrcObj;
	class ASrcActor *SrcActor;
public:
	void GetSrcActor();
	void ChangeUProperty();

3、实现对应函数

BeginPlay:
void ADecActor::BeginPlay()
{
	Super::BeginPlay();
	GetSrcActor();
}
void ADecActor::GetSrcActor()
{
	TArray<AActor*> SrcArray;
	UGameplayStatics::GetAllActorsOfClass(GetWorld(), ASrcActor::StaticClass(), SrcArray);
	if (SrcArray.Num()>0)
	{
		//获取对象
		SrcActor = Cast<ASrcActor>(SrcArray[0]);
		SrcObj = (UObject*)SrcActor;
		//修改值
		ChangeUProperty();
	}
}
void ADecActor::ChangeUProperty()
{
	//遍历对象中的所有值
	for (TFieldIterator<UProperty> ProIt(SrcObj->GetClass()); ProIt; ++ProIt)
	{
		//Name
		UProperty *Pro = *ProIt;
		//通过GetNameCPP找到变量名
		if (Pro->GetNameCPP().Equals("Name"))
		{
			//转换为对应的FString格式
			UStrProperty *StrPro = Cast<UStrProperty>(Pro);
			if (StrPro)
			{
				//输出当前对象
				void *valPtr = Pro->ContainerPtrToValuePtr<uint8*>(SrcObj);
				if (GEngine){
					GEngine->AddOnScreenDebugMessage(-1, 100.f, FColor::Yellow, 
					FString("Name old : ") + StrPro->GetPropertyValue(valPtr));
				}
				//修改对象
				StrPro->SetPropertyValue(valPtr, FString("New Name"));
			}
			//输出修改后对象
			if (GEngine){
				GEngine->AddOnScreenDebugMessage(-1, 100.f, FColor::Red, 
				FString("Name now : ") + SrcActor->Name);
			}
		}

		//bIsActive
		if (Pro->GetNameCPP().Equals("bIsActive"))
		{
			UBoolProperty *BoolPro = Cast<UBoolProperty>(Pro);
			if (BoolPro)
			{
				void *valPtr = Pro->ContainerPtrToValuePtr<uint8>(SrcObj);
				if (GEngine) {
					GEngine->AddOnScreenDebugMessage(-1, 100.f, FColor::Yellow, 
					FString("bIsActive old : ") + 
					FString::FromInt(BoolPro->GetPropertyValue(valPtr)));
				}
				BoolPro->SetPropertyValue(valPtr, true);
			}
			if (GEngine) {
				GEngine->AddOnScreenDebugMessage(-1, 100.f, FColor::Red, 
				FString("bIsActive now : ") + 
				FString::FromInt(SrcActor->bIsActive));
			}
		}
	}
}

4、结果

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值