mcpforunityserver 9.3.0__py3-none-any.whl → 9.3.0b20260128055651__py3-none-any.whl
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.
- cli/commands/editor.py +27 -1
- cli/commands/prefab.py +134 -12
- cli/commands/texture.py +538 -0
- cli/commands/tool.py +61 -0
- cli/commands/vfx.py +51 -15
- cli/main.py +33 -0
- cli/utils/connection.py +37 -0
- cli/utils/suggestions.py +34 -0
- main.py +125 -6
- {mcpforunityserver-9.3.0.dist-info → mcpforunityserver-9.3.0b20260128055651.dist-info}/METADATA +2 -2
- {mcpforunityserver-9.3.0.dist-info → mcpforunityserver-9.3.0b20260128055651.dist-info}/RECORD +22 -17
- services/resources/prefab.py +191 -0
- services/tools/manage_components.py +1 -1
- services/tools/manage_gameobject.py +43 -23
- services/tools/manage_material.py +2 -2
- services/tools/manage_prefabs.py +128 -31
- services/tools/manage_texture.py +667 -0
- services/tools/manage_vfx.py +15 -633
- {mcpforunityserver-9.3.0.dist-info → mcpforunityserver-9.3.0b20260128055651.dist-info}/WHEEL +0 -0
- {mcpforunityserver-9.3.0.dist-info → mcpforunityserver-9.3.0b20260128055651.dist-info}/entry_points.txt +0 -0
- {mcpforunityserver-9.3.0.dist-info → mcpforunityserver-9.3.0b20260128055651.dist-info}/licenses/LICENSE +0 -0
- {mcpforunityserver-9.3.0.dist-info → mcpforunityserver-9.3.0b20260128055651.dist-info}/top_level.txt +0 -0
services/tools/manage_vfx.py
CHANGED
|
@@ -39,86 +39,15 @@ TRAIL_ACTIONS = [
|
|
|
39
39
|
"trail_set_material", "trail_set_properties", "trail_clear", "trail_emit"
|
|
40
40
|
]
|
|
41
41
|
|
|
42
|
-
ALL_ACTIONS = ["ping"] + PARTICLE_ACTIONS +
|
|
43
|
-
VFX_ACTIONS + LINE_ACTIONS + TRAIL_ACTIONS
|
|
42
|
+
ALL_ACTIONS = ["ping"] + PARTICLE_ACTIONS + VFX_ACTIONS + LINE_ACTIONS + TRAIL_ACTIONS
|
|
44
43
|
|
|
45
44
|
|
|
46
45
|
@mcp_for_unity_tool(
|
|
47
|
-
description=
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
- `
|
|
51
|
-
|
|
52
|
-
- `line_*` actions require **LineRenderer** component
|
|
53
|
-
- `trail_*` actions require **TrailRenderer** component
|
|
54
|
-
|
|
55
|
-
**If the component doesn't exist, the action will FAIL
|
|
56
|
-
Before using this tool, either:
|
|
57
|
-
1. Use `manage_gameobject` with `action="get_components"` to check if component exists
|
|
58
|
-
2. Use `manage_gameobject` with `action="add_component", component_name="ParticleSystem"` (or LineRenderer/TrailRenderer/VisualEffect) to add the component first
|
|
59
|
-
3. Assign material to the component beforehand to avoid empty effects
|
|
60
|
-
|
|
61
|
-
**TARGETING:**
|
|
62
|
-
Use `target` parameter to specify the GameObject:
|
|
63
|
-
- By name: `target="Fire"` (finds first GameObject named "Fire")
|
|
64
|
-
- By path: `target="Effects/Fire"` with `search_method="by_path"`
|
|
65
|
-
- By instance ID: `target="12345"` with `search_method="by_id"` (most reliable)
|
|
66
|
-
- By tag: `target="Player"` with `search_method="by_tag"`
|
|
67
|
-
|
|
68
|
-
**Component Types & Action Prefixes:**
|
|
69
|
-
- `particle_*` - ParticleSystem (legacy particle effects)
|
|
70
|
-
- `vfx_*` - Visual Effect Graph (modern GPU particles, requires com.unity.visualeffectgraph)
|
|
71
|
-
- `line_*` - LineRenderer (lines, curves, shapes)
|
|
72
|
-
- `trail_*` - TrailRenderer (motion trails)
|
|
73
|
-
|
|
74
|
-
**ParticleSystem Actions (particle_*):**
|
|
75
|
-
- particle_get_info: Get particle system info
|
|
76
|
-
- particle_set_main: Set main module (duration, looping, startLifetime, startSpeed, startSize, startColor, gravityModifier, maxParticles)
|
|
77
|
-
- particle_set_emission: Set emission (rateOverTime, rateOverDistance)
|
|
78
|
-
- particle_set_shape: Set shape (shapeType, radius, angle, arc, position, rotation, scale)
|
|
79
|
-
- particle_set_color_over_lifetime, particle_set_size_over_lifetime, particle_set_velocity_over_lifetime
|
|
80
|
-
- particle_set_noise: Set noise (strength, frequency, scrollSpeed)
|
|
81
|
-
- particle_set_renderer: Set renderer (renderMode, material)
|
|
82
|
-
- particle_enable_module: Enable/disable modules
|
|
83
|
-
- particle_play/stop/pause/restart/clear: Playback control
|
|
84
|
-
- particle_add_burst, particle_clear_bursts: Burst management
|
|
85
|
-
|
|
86
|
-
**VFX Graph Actions (vfx_*):**
|
|
87
|
-
- **Asset Management:**
|
|
88
|
-
- vfx_create_asset: Create a new VFX Graph asset file (requires: assetName, optional: folderPath, template, overwrite)
|
|
89
|
-
- vfx_assign_asset: Assign a VFX asset to a VisualEffect component (requires: target, assetPath)
|
|
90
|
-
- vfx_list_templates: List available VFX templates in project and packages
|
|
91
|
-
- vfx_list_assets: List all VFX assets in project (optional: folder, search)
|
|
92
|
-
- **Runtime Control:**
|
|
93
|
-
- vfx_get_info: Get VFX info
|
|
94
|
-
- vfx_set_float/int/bool: Set exposed parameters
|
|
95
|
-
- vfx_set_vector2/vector3/vector4: Set vector parameters
|
|
96
|
-
- vfx_set_color, vfx_set_gradient: Set color/gradient parameters
|
|
97
|
-
- vfx_set_texture, vfx_set_mesh: Set asset parameters
|
|
98
|
-
- vfx_set_curve: Set animation curve
|
|
99
|
-
- vfx_send_event: Send events with attributes (position, velocity, color, size, lifetime)
|
|
100
|
-
- vfx_play/stop/pause/reinit: Playback control
|
|
101
|
-
- vfx_set_playback_speed, vfx_set_seed
|
|
102
|
-
|
|
103
|
-
**LineRenderer Actions (line_*):**
|
|
104
|
-
- line_get_info: Get line info
|
|
105
|
-
- line_set_positions: Set all positions
|
|
106
|
-
- line_add_position, line_set_position: Modify positions
|
|
107
|
-
- line_set_width: Set width (uniform, start/end, curve)
|
|
108
|
-
- line_set_color: Set color (uniform, gradient)
|
|
109
|
-
- line_set_material, line_set_properties
|
|
110
|
-
- line_clear: Clear positions
|
|
111
|
-
- line_create_line: Create simple line
|
|
112
|
-
- line_create_circle: Create circle
|
|
113
|
-
- line_create_arc: Create arc
|
|
114
|
-
- line_create_bezier: Create Bezier curve
|
|
115
|
-
|
|
116
|
-
**TrailRenderer Actions (trail_*):**
|
|
117
|
-
- trail_get_info: Get trail info
|
|
118
|
-
- trail_set_time: Set trail duration
|
|
119
|
-
- trail_set_width, trail_set_color, trail_set_material, trail_set_properties
|
|
120
|
-
- trail_clear: Clear trail
|
|
121
|
-
- trail_emit: Emit point (Unity 2021.1+)""",
|
|
46
|
+
description=(
|
|
47
|
+
"Manage Unity VFX components (ParticleSystem, VisualEffect, LineRenderer, TrailRenderer). "
|
|
48
|
+
"Action prefixes: particle_*, vfx_*, line_*, trail_*. "
|
|
49
|
+
"Action-specific parameters go in `properties` (keys match ManageVFX.cs)."
|
|
50
|
+
),
|
|
122
51
|
annotations=ToolAnnotations(
|
|
123
52
|
title="Manage VFX",
|
|
124
53
|
destructiveHint=True,
|
|
@@ -126,283 +55,16 @@ Use `target` parameter to specify the GameObject:
|
|
|
126
55
|
)
|
|
127
56
|
async def manage_vfx(
|
|
128
57
|
ctx: Context,
|
|
129
|
-
action: Annotated[str, "Action to perform
|
|
130
|
-
|
|
131
|
-
# Target specification (common) - REQUIRED for most actions
|
|
132
|
-
# Using str | None to accept any string format
|
|
133
|
-
target: Annotated[str | None,
|
|
134
|
-
"Target GameObject with the VFX component. Use name (e.g. 'Fire'), path ('Effects/Fire'), instance ID, or tag. The GameObject MUST have the required component (ParticleSystem/VisualEffect/LineRenderer/TrailRenderer) for the action prefix."] = None,
|
|
58
|
+
action: Annotated[str, "Action to perform (prefix: particle_, vfx_, line_, trail_)."],
|
|
59
|
+
target: Annotated[str | None, "Target GameObject (name/path/id)."] = None,
|
|
135
60
|
search_method: Annotated[
|
|
136
61
|
Literal["by_id", "by_name", "by_path", "by_tag", "by_layer"] | None,
|
|
137
|
-
"How to find target
|
|
62
|
+
"How to find the target GameObject.",
|
|
63
|
+
] = None,
|
|
64
|
+
properties: Annotated[
|
|
65
|
+
dict[str, Any] | str | None,
|
|
66
|
+
"Action-specific parameters (dict or JSON string).",
|
|
138
67
|
] = None,
|
|
139
|
-
|
|
140
|
-
# === PARTICLE SYSTEM PARAMETERS ===
|
|
141
|
-
# Main module - All use Any to accept string coercion from MCP clients
|
|
142
|
-
duration: Annotated[Any,
|
|
143
|
-
"[Particle] Duration in seconds (number or string)"] = None,
|
|
144
|
-
looping: Annotated[Any,
|
|
145
|
-
"[Particle] Whether to loop (bool or string 'true'/'false')"] = None,
|
|
146
|
-
prewarm: Annotated[Any,
|
|
147
|
-
"[Particle] Prewarm the system (bool or string)"] = None,
|
|
148
|
-
start_delay: Annotated[Any,
|
|
149
|
-
"[Particle] Start delay (number or MinMaxCurve dict)"] = None,
|
|
150
|
-
start_lifetime: Annotated[Any,
|
|
151
|
-
"[Particle] Particle lifetime (number or MinMaxCurve dict)"] = None,
|
|
152
|
-
start_speed: Annotated[Any,
|
|
153
|
-
"[Particle] Initial speed (number or MinMaxCurve dict)"] = None,
|
|
154
|
-
start_size: Annotated[Any,
|
|
155
|
-
"[Particle] Initial size (number or MinMaxCurve dict)"] = None,
|
|
156
|
-
start_rotation: Annotated[Any,
|
|
157
|
-
"[Particle] Initial rotation (number or MinMaxCurve dict)"] = None,
|
|
158
|
-
start_color: Annotated[Any,
|
|
159
|
-
"[Particle/VFX] Start color [r,g,b,a] (array, dict, or JSON string)"] = None,
|
|
160
|
-
gravity_modifier: Annotated[Any,
|
|
161
|
-
"[Particle] Gravity multiplier (number or MinMaxCurve dict)"] = None,
|
|
162
|
-
simulation_space: Annotated[Literal["Local", "World",
|
|
163
|
-
"Custom"] | None, "[Particle] Simulation space"] = None,
|
|
164
|
-
scaling_mode: Annotated[Literal["Hierarchy", "Local",
|
|
165
|
-
"Shape"] | None, "[Particle] Scaling mode"] = None,
|
|
166
|
-
play_on_awake: Annotated[Any,
|
|
167
|
-
"[Particle] Play on awake (bool or string)"] = None,
|
|
168
|
-
max_particles: Annotated[Any,
|
|
169
|
-
"[Particle] Maximum particles (integer or string)"] = None,
|
|
170
|
-
|
|
171
|
-
# Emission
|
|
172
|
-
rate_over_time: Annotated[Any,
|
|
173
|
-
"[Particle] Emission rate over time (number or MinMaxCurve dict)"] = None,
|
|
174
|
-
rate_over_distance: Annotated[Any,
|
|
175
|
-
"[Particle] Emission rate over distance (number or MinMaxCurve dict)"] = None,
|
|
176
|
-
|
|
177
|
-
# Shape
|
|
178
|
-
shape_type: Annotated[Literal["Sphere", "Hemisphere", "Cone", "Box",
|
|
179
|
-
"Circle", "Edge", "Donut"] | None, "[Particle] Shape type"] = None,
|
|
180
|
-
radius: Annotated[Any,
|
|
181
|
-
"[Particle/Line] Shape radius (number or string)"] = None,
|
|
182
|
-
radius_thickness: Annotated[Any,
|
|
183
|
-
"[Particle] Radius thickness 0-1 (number or string)"] = None,
|
|
184
|
-
angle: Annotated[Any, "[Particle] Cone angle (number or string)"] = None,
|
|
185
|
-
arc: Annotated[Any, "[Particle] Arc angle (number or string)"] = None,
|
|
186
|
-
|
|
187
|
-
# Noise
|
|
188
|
-
strength: Annotated[Any,
|
|
189
|
-
"[Particle] Noise strength (number or MinMaxCurve dict)"] = None,
|
|
190
|
-
frequency: Annotated[Any,
|
|
191
|
-
"[Particle] Noise frequency (number or string)"] = None,
|
|
192
|
-
scroll_speed: Annotated[Any,
|
|
193
|
-
"[Particle] Noise scroll speed (number or MinMaxCurve dict)"] = None,
|
|
194
|
-
damping: Annotated[Any,
|
|
195
|
-
"[Particle] Noise damping (bool or string)"] = None,
|
|
196
|
-
octave_count: Annotated[Any,
|
|
197
|
-
"[Particle] Noise octaves 1-4 (integer or string)"] = None,
|
|
198
|
-
quality: Annotated[Literal["Low", "Medium", "High"]
|
|
199
|
-
| None, "[Particle] Noise quality"] = None,
|
|
200
|
-
|
|
201
|
-
# Module control
|
|
202
|
-
module: Annotated[str | None,
|
|
203
|
-
"[Particle] Module name to enable/disable"] = None,
|
|
204
|
-
enabled: Annotated[Any,
|
|
205
|
-
"[Particle] Enable/disable module (bool or string)"] = None,
|
|
206
|
-
|
|
207
|
-
# Burst
|
|
208
|
-
time: Annotated[Any,
|
|
209
|
-
"[Particle/Trail] Burst time or trail duration (number or string)"] = None,
|
|
210
|
-
count: Annotated[Any, "[Particle] Burst count (integer or string)"] = None,
|
|
211
|
-
min_count: Annotated[Any,
|
|
212
|
-
"[Particle] Min burst count (integer or string)"] = None,
|
|
213
|
-
max_count: Annotated[Any,
|
|
214
|
-
"[Particle] Max burst count (integer or string)"] = None,
|
|
215
|
-
cycles: Annotated[Any,
|
|
216
|
-
"[Particle] Burst cycles (integer or string)"] = None,
|
|
217
|
-
interval: Annotated[Any,
|
|
218
|
-
"[Particle] Burst interval (number or string)"] = None,
|
|
219
|
-
probability: Annotated[Any,
|
|
220
|
-
"[Particle] Burst probability 0-1 (number or string)"] = None,
|
|
221
|
-
|
|
222
|
-
# Playback
|
|
223
|
-
with_children: Annotated[Any,
|
|
224
|
-
"[Particle] Apply to children (bool or string)"] = None,
|
|
225
|
-
|
|
226
|
-
# === VFX GRAPH PARAMETERS ===
|
|
227
|
-
# Asset management
|
|
228
|
-
asset_name: Annotated[str | None,
|
|
229
|
-
"[VFX] Name for new VFX asset (without .vfx extension)"] = None,
|
|
230
|
-
folder_path: Annotated[str | None,
|
|
231
|
-
"[VFX] Folder path for new asset (default: Assets/VFX)"] = None,
|
|
232
|
-
template: Annotated[str | None,
|
|
233
|
-
"[VFX] Template name for new asset (use vfx_list_templates to see available)"] = None,
|
|
234
|
-
asset_path: Annotated[str | None,
|
|
235
|
-
"[VFX] Path to VFX asset to assign (e.g. Assets/VFX/MyEffect.vfx)"] = None,
|
|
236
|
-
overwrite: Annotated[Any,
|
|
237
|
-
"[VFX] Overwrite existing asset (bool or string)"] = None,
|
|
238
|
-
folder: Annotated[str | None,
|
|
239
|
-
"[VFX] Folder to search for assets (for vfx_list_assets)"] = None,
|
|
240
|
-
search: Annotated[str | None,
|
|
241
|
-
"[VFX] Search pattern for assets (for vfx_list_assets)"] = None,
|
|
242
|
-
|
|
243
|
-
# Runtime parameters
|
|
244
|
-
parameter: Annotated[str | None, "[VFX] Exposed parameter name"] = None,
|
|
245
|
-
value: Annotated[Any,
|
|
246
|
-
"[VFX] Parameter value (number, bool, array, or string)"] = None,
|
|
247
|
-
texture_path: Annotated[str | None, "[VFX] Texture asset path"] = None,
|
|
248
|
-
mesh_path: Annotated[str | None, "[VFX] Mesh asset path"] = None,
|
|
249
|
-
gradient: Annotated[Any,
|
|
250
|
-
"[VFX/Line/Trail] Gradient {colorKeys, alphaKeys} or {startColor, endColor} (dict or JSON string)"] = None,
|
|
251
|
-
curve: Annotated[Any,
|
|
252
|
-
"[VFX] Animation curve keys or {startValue, endValue} (array, dict, or JSON string)"] = None,
|
|
253
|
-
event_name: Annotated[str | None, "[VFX] Event name to send"] = None,
|
|
254
|
-
velocity: Annotated[Any,
|
|
255
|
-
"[VFX] Event velocity [x,y,z] (array or JSON string)"] = None,
|
|
256
|
-
size: Annotated[Any, "[VFX] Event size (number or string)"] = None,
|
|
257
|
-
lifetime: Annotated[Any, "[VFX] Event lifetime (number or string)"] = None,
|
|
258
|
-
play_rate: Annotated[Any,
|
|
259
|
-
"[VFX] Playback speed multiplier (number or string)"] = None,
|
|
260
|
-
seed: Annotated[Any, "[VFX] Random seed (integer or string)"] = None,
|
|
261
|
-
reset_seed_on_play: Annotated[Any,
|
|
262
|
-
"[VFX] Reset seed on play (bool or string)"] = None,
|
|
263
|
-
|
|
264
|
-
# === LINE/TRAIL RENDERER PARAMETERS ===
|
|
265
|
-
positions: Annotated[Any,
|
|
266
|
-
"[Line] Positions [[x,y,z], ...] (array or JSON string)"] = None,
|
|
267
|
-
position: Annotated[Any,
|
|
268
|
-
"[Line/Trail] Single position [x,y,z] (array or JSON string)"] = None,
|
|
269
|
-
index: Annotated[Any, "[Line] Position index (integer or string)"] = None,
|
|
270
|
-
|
|
271
|
-
# Width
|
|
272
|
-
width: Annotated[Any,
|
|
273
|
-
"[Line/Trail] Uniform width (number or string)"] = None,
|
|
274
|
-
start_width: Annotated[Any,
|
|
275
|
-
"[Line/Trail] Start width (number or string)"] = None,
|
|
276
|
-
end_width: Annotated[Any,
|
|
277
|
-
"[Line/Trail] End width (number or string)"] = None,
|
|
278
|
-
width_curve: Annotated[Any,
|
|
279
|
-
"[Line/Trail] Width curve (number or dict)"] = None,
|
|
280
|
-
width_multiplier: Annotated[Any,
|
|
281
|
-
"[Line/Trail] Width multiplier (number or string)"] = None,
|
|
282
|
-
|
|
283
|
-
# Color
|
|
284
|
-
color: Annotated[Any,
|
|
285
|
-
"[Line/Trail/VFX] Color [r,g,b,a] (array or JSON string)"] = None,
|
|
286
|
-
start_color_line: Annotated[Any,
|
|
287
|
-
"[Line/Trail] Start color (array or JSON string)"] = None,
|
|
288
|
-
end_color: Annotated[Any,
|
|
289
|
-
"[Line/Trail] End color (array or JSON string)"] = None,
|
|
290
|
-
|
|
291
|
-
# Material & properties
|
|
292
|
-
material_path: Annotated[str | None,
|
|
293
|
-
"[Particle/Line/Trail] Material asset path"] = None,
|
|
294
|
-
trail_material_path: Annotated[str | None,
|
|
295
|
-
"[Particle] Trail material asset path"] = None,
|
|
296
|
-
loop: Annotated[Any,
|
|
297
|
-
"[Line] Connect end to start (bool or string)"] = None,
|
|
298
|
-
use_world_space: Annotated[Any,
|
|
299
|
-
"[Line] Use world space (bool or string)"] = None,
|
|
300
|
-
num_corner_vertices: Annotated[Any,
|
|
301
|
-
"[Line/Trail] Corner vertices (integer or string)"] = None,
|
|
302
|
-
num_cap_vertices: Annotated[Any,
|
|
303
|
-
"[Line/Trail] Cap vertices (integer or string)"] = None,
|
|
304
|
-
alignment: Annotated[Literal["View", "Local", "TransformZ"]
|
|
305
|
-
| None, "[Line/Trail] Alignment"] = None,
|
|
306
|
-
texture_mode: Annotated[Literal["Stretch", "Tile", "DistributePerSegment",
|
|
307
|
-
"RepeatPerSegment"] | None, "[Line/Trail] Texture mode"] = None,
|
|
308
|
-
generate_lighting_data: Annotated[Any,
|
|
309
|
-
"[Line/Trail] Generate lighting data for GI (bool or string)"] = None,
|
|
310
|
-
sorting_order: Annotated[Any,
|
|
311
|
-
"[Line/Trail/Particle] Sorting order (integer or string)"] = None,
|
|
312
|
-
sorting_layer_name: Annotated[str | None,
|
|
313
|
-
"[Renderer] Sorting layer name"] = None,
|
|
314
|
-
sorting_layer_id: Annotated[Any,
|
|
315
|
-
"[Renderer] Sorting layer ID (integer or string)"] = None,
|
|
316
|
-
render_mode: Annotated[str | None,
|
|
317
|
-
"[Particle] Render mode (Billboard, Stretch, HorizontalBillboard, VerticalBillboard, Mesh, None)"] = None,
|
|
318
|
-
sort_mode: Annotated[str | None,
|
|
319
|
-
"[Particle] Sort mode (None, Distance, OldestInFront, YoungestInFront, Depth)"] = None,
|
|
320
|
-
|
|
321
|
-
# === RENDERER COMMON PROPERTIES (Shadows, Lighting, Probes) ===
|
|
322
|
-
shadow_casting_mode: Annotated[Literal["Off", "On", "TwoSided",
|
|
323
|
-
"ShadowsOnly"] | None, "[Renderer] Shadow casting mode"] = None,
|
|
324
|
-
receive_shadows: Annotated[Any,
|
|
325
|
-
"[Renderer] Receive shadows (bool or string)"] = None,
|
|
326
|
-
shadow_bias: Annotated[Any,
|
|
327
|
-
"[Renderer] Shadow bias (number or string)"] = None,
|
|
328
|
-
light_probe_usage: Annotated[Literal["Off", "BlendProbes", "UseProxyVolume",
|
|
329
|
-
"CustomProvided"] | None, "[Renderer] Light probe usage mode"] = None,
|
|
330
|
-
reflection_probe_usage: Annotated[Literal["Off", "BlendProbes", "BlendProbesAndSkybox",
|
|
331
|
-
"Simple"] | None, "[Renderer] Reflection probe usage mode"] = None,
|
|
332
|
-
motion_vector_generation_mode: Annotated[Literal["Camera", "Object",
|
|
333
|
-
"ForceNoMotion"] | None, "[Renderer] Motion vector generation mode"] = None,
|
|
334
|
-
rendering_layer_mask: Annotated[Any,
|
|
335
|
-
"[Renderer] Rendering layer mask for SRP (integer or string)"] = None,
|
|
336
|
-
|
|
337
|
-
# === PARTICLE RENDERER SPECIFIC ===
|
|
338
|
-
min_particle_size: Annotated[Any,
|
|
339
|
-
"[Particle] Min particle size relative to viewport (number or string)"] = None,
|
|
340
|
-
max_particle_size: Annotated[Any,
|
|
341
|
-
"[Particle] Max particle size relative to viewport (number or string)"] = None,
|
|
342
|
-
length_scale: Annotated[Any,
|
|
343
|
-
"[Particle] Length scale for stretched billboard (number or string)"] = None,
|
|
344
|
-
velocity_scale: Annotated[Any,
|
|
345
|
-
"[Particle] Velocity scale for stretched billboard (number or string)"] = None,
|
|
346
|
-
camera_velocity_scale: Annotated[Any,
|
|
347
|
-
"[Particle] Camera velocity scale for stretched billboard (number or string)"] = None,
|
|
348
|
-
normal_direction: Annotated[Any,
|
|
349
|
-
"[Particle] Normal direction 0-1 (number or string)"] = None,
|
|
350
|
-
pivot: Annotated[Any,
|
|
351
|
-
"[Particle] Pivot offset [x,y,z] (array or JSON string)"] = None,
|
|
352
|
-
flip: Annotated[Any,
|
|
353
|
-
"[Particle] Flip [x,y,z] (array or JSON string)"] = None,
|
|
354
|
-
allow_roll: Annotated[Any,
|
|
355
|
-
"[Particle] Allow roll for mesh particles (bool or string)"] = None,
|
|
356
|
-
|
|
357
|
-
# Shape creation (line_create_*)
|
|
358
|
-
start: Annotated[Any,
|
|
359
|
-
"[Line] Start point [x,y,z] (array or JSON string)"] = None,
|
|
360
|
-
end: Annotated[Any,
|
|
361
|
-
"[Line] End point [x,y,z] (array or JSON string)"] = None,
|
|
362
|
-
center: Annotated[Any,
|
|
363
|
-
"[Line] Circle/arc center [x,y,z] (array or JSON string)"] = None,
|
|
364
|
-
segments: Annotated[Any,
|
|
365
|
-
"[Line] Number of segments (integer or string)"] = None,
|
|
366
|
-
normal: Annotated[Any,
|
|
367
|
-
"[Line] Normal direction [x,y,z] (array or JSON string)"] = None,
|
|
368
|
-
start_angle: Annotated[Any,
|
|
369
|
-
"[Line] Arc start angle degrees (number or string)"] = None,
|
|
370
|
-
end_angle: Annotated[Any,
|
|
371
|
-
"[Line] Arc end angle degrees (number or string)"] = None,
|
|
372
|
-
control_point1: Annotated[Any,
|
|
373
|
-
"[Line] Bezier control point 1 (array or JSON string)"] = None,
|
|
374
|
-
control_point2: Annotated[Any,
|
|
375
|
-
"[Line] Bezier control point 2 (cubic) (array or JSON string)"] = None,
|
|
376
|
-
|
|
377
|
-
# Trail specific
|
|
378
|
-
min_vertex_distance: Annotated[Any,
|
|
379
|
-
"[Trail] Min vertex distance (number or string)"] = None,
|
|
380
|
-
autodestruct: Annotated[Any,
|
|
381
|
-
"[Trail] Destroy when finished (bool or string)"] = None,
|
|
382
|
-
emitting: Annotated[Any, "[Trail] Is emitting (bool or string)"] = None,
|
|
383
|
-
|
|
384
|
-
# Common vector params for shape/velocity
|
|
385
|
-
x: Annotated[Any,
|
|
386
|
-
"[Particle] Velocity X (number or MinMaxCurve dict)"] = None,
|
|
387
|
-
y: Annotated[Any,
|
|
388
|
-
"[Particle] Velocity Y (number or MinMaxCurve dict)"] = None,
|
|
389
|
-
z: Annotated[Any,
|
|
390
|
-
"[Particle] Velocity Z (number or MinMaxCurve dict)"] = None,
|
|
391
|
-
speed_modifier: Annotated[Any,
|
|
392
|
-
"[Particle] Speed modifier (number or MinMaxCurve dict)"] = None,
|
|
393
|
-
space: Annotated[Literal["Local", "World"] |
|
|
394
|
-
None, "[Particle] Velocity space"] = None,
|
|
395
|
-
separate_axes: Annotated[Any,
|
|
396
|
-
"[Particle] Separate XYZ axes (bool or string)"] = None,
|
|
397
|
-
size_over_lifetime: Annotated[Any,
|
|
398
|
-
"[Particle] Size over lifetime (number or MinMaxCurve dict)"] = None,
|
|
399
|
-
size_x: Annotated[Any,
|
|
400
|
-
"[Particle] Size X (number or MinMaxCurve dict)"] = None,
|
|
401
|
-
size_y: Annotated[Any,
|
|
402
|
-
"[Particle] Size Y (number or MinMaxCurve dict)"] = None,
|
|
403
|
-
size_z: Annotated[Any,
|
|
404
|
-
"[Particle] Size Z (number or MinMaxCurve dict)"] = None,
|
|
405
|
-
|
|
406
68
|
) -> dict[str, Any]:
|
|
407
69
|
"""Unified VFX management tool."""
|
|
408
70
|
|
|
@@ -437,294 +99,14 @@ async def manage_vfx(
|
|
|
437
99
|
|
|
438
100
|
unity_instance = get_unity_instance_from_context(ctx)
|
|
439
101
|
|
|
440
|
-
# Build parameters dict with normalized action to stay consistent with Unity
|
|
441
102
|
params_dict: dict[str, Any] = {"action": action_normalized}
|
|
442
|
-
|
|
443
|
-
|
|
103
|
+
if properties is not None:
|
|
104
|
+
params_dict["properties"] = properties
|
|
444
105
|
if target is not None:
|
|
445
106
|
params_dict["target"] = target
|
|
446
107
|
if search_method is not None:
|
|
447
108
|
params_dict["searchMethod"] = search_method
|
|
448
109
|
|
|
449
|
-
# === PARTICLE SYSTEM ===
|
|
450
|
-
# Pass through all values - C# side handles parsing (ParseColor, ParseVector3, ParseMinMaxCurve, ToObject<T>)
|
|
451
|
-
if duration is not None:
|
|
452
|
-
params_dict["duration"] = duration
|
|
453
|
-
if looping is not None:
|
|
454
|
-
params_dict["looping"] = looping
|
|
455
|
-
if prewarm is not None:
|
|
456
|
-
params_dict["prewarm"] = prewarm
|
|
457
|
-
if start_delay is not None:
|
|
458
|
-
params_dict["startDelay"] = start_delay
|
|
459
|
-
if start_lifetime is not None:
|
|
460
|
-
params_dict["startLifetime"] = start_lifetime
|
|
461
|
-
if start_speed is not None:
|
|
462
|
-
params_dict["startSpeed"] = start_speed
|
|
463
|
-
if start_size is not None:
|
|
464
|
-
params_dict["startSize"] = start_size
|
|
465
|
-
if start_rotation is not None:
|
|
466
|
-
params_dict["startRotation"] = start_rotation
|
|
467
|
-
if start_color is not None:
|
|
468
|
-
params_dict["startColor"] = start_color
|
|
469
|
-
if gravity_modifier is not None:
|
|
470
|
-
params_dict["gravityModifier"] = gravity_modifier
|
|
471
|
-
if simulation_space is not None:
|
|
472
|
-
params_dict["simulationSpace"] = simulation_space
|
|
473
|
-
if scaling_mode is not None:
|
|
474
|
-
params_dict["scalingMode"] = scaling_mode
|
|
475
|
-
if play_on_awake is not None:
|
|
476
|
-
params_dict["playOnAwake"] = play_on_awake
|
|
477
|
-
if max_particles is not None:
|
|
478
|
-
params_dict["maxParticles"] = max_particles
|
|
479
|
-
|
|
480
|
-
# Emission
|
|
481
|
-
if rate_over_time is not None:
|
|
482
|
-
params_dict["rateOverTime"] = rate_over_time
|
|
483
|
-
if rate_over_distance is not None:
|
|
484
|
-
params_dict["rateOverDistance"] = rate_over_distance
|
|
485
|
-
|
|
486
|
-
# Shape
|
|
487
|
-
if shape_type is not None:
|
|
488
|
-
params_dict["shapeType"] = shape_type
|
|
489
|
-
if radius is not None:
|
|
490
|
-
params_dict["radius"] = radius
|
|
491
|
-
if radius_thickness is not None:
|
|
492
|
-
params_dict["radiusThickness"] = radius_thickness
|
|
493
|
-
if angle is not None:
|
|
494
|
-
params_dict["angle"] = angle
|
|
495
|
-
if arc is not None:
|
|
496
|
-
params_dict["arc"] = arc
|
|
497
|
-
|
|
498
|
-
# Noise
|
|
499
|
-
if strength is not None:
|
|
500
|
-
params_dict["strength"] = strength
|
|
501
|
-
if frequency is not None:
|
|
502
|
-
params_dict["frequency"] = frequency
|
|
503
|
-
if scroll_speed is not None:
|
|
504
|
-
params_dict["scrollSpeed"] = scroll_speed
|
|
505
|
-
if damping is not None:
|
|
506
|
-
params_dict["damping"] = damping
|
|
507
|
-
if octave_count is not None:
|
|
508
|
-
params_dict["octaveCount"] = octave_count
|
|
509
|
-
if quality is not None:
|
|
510
|
-
params_dict["quality"] = quality
|
|
511
|
-
|
|
512
|
-
# Module
|
|
513
|
-
if module is not None:
|
|
514
|
-
params_dict["module"] = module
|
|
515
|
-
if enabled is not None:
|
|
516
|
-
params_dict["enabled"] = enabled
|
|
517
|
-
|
|
518
|
-
# Burst
|
|
519
|
-
if time is not None:
|
|
520
|
-
params_dict["time"] = time
|
|
521
|
-
if count is not None:
|
|
522
|
-
params_dict["count"] = count
|
|
523
|
-
if min_count is not None:
|
|
524
|
-
params_dict["minCount"] = min_count
|
|
525
|
-
if max_count is not None:
|
|
526
|
-
params_dict["maxCount"] = max_count
|
|
527
|
-
if cycles is not None:
|
|
528
|
-
params_dict["cycles"] = cycles
|
|
529
|
-
if interval is not None:
|
|
530
|
-
params_dict["interval"] = interval
|
|
531
|
-
if probability is not None:
|
|
532
|
-
params_dict["probability"] = probability
|
|
533
|
-
|
|
534
|
-
# Playback
|
|
535
|
-
if with_children is not None:
|
|
536
|
-
params_dict["withChildren"] = with_children
|
|
537
|
-
|
|
538
|
-
# === VFX GRAPH ===
|
|
539
|
-
# Asset management parameters
|
|
540
|
-
if asset_name is not None:
|
|
541
|
-
params_dict["assetName"] = asset_name
|
|
542
|
-
if folder_path is not None:
|
|
543
|
-
params_dict["folderPath"] = folder_path
|
|
544
|
-
if template is not None:
|
|
545
|
-
params_dict["template"] = template
|
|
546
|
-
if asset_path is not None:
|
|
547
|
-
params_dict["assetPath"] = asset_path
|
|
548
|
-
if overwrite is not None:
|
|
549
|
-
params_dict["overwrite"] = overwrite
|
|
550
|
-
if folder is not None:
|
|
551
|
-
params_dict["folder"] = folder
|
|
552
|
-
if search is not None:
|
|
553
|
-
params_dict["search"] = search
|
|
554
|
-
|
|
555
|
-
# Runtime parameters
|
|
556
|
-
if parameter is not None:
|
|
557
|
-
params_dict["parameter"] = parameter
|
|
558
|
-
if value is not None:
|
|
559
|
-
params_dict["value"] = value
|
|
560
|
-
if texture_path is not None:
|
|
561
|
-
params_dict["texturePath"] = texture_path
|
|
562
|
-
if mesh_path is not None:
|
|
563
|
-
params_dict["meshPath"] = mesh_path
|
|
564
|
-
if gradient is not None:
|
|
565
|
-
params_dict["gradient"] = gradient
|
|
566
|
-
if curve is not None:
|
|
567
|
-
params_dict["curve"] = curve
|
|
568
|
-
if event_name is not None:
|
|
569
|
-
params_dict["eventName"] = event_name
|
|
570
|
-
if velocity is not None:
|
|
571
|
-
params_dict["velocity"] = velocity
|
|
572
|
-
if size is not None:
|
|
573
|
-
params_dict["size"] = size
|
|
574
|
-
if lifetime is not None:
|
|
575
|
-
params_dict["lifetime"] = lifetime
|
|
576
|
-
if play_rate is not None:
|
|
577
|
-
params_dict["playRate"] = play_rate
|
|
578
|
-
if seed is not None:
|
|
579
|
-
params_dict["seed"] = seed
|
|
580
|
-
if reset_seed_on_play is not None:
|
|
581
|
-
params_dict["resetSeedOnPlay"] = reset_seed_on_play
|
|
582
|
-
|
|
583
|
-
# === LINE/TRAIL RENDERER ===
|
|
584
|
-
if positions is not None:
|
|
585
|
-
params_dict["positions"] = positions
|
|
586
|
-
if position is not None:
|
|
587
|
-
params_dict["position"] = position
|
|
588
|
-
if index is not None:
|
|
589
|
-
params_dict["index"] = index
|
|
590
|
-
|
|
591
|
-
# Width
|
|
592
|
-
if width is not None:
|
|
593
|
-
params_dict["width"] = width
|
|
594
|
-
if start_width is not None:
|
|
595
|
-
params_dict["startWidth"] = start_width
|
|
596
|
-
if end_width is not None:
|
|
597
|
-
params_dict["endWidth"] = end_width
|
|
598
|
-
if width_curve is not None:
|
|
599
|
-
params_dict["widthCurve"] = width_curve
|
|
600
|
-
if width_multiplier is not None:
|
|
601
|
-
params_dict["widthMultiplier"] = width_multiplier
|
|
602
|
-
|
|
603
|
-
# Color
|
|
604
|
-
if color is not None:
|
|
605
|
-
params_dict["color"] = color
|
|
606
|
-
if start_color_line is not None:
|
|
607
|
-
params_dict["startColor"] = start_color_line
|
|
608
|
-
if end_color is not None:
|
|
609
|
-
params_dict["endColor"] = end_color
|
|
610
|
-
|
|
611
|
-
# Material & properties
|
|
612
|
-
if material_path is not None:
|
|
613
|
-
params_dict["materialPath"] = material_path
|
|
614
|
-
if trail_material_path is not None:
|
|
615
|
-
params_dict["trailMaterialPath"] = trail_material_path
|
|
616
|
-
if loop is not None:
|
|
617
|
-
params_dict["loop"] = loop
|
|
618
|
-
if use_world_space is not None:
|
|
619
|
-
params_dict["useWorldSpace"] = use_world_space
|
|
620
|
-
if num_corner_vertices is not None:
|
|
621
|
-
params_dict["numCornerVertices"] = num_corner_vertices
|
|
622
|
-
if num_cap_vertices is not None:
|
|
623
|
-
params_dict["numCapVertices"] = num_cap_vertices
|
|
624
|
-
if alignment is not None:
|
|
625
|
-
params_dict["alignment"] = alignment
|
|
626
|
-
if texture_mode is not None:
|
|
627
|
-
params_dict["textureMode"] = texture_mode
|
|
628
|
-
if generate_lighting_data is not None:
|
|
629
|
-
params_dict["generateLightingData"] = generate_lighting_data
|
|
630
|
-
if sorting_order is not None:
|
|
631
|
-
params_dict["sortingOrder"] = sorting_order
|
|
632
|
-
if sorting_layer_name is not None:
|
|
633
|
-
params_dict["sortingLayerName"] = sorting_layer_name
|
|
634
|
-
if sorting_layer_id is not None:
|
|
635
|
-
params_dict["sortingLayerID"] = sorting_layer_id
|
|
636
|
-
if render_mode is not None:
|
|
637
|
-
params_dict["renderMode"] = render_mode
|
|
638
|
-
if sort_mode is not None:
|
|
639
|
-
params_dict["sortMode"] = sort_mode
|
|
640
|
-
|
|
641
|
-
# Renderer common properties (shadows, lighting, probes)
|
|
642
|
-
if shadow_casting_mode is not None:
|
|
643
|
-
params_dict["shadowCastingMode"] = shadow_casting_mode
|
|
644
|
-
if receive_shadows is not None:
|
|
645
|
-
params_dict["receiveShadows"] = receive_shadows
|
|
646
|
-
if shadow_bias is not None:
|
|
647
|
-
params_dict["shadowBias"] = shadow_bias
|
|
648
|
-
if light_probe_usage is not None:
|
|
649
|
-
params_dict["lightProbeUsage"] = light_probe_usage
|
|
650
|
-
if reflection_probe_usage is not None:
|
|
651
|
-
params_dict["reflectionProbeUsage"] = reflection_probe_usage
|
|
652
|
-
if motion_vector_generation_mode is not None:
|
|
653
|
-
params_dict["motionVectorGenerationMode"] = motion_vector_generation_mode
|
|
654
|
-
if rendering_layer_mask is not None:
|
|
655
|
-
params_dict["renderingLayerMask"] = rendering_layer_mask
|
|
656
|
-
|
|
657
|
-
# Particle renderer specific
|
|
658
|
-
if min_particle_size is not None:
|
|
659
|
-
params_dict["minParticleSize"] = min_particle_size
|
|
660
|
-
if max_particle_size is not None:
|
|
661
|
-
params_dict["maxParticleSize"] = max_particle_size
|
|
662
|
-
if length_scale is not None:
|
|
663
|
-
params_dict["lengthScale"] = length_scale
|
|
664
|
-
if velocity_scale is not None:
|
|
665
|
-
params_dict["velocityScale"] = velocity_scale
|
|
666
|
-
if camera_velocity_scale is not None:
|
|
667
|
-
params_dict["cameraVelocityScale"] = camera_velocity_scale
|
|
668
|
-
if normal_direction is not None:
|
|
669
|
-
params_dict["normalDirection"] = normal_direction
|
|
670
|
-
if pivot is not None:
|
|
671
|
-
params_dict["pivot"] = pivot
|
|
672
|
-
if flip is not None:
|
|
673
|
-
params_dict["flip"] = flip
|
|
674
|
-
if allow_roll is not None:
|
|
675
|
-
params_dict["allowRoll"] = allow_roll
|
|
676
|
-
|
|
677
|
-
# Shape creation
|
|
678
|
-
if start is not None:
|
|
679
|
-
params_dict["start"] = start
|
|
680
|
-
if end is not None:
|
|
681
|
-
params_dict["end"] = end
|
|
682
|
-
if center is not None:
|
|
683
|
-
params_dict["center"] = center
|
|
684
|
-
if segments is not None:
|
|
685
|
-
params_dict["segments"] = segments
|
|
686
|
-
if normal is not None:
|
|
687
|
-
params_dict["normal"] = normal
|
|
688
|
-
if start_angle is not None:
|
|
689
|
-
params_dict["startAngle"] = start_angle
|
|
690
|
-
if end_angle is not None:
|
|
691
|
-
params_dict["endAngle"] = end_angle
|
|
692
|
-
if control_point1 is not None:
|
|
693
|
-
params_dict["controlPoint1"] = control_point1
|
|
694
|
-
if control_point2 is not None:
|
|
695
|
-
params_dict["controlPoint2"] = control_point2
|
|
696
|
-
|
|
697
|
-
# Trail specific
|
|
698
|
-
if min_vertex_distance is not None:
|
|
699
|
-
params_dict["minVertexDistance"] = min_vertex_distance
|
|
700
|
-
if autodestruct is not None:
|
|
701
|
-
params_dict["autodestruct"] = autodestruct
|
|
702
|
-
if emitting is not None:
|
|
703
|
-
params_dict["emitting"] = emitting
|
|
704
|
-
|
|
705
|
-
# Velocity/size axes
|
|
706
|
-
if x is not None:
|
|
707
|
-
params_dict["x"] = x
|
|
708
|
-
if y is not None:
|
|
709
|
-
params_dict["y"] = y
|
|
710
|
-
if z is not None:
|
|
711
|
-
params_dict["z"] = z
|
|
712
|
-
if speed_modifier is not None:
|
|
713
|
-
params_dict["speedModifier"] = speed_modifier
|
|
714
|
-
if space is not None:
|
|
715
|
-
params_dict["space"] = space
|
|
716
|
-
if separate_axes is not None:
|
|
717
|
-
params_dict["separateAxes"] = separate_axes
|
|
718
|
-
if size_over_lifetime is not None:
|
|
719
|
-
params_dict["size"] = size_over_lifetime
|
|
720
|
-
if size_x is not None:
|
|
721
|
-
params_dict["sizeX"] = size_x
|
|
722
|
-
if size_y is not None:
|
|
723
|
-
params_dict["sizeY"] = size_y
|
|
724
|
-
if size_z is not None:
|
|
725
|
-
params_dict["sizeZ"] = size_z
|
|
726
|
-
|
|
727
|
-
# Remove None values
|
|
728
110
|
params_dict = {k: v for k, v in params_dict.items() if v is not None}
|
|
729
111
|
|
|
730
112
|
# Send to Unity
|
{mcpforunityserver-9.3.0.dist-info → mcpforunityserver-9.3.0b20260128055651.dist-info}/WHEEL
RENAMED
|
File without changes
|