Unity Plugin Skill
Control Unity Editor through ~100 built-in tools. Works in both Editor and Play mode.
Connection Modes
1. OpenClaw Gateway (Remote)
For Telegram, Discord, and other OpenClaw channels:
- Auto-connects when Unity opens
- Configure in: Window → OpenClaw Plugin → Settings
2. MCP Bridge (Local)
For Claude Code, Cursor, and local AI tools:
- Start: Window → OpenClaw Plugin → MCP Bridge → Start
- Default port: 27182
- Add to Claude Code:
claude mcp add unity -- node <path>/MCP~/index.js
First-Time Setup
If
unity_execute
tool is not available, install the gateway extension:
# From skill directory
./scripts/install-extension.sh
Restart gateway
openclaw gateway restart
The extension files are in
extension/
directory.
What install-extension.sh Does
# 1. Copies extension files from skill to gateway
# Source: <skill>/extension/
# Destination: ~/.openclaw/extensions/unity/
2. Files installed:
- index.ts # Extension entry point (HTTP handlers, tools)
- package.json # Extension metadata
After installation, restart gateway to load the extension.
🔐 Security
이 스킬은
disableModelInvocation: true
로 설정되어 있습니다.
- AI가 자동으로 도구를 호출하지 않음
- 사용자가 명시적으로 요청한 작업만 실행
설정 변경 방법은 README.md를 참조하세요.
Quick Reference
Core Tools
| Category | Key Tools |
|---|
| Scene | scene.getActive , scene.getData , scene.load , scene.open , scene.save
|
| GameObject | gameobject.find , gameobject.getAll , gameobject.create , gameobject.destroy
|
| Component | component.get , component.set , component.add , component.remove
|
| Transform | transform.setPosition , transform.setRotation , transform.setScale
|
| Debug | debug.hierarchy , debug.screenshot , console.getLogs
|
| Input | input.clickUI , input.type , input.keyPress , input.mouseClick
|
| Editor | editor.getState , editor.play , editor.stop , editor.refresh
|
| Material | material.create , material.assign , material.modify , material.getInfo
|
| Prefab | prefab.create , prefab.instantiate , prefab.open , prefab.save
|
| Asset | asset.find , asset.copy , asset.move , asset.delete
|
| Package | package.add , package.remove , package.list , package.search
|
| Test | test.run , test.list , test.getResults
|
Common Workflows
1. Scene Inspection
unity_execute: debug.hierarchy {depth: 2}
unity_execute: scene.getActive
2. Find & Modify Objects
unity_execute: gameobject.find {name: "Player"}
unity_execute: component.get {name: "Player", componentType: "Transform"}
unity_execute: transform.setPosition {name: "Player", x: 0, y: 5, z: 0}
3. UI Testing
unity_execute: input.clickUI {name: "PlayButton"}
unity_execute: input.type {text: "TestUser", elementName: "UsernameInput"}
unity_execute: debug.screenshot
4. Play Mode Control
unity_execute: editor.play # Enter Play mode
unity_execute: editor.stop # Exit Play mode
unity_execute: editor.getState # Check current state
unity_execute: editor.pause # Pause
unity_execute: editor.unpause # Resume
5. Material Creation
unity_execute: material.create {name: "RedMetal", color: "#FF0000", metallic: 0.8}
unity_execute: material.assign {gameObjectName: "Player", materialPath: "Assets/Materials/RedMetal.mat"}
unity_execute: material.modify {path: "Assets/Materials/RedMetal.mat", metallic: 1.0, emission: "#FF4444"}
6. Prefab Workflow
unity_execute: prefab.create {gameObjectName: "Player", path: "Assets/Prefabs/Player.prefab"}
unity_execute: prefab.instantiate {prefabPath: "Assets/Prefabs/Player.prefab", x: 0, y: 1, z: 0}
unity_execute: prefab.open {path: "Assets/Prefabs/Player.prefab"}
unity_execute: prefab.save
unity_execute: prefab.close
7. Asset Management
unity_execute: asset.find {query: "Player", type: "Prefab"}
unity_execute: asset.copy {sourcePath: "Assets/Prefabs/Player.prefab", destPath: "Assets/Backup/Player.prefab"}
unity_execute: asset.move {sourcePath: "Assets/Old/Item.prefab", destPath: "Assets/New/Item.prefab"}
8. Package Management
unity_execute: package.list
unity_execute: package.search {query: "TextMeshPro"}
unity_execute: package.add {packageName: "com.unity.textmeshpro"}
unity_execute: package.add {gitUrl: "https://github.com/example/package.git"}
9. Test Running
unity_execute: test.list {testMode: "EditMode"}
unity_execute: test.run {testMode: "EditMode", filter: "PlayerTests"}
unity_execute: test.getResults
10. Script Execution (Enhanced)
# Debug logging
unity_execute: script.execute {code: "Debug.Log('Hello')"}
Time manipulation
unity_execute: script.execute {code: "Time.timeScale = 0.5"}
PlayerPrefs
unity_execute: script.execute {code: "PlayerPrefs.SetInt('score', 100)"}
Reflection-based method calls
unity_execute: script.execute {code: "MyClass.MyMethod()"}
unity_execute: script.execute {code: "MyClass.MyStaticMethod('param1', 123)"}
Tool Categories (~100 tools)
Console (3 tools)
console.getLogs
- Get logs with optional type filter (Log/Warning/Error)
console.getErrors
- Get error/exception logs (with optional warnings)
console.clear
- Clear captured logs
Scene (7 tools)
scene.list
- List scenes in build settings
scene.getActive
- Get active scene info
scene.getData
- Get full hierarchy data
scene.load
- Load scene by name (Play mode)
scene.open
- Open scene in Editor mode
scene.save
- Save active scene (Editor mode)
scene.saveAll
- Save all open scenes (Editor mode)
GameObject (8 tools)
gameobject.find
- Find by name, tag, or component
gameobject.getAll
- Get all GameObjects with filtering
gameobject.create
- Create object or primitive (Cube, Sphere, etc.)
gameobject.destroy
- Destroy object
gameobject.delete
- Delete object (alias for destroy)
gameobject.getData
- Get detailed data
gameobject.setActive
- Enable/disable
gameobject.setParent
- Change hierarchy
Transform (6 tools)
transform.getPosition
- Get world position {x, y, z}
transform.getRotation
- Get Euler rotation {x, y, z}
transform.getScale
- Get local scale {x, y, z}
transform.setPosition
- Set world position {x, y, z}
transform.setRotation
- Set Euler rotation
transform.setScale
- Set local scale
Component (5 tools)
component.add
- Add component by type name
component.remove
- Remove component
component.get
- Get component data/properties
component.set
- Set field/property value
component.list
- List available component types
Script (3 tools)
script.execute
- Execute code: Debug.Log, Time, PlayerPrefs, reflection calls
script.read
- Read script file
script.list
- List project scripts
Application (4 tools)
app.getState
- Get play mode, FPS, time
app.play
- Enter/exit Play mode
app.pause
- Toggle pause
app.stop
- Stop Play mode
Debug (3 tools)
debug.log
- Write to console
debug.screenshot
- Capture screenshot
debug.hierarchy
- Text hierarchy view
Editor (9 tools)
editor.refresh
- Refresh AssetDatabase (triggers recompile)
editor.recompile
- Request script recompilation
editor.domainReload
- Force domain reload
editor.focusWindow
- Focus window (game/scene/console/hierarchy/project/inspector)
editor.listWindows
- List open windows
editor.getState
- Get editor state
editor.play
- Enter Play mode
editor.stop
- Exit Play mode
editor.pause
/ editor.unpause
- Pause control
Input Simulation (10 tools)
input.keyPress
- Press and release key
input.keyDown
/ input.keyUp
- Hold/release key
input.type
- Type text into field
input.mouseMove
- Move cursor
input.mouseClick
- Click at position
input.mouseDrag
- Drag operation
input.mouseScroll
- Scroll wheel
input.getMousePosition
- Get cursor position
input.clickUI
- Click UI element by name
Material (5 tools) - NEW in v1.5.0
material.create
- Create material with shader, color, metallic, smoothness
material.assign
- Assign material to GameObject
material.modify
- Modify material properties (color, metallic, emission)
material.getInfo
- Get detailed material info with all shader properties
material.list
- List materials in project with filtering
Prefab (5 tools) - NEW in v1.5.0
prefab.create
- Create prefab from scene GameObject
prefab.instantiate
- Instantiate prefab in scene with position
prefab.open
- Open prefab for editing
prefab.close
- Close prefab editing mode
prefab.save
- Save currently edited prefab
Asset (7 tools) - NEW in v1.5.0
asset.find
- Search assets by query, type, folder
asset.copy
- Copy asset to new path
asset.move
- Move/rename asset
asset.delete
- Delete asset (with trash option)
asset.refresh
- Refresh AssetDatabase
asset.import
- Import/reimport specific asset
asset.getPath
- Get asset path by name
Package Manager (4 tools) - NEW in v1.5.0
package.add
- Install package by name or git URL
package.remove
- Remove installed package
package.list
- List installed packages
package.search
- Search Unity package registry
Test Runner (3 tools) - NEW in v1.5.0
test.run
- Run EditMode/PlayMode tests with filtering
test.list
- List available tests
test.getResults
- Get last test run results
Batch Execution (1 tool) - NEW in v1.6.0
batch.execute
- Execute multiple tools in one call (10-100x performance)
commands
: Array of {tool, params} objects
stopOnError
: Stop on first error (default: false)
Session (1 tool) - NEW in v1.6.0
session.getInfo
- Get session info (project, processId, machineName, sessionId)
ScriptableObject (6 tools) - NEW in v1.6.0
scriptableobject.create
- Create new ScriptableObject asset
scriptableobject.load
- Load and inspect ScriptableObject fields
scriptableobject.save
- Save ScriptableObject changes
scriptableobject.getField
- Get specific field value
scriptableobject.setField
- Set field value with auto-save
scriptableobject.list
- List ScriptableObjects in project
Shader (3 tools) - NEW in v1.6.0
shader.list
- List shaders in project
shader.getInfo
- Get shader properties and info
shader.getKeywords
- Get shader keywords
Texture (5 tools) - NEW in v1.6.0
texture.create
- Create new texture with color fill
texture.getInfo
- Get texture info (size, format, import settings)
texture.setPixels
- Fill region with color
texture.resize
- Resize texture via import settings
texture.list
- List textures in project
Custom Tools API - v1.6.0
Register project-specific tools:
OpenClawCustomTools.Register(
"mygame.getScore",
"Get current score",
(args) => new { success = true, score = GameManager.Score }
);
MCP Resources - v1.6.0
Access Unity data via MCP resource URIs:
| URI | Description |
|---|
unity://scene/hierarchy
| Scene hierarchy |
unity://scene/active
| Active scene info |
unity://project/scripts
| Script list |
unity://project/scenes
| Scene list |
unity://editor/state
| Editor state |
unity://console/logs
| Console logs |
unity://session/info
| Session info |
Tips
Screenshot Modes
- Play mode:
ScreenCapture
- includes all UI overlays
- Editor mode:
Camera.main.Render()
- no overlay UI
- Use
{method: "camera"}
for camera-only capture
Finding Objects
gameobject.find {name: "Player"} # By exact name
gameobject.find {tag: "Enemy"} # By tag
gameobject.find {componentType: "Camera"} # By component
gameobject.getAll {activeOnly: true} # All active objects
Script Recompilation
Unity may not auto-recompile after code changes. Use:
editor.refresh # Full asset refresh + recompile
Play Mode Transitions
- Plugin survives Play mode transitions via SessionState
- If connection lost, wait for auto-reconnect or use Window → OpenClaw Plugin → Settings → Connect
MCP Bridge Usage
For Claude Code / Cursor integration:
- Start: Window → OpenClaw Plugin → MCP Bridge → Start
- Register:
claude mcp add unity -- node /path/to/MCP~/index.js
- Verify:
curl http://127.0.0.1:27182/status
Input Simulation Limitation
Keyboard/mouse simulation works for UI interactions but NOT for
Input.GetKey()
. For gameplay testing:
- Use
transform.setPosition
to move objects directly
- Or migrate to Unity's new Input System
Troubleshooting
| Issue | Solution |
|---|
| Tool timeout | Check Unity is responding, try editor.getState
|
| Gateway no connection | Check Window → OpenClaw Plugin → Settings |
| MCP no connection | Start MCP Bridge, verify port 27182 |
| Scripts not updating | Use editor.refresh to force recompile |
| Wrong screenshot | Use Play mode for game view with UI |
| MCP 504 timeout | Unity busy or MCP Bridge not started |
| Test Runner not found | Install com.unity.test-framework package |
Links
- Skill Repository: https://github.com/TomLeeLive/openclaw-unity-skill
- Plugin Repository: https://github.com/TomLeeLive/openclaw-unity-plugin
- OpenClaw Docs: https://docs.openclaw.ai
- MCP Setup Guide: See Plugin Repository → Documentation~/SETUP_GUIDE.md
License
MIT License - See LICENSE file