#pragma once #include "CoreMinimal.h" #include "WingServer.h" #include "WingHandler.h" #include "WingFetcher.h" #include "WingUtils.h" #include "Animation/AnimBlueprint.h" #include "AnimGraphNode_Base.h" #include "AnimBlueprint_ListSyncGroups.generated.h" // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- UCLASS() class UWing_AnimBlueprint_ListSyncGroups : public UObject, public IWingHandler { GENERATED_BODY() public: UPROPERTY(meta=(Description="Path to an Animation Blueprint, e.g. /Game/Foo/ABP_Character")) FString Blueprint; virtual FString GetDescription() const override { return TEXT("List all sync group names used in an Animation Blueprint."); } virtual void Handle() override { WingFetcher F; UAnimBlueprint* AnimBP = F.Walk(Blueprint).Cast(); if (!AnimBP) return; // Walk all anim nodes to collect sync group names TSet SyncGroupNames; for (UAnimGraphNode_Base* AnimNode : WingUtils::AllNodes(AnimBP)) { for (TFieldIterator PropIt(AnimNode->GetClass()); PropIt; ++PropIt) { if (PropIt->GetName().Contains(TEXT("SyncGroup")) || PropIt->GetName().Contains(TEXT("GroupName"))) { FName GroupValue = PropIt->GetPropertyValue_InContainer(AnimNode); if (!GroupValue.IsNone()) { SyncGroupNames.Add(GroupValue.ToString()); } } } } if (SyncGroupNames.Num() == 0) { UWingServer::Print(TEXT("No sync groups found.\n")); return; } for (const FString& Group : SyncGroupNames) { UWingServer::Printf(TEXT("%s\n"), *Group); } } };