| name | unity-playmode-testing |
| description | Supports Unity Play Mode control, input simulation, UI automation, and visual verification. Integrates test execution, screenshot/video capture, and console log checking. Use when: starting Play Mode, input simulation, UI clicks, screenshots, video recording, test execution |
Unity PlayMode & Testing
A guide for Play Mode control, input simulation, UI automation, and visual verification.
Quick Start
1. Play Mode Control
mcp__unity-mcp-server__play_game()
mcp__unity-mcp-server__get_editor_state()
mcp__unity-mcp-server__stop_game()
2. Input Simulation
mcp__unity-mcp-server__input_keyboard({
action: "press",
key: "w",
holdSeconds: 1.0
})
mcp__unity-mcp-server__input_mouse({
action: "click",
x: 500,
y: 300,
button: "left"
})
3. Screenshot
mcp__unity-mcp-server__capture_screenshot({
captureMode: "game"
})
Play Mode Control
Start, Pause, Stop
mcp__unity-mcp-server__play_game()
mcp__unity-mcp-server__pause_game()
mcp__unity-mcp-server__stop_game()
Check State
mcp__unity-mcp-server__get_editor_state()
Wait for State
mcp__unity-mcp-server__playmode_wait_for_state({
isPlaying: true,
timeoutMs: 10000,
pollMs: 500
})
mcp__unity-mcp-server__playmode_wait_for_state({
isPlaying: false,
timeoutMs: 5000
})
Input Simulation
Keyboard Input
mcp__unity-mcp-server__input_keyboard({
action: "press",
key: "space"
})
mcp__unity-mcp-server__input_keyboard({
action: "release",
key: "space"
})
mcp__unity-mcp-server__input_keyboard({
action: "press",
key: "w",
holdSeconds: 2.0
})
mcp__unity-mcp-server__input_keyboard({
action: "type",
text: "Hello World",
typingSpeed: 50
})
mcp__unity-mcp-server__input_keyboard({
action: "combo",
keys: ["ctrl", "shift", "s"],
holdSeconds: 0.1
})
Mouse Input
mcp__unity-mcp-server__input_mouse({
action: "move",
x: 500,
y: 300,
absolute: true
})
mcp__unity-mcp-server__input_mouse({
action: "click",
x: 500,
y: 300,
button: "left",
clickCount: 2
})
mcp__unity-mcp-server__input_mouse({
action: "drag",
startX: 100,
startY: 100,
endX: 300,
endY: 300,
button: "left"
})
mcp__unity-mcp-server__input_mouse({
action: "scroll",
deltaY: -120
})
mcp__unity-mcp-server__input_mouse({
action: "button",
buttonAction: "press",
button: "left",
holdSeconds: 1.0
})
Gamepad Input
mcp__unity-mcp-server__input_gamepad({
action: "button",
button: "a",
buttonAction: "press"
})
mcp__unity-mcp-server__input_gamepad({
action: "stick",
stick: "left",
x: 1.0,
y: 0.5,
holdSeconds: 1.0
})
mcp__unity-mcp-server__input_gamepad({
action: "trigger",
trigger: "right",
value: 0.8,
holdSeconds: 0.5
})
mcp__unity-mcp-server__input_gamepad({
action: "dpad",
direction: "up",
holdSeconds: 0.3
})
Touch Input
mcp__unity-mcp-server__input_touch({
action: "tap",
x: 500,
y: 300,
touchId: 0
})
mcp__unity-mcp-server__input_touch({
action: "swipe",
startX: 100,
startY: 500,
endX: 100,
endY: 200,
duration: 300
})
mcp__unity-mcp-server__input_touch({
action: "pinch",
centerX: 400,
centerY: 300,
startDistance: 100,
endDistance: 200
})
mcp__unity-mcp-server__input_touch({
action: "multi",
touches: [
{ x: 100, y: 200, phase: "began" },
{ x: 300, y: 200, phase: "began" }
]
})
Batch Input (Execute Multiple Actions Sequentially)
mcp__unity-mcp-server__input_keyboard({
actions: [
{ action: "press", key: "w", holdSeconds: 1.0 },
{ action: "press", key: "space" },
{ action: "type", text: "test" }
]
})
mcp__unity-mcp-server__input_mouse({
actions: [
{ action: "move", x: 100, y: 100 },
{ action: "click", button: "left" },
{ action: "move", x: 200, y: 200 },
{ action: "click", button: "left" }
]
})
UI Automation
elementPath (uGUI / UI Toolkit / IMGUI)
The path (= elementPath) returned by find_ui_elements differs in format depending on the UI system.
- uGUI:
/Canvas/... (GameObject hierarchy path)
- UI Toolkit:
uitk:<UIDocument GameObject path>#<VisualElement.name>
- Example:
uitk:/UITK/UIDocument#UITK_Button
- IMGUI:
imgui:<controlId> (ID registered in OnGUI)
- Example:
imgui:IMGUI/Button
Test scenes:
- uGUI:
UnityMCPServer/Assets/Scenes/MCP_UI_UGUI_TestScene.unity
- UI Toolkit:
UnityMCPServer/Assets/Scenes/MCP_UI_UITK_TestScene.unity
- IMGUI:
UnityMCPServer/Assets/Scenes/MCP_UI_IMGUI_TestScene.unity
- uGUI/UI Toolkit/IMGUI combined:
UnityMCPServer/Assets/Scenes/MCP_UI_AllSystems_TestScene.unity
- Note: UI is generated by
McpAllUiSystemsTestBootstrap at Play Mode start, so it's not visible in Edit Mode
- MCP E2E tests (scene load → Play Mode → ui_* tool calls):
- stdio / tools/call:
node --test mcp-server/tests/e2e/ui-automation-mcp-protocol.test.js
- UnityConnection direct:
node --test mcp-server/tests/e2e/ui-automation-scenes.test.js
Search UI Elements
mcp__unity-mcp-server__find_ui_elements({
elementType: "Button"
})
mcp__unity-mcp-server__find_ui_elements({
namePattern: "Start.*",
includeInactive: true
})
mcp__unity-mcp-server__find_ui_elements({
elementType: "Toggle",
canvasFilter: "SettingsCanvas"
})
UI Click
mcp__unity-mcp-server__click_ui_element({
elementPath: "/Canvas/StartButton"
})
mcp__unity-mcp-server__click_ui_element({
elementPath: "uitk:/UITK/UIDocument#UITK_Button"
})
mcp__unity-mcp-server__click_ui_element({
elementPath: "imgui:IMGUI/Button"
})
mcp__unity-mcp-server__click_ui_element({
elementPath: "/Canvas/ContextMenu",
clickType: "right"
})
mcp__unity-mcp-server__click_ui_element({
elementPath: "/Canvas/HoldButton",
holdDuration: 1000
})
mcp__unity-mcp-server__click_ui_element({
elementPath: "/Canvas/Slider",
position: { x: 0.8, y: 0.5 }
})
Get UI Element State
mcp__unity-mcp-server__get_ui_element_state({
elementPath: "/Canvas/StartButton",
includeInteractableInfo: true
})
mcp__unity-mcp-server__get_ui_element_state({
elementPath: "/Canvas/Panel",
includeChildren: true
})
Set UI Value
mcp__unity-mcp-server__set_ui_element_value({
elementPath: "/Canvas/NameInput",
value: "PlayerName",
triggerEvents: true
})
mcp__unity-mcp-server__set_ui_element_value({
elementPath: "/Canvas/VolumeSlider",
value: 0.75
})
mcp__unity-mcp-server__set_ui_element_value({
elementPath: "/Canvas/MuteToggle",
value: true
})
mcp__unity-mcp-server__set_ui_element_value({
elementPath: "/Canvas/DifficultyDropdown",
value: "Hard"
})
Compound UI Sequence
mcp__unity-mcp-server__simulate_ui_input({
inputSequence: [
{ type: "click", params: { elementPath: "/Canvas/NameInput" }},
{ type: "setvalue", params: { elementPath: "/Canvas/NameInput", value: "Player1" }},
{ type: "click", params: { elementPath: "/Canvas/StartButton" }}
],
waitBetween: 500,
validateState: true
})
Visual Capture
Screenshot
mcp__unity-mcp-server__capture_screenshot({
captureMode: "game"
})
mcp__unity-mcp-server__capture_screenshot({
captureMode: "scene"
})
mcp__unity-mcp-server__capture_screenshot({
captureMode: "game",
width: 1920,
height: 1080
})
mcp__unity-mcp-server__capture_screenshot({
captureMode: "game",
includeUI: false
})
mcp__unity-mcp-server__capture_screenshot({
captureMode: "game",
encodeAsBase64: true
})
Explorer Mode (LLM-Optimized Capture)
mcp__unity-mcp-server__capture_screenshot({
captureMode: "explorer",
explorerSettings: {
target: {
type: "gameObject",
name: "Player",
includeChildren: true
},
camera: {
autoFrame: true,
padding: 0.2
}
}
})
mcp__unity-mcp-server__capture_screenshot({
captureMode: "explorer",
explorerSettings: {
target: {
type: "tag",
tag: "Enemy"
},
display: {
showBounds: true,
highlightTarget: true
}
}
})
mcp__unity-mcp-server__capture_screenshot({
captureMode: "explorer",
explorerSettings: {
target: {
type: "area",
center: { x: 0, y: 0, z: 0 },
radius: 10
}
}
})
Screenshot Analysis
mcp__unity-mcp-server__analyze_screenshot({
imagePath: "Assets/../.unity/capture/screenshot.png",
analysisType: "basic"
})
mcp__unity-mcp-server__analyze_screenshot({
analysisType: "ui"
})
mcp__unity-mcp-server__analyze_screenshot({
analysisType: "content"
})
mcp__unity-mcp-server__analyze_screenshot({
analysisType: "full",
prompt: "Find all buttons in the UI"
})
Video Recording
mcp__unity-mcp-server__capture_video_start({
captureMode: "game",
fps: 30,
width: 1280,
height: 720
})
mcp__unity-mcp-server__capture_video_status()
mcp__unity-mcp-server__capture_video_stop()
mcp__unity-mcp-server__video_capture_for({
durationSec: 10,
play: true,
fps: 30
})
Testing & Debugging
Run Tests
mcp__unity-mcp-server__run_tests({
testMode: "EditMode"
})
mcp__unity-mcp-server__run_tests({
testMode: "PlayMode"
})
mcp__unity-mcp-server__run_tests({
testMode: "All"
})
mcp__unity-mcp-server__run_tests({
testMode: "EditMode",
filter: "PlayerTests",
namespace: "Tests.Player",
category: "Unit",
includeDetails: true
})
mcp__unity-mcp-server__run_tests({
testMode: "All",
exportPath: "TestResults/results.xml"
})
Check Test Status
mcp__unity-mcp-server__get_test_status()
mcp__unity-mcp-server__get_test_status({
includeTestResults: true,
includeFileContent: true
})
Console Logs
mcp__unity-mcp-server__read_console({
count: 100,
logTypes: ["Log", "Warning", "Error"]
})
mcp__unity-mcp-server__read_console({
logTypes: ["Error"],
includeStackTrace: true
})
mcp__unity-mcp-server__read_console({
filterText: "Player",
sortOrder: "newest"
})
mcp__unity-mcp-server__read_console({
sinceTimestamp: "2024-01-01T00:00:00Z"
})
mcp__unity-mcp-server__clear_console({
preserveErrors: true
})
Common Workflows
UI Automated Testing
mcp__unity-mcp-server__play_game()
mcp__unity-mcp-server__playmode_wait_for_state({ isPlaying: true })
mcp__unity-mcp-server__click_ui_element({
elementPath: "/Canvas/MainMenu/StartButton"
})
await new Promise(r => setTimeout(r, 1000))
mcp__unity-mcp-server__set_ui_element_value({
elementPath: "/Canvas/NameInput",
value: "TestPlayer"
})
mcp__unity-mcp-server__click_ui_element({
elementPath: "/Canvas/ConfirmButton"
})
mcp__unity-mcp-server__capture_screenshot({ captureMode: "game" })
mcp__unity-mcp-server__read_console({ logTypes: ["Error"] })
mcp__unity-mcp-server__stop_game()
Gameplay Recording
mcp__unity-mcp-server__video_capture_for({
durationSec: 30,
play: true
})
mcp__unity-mcp-server__play_game()
mcp__unity-mcp-server__capture_video_start()
mcp__unity-mcp-server__input_keyboard({
actions: [
{ action: "press", key: "w", holdSeconds: 2.0 },
{ action: "press", key: "space" },
{ action: "press", key: "a", holdSeconds: 1.0 }
]
})
mcp__unity-mcp-server__capture_video_stop()
mcp__unity-mcp-server__stop_game()
Bug Reproduction Automation
mcp__unity-mcp-server__load_scene({
scenePath: "Assets/Scenes/BugScene.unity"
})
mcp__unity-mcp-server__play_game()
mcp__unity-mcp-server__playmode_wait_for_state({ isPlaying: true })
mcp__unity-mcp-server__input_keyboard({
action: "press",
key: "e",
holdSeconds: 0.5
})
mcp__unity-mcp-server__input_mouse({
action: "click",
x: 500,
y: 300
})
mcp__unity-mcp-server__read_console({
logTypes: ["Error"],
includeStackTrace: true
})
mcp__unity-mcp-server__capture_screenshot({ captureMode: "game" })
mcp__unity-mcp-server__stop_game()
Common Mistakes
1. Missing Play Mode State Check
mcp__unity-mcp-server__input_keyboard({ action: "press", key: "w" })
mcp__unity-mcp-server__play_game()
mcp__unity-mcp-server__playmode_wait_for_state({ isPlaying: true })
mcp__unity-mcp-server__input_keyboard({ action: "press", key: "w" })
2. Forgetting Immediate Key Release
mcp__unity-mcp-server__input_keyboard({ action: "press", key: "shift" })
mcp__unity-mcp-server__input_keyboard({
action: "press",
key: "shift",
holdSeconds: 0.5
})
3. Wrong UI Element Path
elementPath: "Canvas/Button"
elementPath: "/Canvas/Button"
4. Forgetting to Stop Recording
mcp__unity-mcp-server__capture_video_start()
mcp__unity-mcp-server__capture_video_stop()
mcp__unity-mcp-server__video_capture_for({ durationSec: 10 })
5. Test Execution Timing
mcp__unity-mcp-server__run_tests({
testMode: "PlayMode",
includeDetails: true
})
Tool Reference
| Tool | Purpose |
|---|
play_game | Start Play Mode |
pause_game | Pause/Resume |
stop_game | Stop Play Mode |
get_editor_state | Get state |
playmode_wait_for_state | Wait for state |
input_keyboard | Keyboard input |
input_mouse | Mouse input |
input_gamepad | Gamepad input |
input_touch | Touch input |
find_ui_elements | Search UI elements |
click_ui_element | UI click |
get_ui_element_state | Get UI state |
set_ui_element_value | Set UI value |
simulate_ui_input | Compound UI sequence |
capture_screenshot | Screenshot |
analyze_screenshot | Screenshot analysis |
capture_video_start | Start recording |
capture_video_stop | Stop recording |
capture_video_status | Recording status |
video_capture_for | Record for specified seconds |
run_tests | Run tests |
get_test_status | Test status |
read_console | Read logs |
clear_console | Clear logs |