#pragma once #include "CoreMinimal.h" #include "WingServer.h" #include "WingHandler.h" #include "WingFetcher.h" #include "WingUtils.h" #include "Kismet2/KismetEditorUtilities.h" #include "Animation/AnimBlueprint.h" #include "AnimStateTransitionNode.h" #include "AnimationStateMachineGraph.h" #include "StateMachine_SetTransitionRule.generated.h" // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- UCLASS() class UWing_StateMachine_SetTransitionRule : public UObject, public IWingHandler { GENERATED_BODY() public: UPROPERTY(meta=(Description="Animation Blueprint package path")) FString Blueprint; UPROPERTY(meta=(Description="State machine graph name")) FString Graph; UPROPERTY(meta=(Description="Name of the source state")) FString FromState; UPROPERTY(meta=(Description="Name of the target state")) FString ToState; UPROPERTY(meta=(Optional, Description="Crossfade duration in seconds")) float CrossfadeDuration = 0.0f; UPROPERTY(meta=(Optional, Description="Blend mode (as integer enum value)")) int32 BlendMode = 0; UPROPERTY(meta=(Optional, Description="Transition priority order")) int32 PriorityOrder = 0; UPROPERTY(meta=(Optional, Description="Logic type (as integer enum value)")) int32 LogicType = 0; UPROPERTY(meta=(Optional, Description="Whether the transition is bidirectional")) bool BBidirectional = false; virtual FString GetDescription() const override { return TEXT("Update properties on an existing transition between two states in an animation state machine."); } virtual void Handle() override { WingFetcher F; UAnimBlueprint* AnimBP = F.Asset(Blueprint).Cast(); if (!AnimBP) return; UAnimationStateMachineGraph* SMGraph = WingUtils::FindStateMachineGraph(AnimBP, Graph); if (!SMGraph) { UWingServer::Printf(TEXT("ERROR: State machine graph '%s' not found in '%s'\n"), *Graph, *WingUtils::FormatName(AnimBP)); return; } UAnimStateTransitionNode* TransNode = WingUtils::FindTransition(SMGraph, FromState, ToState); if (!TransNode) { UWingServer::Printf(TEXT("ERROR: Transition from '%s' to '%s' not found in graph '%s'\n"), *FromState, *ToState, *Graph); return; } // Apply properties TransNode->CrossfadeDuration = CrossfadeDuration; TransNode->BlendMode = (EAlphaBlendOption)BlendMode; TransNode->PriorityOrder = PriorityOrder; TransNode->LogicType = (ETransitionLogicType::Type)LogicType; TransNode->Bidirectional = BBidirectional; // Compile FKismetEditorUtilities::CompileBlueprint(AnimBP); UWingServer::Printf(TEXT("Updated transition %s -> %s: %s\n"), *FromState, *ToState, *WingUtils::FormatName(TransNode)); } };