参见 https://www.unrealengine.com/blog/unreal-property-system-reflection
// // Base class for mobile units (soldiers) #include "StrategyTypes.h" #include "StrategyChar.generated.h" UCLASS(Abstract) class AStrategyChar : public ACharacter, public IStrategyTeamInterface { GENERATED_UCLASS_BODY() /** How many resources this pawn is worth when it dies. */ UPROPERTY(EditAnywhere, Category=Pawn) int32 ResourcesToGather; /** set attachment for weapon slot */ UFUNCTION(BlueprintCallable, Category=Attachment) void SetWeaponAttachment(class UStrategyAttachment* Weapon); UFUNCTION(BlueprintCallable, Category=Attachment) bool IsWeaponAttached(); protected: /** melee anim */ UPROPERTY(EditDefaultsOnly, Category=Pawn) UAnimMontage* MeleeAnim; /** Armor attachment slot */ UPROPERTY() UStrategyAttachment* ArmorSlot; /** team number */ uint8 MyTeamNum; [more code omitted] };
USING REFLECTION DATA
UField UStruct UClass (C++ class) UScriptStruct (C++ struct) UFunction (C++ function) UEnum (C++ enumeration) UProperty (C++ member variable or function parameter) (Many subclasses for different types)
To iterate over all members of a UStruct, use a TFieldIterator:
for (TFieldIterator<UProperty> PropIt(GetClass()); PropIt; ++PropIt) { UProperty* Property = *PropIt; UE_LOG(YourLog, Warning, TEXT("get property:%s"), *(PropIt->GetFName()).ToString()); // Do something with the property }
Object iterators are a very useful tool to iterate over all instances of a particular UObject type and its subclasses.
for (TObjectIterator<UObject> It; It; ++It) { UObject* CurrentObject = *It; UE_LOG(YourLog, Log, TEXT("Found UObject named: %s"), *CurrentObject->GetName()); }
ActorIterator
APlayerController* MyPC = GetMyPlayerControllerFromSomewhere(); UWorld* World = MyPC->GetWorld(); // Like object iterators, you can provide a specific class to get only objects that are // or derive from that class for (TActorIterator<AEnemy> It(World); It; ++It) { // ... }