unity-cli-plugin
Health Gecti
- License — License: Apache-2.0
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 19 GitHub stars
Code Basarisiz
- rm -rf — Recursive force deletion command in .github/workflows/convert-codex.yml
- exec() — Shell command execution in cli/core_bridge.py
- exec() — Shell command execution in cli/cs.py
Permissions Gecti
- Permissions — No dangerous permissions requested
This is a Claude Code plugin that provides AI-driven scene editing, GameObject/Component manipulation, profiling, and a C# REPL for Unity projects via 40+ built-in commands.
Security Assessment
The overall risk is Medium. The tool inherently relies on executing shell commands (`core_bridge.py` and `cs.py`) to send instructions from the CLI to the Unity Editor, which is its intended design. However, this does broaden the attack surface if a malicious prompt tricks the AI into executing unintended terminal operations. A recursive force deletion command (`rm -rf`) was flagged in a GitHub Actions workflow file, which poses a supply chain risk if the CI/CD pipeline is compromised. It does not request explicitly dangerous permissions, no hardcoded secrets were found, and no unknown outbound network requests were detected beyond standard local communication with the Unity Editor.
Quality Assessment
The project appears to be highly maintained and professional. It uses the permissive Apache-2.0 license and was updated very recently (pushed 0 days ago). With 19 GitHub stars, the community trust level is currently low due to its small size, meaning it has not yet been extensively battle-tested by a wide audience.
Verdict
Use with caution — the tool functions as designed and is well-maintained, but the reliance on shell execution and the presence of `rm -rf` in its workflows necessitate a thorough review of your AI agent's permissions before integrating it into production environments.
Claude Code plugin for Unity — AI-driven scene editing, GameObject/Component manipulation, profiling, and C# REPL via 40+ built-in commands. Works with any Unity 2022.3+ project.
unity-cli-plugin
Claude Code plugin for Unity Editor — powered by unity-csharpconsole
40+ commands for scene editing, components, assets, screenshots, profiling, and more.
Depends on unity-csharpconsole — a Roslyn-powered interactive C# REPL for Unity.
Quick Start · Usage · Commands · Custom Commands · Architecture
English | 中文
You: "Create 10 cubes in a circle and add Rigidbody to each"
Claude: Done. 10 cubes created at radius 5, each with a Rigidbody component.
CLI + Skills, Not MCP
Same approach as Playwright CLI — CLI commands exposed through Claude Code's skill system instead of MCP. Why:
- Token-efficient. Skills load on demand; MCP loads all tool schemas on every request.
- Unrestricted. Falls back to a full Roslyn C# REPL — not limited to predefined tools.
- No sidecar. Service runs inside Unity Editor. No extra process.
- Workflow-aware. Understands Unity's compile lifecycle, play mode, domain reload.
| CLI + Skills (this plugin) | MCP | |
|---|---|---|
| Context window cost | Low (on-demand) | High (always loaded) |
| C# REPL fallback | Yes | Limited or none |
| External server | None (in-process) | Required |
| Play-mode-aware refresh | Yes | No |
| Custom command discovery | Automatic | Manual registration |
| Runtime / IL2CPP | Yes (HybridCLR) | Varies |
Quick Start
Prerequisites: Claude Code, Unity 2022.3+, Python 3.7+
# 1. Add the marketplace & install the plugin
claude plugin marketplace add niqibiao/unity-cli-plugin
claude plugin install unity-cli-plugin
# 2. Install the Unity package (inside your project)
claude
> /unity-cli-setup
# 3. Verify
> /unity-cli-status
Usage
Just tell Claude what you want:
> Add a directional light and rotate it 45 degrees on X
> Find all "Enemy" objects and list their components
> Take a screenshot of the Scene View
> Start profiler recording with deep profiling
Claude picks the right command or writes C# code as needed.
Slash Commands
| Command | Description |
|---|---|
/unity-cli-setup |
Install the Unity package |
/unity-cli-status |
Check package and service status |
/unity-cli-refresh |
Trigger asset refresh / recompile |
/unity-cli-refresh-commands |
Refresh cached custom command list |
/unity-cli-sync-catalog |
Compare local command catalog with live list |
Direct CLI
python cli/cs.py exec --json --project . "Debug.Log(\"Hello\")"
python cli/cs.py command --json --project . gameobject create '{"name":"Cube","primitiveType":"Cube"}'
python cli/cs.py refresh --json --project . --exit-playmode --wait 60
python cli/cs.py batch --json --project . '[{"ns":"gameobject","action":"create","args":{"name":"A"}},{"ns":"gameobject","action":"create","args":{"name":"B"}}]'
python cli/cs.py list-commands --json --project . --timeout 10
Commands
46 built-in commands across 12 namespaces. All commands support --json output.
gameobject
| Action | Description |
|---|---|
find |
Find GameObjects by name, tag, or component type |
create |
Create a new GameObject (empty or primitive) |
destroy |
Destroy a GameObject |
get |
Get detailed info about a GameObject |
modify |
Change name, tag, layer, active state, or static flag |
set_parent |
Reparent a GameObject |
duplicate |
Duplicate a GameObject |
component
| Action | Description |
|---|---|
add |
Add a component to a GameObject |
remove |
Remove a component from a GameObject |
get |
Get serialized field data of a component |
modify |
Modify serialized fields of a component |
transform
| Action | Description |
|---|---|
get |
Get position, rotation, and scale |
set |
Set position, rotation, and/or scale (local or world) |
scene
| Action | Description |
|---|---|
hierarchy |
Get the full scene hierarchy tree, optionally with component info |
prefab
| Action | Description |
|---|---|
create |
Create a prefab asset from a scene GameObject |
instantiate |
Instantiate a prefab into the active scene |
unpack |
Unpack a prefab instance |
material
| Action | Description |
|---|---|
create |
Create a new material asset with a specified shader |
get |
Get material properties from an asset or a Renderer |
assign |
Assign a material to a Renderer component |
screenshot
| Action | Description |
|---|---|
scene_view |
Capture the Scene View to an image file |
game_view |
Capture the Game View to an image file |
profiler
| Action | Description |
|---|---|
start |
Start Profiler recording (optional deep profiling) |
stop |
Stop Profiler recording |
status |
Get current Profiler state |
save |
Save recorded profiler data to a .raw file |
editor
| Action | Description |
|---|---|
status |
Get editor state and play mode info |
playmode.status |
Get current play mode state |
playmode.enter |
Enter play mode |
playmode.exit |
Exit play mode |
menu.open |
Execute a menu item by path |
window.open |
Open an editor window by type name |
console.get |
Get editor console log entries |
console.clear |
Clear the editor console |
project
| Action | Description |
|---|---|
scene.list |
List all scenes in the project |
scene.open |
Open a scene by path |
scene.save |
Save the current scene |
selection.get |
Get the current editor selection |
selection.set |
Set the editor selection |
asset.list |
List assets by type filter |
asset.import |
Import an asset by path |
asset.reimport |
Reimport an asset by path |
session
| Action | Description |
|---|---|
list |
List active REPL sessions |
inspect |
Inspect a session's state |
reset |
Reset a session's compiler and executor |
command
| Action | Description |
|---|---|
list |
List all registered commands (built-in + custom) |
Custom Commands
Add [CommandAction] to any static method — auto-discovered at startup, no registration needed. Parameters are bound automatically from JSON args by name.
using Zh1Zh1.CSharpConsole.Service.Commands.Routing;
public static class MyCommands
{
// Minimal form — return (bool, string) tuple
[CommandAction("custom", "greet", summary: "Say hello")]
private static (bool, string) Greet(string name = "World")
{
return (true, $"Hello, {name}!");
}
}
For structured data, return CommandResponse:
using Zh1Zh1.CSharpConsole.Service.Commands.Core;
using Zh1Zh1.CSharpConsole.Service.Commands.Routing;
public static class MyCommands
{
[CommandAction("mygame", "spawn", editorOnly: true, runOnMainThread: true, summary: "Spawn prefab instances")]
private static CommandResponse Spawn(string prefabPath, int count = 1)
{
// ... instantiation logic ...
return CommandResponseFactory.Ok($"Spawned {count} instance(s)");
}
}
Run /unity-cli-refresh-commands to make Claude aware of new commands.
Architecture
Claude Code Unity Editor
┌──────────────────┐ ┌──────────────────────────┐
│ Skills │ │ com.zh1zh1.csharpconsole│
│ ┌────────────┐ │ │ ┌────────────────────┐ │
│ │ cli-command│──┼── HTTP ──▶ │ │ ConsoleHttpService │ │
│ │ cli-exec │ │ │ │ ├─ CommandRouter │ │
│ └────────────┘ │ │ │ ├─ REPL Compiler │ │
│ │ │ │ └─ REPL Executor │ │
│ Python CLI │ │ └────────────────────┘ │
│ ┌────────────┐ │ │ │
│ │ cs.py │ │ │ 40+ CommandActions │
│ │ core_bridge│ │ │ (GameObject, Component, │
│ └────────────┘ │ │ Prefab, Material, ...) │
└──────────────────┘ └──────────────────────────┘
- Plugin layer: Skills and slash commands invoked by Claude Code
- CLI layer: Python dispatcher, serializes requests to JSON
- Unity layer: unity-csharpconsole — HTTP service, auto-discovered command handlers, Roslyn C# REPL
Auto-detects project root and service port. No manual configuration.
Troubleshooting
| Problem | Solution |
|---|---|
service: UNREACHABLE |
Make sure Unity Editor is open with the project loaded |
package: NOT FOUND |
Run /unity-cli-setup or check Packages/manifest.json |
| Port conflict | Service auto-advances to the next free port. Check Temp/CSharpConsole/refresh_state.json |
| Commands not found | Ensure the package compiled successfully (no errors in Unity Console) |
| Version mismatch | Run /unity-cli-status to check version info. Update the package if protocol differs |
License
If this plugin saves you time, consider giving it a star. It helps others find it.
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi