mcpforunityserver 9.2.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.
@@ -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="""Unified VFX management for Unity visual effects components.
48
-
49
- Each action prefix requires a specific component on the target GameObject:
50
- - `particle_*` actions require **ParticleSystem** component
51
- - `vfx_*` actions require **VisualEffect** component (+ com.unity.visualeffectgraph package)
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. Use prefix: particle_, vfx_, line_, or trail_"],
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: by_name (default), by_path (hierarchy path), by_id (instance ID - most reliable), by_tag, by_layer"
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
- # Target
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