| name | unity-editor |
| description | Remote control Unity Editor via CLI using unityctl. Use when working with Unity projects to launch/stop editor, enter/exit play mode, compile scripts, view logs, load scenes, run tests, capture screenshots, or execute C# code for debugging. Activate when user mentions Unity, play mode, compilation, or needs to interact with a running Unity Editor. |
unityctl - Unity Editor Remote Control
Control a running Unity Editor from the command line without batch mode.
Instructions
Setup (Required First)
- Start the bridge daemon:
unityctl bridge start
- Launch Unity:
unityctl editor run or manually open the project in Unity Editor
- Verify connection:
unityctl status
Refresh Assets After Script Changes
After modifying C# scripts, refresh assets to compile:
unityctl asset refresh
Returns compilation errors directly in the output (non-zero exit code on failure). Fix errors and re-run until compilation succeeds before entering play mode.
Common Commands
Status & Bridge:
unityctl status
unityctl bridge start
unityctl bridge stop
Editor Lifecycle:
unityctl editor run
unityctl editor stop
Play Mode:
unityctl play enter
unityctl play exit
Logs:
unityctl logs
unityctl logs -n 50
unityctl logs --stack
unityctl logs --full
Scenes:
unityctl scene list
unityctl scene load Assets/Scenes/Main.unity
Testing:
unityctl test run
unityctl test run --mode playmode
Screenshots:
unityctl screenshot capture
Script Execution (Debugging Power Tool)
Execute arbitrary C# in the running editor via Roslyn. Invaluable for debugging and automation.
using UnityEngine;
public class Script
{
public static object Main()
{
return Application.version;
}
}
unityctl script execute -f tmp/get-version.cs
You can also execute code directly with -c:
unityctl script execute -c "using UnityEngine; public class Script { public static object Main() { return Application.version; } }"
Scripts must define a class with a public static object Main() method. The return value is JSON-serialized.
Getting Help
unityctl --help
unityctl <command> --help
Examples
Workflow: Edit script, compile, and test:
unityctl asset refresh
unityctl play enter
unityctl logs
unityctl play exit
Debug: Find all GameObjects in scene:
using UnityEngine;
public class Script
{
public static object Main()
{
return GameObject.FindObjectsOfType<GameObject>().Length;
}
}
unityctl script execute -f tmp/find-objects.cs
Debug: Inspect Player position:
using UnityEngine;
public class Script
{
public static object Main()
{
var go = GameObject.Find("Player");
return go?.transform.position.ToString() ?? "not found";
}
}
unityctl script execute -f tmp/find-player.cs
Debug: Log message to Unity console:
using UnityEngine;
public class Script
{
public static object Main()
{
Debug.Log("Hello from CLI");
return "logged";
}
}
unityctl script execute -f tmp/log-message.cs
Best Practices
- Run
unityctl status to check overall project status before running commands
- Always run
unityctl asset refresh after modifying C# files before entering play mode
- For script execution, write scripts to
tmp/<scriptname>.cs and execute with -f
Troubleshooting
Run unityctl status first to diagnose issues.
| Problem | Solution |
|---|
| Bridge not responding | unityctl bridge stop then unityctl bridge start |
| Editor not connected to newly started bridge | Normal, editor plugin uses exponential backoff, up to 30 seconds |
| Connection lost after compile | Normal - domain reload. Auto-reconnects. |
| "Project not found" | Run from project directory or use --project flag |
| Editor not found | Use --unity-path to specify Unity executable |