通过变量名动态修改变量属性
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));
}
}
}
}