[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HSX7YFZB1JVD6YZ63NFDFK":3,"skill-same:01M6HSX7YFZB1JVD6YZ63NFDFK":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":52,"install":53,"resources":66},"01M6HSX7YFZB1JVD6YZ63NFDFK","unreal-niagara-editing",null,"Edit Niagara systems, emitters, and scripts via UCP. Use when the user asks to create\u002Fmodify particle effects, manage emitters, configure modules, set module inputs, edit Niagara script graphs, or any Niagara VFX operation.","welflau\u002Fai-dev-system","welflau","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7010385?v=4","01M6HPTDGF18RFY07M229P8CTM","01M6HPTDMRMZCJPYBFEA9XVVYT",3,"MIT","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fuse_skills\u002Funreal-niagara-editing\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"editing","unreal niagara editing","unreal niagara","unreal","graphs","when","vfx","effects","script","operation","via","scripts","systems","module","create","manage","modules","use","user","edit","configure","SET","ucp","2026-11-10 10:12:30",false,"---\nname: unreal-niagara-editing\ndescription: Edit Niagara systems, emitters, and scripts via UCP. Use when the user asks to create\u002Fmodify particle effects, manage emitters, configure modules, set module inputs, edit Niagara script graphs, or any Niagara VFX operation.\n---\n\n# Niagara Editing\n\nNiagara editing uses three complementary paths: **NiagaraOperationLibrary** for structural operations, **NodeCode** for graph\u002Fproperty reading and writing, and **ObjectOperationLibrary** for detailed UObject property access.\n\n**Prerequisite**: UE editor running with UCP plugin enabled.\n\n## API Overview\n\n### NiagaraOperationLibrary (structural operations)\n\nCDO: `\u002FScript\u002FUnrealClientProtocolEditor.Default__NiagaraOperationLibrary`\n\nUObject path parameters (System, Emitter, Script, etc.) are auto-resolved by UCP — pass the object path as a string and UCP converts it to the UObject pointer.\n\n| Function | Params | Description |\n|----------|--------|-------------|\n| `AddEmitter` | `System`(path), `SourceEmitter`(path), `Name` | Add emitter to system |\n| `RemoveEmitter` | `System`(path), `EmitterName` | Remove emitter from system |\n| `ReorderEmitter` | `System`(path), `EmitterName`, `NewIndex` | Reorder emitter |\n| `AddUserParameter` | `System`(path), `ParamName`, `TypeName`, `DefaultValue` | Add User parameter |\n| `RemoveUserParameter` | `System`(path), `ParamName` | Remove User parameter |\n| `AddModule` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleScript`(path), `Index` | Add module to stack |\n| `RemoveModule` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid` | Remove module |\n| `MoveModule` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `NewIndex` | Reorder module |\n| `SetModuleEnabled` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `bEnabled` | Enable\u002Fdisable module |\n| `GetModules` | `SystemOrEmitter`(path), `ScriptUsage` | List modules with name\u002Fguid\u002Fenabled\u002FscriptPath |\n| `SetModuleInputValue` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `InputName`, `Value` | Set input to literal (Rapid Iteration) |\n| `SetModuleInputBinding` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `InputName`, `LinkedParamName` | Bind input to parameter |\n| `SetModuleInputDynamicInput` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `InputName`, `DynamicInputScript`(path) | Set dynamic input |\n| `ResetModuleInput` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `InputName` | Reset to default |\n| `GetModuleInputs` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid` | List inputs with name\u002Ftype\u002Fmode\u002Fvalue |\n| `AddRenderer` | `Emitter`(path), `RendererClassName` | Add renderer |\n| `RemoveRenderer` | `Emitter`(path), `RendererIndex` | Remove renderer |\n| `MoveRenderer` | `Emitter`(path), `RendererIndex`, `NewIndex` | Reorder renderer |\n| `AddEventHandler` | `Emitter`(path) | Add event handler |\n| `RemoveEventHandler` | `Emitter`(path), `UsageIdString` | Remove event handler |\n| `AddSimulationStage` | `Emitter`(path) | Add simulation stage |\n| `RemoveSimulationStage` | `Emitter`(path), `StageIdString` | Remove simulation stage |\n| `MoveSimulationStage` | `Emitter`(path), `StageIdString`, `NewIndex` | Reorder simulation stage |\n| `AddGraphParameter` | `Script`(path), `ParamName`, `TypeName` | Add parameter to script graph |\n| `RemoveGraphParameter` | `Script`(path), `ParamName` | Remove parameter |\n| `RenameGraphParameter` | `Script`(path), `OldName`, `NewName` | Rename parameter |\n| `CreateScratchPadScript` | `SystemOrEmitter`(path), `ScriptName`, `Usage`, `ModuleUsageBitmask` | Create a ScratchPad (Local Module) script |\n\n### NodeCode (graph + properties reading\u002Fwriting)\n\nCDO: `\u002FScript\u002FUnrealClientProtocolEditor.Default__NodeCodeEditingLibrary`\n\n| Function | Params | Description |\n|----------|--------|-------------|\n| `Outline` | `AssetPath` | List available sections |\n| `ReadGraph` | `AssetPath`, `Section` | Read section content as text |\n| `WriteGraph` | `AssetPath`, `Section`, `GraphText` | Write section content back |\n\n## Section Model\n\n### System Asset (UNiagaraSystem)\n\n| Section | Type | Description |\n|---------|------|-------------|\n| `[SystemProperties]` | Properties | Warmup, bounds, determinism, scalability, LWC, render defaults |\n| `[Emitters]` | Properties | Emitter list with names, enabled state, ObjectPath |\n| `[UserParameters]` | Properties | User. namespace exposed parameters |\n| `[ScratchPadScripts]` | Properties | Local Module scripts with name, Usage, ModuleUsageBitmask, ObjectPath |\n| `[SystemSpawn]` | Graph | System spawn stage module chain |\n| `[SystemUpdate]` | Graph | System update stage module chain |\n\n### Emitter Object (UNiagaraEmitter, accessed via ObjectPath from [Emitters])\n\n| Section | Type | Description |\n|---------|------|-------------|\n| `[EmitterProperties]` | Properties | SimTarget, bLocalSpace, bounds, allocation, inheritance |\n| `[ParticleAttributes]` | Properties (read-only) | Compiled particle attributes list |\n| `[Renderers]` | Properties | Renderer list with class, ObjectPath |\n| `[EventHandlers]` | Properties | Event handler configs |\n| `[SimulationStages]` | Properties | Simulation stage list |\n| `[EmitterSpawn]` | Graph | Emitter spawn stage |\n| `[EmitterUpdate]` | Graph | Emitter update stage |\n| `[ParticleSpawn]` | Graph | Particle spawn stage |\n| `[ParticleUpdate]` | Graph | Particle update stage |\n| `[ParticleEvent:EventId]` | Graph | Event handler graph |\n| `[SimulationStage:StageId]` | Graph | Custom simulation stage graph |\n\n### Standalone Script (UNiagaraScript)\n\n| Section | Type | Description |\n|---------|------|-------------|\n| `[Module]` | Graph | Module script graph |\n| `[Function]` | Graph | Function script graph |\n| `[DynamicInput]` | Graph | Dynamic input script graph |\n\n## ScriptUsage Values\n\nUse these strings for `ScriptUsage` parameter:\n\n`SystemSpawn`, `SystemUpdate`, `EmitterSpawn`, `EmitterUpdate`, `ParticleSpawn`, `ParticleUpdate`, `ParticleEvent`, `SimulationStage`, `Module`, `Function`, `DynamicInput`\n\n## Parameter Namespaces\n\n| Namespace | Scope | Writable In |\n|-----------|-------|-------------|\n| `System.` | System-level attributes | System stages |\n| `Emitter.` | Emitter-level attributes | Emitter stages |\n| `Particles.` | Particle attributes | Particle stages |\n| `Module.` | Module input parameters | Module internal |\n| `User.` | User-exposed parameters | Runtime settable |\n| `Engine.` | Engine values (DeltaTime, etc.) | Read-only |\n| `Local.Module.` | Module-local temporaries | Module internal |\n| `Transient.` | Cross-module temporaries | Current stage |\n| `Constants.` | Rapid iteration parameters | Editor-set values |\n\n## Module Input Setting Methods\n\nModules can have their inputs set in four ways:\n\n1. **Literal Value** (`SetModuleInputValue`) — stored as Rapid Iteration Parameter in `Constants.EmitterName.ModuleName.InputName`, no graph nodes\n2. **Binding** (`SetModuleInputBinding`) — ParameterMapGet reads another parameter (e.g. `User.MyParam`, `Emitter.SpawnRate`)\n3. **Dynamic Input** (`SetModuleInputDynamicInput`) — a DynamicInput script computes the value\n4. **Data Interface** — a NiagaraNodeInput provides a data interface object\n5. **Default** — module's built-in default, no override\n\n## Workflow\n\n### Exploring a System\n\n```json\n\u002F\u002F 1. Get system structure\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"Outline\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Fountain\"}}\n\n\u002F\u002F 2. Read emitter list\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"ReadGraph\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Fountain\",\"Section\":\"Emitters\"}}\n\n\u002F\u002F 3. Deep-dive into an emitter (use ObjectPath from step 2)\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"Outline\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Fountain.NS_Fountain:Fountain\"}}\n```\n\n### Modifying Module Stack\n\n```json\n\u002F\u002F Add a module\n{\"object\":\"...NiagaraOperationLibrary\",\"function\":\"AddModule\",\"params\":{\"EmitterPath\":\"...Fountain\",\"ScriptUsage\":\"ParticleSpawn\",\"ModuleAssetPath\":\"\u002FNiagara\u002FModules\u002FAddVelocity\",\"Index\":1}}\n\n\u002F\u002F Set module input to a value\n{\"object\":\"...NiagaraOperationLibrary\",\"function\":\"SetModuleInputValue\",\"params\":{\"EmitterPath\":\"...Fountain\",\"ScriptUsage\":\"ParticleSpawn\",\"ModuleGuid\":\"...\",\"InputName\":\"Velocity\",\"Value\":\"(X=0,Y=0,Z=100)\"}}\n\n\u002F\u002F Bind module input to User parameter\n{\"object\":\"...NiagaraOperationLibrary\",\"function\":\"SetModuleInputBinding\",\"params\":{\"EmitterPath\":\"...Fountain\",\"ScriptUsage\":\"ParticleSpawn\",\"ModuleGuid\":\"...\",\"InputName\":\"Velocity\",\"LinkedParamName\":\"User.InitialVelocity\"}}\n```\n\n### Editing a Module Script's Internal Graph\n\n```\nReadGraph(\"\u002FGame\u002FFX\u002FModules\u002FMyModule\", \"Module\")\n→ Text representation of the node graph\n\nWriteGraph(\"\u002FGame\u002FFX\u002FModules\u002FMyModule\", \"Module\", \u003Cmodified text>)\n→ Diff result\n```\n\n### Modifying Renderer Properties\n\n```json\n\u002F\u002F Get renderer list\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"ReadGraph\",\"params\":{\"AssetPath\":\"...Fountain\",\"Section\":\"Renderers\"}}\n\n\u002F\u002F Read detailed renderer properties via reflection\n{\"object\":\"...ObjectOperationLibrary\",\"function\":\"DescribeObject\",\"params\":{\"ObjectPath\":\"...SpriteRenderer_0\"}}\n\n\u002F\u002F Set renderer property\n{\"object\":\"...ObjectOperationLibrary\",\"function\":\"SetObjectProperty\",\"params\":{\"ObjectPath\":\"...SpriteRenderer_0\",\"PropertyName\":\"Material\",\"JsonValue\":\"\\\"\u002FGame\u002FMaterials\u002FM_Particle\\\"\"}}\n```\n\n## Node Types in Graph Sections\n\n| Encoded Name | UClass | Description |\n|-------------|--------|-------------|\n| `FunctionCall:\u003CScriptPath>` | UNiagaraNodeFunctionCall | Module\u002Ffunction call (asset module) |\n| `FunctionCall:ScratchPad:\u003CName>` | UNiagaraNodeFunctionCall | ScratchPad (Local Module) reference |\n| `Assignment` | UNiagaraNodeAssignment | Inline assignment |\n| `CustomHlsl` | UNiagaraNodeCustomHlsl | Custom HLSL code |\n| `ParameterMapGet` | UNiagaraNodeParameterMapGet | Read from parameter map |\n| `ParameterMapSet` | UNiagaraNodeParameterMapSet | Write to parameter map |\n| `NiagaraOp` | UNiagaraNodeOp | Math operation (OpName property) |\n| `NiagaraNodeInput` | UNiagaraNodeInput | Input node |\n| `NiagaraNodeOutput` | UNiagaraNodeOutput | Output node |\n\n### Working with ScratchPad (Local Module) Scripts\n\nScratchPad scripts are inline module\u002Ffunction\u002Fdynamic-input scripts embedded within a System or Emitter. They appear in `[ScratchPadScripts]` and are referenced in graphs as `FunctionCall:ScratchPad:\u003CName>`.\n\n```json\n\u002F\u002F 1. Read ScratchPad list from source system\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"ReadGraph\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Source\",\"Section\":\"ScratchPadScripts\"}}\n\n\u002F\u002F 2. Create matching ScratchPad scripts in target system\n{\"object\":\"...NiagaraOperationLibrary\",\"function\":\"CreateScratchPadScript\",\"params\":{\"SystemOrEmitter\":\"\u002FGame\u002FFX\u002FNS_Target\",\"ScriptName\":\"MyModule\",\"Usage\":\"Module\",\"ModuleUsageBitmask\":56}}\n\n\u002F\u002F 3. Read source ScratchPad internal graph (use ObjectPath from step 1)\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"ReadGraph\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Source.NS_Source:MyModule\",\"Section\":\"Module\"}}\n\n\u002F\u002F 4. Write to target ScratchPad (use ObjectPath from step 2)\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"WriteGraph\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Target.NS_Target:MyModule\",\"Section\":\"Module\",\"GraphText\":\"...\"}}\n\n\u002F\u002F 5. Now write stage graphs — FunctionCall:ScratchPad:MyModule auto-resolves to target system's script\n```\n\n## Important Notes\n\n- **GUID Preservation**: When editing graphs with WriteGraph, preserve existing node `#guid` values to ensure correct diff matching.\n- **Emitters are embedded**: Emitters inside a System are copies, not references. Access them via ObjectPath from the `[Emitters]` section.\n- **ParticleAttributes are read-only**: They are derived from compiled scripts. To add\u002Fremove particle attributes, add\u002Fremove modules that write to `Particles.` namespace.\n- **Prefer OperationLibrary for module stack changes**: Use AddModule\u002FRemoveModule\u002FSetModuleInput instead of WriteGraph for System\u002FEmitter stage graphs, as these APIs correctly handle Rapid Iteration parameters and Override node management.\n","# Niagara Editing\n\nNiagara editing uses three complementary paths: **NiagaraOperationLibrary** for structural operations, **NodeCode** for graph\u002Fproperty reading and writing, and **ObjectOperationLibrary** for detailed UObject property access.\n\n**Prerequisite**: UE editor running with UCP plugin enabled.\n\n## API Overview\n\n### NiagaraOperationLibrary (structural operations)\n\nCDO: `\u002FScript\u002FUnrealClientProtocolEditor.Default__NiagaraOperationLibrary`\n\nUObject path parameters (System, Emitter, Script, etc.) are auto-resolved by UCP — pass the object path as a string and UCP converts it to the UObject pointer.\n\n| Function | Params | Description |\n|----------|--------|-------------|\n| `AddEmitter` | `System`(path), `SourceEmitter`(path), `Name` | Add emitter to system |\n| `RemoveEmitter` | `System`(path), `EmitterName` | Remove emitter from system |\n| `ReorderEmitter` | `System`(path), `EmitterName`, `NewIndex` | Reorder emitter |\n| `AddUserParameter` | `System`(path), `ParamName`, `TypeName`, `DefaultValue` | Add User parameter |\n| `RemoveUserParameter` | `System`(path), `ParamName` | Remove User parameter |\n| `AddModule` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleScript`(path), `Index` | Add module to stack |\n| `RemoveModule` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid` | Remove module |\n| `MoveModule` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `NewIndex` | Reorder module |\n| `SetModuleEnabled` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `bEnabled` | Enable\u002Fdisable module |\n| `GetModules` | `SystemOrEmitter`(path), `ScriptUsage` | List modules with name\u002Fguid\u002Fenabled\u002FscriptPath |\n| `SetModuleInputValue` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `InputName`, `Value` | Set input to literal (Rapid Iteration) |\n| `SetModuleInputBinding` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `InputName`, `LinkedParamName` | Bind input to parameter |\n| `SetModuleInputDynamicInput` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `InputName`, `DynamicInputScript`(path) | Set dynamic input |\n| `ResetModuleInput` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid`, `InputName` | Reset to default |\n| `GetModuleInputs` | `SystemOrEmitter`(path), `ScriptUsage`, `ModuleNodeGuid` | List inputs with name\u002Ftype\u002Fmode\u002Fvalue |\n| `AddRenderer` | `Emitter`(path), `RendererClassName` | Add renderer |\n| `RemoveRenderer` | `Emitter`(path), `RendererIndex` | Remove renderer |\n| `MoveRenderer` | `Emitter`(path), `RendererIndex`, `NewIndex` | Reorder renderer |\n| `AddEventHandler` | `Emitter`(path) | Add event handler |\n| `RemoveEventHandler` | `Emitter`(path), `UsageIdString` | Remove event handler |\n| `AddSimulationStage` | `Emitter`(path) | Add simulation stage |\n| `RemoveSimulationStage` | `Emitter`(path), `StageIdString` | Remove simulation stage |\n| `MoveSimulationStage` | `Emitter`(path), `StageIdString`, `NewIndex` | Reorder simulation stage |\n| `AddGraphParameter` | `Script`(path), `ParamName`, `TypeName` | Add parameter to script graph |\n| `RemoveGraphParameter` | `Script`(path), `ParamName` | Remove parameter |\n| `RenameGraphParameter` | `Script`(path), `OldName`, `NewName` | Rename parameter |\n| `CreateScratchPadScript` | `SystemOrEmitter`(path), `ScriptName`, `Usage`, `ModuleUsageBitmask` | Create a ScratchPad (Local Module) script |\n\n### NodeCode (graph + properties reading\u002Fwriting)\n\nCDO: `\u002FScript\u002FUnrealClientProtocolEditor.Default__NodeCodeEditingLibrary`\n\n| Function | Params | Description |\n|----------|--------|-------------|\n| `Outline` | `AssetPath` | List available sections |\n| `ReadGraph` | `AssetPath`, `Section` | Read section content as text |\n| `WriteGraph` | `AssetPath`, `Section`, `GraphText` | Write section content back |\n\n## Section Model\n\n### System Asset (UNiagaraSystem)\n\n| Section | Type | Description |\n|---------|------|-------------|\n| `[SystemProperties]` | Properties | Warmup, bounds, determinism, scalability, LWC, render defaults |\n| `[Emitters]` | Properties | Emitter list with names, enabled state, ObjectPath |\n| `[UserParameters]` | Properties | User. namespace exposed parameters |\n| `[ScratchPadScripts]` | Properties | Local Module scripts with name, Usage, ModuleUsageBitmask, ObjectPath |\n| `[SystemSpawn]` | Graph | System spawn stage module chain |\n| `[SystemUpdate]` | Graph | System update stage module chain |\n\n### Emitter Object (UNiagaraEmitter, accessed via ObjectPath from [Emitters])\n\n| Section | Type | Description |\n|---------|------|-------------|\n| `[EmitterProperties]` | Properties | SimTarget, bLocalSpace, bounds, allocation, inheritance |\n| `[ParticleAttributes]` | Properties (read-only) | Compiled particle attributes list |\n| `[Renderers]` | Properties | Renderer list with class, ObjectPath |\n| `[EventHandlers]` | Properties | Event handler configs |\n| `[SimulationStages]` | Properties | Simulation stage list |\n| `[EmitterSpawn]` | Graph | Emitter spawn stage |\n| `[EmitterUpdate]` | Graph | Emitter update stage |\n| `[ParticleSpawn]` | Graph | Particle spawn stage |\n| `[ParticleUpdate]` | Graph | Particle update stage |\n| `[ParticleEvent:EventId]` | Graph | Event handler graph |\n| `[SimulationStage:StageId]` | Graph | Custom simulation stage graph |\n\n### Standalone Script (UNiagaraScript)\n\n| Section | Type | Description |\n|---------|------|-------------|\n| `[Module]` | Graph | Module script graph |\n| `[Function]` | Graph | Function script graph |\n| `[DynamicInput]` | Graph | Dynamic input script graph |\n\n## ScriptUsage Values\n\nUse these strings for `ScriptUsage` parameter:\n\n`SystemSpawn`, `SystemUpdate`, `EmitterSpawn`, `EmitterUpdate`, `ParticleSpawn`, `ParticleUpdate`, `ParticleEvent`, `SimulationStage`, `Module`, `Function`, `DynamicInput`\n\n## Parameter Namespaces\n\n| Namespace | Scope | Writable In |\n|-----------|-------|-------------|\n| `System.` | System-level attributes | System stages |\n| `Emitter.` | Emitter-level attributes | Emitter stages |\n| `Particles.` | Particle attributes | Particle stages |\n| `Module.` | Module input parameters | Module internal |\n| `User.` | User-exposed parameters | Runtime settable |\n| `Engine.` | Engine values (DeltaTime, etc.) | Read-only |\n| `Local.Module.` | Module-local temporaries | Module internal |\n| `Transient.` | Cross-module temporaries | Current stage |\n| `Constants.` | Rapid iteration parameters | Editor-set values |\n\n## Module Input Setting Methods\n\nModules can have their inputs set in four ways:\n\n1. **Literal Value** (`SetModuleInputValue`) — stored as Rapid Iteration Parameter in `Constants.EmitterName.ModuleName.InputName`, no graph nodes\n2. **Binding** (`SetModuleInputBinding`) — ParameterMapGet reads another parameter (e.g. `User.MyParam`, `Emitter.SpawnRate`)\n3. **Dynamic Input** (`SetModuleInputDynamicInput`) — a DynamicInput script computes the value\n4. **Data Interface** — a NiagaraNodeInput provides a data interface object\n5. **Default** — module's built-in default, no override\n\n## Workflow\n\n### Exploring a System\n\n```json\n\u002F\u002F 1. Get system structure\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"Outline\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Fountain\"}}\n\n\u002F\u002F 2. Read emitter list\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"ReadGraph\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Fountain\",\"Section\":\"Emitters\"}}\n\n\u002F\u002F 3. Deep-dive into an emitter (use ObjectPath from step 2)\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"Outline\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Fountain.NS_Fountain:Fountain\"}}\n```\n\n### Modifying Module Stack\n\n```json\n\u002F\u002F Add a module\n{\"object\":\"...NiagaraOperationLibrary\",\"function\":\"AddModule\",\"params\":{\"EmitterPath\":\"...Fountain\",\"ScriptUsage\":\"ParticleSpawn\",\"ModuleAssetPath\":\"\u002FNiagara\u002FModules\u002FAddVelocity\",\"Index\":1}}\n\n\u002F\u002F Set module input to a value\n{\"object\":\"...NiagaraOperationLibrary\",\"function\":\"SetModuleInputValue\",\"params\":{\"EmitterPath\":\"...Fountain\",\"ScriptUsage\":\"ParticleSpawn\",\"ModuleGuid\":\"...\",\"InputName\":\"Velocity\",\"Value\":\"(X=0,Y=0,Z=100)\"}}\n\n\u002F\u002F Bind module input to User parameter\n{\"object\":\"...NiagaraOperationLibrary\",\"function\":\"SetModuleInputBinding\",\"params\":{\"EmitterPath\":\"...Fountain\",\"ScriptUsage\":\"ParticleSpawn\",\"ModuleGuid\":\"...\",\"InputName\":\"Velocity\",\"LinkedParamName\":\"User.InitialVelocity\"}}\n```\n\n### Editing a Module Script's Internal Graph\n\n```\nReadGraph(\"\u002FGame\u002FFX\u002FModules\u002FMyModule\", \"Module\")\n→ Text representation of the node graph\n\nWriteGraph(\"\u002FGame\u002FFX\u002FModules\u002FMyModule\", \"Module\", \u003Cmodified text>)\n→ Diff result\n```\n\n### Modifying Renderer Properties\n\n```json\n\u002F\u002F Get renderer list\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"ReadGraph\",\"params\":{\"AssetPath\":\"...Fountain\",\"Section\":\"Renderers\"}}\n\n\u002F\u002F Read detailed renderer properties via reflection\n{\"object\":\"...ObjectOperationLibrary\",\"function\":\"DescribeObject\",\"params\":{\"ObjectPath\":\"...SpriteRenderer_0\"}}\n\n\u002F\u002F Set renderer property\n{\"object\":\"...ObjectOperationLibrary\",\"function\":\"SetObjectProperty\",\"params\":{\"ObjectPath\":\"...SpriteRenderer_0\",\"PropertyName\":\"Material\",\"JsonValue\":\"\\\"\u002FGame\u002FMaterials\u002FM_Particle\\\"\"}}\n```\n\n## Node Types in Graph Sections\n\n| Encoded Name | UClass | Description |\n|-------------|--------|-------------|\n| `FunctionCall:\u003CScriptPath>` | UNiagaraNodeFunctionCall | Module\u002Ffunction call (asset module) |\n| `FunctionCall:ScratchPad:\u003CName>` | UNiagaraNodeFunctionCall | ScratchPad (Local Module) reference |\n| `Assignment` | UNiagaraNodeAssignment | Inline assignment |\n| `CustomHlsl` | UNiagaraNodeCustomHlsl | Custom HLSL code |\n| `ParameterMapGet` | UNiagaraNodeParameterMapGet | Read from parameter map |\n| `ParameterMapSet` | UNiagaraNodeParameterMapSet | Write to parameter map |\n| `NiagaraOp` | UNiagaraNodeOp | Math operation (OpName property) |\n| `NiagaraNodeInput` | UNiagaraNodeInput | Input node |\n| `NiagaraNodeOutput` | UNiagaraNodeOutput | Output node |\n\n### Working with ScratchPad (Local Module) Scripts\n\nScratchPad scripts are inline module\u002Ffunction\u002Fdynamic-input scripts embedded within a System or Emitter. They appear in `[ScratchPadScripts]` and are referenced in graphs as `FunctionCall:ScratchPad:\u003CName>`.\n\n```json\n\u002F\u002F 1. Read ScratchPad list from source system\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"ReadGraph\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Source\",\"Section\":\"ScratchPadScripts\"}}\n\n\u002F\u002F 2. Create matching ScratchPad scripts in target system\n{\"object\":\"...NiagaraOperationLibrary\",\"function\":\"CreateScratchPadScript\",\"params\":{\"SystemOrEmitter\":\"\u002FGame\u002FFX\u002FNS_Target\",\"ScriptName\":\"MyModule\",\"Usage\":\"Module\",\"ModuleUsageBitmask\":56}}\n\n\u002F\u002F 3. Read source ScratchPad internal graph (use ObjectPath from step 1)\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"ReadGraph\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Source.NS_Source:MyModule\",\"Section\":\"Module\"}}\n\n\u002F\u002F 4. Write to target ScratchPad (use ObjectPath from step 2)\n{\"object\":\"...NodeCodeEditingLibrary\",\"function\":\"WriteGraph\",\"params\":{\"AssetPath\":\"\u002FGame\u002FFX\u002FNS_Target.NS_Target:MyModule\",\"Section\":\"Module\",\"GraphText\":\"...\"}}\n\n\u002F\u002F 5. Now write stage graphs — FunctionCall:ScratchPad:MyModule auto-resolves to target system's script\n```\n\n## Important Notes\n\n- **GUID Preservation**: When editing graphs with WriteGraph, preserve existing node `#guid` values to ensure correct diff matching.\n- **Emitters are embedded**: Emitters inside a System are copies, not references. Access them via ObjectPath from the `[Emitters]` section.\n- **ParticleAttributes are read-only**: They are derived from compiled scripts. To add\u002Fremove particle attributes, add\u002Fremove modules that write to `Particles.` namespace.\n- **Prefer OperationLibrary for module stack changes**: Use AddModule\u002FRemoveModule\u002FSetModuleInput instead of WriteGraph for System\u002FEmitter stage graphs, as these APIs correctly handle Rapid Iteration parameters and Override node management.\n",{"name":5,"description":7},"main","18d0e63d1313ca87098f614aa7c1e2dcf6de79c7","backend\u002Fskills\u002Fuse_skills\u002Funreal-niagara-editing",1,"https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system","https:\u002F\u002Fgithub.com\u002Fwelflau","2026-11-12 14:55:20",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add welflau\u002Fai-dev-system --skill unreal-niagara-editing",{"tool":59,"command":60},"bunx","bunx skills add welflau\u002Fai-dev-system --skill unreal-niagara-editing",{"tool":62,"command":63},"pnpm","pnpm dlx skills add welflau\u002Fai-dev-system --skill unreal-niagara-editing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fuse_skills\u002Funreal-niagara-editing\u002FSKILL.md",true,[],[68,102,132,156,181,204],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":72,"licenseFileUrl":73,"sourceHtmlUrl":74,"categories":75,"keywords":81,"publishedAt":41},"01M6HSTDP4M3JFXEBK91VFB4PA","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FSKILL.md",[76],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[82,83,84,85,86,87,88,89,90,91,92,93,94,95,35,96,97,98,99,100,101],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","routing","state management","state","file","Tailwind","single-file","simple","ui components","multi","for","single",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":72,"licenseFileUrl":106,"sourceHtmlUrl":107,"categories":108,"keywords":118,"publishedAt":41},"01M6HSDXH0JSP8R3QTNY9XZ8HN","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FSKILL.md",[109,110,113],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},{"categoryNo":111,"categoryName":112,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":114,"categoryName":115,"taxonomyType":116,"taxonomyTypeDesc":117},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[87,119,120,88,83,89,90,121,32,122,84,123,124,125,35,126,127,128,129,130,131,23],"design","frontend design","react components","code","examples","applications","landing","ui design","pages","aesthetics","web ui","with","generic",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":72,"licenseFileUrl":136,"sourceHtmlUrl":137,"categories":138,"keywords":140,"publishedAt":41},"01M6HSA77QYVP7A72HREGTDN2C","algorithmic-art","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FSKILL.md",[139],{"categoryNo":111,"categoryName":112,"taxonomyType":79,"taxonomyTypeDesc":80},[141,142,143,32,122,144,145,146,147,35,148,149,30,150,130,151,152,153,154,155,23],"algorithmic art","Art","algorithmic","flow","js","work","interactive","generative art","exploration","users","Existing","request","generative","copyright","fields",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":72,"licenseFileUrl":160,"sourceHtmlUrl":161,"categories":162,"keywords":164,"publishedAt":41},"01M6HS9HE0X390Y6RQKTY1YNGJ","theme-factory","Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors\u002Ffonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FSKILL.md",[163],{"categoryNo":111,"categoryName":112,"taxonomyType":79,"taxonomyTypeDesc":80},[165,166,167,168,169,170,84,39,171,172,125,173,174,127,175,130,176,177,178,100,179,180],"theme factory","factory","theme","docs","toolkit","generate","fly","slides","styling","artifact","themes","you","fonts","can","apply","new",{"skillNo":182,"name":183,"nameZh":6,"description":184,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":185,"categories":186,"keywords":190,"publishedAt":41},"01M6HS74GASM6FJ77F83EY679E","browsing","Use when you need direct browser control - teaches Chrome DevTools Protocol for controlling existing browser sessions, multi-tab management, form automation, and content extraction via use_browser MCP tool","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fsuperpowers-chrome\u002Fskills\u002Fbrowsing\u002FSKILL.md",[187],{"categoryNo":188,"categoryName":189,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000023","Skill与智能体开发",[183,191,192,193,194,195,196,197,198,199,200,35,201,202,28,203,99,176,100,151],"MCP","automation","chrome","sessions","protocol","browser","devtools","chrome devtools","tool","direct","browser control","control","form",{"skillNo":205,"name":206,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":72,"licenseFileUrl":208,"sourceHtmlUrl":209,"categories":210,"keywords":217,"publishedAt":41},"01M6HS6BZT2CKDNQ6YF20DXN4T","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FSKILL.md",[211,214],{"categoryNo":212,"categoryName":213,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":215,"categoryName":216,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000016","图像与多媒体",[218,219,220,221,222,223,224,225,226,35,227,150,228,229,230,100,152,23],"slack gif creator","slack","gif","creator","validation","Tools","constraints","Animation","knowledge","me","make","Utilities","concepts"]