ue-mcp 1.1.13 → 1.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/tool-counts.json +5 -5
- package/dist/tools/animation.js +21 -1
- package/dist/tools/animation.js.map +1 -1
- package/dist/ue-mcp.default.yml +31 -1
- package/package.json +2 -2
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +20 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +13 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_MotionMatching.cpp +183 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp +254 -8
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_StateMachine.cpp +215 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +3 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +1 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# UE-MCP
|
|
2
2
|
|
|
3
|
-
**Unreal Engine Model Context Protocol Server** - gives AI assistants deep read/write access to the Unreal Editor through <!-- count:tools -->23<!-- /count --> category tools covering <!-- count:actions -->
|
|
3
|
+
**Unreal Engine Model Context Protocol Server** - gives AI assistants deep read/write access to the Unreal Editor through <!-- count:tools -->23<!-- /count --> category tools covering <!-- count:actions -->682+<!-- /count --> actions, plus a YAML flow engine for multi-step workflows.
|
|
4
4
|
|
|
5
5
|
```mermaid
|
|
6
6
|
flowchart LR
|
package/dist/tool-counts.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"tools": 23,
|
|
3
|
-
"actions":
|
|
4
|
-
"bridgeActions":
|
|
3
|
+
"actions": 682,
|
|
4
|
+
"bridgeActions": 648,
|
|
5
5
|
"localActions": 34,
|
|
6
6
|
"perTool": {
|
|
7
7
|
"project": 32,
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"blueprint": 58,
|
|
10
10
|
"level": 69,
|
|
11
11
|
"material": 41,
|
|
12
|
-
"animation":
|
|
12
|
+
"animation": 83,
|
|
13
13
|
"landscape": 10,
|
|
14
14
|
"pcg": 19,
|
|
15
15
|
"foliage": 5,
|
|
@@ -30,6 +30,6 @@
|
|
|
30
30
|
},
|
|
31
31
|
"nativeToolsets": 52,
|
|
32
32
|
"nativeToolActions": 830,
|
|
33
|
-
"generatedAt": "2026-07-
|
|
34
|
-
"version": "1.1.
|
|
33
|
+
"generatedAt": "2026-07-11T19:28:24.770Z",
|
|
34
|
+
"version": "1.1.15"
|
|
35
35
|
}
|
package/dist/tools/animation.js
CHANGED
|
@@ -34,9 +34,12 @@ export const animationTool = categoryTool("animation", "Animation assets, skelet
|
|
|
34
34
|
add_transition: bp("Add directed transition between states. Params: assetPath, stateMachineName, fromState, toState", "add_transition"),
|
|
35
35
|
set_state_animation: bp("Assign anim asset to state. Params: assetPath, stateMachineName, stateName, animAssetPath", "set_state_animation"),
|
|
36
36
|
set_transition_blend: bp("Set blend type/duration on transition. Params: assetPath, stateMachineName, fromState, toState, blendDuration?, blendLogic?", "set_transition_blend"),
|
|
37
|
+
set_transition_condition: bp("Set a transition's 'can enter transition' condition from a bool variable, keyed by transition (not graph name - every rule graph is named 'Transition' so blueprint graph tools can only reach the first). Wires VariableGet(bool) -> bCanEnterTransition, replacing any prior condition. Identify the transition by transitionGuid (from add_transition/read_state_machine) OR fromState+toState. Params: assetPath, stateMachineName, variableName (existing bool var), transitionGuid? OR fromState?+toState?, negate? (default false) (#707)", "set_transition_condition", (p) => ({ assetPath: p.assetPath, stateMachineName: p.stateMachineName, variableName: p.variableName, transitionGuid: p.transitionGuid, fromState: p.fromState, toState: p.toState, negate: p.negate })),
|
|
37
38
|
read_state_machine: bp("Read state machine topology. Params: assetPath, stateMachineName", "read_state_machine"),
|
|
38
39
|
read_anim_graph: bp("Read AnimBP AnimGraph nodes with properties & pins. Params: assetPath, graphName?", "read_anim_graph"),
|
|
39
40
|
add_curve: bp("Add float curve to AnimSequence. Params: assetPath, curveName, curveType?", "add_curve"),
|
|
41
|
+
set_anim_curve_keys: bp("Set float-curve key VALUES on an AnimSequence (add_curve only creates an empty named curve - it cannot set keyframe values). Adds the curve if missing, then replaces its keys. Use for authoring Distance/Speed/any float curve directly. Params: assetPath, curveName, keys ([{time, value, interp?('linear'|'constant'|'cubic')}]), interpolation? (default 'linear', applied to keys without their own interp) (#712)", "set_anim_curve_keys", (p) => ({ assetPath: p.assetPath, curveName: p.curveName, keys: p.keys, interpolation: p.interpolation })),
|
|
42
|
+
apply_animation_modifier: bp("Instantiate a UAnimationModifier subclass and run it on an AnimSequence. Headline use: modifierClass='DistanceCurveModifier' bakes a Distance curve from the clip's root motion for distance matching (needs root motion baked first - see bake_root_motion_from_bone). Registers the modifier on the sequence so it re-applies on reimport. props sets the modifier's EditAnywhere fields (e.g. DistanceCurveModifier: {CurveName, Axis:'XY'|'X'|..., bStopAtEnd, StopSpeedThreshold, SampleRate}). Note: DistanceCurveModifier ships in the 'Animation Locomotion Library' plugin (off by default) - enable it first. Params: assetPath, modifierClass (short name or /Script path), props? (#712)", "apply_animation_modifier", (p) => ({ assetPath: p.assetPath, modifierClass: p.modifierClass, props: p.props })),
|
|
40
43
|
set_montage_slot: bp("Set slot name on a montage track. Params: assetPath, slotName, trackIndex?", "set_montage_slot"),
|
|
41
44
|
add_montage_section: bp("Add composite section to montage. Params: assetPath, sectionName, startTime?, linkedSection?", "add_montage_section"),
|
|
42
45
|
create_ik_rig: bp("Create IKRigDefinition asset, optionally with retargetRoot + chains[]. Params: name, skeletalMeshPath, packagePath?, retargetRoot?, chains?: [{name, startBone, endBone, goal?}]", "create_ik_rig"),
|
|
@@ -68,12 +71,15 @@ export const animationTool = categoryTool("animation", "Animation assets, skelet
|
|
|
68
71
|
add_pose_search_schema_pose_channel: bp("Add a Pose feature channel to a schema (samples named bones for velocity/position/rotation/phase). Params: schemaPath, bones ([{bone, flags?:['velocity','position','rotation','phase'], weight?}] - a bare bone-name string defaults to position), weight? (motion matching)", "add_pose_search_schema_pose_channel", (p) => ({ schemaPath: p.schemaPath, bones: p.bones, weight: p.weight })),
|
|
69
72
|
add_pose_search_schema_trajectory_channel: bp("Add a Trajectory feature channel to a schema (past/future motion samples). Params: schemaPath, samples ([{offset (seconds; negative=history, positive=prediction), flags?:['position','velocity','facingDirection','velocityDirection', ...XY variants], weight?}]), weight? (motion matching)", "add_pose_search_schema_trajectory_channel", (p) => ({ schemaPath: p.schemaPath, samples: p.samples, weight: p.weight })),
|
|
70
73
|
read_pose_search_schema: bp("Inspect a PoseSearchSchema: skeleton(s), mirror table, sample rate, feature channels. Params: schemaPath (motion matching)", "read_pose_search_schema", (p) => ({ schemaPath: p.schemaPath })),
|
|
71
|
-
create_mirror_data_table: bp("Create a MirrorDataTable for a skeleton (needed for mirrored poses in motion matching / mirror nodes). Auto-derives bone-pair rows from find/replace expressions (defaults to UE mannequin _l
|
|
74
|
+
create_mirror_data_table: bp("Create a MirrorDataTable for a skeleton (needed for mirrored poses in motion matching / mirror nodes). Auto-derives bone-pair rows from find/replace expressions (defaults to UE mannequin _l/_r suffix swap). Params: name, skeletonPath, packagePath?, expressions? ([{find, replace, method?:'suffix'|'prefix'|'regex'}]), mirrorAxis? (motion matching)", "create_mirror_data_table", (p) => ({ name: p.name, skeletonPath: p.skeletonPath, packagePath: p.packagePath, expressions: p.expressions, mirrorAxis: p.mirrorAxis, onConflict: p.onConflict })),
|
|
72
75
|
read_mirror_data_table: bp("Inspect a MirrorDataTable: skeleton and bone-pair rows (name -> mirroredName). Params: assetPath (motion matching)", "read_mirror_data_table", (p) => ({ assetPath: p.assetPath })),
|
|
73
76
|
create_pose_search_normalization_set: bp("Create a PoseSearchNormalizationSet grouping databases so they normalize their cost space together (consistent blending across a locomotion set). Assign it via set_pose_search_database_settings(normalizationSetPath). Params: name, packagePath?, databases? ([PoseSearchDatabase paths]) (motion matching)", "create_pose_search_normalization_set", (p) => ({ name: p.name, packagePath: p.packagePath, databases: p.databases, onConflict: p.onConflict })),
|
|
74
77
|
add_motion_matching_node: bp("Add a Motion Matching node to an AnimBP AnimGraph and point it at a PoseSearchDatabase (the runtime node that searches the database each frame). Connects its output to the Output Pose by default. For chooser-driven database selection, bind an anim-node function that calls SetDatabasesToSearch. Params: assetPath (AnimBP), databasePath, graphName? (default AnimGraph), connectToOutput? (default true), blendTime? (motion matching)", "add_motion_matching_node", (p) => ({ assetPath: p.assetPath, databasePath: p.databasePath, graphName: p.graphName, connectToOutput: p.connectToOutput, blendTime: p.blendTime })),
|
|
75
78
|
add_pose_history_node: bp("Add a Pose History (PoseSearchHistoryCollector) node to an AnimBP AnimGraph - the Motion Matching node needs it in the graph to query pose/trajectory history. Defaults to self-generated trajectory (no external trajectory pin needed) and inserts itself into the pose chain feeding the Output Pose. Params: assetPath (AnimBP), graphName? (default AnimGraph), poseCount?, samplingInterval?, generateTrajectory? (default true), trajectoryHistoryCount?, trajectoryPredictionCount?, insertBeforeOutput? (default true) (motion matching)", "add_pose_history_node", (p) => ({ assetPath: p.assetPath, graphName: p.graphName, poseCount: p.poseCount, samplingInterval: p.samplingInterval, generateTrajectory: p.generateTrajectory, trajectoryHistoryCount: p.trajectoryHistoryCount, trajectoryPredictionCount: p.trajectoryPredictionCount, insertBeforeOutput: p.insertBeforeOutput })),
|
|
76
79
|
set_motion_matching_chooser: bp("Drive the Motion Matching node's Database from a ChooserTable so the database is selected at runtime by character state. Wires a thread-safe EvaluateChooser (result typed to PoseSearchDatabase) into the MM node's Database pin. contextSource selects what the chooser reads its columns from: 'self' (default, the anim instance - choosers branching on AnimBP variables) or 'pawn' (the owning pawn via TryGetPawnOwner - choosers branching on character/pawn state). Params: assetPath (AnimBP), chooserPath (ChooserTable), graphName? (default AnimGraph), contextSource? ('self'|'pawn') (motion matching)", "set_motion_matching_chooser", (p) => ({ assetPath: p.assetPath, chooserPath: p.chooserPath, graphName: p.graphName, contextSource: p.contextSource })),
|
|
80
|
+
// #713 — distance-matching graph authoring
|
|
81
|
+
add_sequence_evaluator: bp("Add a Sequence Evaluator node (explicit-time player) to an AnimBP graph - the node distance matching drives by setting its ExplicitTime each frame. graphName can be the top-level AnimGraph or a state's inner graph (pass the state name). Defaults bTeleportToExplicitTime=false so time advances and root motion extracts. Connects to the Output Pose by default. Returns nodeGuid for bind_anim_node_function. Params: assetPath (AnimBP), sequencePath? (AnimSequence to evaluate), graphName? (default AnimGraph), explicitTime?, shouldLoop?, teleportToExplicitTime? (default false), connectToOutput? (default true) (#713)", "add_sequence_evaluator", (p) => ({ assetPath: p.assetPath, sequencePath: p.sequencePath, graphName: p.graphName, explicitTime: p.explicitTime, shouldLoop: p.shouldLoop, teleportToExplicitTime: p.teleportToExplicitTime, connectToOutput: p.connectToOutput })),
|
|
82
|
+
bind_anim_node_function: bp("Bind a thread-safe anim-node function to an anim graph node's update slot - the mechanism distance matching uses to advance a Sequence Evaluator's explicit time each frame (function calls AnimDistanceMatchingLibrary::DistanceMatchToTarget / AdvanceTimeByDistanceMatching). The function must already exist on the AnimBP (create it as a BlueprintThreadSafe function first). Identify the node by nodeGuid (from add_sequence_evaluator / add_*_node). Params: assetPath (AnimBP), nodeGuid, functionName, graphName? (default AnimGraph), binding? ('update' (default)|'becomeRelevant'|'initialUpdate') (#713)", "bind_anim_node_function", (p) => ({ assetPath: p.assetPath, nodeGuid: p.nodeGuid, functionName: p.functionName, graphName: p.graphName, binding: p.binding })),
|
|
77
83
|
// v1.0.0-rc.2 — #153, #154 (animation authoring gaps)
|
|
78
84
|
set_sequence_properties: bp("Batch-set properties on AnimSequence assets. If a path is a Montage and resolveFromMontages is true (default), resolves to its first AnimSequence. Params: assetPaths[], properties{enableRootMotion?, forceRootLock?, useNormalizedRootMotionScale?, rootMotionRootLock?}, resolveFromMontages?", "set_sequence_properties"),
|
|
79
85
|
bake_root_motion_from_bone: bp("Bake delta translation from a source bone (e.g. pelvis) onto the root bone across the whole sequence; compensates the source bone so world-space position is unchanged. Params: assetPath, sourceBone, rootBone? (default 'root'), axes? (default ['x','y']), interpolation? ('linear'|'per_frame', default 'linear')", "bake_root_motion_from_bone"),
|
|
@@ -131,10 +137,24 @@ export const animationTool = categoryTool("animation", "Animation assets, skelet
|
|
|
131
137
|
animAssetPath: z.string().optional().describe("Path to animation sequence or blendspace"),
|
|
132
138
|
blendDuration: z.number().optional(),
|
|
133
139
|
blendLogic: z.string().optional().describe("Standard or Inertialization"),
|
|
140
|
+
variableName: z.string().optional().describe("Bool variable name for set_transition_condition (#707)"),
|
|
141
|
+
transitionGuid: z.string().optional().describe("Transition GUID selector for set_transition_condition (#707)"),
|
|
142
|
+
negate: z.boolean().optional().describe("Negate the bool condition in set_transition_condition (#707)"),
|
|
134
143
|
graphName: z.string().optional().describe("Target graph name (default: AnimGraph)"),
|
|
135
144
|
// Curve params (#79 / #24)
|
|
136
145
|
curveName: z.string().optional().describe("Curve name for add_curve"),
|
|
137
146
|
curveType: z.string().optional().describe("Curve type (default: float)"),
|
|
147
|
+
// #712 — direct float-curve values + animation modifiers
|
|
148
|
+
keys: z.array(z.object({ time: z.number(), value: z.number(), interp: z.string().optional() })).optional().describe("set_anim_curve_keys: [{time, value, interp?}] keyframes"),
|
|
149
|
+
modifierClass: z.string().optional().describe("apply_animation_modifier: UAnimationModifier subclass (short name e.g. 'DistanceCurveModifier' or /Script path)"),
|
|
150
|
+
props: z.record(z.any()).optional().describe("apply_animation_modifier: modifier EditAnywhere property values"),
|
|
151
|
+
// #713 — distance-matching graph authoring
|
|
152
|
+
nodeGuid: z.string().optional().describe("bind_anim_node_function: target anim graph node GUID (from add_sequence_evaluator / add_*_node)"),
|
|
153
|
+
functionName: z.string().optional().describe("bind_anim_node_function: thread-safe anim-node function name to bind"),
|
|
154
|
+
binding: z.string().optional().describe("bind_anim_node_function: 'update' (default), 'becomeRelevant', or 'initialUpdate'"),
|
|
155
|
+
explicitTime: z.number().optional().describe("add_sequence_evaluator: initial ExplicitTime"),
|
|
156
|
+
shouldLoop: z.boolean().optional().describe("add_sequence_evaluator: bShouldLoop"),
|
|
157
|
+
teleportToExplicitTime: z.boolean().optional().describe("add_sequence_evaluator: bTeleportToExplicitTime (default false so time advances / root motion extracts)"),
|
|
138
158
|
// Montage slot & section params (#78, #27)
|
|
139
159
|
slotName: z.string().optional().describe("Slot name for set_montage_slot"),
|
|
140
160
|
trackIndex: z.number().optional().describe("Slot track index (default: 0)"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../../src/tools/animation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../../src/tools/animation.ts"],"names":[],"mappings":"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"}
|
package/dist/ue-mcp.default.yml
CHANGED
|
@@ -1905,6 +1905,12 @@ tasks:
|
|
|
1905
1905
|
description: "Set blend type/duration on transition. Params: assetPath, stateMachineName, fromState, toState, blendDuration?, blendLogic?"
|
|
1906
1906
|
options:
|
|
1907
1907
|
method: set_transition_blend
|
|
1908
|
+
animation.set_transition_condition:
|
|
1909
|
+
class_path: ue-mcp.bridge
|
|
1910
|
+
group: animation
|
|
1911
|
+
description: "Set a transition's 'can enter transition' condition from a bool variable, keyed by transition (not graph name - every rule graph is named 'Transition' so blueprint graph tools can only reach the first). Wires VariableGet(bool) -> bCanEnterTransition, replacing any prior condition. Identify the transition by transitionGuid (from add_transition/read_state_machine) OR fromState+toState. Params: assetPath, stateMachineName, variableName (existing bool var), transitionGuid? OR fromState?+toState?, negate? (default false) (#707)"
|
|
1912
|
+
options:
|
|
1913
|
+
method: set_transition_condition
|
|
1908
1914
|
animation.read_state_machine:
|
|
1909
1915
|
class_path: ue-mcp.bridge
|
|
1910
1916
|
group: animation
|
|
@@ -1923,6 +1929,18 @@ tasks:
|
|
|
1923
1929
|
description: "Add float curve to AnimSequence. Params: assetPath, curveName, curveType?"
|
|
1924
1930
|
options:
|
|
1925
1931
|
method: add_curve
|
|
1932
|
+
animation.set_anim_curve_keys:
|
|
1933
|
+
class_path: ue-mcp.bridge
|
|
1934
|
+
group: animation
|
|
1935
|
+
description: "Set float-curve key VALUES on an AnimSequence (add_curve only creates an empty named curve - it cannot set keyframe values). Adds the curve if missing, then replaces its keys. Use for authoring Distance/Speed/any float curve directly. Params: assetPath, curveName, keys ([{time, value, interp?('linear'|'constant'|'cubic')}]), interpolation? (default 'linear', applied to keys without their own interp) (#712)"
|
|
1936
|
+
options:
|
|
1937
|
+
method: set_anim_curve_keys
|
|
1938
|
+
animation.apply_animation_modifier:
|
|
1939
|
+
class_path: ue-mcp.bridge
|
|
1940
|
+
group: animation
|
|
1941
|
+
description: "Instantiate a UAnimationModifier subclass and run it on an AnimSequence. Headline use: modifierClass='DistanceCurveModifier' bakes a Distance curve from the clip's root motion for distance matching (needs root motion baked first - see bake_root_motion_from_bone). Registers the modifier on the sequence so it re-applies on reimport. props sets the modifier's EditAnywhere fields (e.g. DistanceCurveModifier: {CurveName, Axis:'XY'|'X'|..., bStopAtEnd, StopSpeedThreshold, SampleRate}). Note: DistanceCurveModifier ships in the 'Animation Locomotion Library' plugin (off by default) - enable it first. Params: assetPath, modifierClass (short name or /Script path), props? (#712)"
|
|
1942
|
+
options:
|
|
1943
|
+
method: apply_animation_modifier
|
|
1926
1944
|
animation.set_montage_slot:
|
|
1927
1945
|
class_path: ue-mcp.bridge
|
|
1928
1946
|
group: animation
|
|
@@ -2112,7 +2130,7 @@ tasks:
|
|
|
2112
2130
|
animation.create_mirror_data_table:
|
|
2113
2131
|
class_path: ue-mcp.bridge
|
|
2114
2132
|
group: animation
|
|
2115
|
-
description: "Create a MirrorDataTable for a skeleton (needed for mirrored poses in motion matching / mirror nodes). Auto-derives bone-pair rows from find/replace expressions (defaults to UE mannequin _l
|
|
2133
|
+
description: "Create a MirrorDataTable for a skeleton (needed for mirrored poses in motion matching / mirror nodes). Auto-derives bone-pair rows from find/replace expressions (defaults to UE mannequin _l/_r suffix swap). Params: name, skeletonPath, packagePath?, expressions? ([{find, replace, method?:'suffix'|'prefix'|'regex'}]), mirrorAxis? (motion matching)"
|
|
2116
2134
|
options:
|
|
2117
2135
|
method: create_mirror_data_table
|
|
2118
2136
|
animation.read_mirror_data_table:
|
|
@@ -2145,6 +2163,18 @@ tasks:
|
|
|
2145
2163
|
description: "Drive the Motion Matching node's Database from a ChooserTable so the database is selected at runtime by character state. Wires a thread-safe EvaluateChooser (result typed to PoseSearchDatabase) into the MM node's Database pin. contextSource selects what the chooser reads its columns from: 'self' (default, the anim instance - choosers branching on AnimBP variables) or 'pawn' (the owning pawn via TryGetPawnOwner - choosers branching on character/pawn state). Params: assetPath (AnimBP), chooserPath (ChooserTable), graphName? (default AnimGraph), contextSource? ('self'|'pawn') (motion matching)"
|
|
2146
2164
|
options:
|
|
2147
2165
|
method: set_motion_matching_chooser
|
|
2166
|
+
animation.add_sequence_evaluator:
|
|
2167
|
+
class_path: ue-mcp.bridge
|
|
2168
|
+
group: animation
|
|
2169
|
+
description: "Add a Sequence Evaluator node (explicit-time player) to an AnimBP graph - the node distance matching drives by setting its ExplicitTime each frame. graphName can be the top-level AnimGraph or a state's inner graph (pass the state name). Defaults bTeleportToExplicitTime=false so time advances and root motion extracts. Connects to the Output Pose by default. Returns nodeGuid for bind_anim_node_function. Params: assetPath (AnimBP), sequencePath? (AnimSequence to evaluate), graphName? (default AnimGraph), explicitTime?, shouldLoop?, teleportToExplicitTime? (default false), connectToOutput? (default true) (#713)"
|
|
2170
|
+
options:
|
|
2171
|
+
method: add_sequence_evaluator
|
|
2172
|
+
animation.bind_anim_node_function:
|
|
2173
|
+
class_path: ue-mcp.bridge
|
|
2174
|
+
group: animation
|
|
2175
|
+
description: "Bind a thread-safe anim-node function to an anim graph node's update slot - the mechanism distance matching uses to advance a Sequence Evaluator's explicit time each frame (function calls AnimDistanceMatchingLibrary::DistanceMatchToTarget / AdvanceTimeByDistanceMatching). The function must already exist on the AnimBP (create it as a BlueprintThreadSafe function first). Identify the node by nodeGuid (from add_sequence_evaluator / add_*_node). Params: assetPath (AnimBP), nodeGuid, functionName, graphName? (default AnimGraph), binding? ('update' (default)|'becomeRelevant'|'initialUpdate') (#713)"
|
|
2176
|
+
options:
|
|
2177
|
+
method: bind_anim_node_function
|
|
2148
2178
|
animation.set_sequence_properties:
|
|
2149
2179
|
class_path: ue-mcp.bridge
|
|
2150
2180
|
group: animation
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ue-mcp",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"description": "Unreal Engine MCP server - 23 tools,
|
|
3
|
+
"version": "1.1.15",
|
|
4
|
+
"description": "Unreal Engine MCP server - 23 tools, 682+ actions for AI-driven editor control",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"exports": {
|
|
@@ -104,6 +104,7 @@ void FAnimationHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
|
104
104
|
Registry.RegisterHandler(TEXT("add_transition"), &AddTransition);
|
|
105
105
|
Registry.RegisterHandler(TEXT("set_state_animation"), &SetStateAnimation);
|
|
106
106
|
Registry.RegisterHandler(TEXT("set_transition_blend"), &SetTransitionBlend);
|
|
107
|
+
Registry.RegisterHandler(TEXT("set_transition_condition"), &SetTransitionCondition);
|
|
107
108
|
Registry.RegisterHandler(TEXT("read_state_machine"), &ReadStateMachine);
|
|
108
109
|
|
|
109
110
|
// AnimGraph inspection (#23 / #91)
|
|
@@ -113,6 +114,8 @@ void FAnimationHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
|
113
114
|
|
|
114
115
|
// Float curve authoring (#79 / #24)
|
|
115
116
|
Registry.RegisterHandler(TEXT("add_curve"), &AddCurve);
|
|
117
|
+
Registry.RegisterHandler(TEXT("set_anim_curve_keys"), &SetAnimCurveKeys);
|
|
118
|
+
Registry.RegisterHandler(TEXT("apply_animation_modifier"), &ApplyAnimationModifier);
|
|
116
119
|
|
|
117
120
|
// Montage slot & section editing (#78, #27)
|
|
118
121
|
Registry.RegisterHandler(TEXT("set_montage_slot"), &SetMontageSlot);
|
|
@@ -170,6 +173,10 @@ void FAnimationHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
|
170
173
|
Registry.RegisterHandler(TEXT("add_pose_history_node"), &AddPoseHistoryNode);
|
|
171
174
|
Registry.RegisterHandler(TEXT("set_motion_matching_chooser"), &SetMotionMatchingChooser);
|
|
172
175
|
|
|
176
|
+
// #713 — distance-matching graph authoring
|
|
177
|
+
Registry.RegisterHandler(TEXT("add_sequence_evaluator"), &AddSequenceEvaluator);
|
|
178
|
+
Registry.RegisterHandler(TEXT("bind_anim_node_function"), &BindAnimNodeFunction);
|
|
179
|
+
|
|
173
180
|
// #419/#420 — live-actor skeletal reads + rebind + preview (moved from Level)
|
|
174
181
|
Registry.RegisterHandler(TEXT("get_bone_transform"), &GetBoneTransform);
|
|
175
182
|
Registry.RegisterHandler(TEXT("list_bones"), &ListBones);
|
|
@@ -1128,6 +1135,13 @@ TSharedPtr<FJsonValue> FAnimationHandlers::PopulateBlendspace(const TSharedPtr<F
|
|
|
1128
1135
|
}
|
|
1129
1136
|
}
|
|
1130
1137
|
|
|
1138
|
+
// #710: rebuild BlendSpaceData (Segments/Triangles). Without this the
|
|
1139
|
+
// blendspace is un-triangulated and a BlendSpacePlayer outputs the ref
|
|
1140
|
+
// pose at runtime until the asset is opened in the editor (which calls
|
|
1141
|
+
// ResampleData itself). Bare PostEditChange does NOT rebuild triangulation.
|
|
1142
|
+
BS->ResampleData();
|
|
1143
|
+
BS->ValidateSampleData();
|
|
1144
|
+
|
|
1131
1145
|
BS->PostEditChange();
|
|
1132
1146
|
BS->MarkPackageDirty();
|
|
1133
1147
|
UEditorAssetLibrary::SaveLoadedAsset(BS, /*bOnlyIfIsDirty*/ true);
|
|
@@ -1187,6 +1201,9 @@ TSharedPtr<FJsonValue> FAnimationHandlers::AddBlendSample(const TSharedPtr<FJson
|
|
|
1187
1201
|
TEXT("BlendSpace::AddSample rejected position (%.3f, %.3f) - check axis ranges via read_blendspace."),
|
|
1188
1202
|
PosX, PosY));
|
|
1189
1203
|
}
|
|
1204
|
+
// #710: retriangulate so the sample is usable at runtime without a manual editor open.
|
|
1205
|
+
BlendSpace->ResampleData();
|
|
1206
|
+
BlendSpace->ValidateSampleData();
|
|
1190
1207
|
BlendSpace->PostEditChange();
|
|
1191
1208
|
SaveAssetPackage(BlendSpace);
|
|
1192
1209
|
|
|
@@ -1279,6 +1296,9 @@ TSharedPtr<FJsonValue> FAnimationHandlers::SetBlendSample(const TSharedPtr<FJson
|
|
|
1279
1296
|
return MCPError(TEXT("Nothing to update - provide position {x,y} and/or animation"));
|
|
1280
1297
|
}
|
|
1281
1298
|
|
|
1299
|
+
// #710: retriangulate so the edited sample interpolates at runtime.
|
|
1300
|
+
BlendSpace->ResampleData();
|
|
1301
|
+
BlendSpace->ValidateSampleData();
|
|
1282
1302
|
BlendSpace->PostEditChange();
|
|
1283
1303
|
SaveAssetPackage(BlendSpace);
|
|
1284
1304
|
|
|
@@ -64,6 +64,7 @@ private:
|
|
|
64
64
|
static TSharedPtr<FJsonValue> AddTransition(const TSharedPtr<FJsonObject>& Params);
|
|
65
65
|
static TSharedPtr<FJsonValue> SetStateAnimation(const TSharedPtr<FJsonObject>& Params);
|
|
66
66
|
static TSharedPtr<FJsonValue> SetTransitionBlend(const TSharedPtr<FJsonObject>& Params);
|
|
67
|
+
static TSharedPtr<FJsonValue> SetTransitionCondition(const TSharedPtr<FJsonObject>& Params);
|
|
67
68
|
static TSharedPtr<FJsonValue> ReadStateMachine(const TSharedPtr<FJsonObject>& Params);
|
|
68
69
|
|
|
69
70
|
// AnimGraph inspection (#23 / #91)
|
|
@@ -74,6 +75,11 @@ private:
|
|
|
74
75
|
|
|
75
76
|
// Float curve authoring (#79 / #24)
|
|
76
77
|
static TSharedPtr<FJsonValue> AddCurve(const TSharedPtr<FJsonObject>& Params);
|
|
78
|
+
// #712: set float-curve key VALUES directly (add_curve only names an empty curve).
|
|
79
|
+
static TSharedPtr<FJsonValue> SetAnimCurveKeys(const TSharedPtr<FJsonObject>& Params);
|
|
80
|
+
// #712: instantiate + run a UAnimationModifier subclass on an AnimSequence
|
|
81
|
+
// (e.g. DistanceCurveModifier to bake a Distance curve from root motion).
|
|
82
|
+
static TSharedPtr<FJsonValue> ApplyAnimationModifier(const TSharedPtr<FJsonObject>& Params);
|
|
77
83
|
|
|
78
84
|
// Montage slot & section editing (#78, #27)
|
|
79
85
|
static TSharedPtr<FJsonValue> SetMontageSlot(const TSharedPtr<FJsonObject>& Params);
|
|
@@ -136,6 +142,13 @@ private:
|
|
|
136
142
|
// Drive the MM node's Database from a ChooserTable (runtime database selection).
|
|
137
143
|
static TSharedPtr<FJsonValue> SetMotionMatchingChooser(const TSharedPtr<FJsonObject>& Params);
|
|
138
144
|
|
|
145
|
+
// #713 — distance-matching graph authoring
|
|
146
|
+
// Add a Sequence Evaluator node (explicit-time player distance matching drives).
|
|
147
|
+
static TSharedPtr<FJsonValue> AddSequenceEvaluator(const TSharedPtr<FJsonObject>& Params);
|
|
148
|
+
// Bind a thread-safe anim-node function to a node's OnUpdate/OnBecomeRelevant/
|
|
149
|
+
// OnInitialUpdate (the mechanism distance matching uses to advance the evaluator).
|
|
150
|
+
static TSharedPtr<FJsonValue> BindAnimNodeFunction(const TSharedPtr<FJsonObject>& Params);
|
|
151
|
+
|
|
139
152
|
// #419/#420 — live-actor skeletal reads + rebind + preview (moved from Level)
|
|
140
153
|
static TSharedPtr<FJsonValue> GetBoneTransform(const TSharedPtr<FJsonObject>& Params);
|
|
141
154
|
static TSharedPtr<FJsonValue> ListBones(const TSharedPtr<FJsonObject>& Params);
|
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
#include "AnimGraphNode_MotionMatching.h"
|
|
28
28
|
#include "AnimGraphNode_PoseSearchHistoryCollector.h"
|
|
29
29
|
#include "AnimGraphNode_Root.h"
|
|
30
|
+
#include "AnimGraphNode_SequenceEvaluator.h"
|
|
31
|
+
#include "AnimGraphNode_StateResult.h"
|
|
32
|
+
#include "AnimGraphNode_Base.h"
|
|
33
|
+
#include "Animation/AnimSequenceBase.h"
|
|
34
|
+
#include "Engine/MemberReference.h"
|
|
30
35
|
#include "EdGraph/EdGraph.h"
|
|
31
36
|
#include "EdGraph/EdGraphPin.h"
|
|
32
37
|
#include "Kismet2/KismetEditorUtilities.h"
|
|
@@ -798,3 +803,181 @@ TSharedPtr<FJsonValue> FAnimationHandlers::SetMotionMatchingChooser(const TShare
|
|
|
798
803
|
Res->SetBoolField(TEXT("disabledThreadedUpdate"), bDisabledThreadedUpdate);
|
|
799
804
|
return MCPResult(Res);
|
|
800
805
|
}
|
|
806
|
+
|
|
807
|
+
// ═══ #713 — distance-matching graph authoring ═════════════════════════════
|
|
808
|
+
// Distance matching drives a Sequence Evaluator's explicit time each frame from
|
|
809
|
+
// a thread-safe anim-node function. blueprint(search_node_types) can't surface
|
|
810
|
+
// the evaluator node, and there was no way to bind the update function. These two
|
|
811
|
+
// handlers close both gaps: add_sequence_evaluator drops the node, and
|
|
812
|
+
// bind_anim_node_function binds a UFUNCTION to a node's update slot.
|
|
813
|
+
|
|
814
|
+
// Resolve an AnimGraph (AnimGraph itself or a named state's inner graph) on an
|
|
815
|
+
// AnimBP by name.
|
|
816
|
+
static UEdGraph* FindAnimGraphByName(UAnimBlueprint* AnimBP, const FString& GraphName)
|
|
817
|
+
{
|
|
818
|
+
TArray<UEdGraph*> All;
|
|
819
|
+
AnimBP->GetAllGraphs(All);
|
|
820
|
+
for (UEdGraph* G : All) { if (G && G->GetName() == GraphName) return G; }
|
|
821
|
+
return nullptr;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
// The output pose node of a graph. In the top-level AnimGraph this is a
|
|
825
|
+
// UAnimGraphNode_Root; inside a state's inner graph it is a
|
|
826
|
+
// UAnimGraphNode_StateResult (both derive from UAnimGraphNode_Base and expose a
|
|
827
|
+
// single pose input pin).
|
|
828
|
+
static UAnimGraphNode_Base* FindGraphResultNode(UEdGraph* Graph)
|
|
829
|
+
{
|
|
830
|
+
for (UEdGraphNode* N : Graph->Nodes)
|
|
831
|
+
{
|
|
832
|
+
if (UAnimGraphNode_Root* Root = Cast<UAnimGraphNode_Root>(N)) return Root;
|
|
833
|
+
}
|
|
834
|
+
for (UEdGraphNode* N : Graph->Nodes)
|
|
835
|
+
{
|
|
836
|
+
if (UAnimGraphNode_StateResult* Res = Cast<UAnimGraphNode_StateResult>(N)) return Res;
|
|
837
|
+
}
|
|
838
|
+
return nullptr;
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
TSharedPtr<FJsonValue> FAnimationHandlers::AddSequenceEvaluator(const TSharedPtr<FJsonObject>& Params)
|
|
842
|
+
{
|
|
843
|
+
FString AssetPath;
|
|
844
|
+
if (auto Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), AssetPath)) return Err;
|
|
845
|
+
UAnimBlueprint* AnimBP = LoadAssetByPath<UAnimBlueprint>(AssetPath);
|
|
846
|
+
if (!AnimBP) return MCPError(FString::Printf(TEXT("AnimBlueprint not found: %s"), *AssetPath));
|
|
847
|
+
|
|
848
|
+
// Distance matching usually lives inside a state's graph; pass that state name
|
|
849
|
+
// as graphName. Defaults to the top-level AnimGraph.
|
|
850
|
+
const FString GraphName = OptionalString(Params, TEXT("graphName"), TEXT("AnimGraph"));
|
|
851
|
+
UEdGraph* Graph = FindAnimGraphByName(AnimBP, GraphName);
|
|
852
|
+
if (!Graph) return MCPError(FString::Printf(TEXT("Graph not found: %s"), *GraphName));
|
|
853
|
+
|
|
854
|
+
UAnimSequenceBase* Sequence = nullptr;
|
|
855
|
+
const FString SequencePath = OptionalString(Params, TEXT("sequencePath"));
|
|
856
|
+
if (!SequencePath.IsEmpty())
|
|
857
|
+
{
|
|
858
|
+
Sequence = LoadAssetByPath<UAnimSequenceBase>(SequencePath);
|
|
859
|
+
if (!Sequence) return MCPError(FString::Printf(TEXT("AnimSequence not found: %s"), *SequencePath));
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
UAnimGraphNode_SequenceEvaluator* EvalNode = NewObject<UAnimGraphNode_SequenceEvaluator>(Graph);
|
|
863
|
+
PlaceAnimNode(Graph, EvalNode, 0, 0);
|
|
864
|
+
|
|
865
|
+
UScriptStruct* NodeStruct = nullptr;
|
|
866
|
+
void* NodeData = GetAnimNodeMemory(EvalNode, NodeStruct);
|
|
867
|
+
if (NodeStruct && NodeData)
|
|
868
|
+
{
|
|
869
|
+
if (Sequence) SetNodeObject(NodeStruct, NodeData, TEXT("Sequence"), Sequence);
|
|
870
|
+
double Num = 0.0;
|
|
871
|
+
if (Params->TryGetNumberField(TEXT("explicitTime"), Num)) SetNodeFloat(NodeStruct, NodeData, TEXT("ExplicitTime"), (float)Num);
|
|
872
|
+
bool bFlag = false;
|
|
873
|
+
if (Params->TryGetBoolField(TEXT("shouldLoop"), bFlag)) SetNodeBool(NodeStruct, NodeData, TEXT("bShouldLoop"), bFlag);
|
|
874
|
+
// Distance matching wants time to advance (root motion extraction), so the
|
|
875
|
+
// default here flips the engine default of bTeleportToExplicitTime=true.
|
|
876
|
+
SetNodeBool(NodeStruct, NodeData, TEXT("bTeleportToExplicitTime"),
|
|
877
|
+
OptionalBool(Params, TEXT("teleportToExplicitTime"), false));
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
bool bConnected = false;
|
|
881
|
+
if (OptionalBool(Params, TEXT("connectToOutput"), true))
|
|
882
|
+
{
|
|
883
|
+
if (UAnimGraphNode_Base* Result = FindGraphResultNode(Graph))
|
|
884
|
+
{
|
|
885
|
+
UEdGraphPin* ResultIn = GetPosePin(Result, EGPD_Input);
|
|
886
|
+
UEdGraphPin* NodeOut = GetPosePin(EvalNode, EGPD_Output);
|
|
887
|
+
if (ResultIn && NodeOut) { ResultIn->BreakAllPinLinks(); NodeOut->MakeLinkTo(ResultIn); bConnected = true; }
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
FKismetEditorUtilities::CompileBlueprint(AnimBP);
|
|
892
|
+
SaveAssetPackage(AnimBP);
|
|
893
|
+
|
|
894
|
+
TSharedPtr<FJsonObject> Res = MCPSuccess();
|
|
895
|
+
MCPSetCreated(Res);
|
|
896
|
+
Res->SetStringField(TEXT("assetPath"), AssetPath);
|
|
897
|
+
Res->SetStringField(TEXT("graphName"), GraphName);
|
|
898
|
+
Res->SetStringField(TEXT("nodeGuid"), EvalNode->NodeGuid.ToString());
|
|
899
|
+
Res->SetStringField(TEXT("sequencePath"), Sequence ? Sequence->GetPathName() : FString());
|
|
900
|
+
Res->SetBoolField(TEXT("connectedToOutput"), bConnected);
|
|
901
|
+
return MCPResult(Res);
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
TSharedPtr<FJsonValue> FAnimationHandlers::BindAnimNodeFunction(const TSharedPtr<FJsonObject>& Params)
|
|
905
|
+
{
|
|
906
|
+
FString AssetPath;
|
|
907
|
+
if (auto Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), AssetPath)) return Err;
|
|
908
|
+
UAnimBlueprint* AnimBP = LoadAssetByPath<UAnimBlueprint>(AssetPath);
|
|
909
|
+
if (!AnimBP) return MCPError(FString::Printf(TEXT("AnimBlueprint not found: %s"), *AssetPath));
|
|
910
|
+
|
|
911
|
+
FString FunctionName;
|
|
912
|
+
if (auto Err = RequireStringAlt(Params, TEXT("functionName"), TEXT("function"), FunctionName)) return Err;
|
|
913
|
+
|
|
914
|
+
const FString GraphName = OptionalString(Params, TEXT("graphName"), TEXT("AnimGraph"));
|
|
915
|
+
UEdGraph* Graph = FindAnimGraphByName(AnimBP, GraphName);
|
|
916
|
+
if (!Graph) return MCPError(FString::Printf(TEXT("Graph not found: %s"), *GraphName));
|
|
917
|
+
|
|
918
|
+
// Locate the target node by GUID (from add_sequence_evaluator / add_*_node).
|
|
919
|
+
FString NodeGuidStr;
|
|
920
|
+
if (auto Err = RequireStringAlt(Params, TEXT("nodeGuid"), TEXT("nodeId"), NodeGuidStr)) return Err;
|
|
921
|
+
FGuid NodeGuid;
|
|
922
|
+
if (!FGuid::Parse(NodeGuidStr, NodeGuid)) return MCPError(FString::Printf(TEXT("Invalid nodeGuid: %s"), *NodeGuidStr));
|
|
923
|
+
|
|
924
|
+
UAnimGraphNode_Base* Node = nullptr;
|
|
925
|
+
for (UEdGraphNode* N : Graph->Nodes)
|
|
926
|
+
{
|
|
927
|
+
if (N && N->NodeGuid == NodeGuid) { Node = Cast<UAnimGraphNode_Base>(N); break; }
|
|
928
|
+
}
|
|
929
|
+
if (!Node) return MCPError(FString::Printf(TEXT("Anim graph node with guid %s not found in graph '%s'"), *NodeGuidStr, *GraphName));
|
|
930
|
+
|
|
931
|
+
// Which bindable slot: OnUpdate (default), OnBecomeRelevant, OnInitialUpdate.
|
|
932
|
+
const FString Slot = OptionalString(Params, TEXT("binding"), TEXT("update")).ToLower();
|
|
933
|
+
FMemberReference* Target = nullptr;
|
|
934
|
+
FString SlotResolved;
|
|
935
|
+
if (Slot == TEXT("update") || Slot == TEXT("onupdate")) { Target = &Node->UpdateFunction; SlotResolved = TEXT("update"); }
|
|
936
|
+
else if (Slot == TEXT("becomerelevant") || Slot == TEXT("onbecomerelevant")) { Target = &Node->BecomeRelevantFunction; SlotResolved = TEXT("becomeRelevant"); }
|
|
937
|
+
else if (Slot == TEXT("initialupdate") || Slot == TEXT("oninitialupdate")) { Target = &Node->InitialUpdateFunction; SlotResolved = TEXT("initialUpdate"); }
|
|
938
|
+
else return MCPError(FString::Printf(TEXT("Unknown binding slot '%s' (use 'update', 'becomeRelevant' or 'initialUpdate')"), *Slot));
|
|
939
|
+
|
|
940
|
+
// Verify the function exists on the AnimBP class so the binding resolves at
|
|
941
|
+
// compile time instead of being silently dropped. Skeleton class carries the
|
|
942
|
+
// stubs even before a full compile.
|
|
943
|
+
const FName FuncFName(*FunctionName);
|
|
944
|
+
UFunction* Found = nullptr;
|
|
945
|
+
if (UClass* SkelClass = AnimBP->SkeletonGeneratedClass) Found = SkelClass->FindFunctionByName(FuncFName);
|
|
946
|
+
if (!Found) { if (UClass* GenClass = AnimBP->GeneratedClass) Found = GenClass->FindFunctionByName(FuncFName); }
|
|
947
|
+
if (!Found)
|
|
948
|
+
{
|
|
949
|
+
return MCPError(FString::Printf(TEXT("Function '%s' not found on AnimBlueprint '%s' - create it first (a thread-safe anim-node function)"), *FunctionName, *AnimBP->GetName()));
|
|
950
|
+
}
|
|
951
|
+
// Capture metadata now: CompileBlueprint below regenerates the class and frees
|
|
952
|
+
// this UFunction*, so it must not be dereferenced afterwards.
|
|
953
|
+
const bool bThreadSafe = Found->HasMetaData(TEXT("BlueprintThreadSafe"));
|
|
954
|
+
|
|
955
|
+
Node->Modify();
|
|
956
|
+
Target->SetSelfMember(FuncFName);
|
|
957
|
+
// Mirror to the runtime node so the setting is consistent pre-compile.
|
|
958
|
+
Node->PostEditChange();
|
|
959
|
+
|
|
960
|
+
FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(AnimBP);
|
|
961
|
+
FKismetEditorUtilities::CompileBlueprint(AnimBP);
|
|
962
|
+
SaveAssetPackage(AnimBP);
|
|
963
|
+
|
|
964
|
+
// A bound anim-node function only runs if it is BlueprintThreadSafe with a
|
|
965
|
+
// compatible signature; the compiler rejects it otherwise. Surface that rather
|
|
966
|
+
// than reporting hollow success.
|
|
967
|
+
const bool bCompiled = (AnimBP->Status != EBlueprintStatus::BS_Error);
|
|
968
|
+
|
|
969
|
+
TSharedPtr<FJsonObject> Res = MCPSuccess();
|
|
970
|
+
MCPSetUpdated(Res);
|
|
971
|
+
Res->SetStringField(TEXT("assetPath"), AssetPath);
|
|
972
|
+
Res->SetStringField(TEXT("graphName"), GraphName);
|
|
973
|
+
Res->SetStringField(TEXT("nodeGuid"), NodeGuidStr);
|
|
974
|
+
Res->SetStringField(TEXT("binding"), SlotResolved);
|
|
975
|
+
Res->SetStringField(TEXT("functionName"), FunctionName);
|
|
976
|
+
Res->SetBoolField(TEXT("threadSafe"), bThreadSafe);
|
|
977
|
+
Res->SetBoolField(TEXT("compiled"), bCompiled);
|
|
978
|
+
if (!bThreadSafe || !bCompiled)
|
|
979
|
+
{
|
|
980
|
+
Res->SetStringField(TEXT("warning"), TEXT("bound, but the function must be marked BlueprintThreadSafe with a compatible (FAnimUpdateContext, FAnim...Reference) signature for the binding to run - the compiler rejected it otherwise"));
|
|
981
|
+
}
|
|
982
|
+
return MCPResult(Res);
|
|
983
|
+
}
|
package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp
CHANGED
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
#include "HandlerRegistry.h"
|
|
8
8
|
#include "HandlerUtils.h"
|
|
9
9
|
#include "HandlerAssetCreate.h"
|
|
10
|
+
#include "HandlerJsonProperty.h"
|
|
11
|
+
#include "Curves/RichCurve.h"
|
|
12
|
+
#include "AnimationModifier.h"
|
|
13
|
+
#include "AnimationModifiersAssetUserData.h"
|
|
10
14
|
#include "Animation/AnimSequence.h"
|
|
11
15
|
#include "Animation/AnimSequenceBase.h"
|
|
12
16
|
#include "Animation/AnimComposite.h"
|
|
@@ -765,6 +769,233 @@ TSharedPtr<FJsonValue> FAnimationHandlers::AddCurve(const TSharedPtr<FJsonObject
|
|
|
765
769
|
return MCPResult(Result);
|
|
766
770
|
}
|
|
767
771
|
|
|
772
|
+
// ─── #712 set_anim_curve_keys ───────────────────────────────────────
|
|
773
|
+
// add_curve only creates an empty named curve; it cannot set key VALUES.
|
|
774
|
+
// This adds the curve if missing, then replaces its keys with the provided
|
|
775
|
+
// [{time,value,interp?}] list. Enables authoring distance / speed / any float
|
|
776
|
+
// curve directly, without dropping to an AnimationModifier or Python.
|
|
777
|
+
static ERichCurveInterpMode ParseRichCurveInterp(const FString& S, ERichCurveInterpMode Default)
|
|
778
|
+
{
|
|
779
|
+
const FString L = S.ToLower();
|
|
780
|
+
if (L == TEXT("constant") || L == TEXT("step")) return RCIM_Constant;
|
|
781
|
+
if (L == TEXT("linear")) return RCIM_Linear;
|
|
782
|
+
if (L == TEXT("cubic") || L == TEXT("auto")) return RCIM_Cubic;
|
|
783
|
+
return Default;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
TSharedPtr<FJsonValue> FAnimationHandlers::SetAnimCurveKeys(const TSharedPtr<FJsonObject>& Params)
|
|
787
|
+
{
|
|
788
|
+
FString AssetPath;
|
|
789
|
+
if (auto Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), AssetPath)) return Err;
|
|
790
|
+
FString CurveName;
|
|
791
|
+
if (auto Err = RequireString(Params, TEXT("curveName"), CurveName)) return Err;
|
|
792
|
+
|
|
793
|
+
const TArray<TSharedPtr<FJsonValue>>* KeysArr = nullptr;
|
|
794
|
+
if (!Params->TryGetArrayField(TEXT("keys"), KeysArr) || !KeysArr)
|
|
795
|
+
{
|
|
796
|
+
return MCPError(TEXT("Missing 'keys' array parameter (each entry: {time, value, interp?})"));
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
UAnimSequence* Seq = Cast<UAnimSequence>(UEditorAssetLibrary::LoadAsset(AssetPath));
|
|
800
|
+
if (!Seq) return MCPError(FString::Printf(TEXT("AnimSequence not found: %s"), *AssetPath));
|
|
801
|
+
if (!Seq->GetSkeleton()) return MCPError(TEXT("AnimSequence has no Skeleton"));
|
|
802
|
+
|
|
803
|
+
const ERichCurveInterpMode DefaultInterp = ParseRichCurveInterp(
|
|
804
|
+
OptionalString(Params, TEXT("interpolation"), TEXT("linear")), RCIM_Linear);
|
|
805
|
+
|
|
806
|
+
TArray<FRichCurveKey> Keys;
|
|
807
|
+
Keys.Reserve(KeysArr->Num());
|
|
808
|
+
for (const TSharedPtr<FJsonValue>& V : *KeysArr)
|
|
809
|
+
{
|
|
810
|
+
const TSharedPtr<FJsonObject>* KObj = nullptr;
|
|
811
|
+
if (!V.IsValid() || !V->TryGetObject(KObj) || !KObj || !(*KObj).IsValid()) continue;
|
|
812
|
+
double Time = 0.0, Val = 0.0;
|
|
813
|
+
if (!(*KObj)->TryGetNumberField(TEXT("time"), Time)) continue;
|
|
814
|
+
if (!(*KObj)->TryGetNumberField(TEXT("value"), Val)) continue;
|
|
815
|
+
FRichCurveKey Key((float)Time, (float)Val);
|
|
816
|
+
FString KInterp;
|
|
817
|
+
Key.InterpMode = (*KObj)->TryGetStringField(TEXT("interp"), KInterp)
|
|
818
|
+
? ParseRichCurveInterp(KInterp, DefaultInterp) : DefaultInterp;
|
|
819
|
+
Keys.Add(Key);
|
|
820
|
+
}
|
|
821
|
+
if (Keys.Num() == 0)
|
|
822
|
+
{
|
|
823
|
+
return MCPError(TEXT("No valid keys parsed from 'keys' (each entry needs numeric time+value)"));
|
|
824
|
+
}
|
|
825
|
+
// Keep keys time-ordered so the curve evaluates predictably.
|
|
826
|
+
Keys.Sort([](const FRichCurveKey& A, const FRichCurveKey& B) { return A.Time < B.Time; });
|
|
827
|
+
|
|
828
|
+
const FAnimationCurveIdentifier CurveId(FName(*CurveName), ERawCurveTrackTypes::RCT_Float);
|
|
829
|
+
|
|
830
|
+
IAnimationDataController& Controller = Seq->GetController();
|
|
831
|
+
Controller.OpenBracket(NSLOCTEXT("MCP", "SetAnimCurveKeys", "MCP Set Anim Curve Keys"));
|
|
832
|
+
|
|
833
|
+
const bool bAdded = Controller.AddCurve(CurveId, AACF_DefaultCurve);
|
|
834
|
+
const bool bSet = Controller.SetCurveKeys(CurveId, Keys);
|
|
835
|
+
|
|
836
|
+
Controller.CloseBracket();
|
|
837
|
+
|
|
838
|
+
if (!bSet)
|
|
839
|
+
{
|
|
840
|
+
return MCPError(FString::Printf(TEXT("Failed to set keys on curve '%s'"), *CurveName));
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
Seq->MarkPackageDirty();
|
|
844
|
+
UEditorAssetLibrary::SaveLoadedAsset(Seq, /*bOnlyIfIsDirty=*/false);
|
|
845
|
+
|
|
846
|
+
auto Result = MCPSuccess();
|
|
847
|
+
MCPSetUpdated(Result);
|
|
848
|
+
Result->SetStringField(TEXT("assetPath"), AssetPath);
|
|
849
|
+
Result->SetStringField(TEXT("curveName"), CurveName);
|
|
850
|
+
Result->SetBoolField(TEXT("curveCreated"), bAdded);
|
|
851
|
+
Result->SetNumberField(TEXT("keyCount"), Keys.Num());
|
|
852
|
+
return MCPResult(Result);
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
// ─── #712 apply_animation_modifier ──────────────────────────────────
|
|
856
|
+
// Instantiate a UAnimationModifier subclass and run it on an AnimSequence.
|
|
857
|
+
// The headline case is DistanceCurveModifier (bakes a Distance curve from root
|
|
858
|
+
// motion for distance matching), but any modifier class works. The concrete
|
|
859
|
+
// modifier class is resolved by name at runtime so the plugin providing it does
|
|
860
|
+
// not have to be a link-time dependency; if it can't be found we tell the caller
|
|
861
|
+
// which plugin to enable rather than failing opaquely.
|
|
862
|
+
static UClass* ResolveAnimationModifierClass(const FString& NameOrPath, UClass* BaseClass, FString& OutHint)
|
|
863
|
+
{
|
|
864
|
+
// Explicit object/class path.
|
|
865
|
+
if (NameOrPath.Contains(TEXT("/")) || NameOrPath.Contains(TEXT(".")))
|
|
866
|
+
{
|
|
867
|
+
if (UClass* C = LoadClass<UObject>(nullptr, *NameOrPath)) return C;
|
|
868
|
+
const FString WithSuffix = NameOrPath.EndsWith(TEXT("_C")) ? NameOrPath : NameOrPath + TEXT("_C");
|
|
869
|
+
if (UClass* C = LoadClass<UObject>(nullptr, *WithSuffix)) return C;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// Bare class name (tolerate a leading 'U').
|
|
873
|
+
FString Short = NameOrPath;
|
|
874
|
+
Short.RemoveFromStart(TEXT("U"));
|
|
875
|
+
|
|
876
|
+
// Script packages that ship stock modifiers. DistanceCurveModifier lives in the
|
|
877
|
+
// AnimationLocomotionLibrary plugin (module AnimationLocomotionLibraryEditor),
|
|
878
|
+
// which is NOT enabled by default.
|
|
879
|
+
static const TCHAR* ScriptPackages[] = {
|
|
880
|
+
TEXT("/Script/AnimationLocomotionLibraryEditor."),
|
|
881
|
+
TEXT("/Script/AnimationModifierLibrary."),
|
|
882
|
+
TEXT("/Script/AnimationModifiers."),
|
|
883
|
+
};
|
|
884
|
+
for (const TCHAR* Pkg : ScriptPackages)
|
|
885
|
+
{
|
|
886
|
+
if (UClass* C = FindObject<UClass>(nullptr, *(FString(Pkg) + Short))) return C;
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
// Global fallback: any loaded UClass with this name.
|
|
890
|
+
if (UClass* C = FindFirstObject<UClass>(*Short, EFindFirstObjectOptions::NativeFirst)) return C;
|
|
891
|
+
|
|
892
|
+
if (Short.Equals(TEXT("DistanceCurveModifier"), ESearchCase::IgnoreCase))
|
|
893
|
+
{
|
|
894
|
+
OutHint = TEXT(" - enable the 'Animation Locomotion Library' plugin (it is off by default) and restart the editor");
|
|
895
|
+
}
|
|
896
|
+
return nullptr;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
TSharedPtr<FJsonValue> FAnimationHandlers::ApplyAnimationModifier(const TSharedPtr<FJsonObject>& Params)
|
|
900
|
+
{
|
|
901
|
+
FString AssetPath;
|
|
902
|
+
if (auto Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), AssetPath)) return Err;
|
|
903
|
+
FString ModifierClassName;
|
|
904
|
+
if (auto Err = RequireStringAlt(Params, TEXT("modifierClass"), TEXT("modifier"), ModifierClassName)) return Err;
|
|
905
|
+
|
|
906
|
+
UAnimSequence* Seq = Cast<UAnimSequence>(UEditorAssetLibrary::LoadAsset(AssetPath));
|
|
907
|
+
if (!Seq) return MCPError(FString::Printf(TEXT("AnimSequence not found: %s"), *AssetPath));
|
|
908
|
+
|
|
909
|
+
FString Hint;
|
|
910
|
+
UClass* ModClass = ResolveAnimationModifierClass(ModifierClassName, UAnimationModifier::StaticClass(), Hint);
|
|
911
|
+
if (!ModClass)
|
|
912
|
+
{
|
|
913
|
+
return MCPError(FString::Printf(TEXT("Animation modifier class not found: '%s'%s"), *ModifierClassName, *Hint));
|
|
914
|
+
}
|
|
915
|
+
if (!ModClass->IsChildOf(UAnimationModifier::StaticClass()))
|
|
916
|
+
{
|
|
917
|
+
return MCPError(FString::Printf(TEXT("'%s' is not a UAnimationModifier subclass"), *ModClass->GetName()));
|
|
918
|
+
}
|
|
919
|
+
if (ModClass->HasAnyClassFlags(CLASS_Abstract))
|
|
920
|
+
{
|
|
921
|
+
return MCPError(FString::Printf(TEXT("'%s' is abstract and cannot be applied"), *ModClass->GetName()));
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
// Register the modifier on the sequence (creating the asset-user-data + instance
|
|
925
|
+
// if needed) so it shows up in list_anim_modifiers and re-applies on reimport.
|
|
926
|
+
// Reuse an existing instance of the same class for idempotent replay.
|
|
927
|
+
UAnimationModifiersAssetUserData* UserData = Seq->GetAssetUserData<UAnimationModifiersAssetUserData>();
|
|
928
|
+
UAnimationModifier* Instance = nullptr;
|
|
929
|
+
if (UserData)
|
|
930
|
+
{
|
|
931
|
+
for (UAnimationModifier* M : UserData->GetAnimationModifierInstances())
|
|
932
|
+
{
|
|
933
|
+
if (M && M->GetClass() == ModClass) { Instance = M; break; }
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
bool bRegistered = false;
|
|
937
|
+
if (!Instance)
|
|
938
|
+
{
|
|
939
|
+
UAnimationModifiersAssetUserData::AddAnimationModifierOfClass(Seq, ModClass);
|
|
940
|
+
bRegistered = true;
|
|
941
|
+
UserData = Seq->GetAssetUserData<UAnimationModifiersAssetUserData>();
|
|
942
|
+
if (UserData)
|
|
943
|
+
{
|
|
944
|
+
for (UAnimationModifier* M : UserData->GetAnimationModifierInstances())
|
|
945
|
+
{
|
|
946
|
+
if (M && M->GetClass() == ModClass) { Instance = M; }
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
if (!Instance)
|
|
951
|
+
{
|
|
952
|
+
// Fall back to a transient instance so the bake still happens even if the
|
|
953
|
+
// user-data registration path is unavailable.
|
|
954
|
+
Instance = NewObject<UAnimationModifier>(Seq, ModClass);
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
// Apply caller-provided settings (CurveName, Axis, SampleRate, ...).
|
|
958
|
+
TArray<FString> AppliedProps;
|
|
959
|
+
const TSharedPtr<FJsonObject>* PropsObj = nullptr;
|
|
960
|
+
if (Params->TryGetObjectField(TEXT("props"), PropsObj) && PropsObj && (*PropsObj).IsValid())
|
|
961
|
+
{
|
|
962
|
+
Instance->Modify();
|
|
963
|
+
for (const auto& Pair : (*PropsObj)->Values)
|
|
964
|
+
{
|
|
965
|
+
const FString PropName(*Pair.Key);
|
|
966
|
+
FProperty* Prop = ModClass->FindPropertyByName(FName(*PropName));
|
|
967
|
+
if (!Prop)
|
|
968
|
+
{
|
|
969
|
+
return MCPError(FString::Printf(TEXT("Modifier '%s' has no property '%s'"), *ModClass->GetName(), *PropName));
|
|
970
|
+
}
|
|
971
|
+
void* Addr = Prop->ContainerPtrToValuePtr<void>(Instance);
|
|
972
|
+
FString E;
|
|
973
|
+
if (!MCPJsonProperty::SetJsonOnProperty(Prop, Addr, Pair.Value, E))
|
|
974
|
+
{
|
|
975
|
+
return MCPError(FString::Printf(TEXT("Failed to set '%s': %s"), *PropName, *E));
|
|
976
|
+
}
|
|
977
|
+
AppliedProps.Add(PropName);
|
|
978
|
+
}
|
|
979
|
+
Instance->PostEditChange();
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
// Bake. ApplyToAnimationSequence reverts any prior application then runs OnApply.
|
|
983
|
+
Instance->ApplyToAnimationSequence(Seq);
|
|
984
|
+
|
|
985
|
+
Seq->MarkPackageDirty();
|
|
986
|
+
UEditorAssetLibrary::SaveLoadedAsset(Seq, /*bOnlyIfIsDirty=*/false);
|
|
987
|
+
|
|
988
|
+
auto Result = MCPSuccess();
|
|
989
|
+
MCPSetUpdated(Result);
|
|
990
|
+
Result->SetStringField(TEXT("assetPath"), AssetPath);
|
|
991
|
+
Result->SetStringField(TEXT("modifierClass"), ModClass->GetName());
|
|
992
|
+
Result->SetBoolField(TEXT("registered"), bRegistered);
|
|
993
|
+
TArray<TSharedPtr<FJsonValue>> PropArr;
|
|
994
|
+
for (const FString& P : AppliedProps) PropArr.Add(MakeShared<FJsonValueString>(P));
|
|
995
|
+
Result->SetArrayField(TEXT("appliedProps"), PropArr);
|
|
996
|
+
return MCPResult(Result);
|
|
997
|
+
}
|
|
998
|
+
|
|
768
999
|
// ─── #78 set_montage_slot ──────────────────────────────────────────
|
|
769
1000
|
|
|
770
1001
|
|
|
@@ -802,9 +1033,29 @@ TSharedPtr<FJsonValue> FAnimationHandlers::ListAnimModifiers(const TSharedPtr<FJ
|
|
|
802
1033
|
if (!Seq) return MCPError(FString::Printf(TEXT("AnimSequence not found: %s"), *AssetPath));
|
|
803
1034
|
|
|
804
1035
|
TArray<TSharedPtr<FJsonValue>> Arr;
|
|
1036
|
+
TSet<UObject*> Seen;
|
|
1037
|
+
auto AddModifier = [&Arr, &Seen](UObject* Modifier)
|
|
1038
|
+
{
|
|
1039
|
+
if (!Modifier || Seen.Contains(Modifier)) return;
|
|
1040
|
+
Seen.Add(Modifier);
|
|
1041
|
+
TSharedPtr<FJsonObject> M = MakeShared<FJsonObject>();
|
|
1042
|
+
M->SetStringField(TEXT("class"), Modifier->GetClass()->GetName());
|
|
1043
|
+
M->SetStringField(TEXT("classPath"), Modifier->GetClass()->GetPathName());
|
|
1044
|
+
M->SetStringField(TEXT("name"), Modifier->GetName());
|
|
1045
|
+
Arr.Add(MakeShared<FJsonValueObject>(M));
|
|
1046
|
+
};
|
|
1047
|
+
|
|
1048
|
+
// The modern store is UAnimationModifiersAssetUserData::AnimationModifierInstances -
|
|
1049
|
+
// what the Animation Data Modifiers window shows and what apply_animation_modifier
|
|
1050
|
+
// registers into (#712).
|
|
1051
|
+
if (UAnimationModifiersAssetUserData* UserData = Seq->GetAssetUserData<UAnimationModifiersAssetUserData>())
|
|
1052
|
+
{
|
|
1053
|
+
for (UAnimationModifier* M : UserData->GetAnimationModifierInstances()) AddModifier(M);
|
|
1054
|
+
}
|
|
1055
|
+
|
|
805
1056
|
// AppliedAnimationModifiers is an editor-only TArray<UAnimationModifier*> on the
|
|
806
|
-
// AnimSequence. Enumerate it via reflection (portable across module
|
|
807
|
-
// each element is an instanced UAnimationModifier subobject.
|
|
1057
|
+
// AnimSequence (legacy store). Enumerate it via reflection (portable across module
|
|
1058
|
+
// linkage): each element is an instanced UAnimationModifier subobject.
|
|
808
1059
|
FArrayProperty* ModifiersProp = CastField<FArrayProperty>(
|
|
809
1060
|
Seq->GetClass()->FindPropertyByName(TEXT("AppliedAnimationModifiers")));
|
|
810
1061
|
if (ModifiersProp)
|
|
@@ -814,12 +1065,7 @@ TSharedPtr<FJsonValue> FAnimationHandlers::ListAnimModifiers(const TSharedPtr<FJ
|
|
|
814
1065
|
for (int32 i = 0; i < Helper.Num(); ++i)
|
|
815
1066
|
{
|
|
816
1067
|
UObject* Modifier = ElemProp ? ElemProp->GetObjectPropertyValue(Helper.GetRawPtr(i)) : nullptr;
|
|
817
|
-
|
|
818
|
-
TSharedPtr<FJsonObject> M = MakeShared<FJsonObject>();
|
|
819
|
-
M->SetStringField(TEXT("class"), Modifier->GetClass()->GetName());
|
|
820
|
-
M->SetStringField(TEXT("classPath"), Modifier->GetClass()->GetPathName());
|
|
821
|
-
M->SetStringField(TEXT("name"), Modifier->GetName());
|
|
822
|
-
Arr.Add(MakeShared<FJsonValueObject>(M));
|
|
1068
|
+
AddModifier(Modifier);
|
|
823
1069
|
}
|
|
824
1070
|
}
|
|
825
1071
|
|
|
@@ -24,6 +24,11 @@
|
|
|
24
24
|
#include "AnimationTransitionGraph.h"
|
|
25
25
|
#include "AnimStateNode.h"
|
|
26
26
|
#include "AnimStateTransitionNode.h"
|
|
27
|
+
#include "AnimGraphNode_TransitionResult.h"
|
|
28
|
+
#include "K2Node_VariableGet.h"
|
|
29
|
+
#include "K2Node_CallFunction.h"
|
|
30
|
+
#include "EdGraphSchema_K2.h"
|
|
31
|
+
#include "Kismet/KismetMathLibrary.h"
|
|
27
32
|
#include "RetargetEditor/IKRetargeterController.h"
|
|
28
33
|
#include "RetargetEditor/IKRetargetBatchOperation.h"
|
|
29
34
|
#include "Retargeter/IKRetargeter.h"
|
|
@@ -711,6 +716,216 @@ TSharedPtr<FJsonValue> FAnimationHandlers::SetTransitionBlend(const TSharedPtr<F
|
|
|
711
716
|
}
|
|
712
717
|
|
|
713
718
|
|
|
719
|
+
// Locate a transition node in a state machine graph by transitionGuid (preferred,
|
|
720
|
+
// unambiguous) or by fromState+toState endpoints. Returns nullptr if none match.
|
|
721
|
+
static UAnimStateTransitionNode* FindTransitionNode(
|
|
722
|
+
UAnimationStateMachineGraph* SMGraph,
|
|
723
|
+
const FString& TransitionGuid,
|
|
724
|
+
const FString& FromState,
|
|
725
|
+
const FString& ToState)
|
|
726
|
+
{
|
|
727
|
+
for (UEdGraphNode* Node : SMGraph->Nodes)
|
|
728
|
+
{
|
|
729
|
+
UAnimStateTransitionNode* T = Cast<UAnimStateTransitionNode>(Node);
|
|
730
|
+
if (!T) continue;
|
|
731
|
+
|
|
732
|
+
if (!TransitionGuid.IsEmpty())
|
|
733
|
+
{
|
|
734
|
+
if (T->NodeGuid.ToString() == TransitionGuid) return T;
|
|
735
|
+
continue;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
UAnimStateNode* Prev = Cast<UAnimStateNode>(T->GetPreviousState());
|
|
739
|
+
UAnimStateNode* Next = Cast<UAnimStateNode>(T->GetNextState());
|
|
740
|
+
if (Prev && Next && Prev->GetStateName() == FromState && Next->GetStateName() == ToState)
|
|
741
|
+
{
|
|
742
|
+
return T;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
return nullptr;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// #707: author a transition's "can enter transition" condition from a bool
|
|
749
|
+
// variable. Every transition's rule graph is named "Transition", so the generic
|
|
750
|
+
// blueprint(read_graph/add_node/connect_pins) tools (which address by graphName)
|
|
751
|
+
// can only ever reach the first one. This native setter addresses the transition
|
|
752
|
+
// by transitionGuid or fromState+toState, then wires a bool VariableGet (optionally
|
|
753
|
+
// negated) into the TransitionResult node's bCanEnterTransition pin.
|
|
754
|
+
TSharedPtr<FJsonValue> FAnimationHandlers::SetTransitionCondition(const TSharedPtr<FJsonObject>& Params)
|
|
755
|
+
{
|
|
756
|
+
FString AssetPath;
|
|
757
|
+
if (auto Err = RequireStringAlt(Params, TEXT("assetPath"), TEXT("path"), AssetPath)) return Err;
|
|
758
|
+
|
|
759
|
+
FString SMName;
|
|
760
|
+
if (auto Err = RequireString(Params, TEXT("stateMachineName"), SMName)) return Err;
|
|
761
|
+
|
|
762
|
+
FString VariableName;
|
|
763
|
+
if (auto Err = RequireString(Params, TEXT("variableName"), VariableName)) return Err;
|
|
764
|
+
|
|
765
|
+
// Selector: transitionGuid is unambiguous; fromState+toState is the fallback.
|
|
766
|
+
const FString TransitionGuid = OptionalString(Params, TEXT("transitionGuid"), TEXT(""));
|
|
767
|
+
const FString FromState = OptionalString(Params, TEXT("fromState"), TEXT(""));
|
|
768
|
+
const FString ToState = OptionalString(Params, TEXT("toState"), TEXT(""));
|
|
769
|
+
if (TransitionGuid.IsEmpty() && (FromState.IsEmpty() || ToState.IsEmpty()))
|
|
770
|
+
{
|
|
771
|
+
return MCPError(TEXT("Provide transitionGuid, or both fromState and toState, to identify the transition."));
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
const bool bNegate = OptionalBool(Params, TEXT("negate"), false);
|
|
775
|
+
|
|
776
|
+
UAnimBlueprint* AnimBP = LoadAnimBP(AssetPath);
|
|
777
|
+
if (!AnimBP)
|
|
778
|
+
{
|
|
779
|
+
return MCPError(FString::Printf(TEXT("AnimBlueprint not found: %s"), *AssetPath));
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
UAnimGraphNode_StateMachine* SMNode = FindStateMachineNode(AnimBP, SMName);
|
|
783
|
+
if (!SMNode)
|
|
784
|
+
{
|
|
785
|
+
return MCPError(FString::Printf(TEXT("State machine '%s' not found"), *SMName));
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
UAnimationStateMachineGraph* SMGraph = Cast<UAnimationStateMachineGraph>(SMNode->EditorStateMachineGraph);
|
|
789
|
+
if (!SMGraph)
|
|
790
|
+
{
|
|
791
|
+
return MCPError(TEXT("State machine has no editor graph"));
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
UAnimStateTransitionNode* TransNode = FindTransitionNode(SMGraph, TransitionGuid, FromState, ToState);
|
|
795
|
+
if (!TransNode)
|
|
796
|
+
{
|
|
797
|
+
if (!TransitionGuid.IsEmpty())
|
|
798
|
+
return MCPError(FString::Printf(TEXT("No transition with transitionGuid '%s'"), *TransitionGuid));
|
|
799
|
+
return MCPError(FString::Printf(TEXT("No transition from '%s' to '%s'"), *FromState, *ToState));
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// Validate the variable exists on the AnimBP and is a bool.
|
|
803
|
+
UClass* VarOwnerClass = AnimBP->SkeletonGeneratedClass ? AnimBP->SkeletonGeneratedClass : AnimBP->GeneratedClass;
|
|
804
|
+
if (VarOwnerClass && !CastField<FBoolProperty>(VarOwnerClass->FindPropertyByName(FName(*VariableName))))
|
|
805
|
+
{
|
|
806
|
+
return MCPError(FString::Printf(
|
|
807
|
+
TEXT("Variable '%s' not found on the AnimBlueprint or is not a bool. Create a bool variable first (blueprint(add_variable))."),
|
|
808
|
+
*VariableName));
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
UAnimationTransitionGraph* TransGraph = Cast<UAnimationTransitionGraph>(TransNode->BoundGraph);
|
|
812
|
+
if (!TransGraph)
|
|
813
|
+
{
|
|
814
|
+
return MCPError(TEXT("Transition has no rule graph (BoundGraph)."));
|
|
815
|
+
}
|
|
816
|
+
UAnimGraphNode_TransitionResult* ResultNode = TransGraph->GetResultNode();
|
|
817
|
+
if (!ResultNode)
|
|
818
|
+
{
|
|
819
|
+
return MCPError(TEXT("Transition rule graph has no result node."));
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
// The result node exposes the bool condition as an input data pin
|
|
823
|
+
// ("bCanEnterTransition"). Fall back to the first bool input pin.
|
|
824
|
+
UEdGraphPin* ResultPin = nullptr;
|
|
825
|
+
for (UEdGraphPin* Pin : ResultNode->Pins)
|
|
826
|
+
{
|
|
827
|
+
if (!Pin || Pin->Direction != EGPD_Input) continue;
|
|
828
|
+
if (Pin->PinName == TEXT("bCanEnterTransition")) { ResultPin = Pin; break; }
|
|
829
|
+
if (!ResultPin && Pin->PinType.PinCategory == UEdGraphSchema_K2::PC_Boolean) ResultPin = Pin;
|
|
830
|
+
}
|
|
831
|
+
if (!ResultPin)
|
|
832
|
+
{
|
|
833
|
+
return MCPError(TEXT("Could not find the bCanEnterTransition pin on the transition result node."));
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
// Idempotency: wipe any previously authored condition nodes so re-running
|
|
837
|
+
// replaces the condition instead of stacking orphan nodes. The default rule
|
|
838
|
+
// graph contains only the result node; anything else was authored by us.
|
|
839
|
+
{
|
|
840
|
+
TArray<UEdGraphNode*> ToRemove;
|
|
841
|
+
for (UEdGraphNode* Node : TransGraph->Nodes)
|
|
842
|
+
{
|
|
843
|
+
if (Node && Node != ResultNode) ToRemove.Add(Node);
|
|
844
|
+
}
|
|
845
|
+
for (UEdGraphNode* Node : ToRemove)
|
|
846
|
+
{
|
|
847
|
+
TransGraph->RemoveNode(Node);
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
ResultPin->BreakAllPinLinks();
|
|
851
|
+
|
|
852
|
+
// Author: VariableGet(bool) -> [optional NOT] -> bCanEnterTransition.
|
|
853
|
+
UK2Node_VariableGet* GetNode = NewObject<UK2Node_VariableGet>(TransGraph);
|
|
854
|
+
TransGraph->AddNode(GetNode, false, false);
|
|
855
|
+
GetNode->VariableReference.SetSelfMember(FName(*VariableName));
|
|
856
|
+
GetNode->CreateNewGuid();
|
|
857
|
+
GetNode->PostPlacedNewNode();
|
|
858
|
+
GetNode->AllocateDefaultPins();
|
|
859
|
+
GetNode->NodePosX = ResultNode->NodePosX - 400;
|
|
860
|
+
GetNode->NodePosY = ResultNode->NodePosY;
|
|
861
|
+
|
|
862
|
+
UEdGraphPin* VarOutPin = nullptr;
|
|
863
|
+
for (UEdGraphPin* Pin : GetNode->Pins)
|
|
864
|
+
{
|
|
865
|
+
if (Pin && Pin->Direction == EGPD_Output && Pin->PinType.PinCategory == UEdGraphSchema_K2::PC_Boolean)
|
|
866
|
+
{
|
|
867
|
+
VarOutPin = Pin;
|
|
868
|
+
break;
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
if (!VarOutPin)
|
|
872
|
+
{
|
|
873
|
+
TransGraph->RemoveNode(GetNode);
|
|
874
|
+
return MCPError(FString::Printf(
|
|
875
|
+
TEXT("VariableGet for '%s' produced no bool output pin - is the variable a bool?"), *VariableName));
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
UEdGraphPin* SourcePin = VarOutPin;
|
|
879
|
+
if (bNegate)
|
|
880
|
+
{
|
|
881
|
+
UFunction* NotFunc = UKismetMathLibrary::StaticClass()->FindFunctionByName(FName(TEXT("Not_PreBool")));
|
|
882
|
+
if (NotFunc)
|
|
883
|
+
{
|
|
884
|
+
UK2Node_CallFunction* NotNode = NewObject<UK2Node_CallFunction>(TransGraph);
|
|
885
|
+
TransGraph->AddNode(NotNode, false, false);
|
|
886
|
+
NotNode->SetFromFunction(NotFunc);
|
|
887
|
+
NotNode->CreateNewGuid();
|
|
888
|
+
NotNode->PostPlacedNewNode();
|
|
889
|
+
NotNode->AllocateDefaultPins();
|
|
890
|
+
NotNode->NodePosX = ResultNode->NodePosX - 200;
|
|
891
|
+
NotNode->NodePosY = ResultNode->NodePosY;
|
|
892
|
+
|
|
893
|
+
UEdGraphPin* NotIn = nullptr;
|
|
894
|
+
UEdGraphPin* NotOut = nullptr;
|
|
895
|
+
for (UEdGraphPin* Pin : NotNode->Pins)
|
|
896
|
+
{
|
|
897
|
+
if (!Pin || Pin->PinType.PinCategory != UEdGraphSchema_K2::PC_Boolean) continue;
|
|
898
|
+
if (Pin->Direction == EGPD_Input) NotIn = Pin;
|
|
899
|
+
else if (Pin->Direction == EGPD_Output) NotOut = Pin;
|
|
900
|
+
}
|
|
901
|
+
if (NotIn && NotOut)
|
|
902
|
+
{
|
|
903
|
+
VarOutPin->MakeLinkTo(NotIn);
|
|
904
|
+
SourcePin = NotOut;
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
SourcePin->MakeLinkTo(ResultPin);
|
|
910
|
+
TransGraph->NotifyGraphChanged();
|
|
911
|
+
|
|
912
|
+
CompileAndSave(AnimBP);
|
|
913
|
+
|
|
914
|
+
auto Result = MCPSuccess();
|
|
915
|
+
MCPSetUpdated(Result);
|
|
916
|
+
Result->SetStringField(TEXT("assetPath"), AssetPath);
|
|
917
|
+
Result->SetStringField(TEXT("stateMachineName"), SMName);
|
|
918
|
+
Result->SetStringField(TEXT("transitionGuid"), TransNode->NodeGuid.ToString());
|
|
919
|
+
if (UAnimStateNode* Prev = Cast<UAnimStateNode>(TransNode->GetPreviousState()))
|
|
920
|
+
Result->SetStringField(TEXT("fromState"), Prev->GetStateName());
|
|
921
|
+
if (UAnimStateNode* Next = Cast<UAnimStateNode>(TransNode->GetNextState()))
|
|
922
|
+
Result->SetStringField(TEXT("toState"), Next->GetStateName());
|
|
923
|
+
Result->SetStringField(TEXT("variableName"), VariableName);
|
|
924
|
+
Result->SetBoolField(TEXT("negate"), bNegate);
|
|
925
|
+
return MCPResult(Result);
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
|
|
714
929
|
TSharedPtr<FJsonValue> FAnimationHandlers::ReadStateMachine(const TSharedPtr<FJsonObject>& Params)
|
|
715
930
|
{
|
|
716
931
|
FString AssetPath;
|
|
@@ -2060,13 +2060,13 @@ TSharedPtr<FJsonValue> FGameplayHandlers::GetNavmeshDetails(const TSharedPtr<FJs
|
|
|
2060
2060
|
if (RecastNav) break;
|
|
2061
2061
|
}
|
|
2062
2062
|
|
|
2063
|
-
// Fallback:
|
|
2063
|
+
// Fallback: grab the first ARecastNavMesh in the world
|
|
2064
2064
|
if (!RecastNav)
|
|
2065
2065
|
{
|
|
2066
|
-
|
|
2066
|
+
TActorIterator<ARecastNavMesh> It(World);
|
|
2067
|
+
if (It)
|
|
2067
2068
|
{
|
|
2068
2069
|
RecastNav = *It;
|
|
2069
|
-
break;
|
|
2070
2070
|
}
|
|
2071
2071
|
}
|
|
2072
2072
|
|