Unity를 OpenClaw AI 어시스턴트와 HTTP로 연결합니다. Play 모드 없이 Editor 모드에서도 작동합니다!
이 소프트웨어는 베타 버전입니다. 사용에 따른 책임은 본인에게 있습니다.
- 사용 전 항상 프로젝트를 백업하세요
- 별도의 테스트 프로젝트에서 먼저 테스트하세요
- 저작자는 데이터 손실이나 프로젝트 손상에 대해 책임지지 않습니다
전체 조항은 LICENSE를 참조하세요.
이 플러그인은 두 가지 연결 모드를 지원합니다 - 워크플로우에 맞게 선택하세요:
Telegram/Discord/Web → OpenClaw Gateway → Unity Plugin
- ✅ 어디서든 원격 접속
- ✅ 채팅 통합 (Telegram, Discord 등)
- ✅ 크론 작업, 자동화, 멀티 디바이스
⚠️ OpenClaw Gateway 실행 필요
Claude Code/Desktop → MCP Server → Unity Plugin
- ✅ 직접 연결, 미들웨어 불필요
- ✅ Claude Code, Cursor 등과 바로 연동
- ✅ 로컬 개발 시 낮은 지연시간
⚠️ 로컬 전용 (127.0.0.1)
| 모드 | 설정 방법 |
|---|---|
| OpenClaw | 플러그인 설치만 하면 Gateway가 연결 처리 |
| MCP | MCP Bridge 활성화: Window > OpenClaw > Start MCP Bridge |
📖 Setup Guide | 셋업 가이드
- 🎮 Editor & Play 모드 모두 지원 - AI 도구 사용에 Play 버튼 불필요
- 🔌 자동 연결 - Unity 시작 시 연결, 모드 전환 시에도 연결 유지
- 📋 콘솔 통합 - 디버깅을 위한 Unity 로그 캡처 및 조회
- 🎬 씬 관리 - 씬 목록, 로드, 검사
- 🔧 컴포넌트 편집 - 컴포넌트 추가, 제거, 속성 수정
- 📸 디버그 도구 - 스크린샷, 하이어라키 뷰 등
- 🎯 입력 시뮬레이션 - 게임 테스트를 위한 키보드, 마우스, UI 상호작용
- 🔄 에디터 제어 - 원격으로 리컴파일 및 에셋 새로고침 트리거
- 🔒 보안 제어 - 허용 작업 설정 가능
| 구성요소 | 버전 |
|---|---|
| Unity | 2021.3+ |
| OpenClaw | 2026.2.3+ |
⚠️ Unity 6000.3 (Unity 6.3 LTS)에서만 테스트되었습니다.Unity 2021.3+ 용으로 설계되었지만, Unity 6000.3.7f1 (Unity 6.3 LTS)에서만 테스트되었습니다. 다른 Unity 버전에서 문제가 발생하면:
- 🐛 Issue 등록 - Unity 버전과 에러 내용 포함
- 🔧 Pull Request 제출 - 수정사항이 있다면
여러분의 기여가 모든 Unity 버전 지원에 도움이 됩니다!
- Unity Package Manager 열기 (
Window > Package Manager) +→Add package from git URL...클릭- 입력:
https://github.com/TomLeeLive/openclaw-unity-plugin.git
- 이 저장소 클론
- Unity에서:
Window > Package Manager→+→Add package from disk... package.json파일 선택
Gateway 확장 파일을 OpenClaw에 복사:
# 확장 파일 복사
cp -r OpenClawPlugin~/* ~/.openclaw/extensions/unity/
# 확장 로드를 위해 Gateway 재시작
openclaw gateway restart
# 확인
openclaw unity status참고:
OpenClawPlugin~에는unity_execute및unity_sessions도구를 활성화하는 Gateway 확장이 포함되어 있습니다. OpenClaw가 Unity와 통신하려면 필수입니다.
위의 설치 섹션에서 Git URL 또는 로컬 패키지 설정을 참조하세요.
Window > OpenClaw Plugin열기- Gateway URL 설정:
http://localhost:18789(기본값) - Unity 시작 시 자동 연결
- 연결되면 상태가 녹색으로 표시
OpenClaw에게 씬 검사, 오브젝트 생성, 이슈 디버그를 요청하세요 - Play 모드 진입 없이 모두 가능!
Companion skill은 AI를 위한 워크플로우 패턴과 도구 참조를 제공합니다:
# OpenClaw 워크스페이스에 skill 클론
git clone https://github.com/TomLeeLive/openclaw-unity-skill.git ~/.openclaw/workspace/skills/unity-pluginSkill 제공 내용:
- 50개 도구 전체 빠른 참조
- 일반적인 워크플로우 패턴 (씬 검사, UI 테스트 등)
- 상세한 파라미터 문서
- 문제 해결 가이드
참고: Skill은 Gateway 확장과 별개입니다. 확장은 도구를 활성화하고, skill은 AI가 효과적으로 사용하는 방법을 알려줍니다.
| 도구 | 설명 |
|---|---|
console.getLogs |
Unity 콘솔 로그 가져오기 (타입 필터 지원) |
console.getErrors |
에러/예외 로그 가져오기 (경고 포함 옵션) |
console.clear |
캡처된 로그 지우기 |
| 도구 | 설명 |
|---|---|
scene.list |
빌드 설정의 모든 씬 목록 |
scene.getActive |
활성 씬 정보 가져오기 |
scene.getData |
씬 하이어라키 데이터 가져오기 |
scene.load |
이름으로 씬 로드 (Play 모드) |
scene.open |
Editor 모드에서 씬 열기 |
| 도구 | 설명 |
|---|---|
gameobject.find |
이름, 태그, 컴포넌트 타입으로 찾기 |
gameobject.create |
GameObject 또는 프리미티브 생성 |
gameobject.destroy |
GameObject 파괴 |
gameobject.delete |
GameObject 삭제 (destroy 별칭) |
gameobject.getData |
상세 오브젝트 데이터 가져오기 |
gameobject.setActive |
오브젝트 활성화/비활성화 |
gameobject.setParent |
부모 변경 |
| 도구 | 설명 |
|---|---|
transform.getPosition |
월드 위치 가져오기 (x, y, z) |
transform.getRotation |
오일러 각도 회전값 가져오기 |
transform.getScale |
로컬 스케일 가져오기 |
transform.setPosition |
월드 위치 설정 |
transform.setRotation |
회전 설정 (오일러) |
transform.setScale |
로컬 스케일 설정 |
| 도구 | 설명 |
|---|---|
component.add |
오브젝트에 컴포넌트 추가 |
component.remove |
컴포넌트 제거 |
component.get |
컴포넌트 데이터 가져오기 |
component.set |
필드/속성 값 설정 |
component.list |
사용 가능한 타입 목록 |
| 도구 | 설명 |
|---|---|
script.execute |
코드/메서드 실행 (Debug.Log, Time.timeScale, PlayerPrefs, 리플렉션 호출) |
script.read |
스크립트 파일 내용 읽기 |
script.list |
프로젝트의 스크립트 파일 목록 |
| 도구 | 설명 |
|---|---|
app.getState |
플레이 모드, FPS 등 가져오기 |
app.play |
플레이 모드 진입 (Editor) |
app.pause |
일시정지 토글 (Editor) |
app.stop |
플레이 모드 종료 (Editor) |
| 도구 | 설명 |
|---|---|
debug.log |
콘솔에 쓰기 |
debug.screenshot |
스크린샷 캡처 (UI 포함) |
debug.hierarchy |
텍스트 하이어라키 뷰 |
| 도구 | 설명 |
|---|---|
editor.refresh |
AssetDatabase 새로고침 (리컴파일 트리거) |
editor.recompile |
스크립트 리컴파일 요청 |
editor.focusWindow |
Editor 창 포커스 (game/scene/console/hierarchy/project/inspector) |
editor.listWindows |
열린 Editor 창 모두 목록 |
| 도구 | 설명 |
|---|---|
input.keyPress |
키 누르고 떼기 |
input.keyDown |
키 누르고 있기 |
input.keyUp |
키 떼기 |
input.type |
입력 필드에 텍스트 입력 |
input.mouseMove |
마우스 커서 이동 |
input.mouseClick |
위치에서 클릭 |
input.mouseDrag |
A에서 B로 드래그 |
input.mouseScroll |
스크롤 휠 |
input.getMousePosition |
현재 커서 위치 가져오기 |
input.clickUI |
이름으로 UI 요소 클릭 |
| 도구 | 설명 |
|---|---|
material.create |
셰이더, 색상, 메탈릭, 매끄러움으로 머티리얼 생성 |
material.assign |
GameObject에 머티리얼 할당 |
material.modify |
머티리얼 속성 수정 (색상, 메탈릭, 이미션 등) |
material.getInfo |
모든 셰이더 속성 포함 상세 머티리얼 정보 |
material.list |
프로젝트 내 머티리얼 목록 (필터링) |
| 도구 | 설명 |
|---|---|
prefab.create |
씬 GameObject에서 프리팹 생성 |
prefab.instantiate |
씬에 프리팹 인스턴스화 (위치 지정) |
prefab.open |
프리팹 편집 모드 열기 |
prefab.close |
프리팹 편집 모드 닫기 |
prefab.save |
현재 편집 중인 프리팹 저장 |
| 도구 | 설명 |
|---|---|
asset.find |
쿼리, 타입, 폴더로 에셋 검색 |
asset.copy |
에셋을 새 경로로 복사 |
asset.move |
에셋 이동/이름 변경 |
asset.delete |
에셋 삭제 (휴지통 옵션) |
asset.refresh |
AssetDatabase 새로고침 |
asset.import |
특정 에셋 임포트/재임포트 |
asset.getPath |
이름으로 에셋 경로 가져오기 |
| 도구 | 설명 |
|---|---|
package.add |
패키지 설치 (이름 또는 git URL) |
package.remove |
설치된 패키지 제거 |
package.list |
설치된 패키지 목록 |
package.search |
Unity 패키지 레지스트리 검색 |
| 도구 | 설명 |
|---|---|
test.run |
EditMode/PlayMode 테스트 실행 (필터링) |
test.list |
사용 가능한 테스트 목록 |
test.getResults |
마지막 테스트 실행 결과 가져오기 |
| 도구 | 설명 |
|---|---|
batch.execute |
다중 도구 일괄 실행 (10-100x 성능 향상) |
예제:
{
"commands": [
{ "tool": "scene.getActive", "params": {} },
{ "tool": "gameobject.find", "params": { "name": "Player" } },
{ "tool": "debug.screenshot", "params": {} }
],
"stopOnError": false
}| 도구 | 설명 |
|---|---|
session.getInfo |
세션 정보 (프로젝트, processId, machineName) - 멀티 인스턴스 지원 |
| 도구 | 설명 |
|---|---|
scriptableobject.create |
새 ScriptableObject 에셋 생성 |
scriptableobject.load |
ScriptableObject 필드 로드 및 검사 |
scriptableobject.save |
ScriptableObject 변경사항 저장 |
scriptableobject.getField |
특정 필드 값 가져오기 |
scriptableobject.setField |
필드 값 설정 (자동 저장) |
scriptableobject.list |
프로젝트의 ScriptableObject 목록 |
| 도구 | 설명 |
|---|---|
shader.list |
프로젝트의 셰이더 목록 |
shader.getInfo |
셰이더 속성 및 정보 |
shader.getKeywords |
셰이더 키워드 가져오기 |
| 도구 | 설명 |
|---|---|
texture.create |
색상 채움으로 새 텍스처 생성 |
texture.getInfo |
텍스처 정보 (크기, 포맷, 임포트 설정) |
texture.setPixels |
영역 색상 채우기 |
texture.resize |
임포트 설정으로 텍스처 크기 조정 |
texture.list |
프로젝트의 텍스처 목록 |
프로젝트별 커스텀 도구를 등록하여 OpenClaw 기능을 확장할 수 있습니다:
using OpenClaw.Unity;
// 게임 코드에서
OpenClawCustomTools.Register(new CustomTool
{
Name = "mygame.spawnEnemy",
Description = "지정 위치에 적 스폰",
Execute = (args) => {
var x = args.TryGetValue("x", out var xv) ? Convert.ToSingle(xv) : 0;
var y = args.TryGetValue("y", out var yv) ? Convert.ToSingle(yv) : 0;
var z = args.TryGetValue("z", out var zv) ? Convert.ToSingle(zv) : 0;
// 스폰 로직
var enemy = EnemyManager.Spawn(new Vector3(x, y, z));
return new { success = true, spawned = enemy.name, position = new { x, y, z } };
}
});
// 간단한 등록 방법
OpenClawCustomTools.Register(
"mygame.getScore",
"현재 점수 가져오기",
(args) => new { success = true, score = GameManager.Score }
);MCP 프로토콜의 Resources 기능을 지원합니다. 다음 리소스에 접근 가능:
| URI | 설명 |
|---|---|
unity://scene/hierarchy |
현재 씬 하이어라키 |
unity://scene/active |
활성 씬 정보 |
unity://project/scripts |
프로젝트 스크립트 목록 |
unity://project/scenes |
빌드 설정 씬 목록 |
unity://project/assets?query=Player&type=Prefab |
에셋 검색 |
unity://editor/state |
에디터 상태 |
unity://console/logs |
콘솔 로그 |
unity://session/info |
세션 정보 |
┌─────────────────────────────────────────────────────────────┐
│ Unity Editor │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ OpenClawEditorBridge │ │
│ │ [InitializeOnLoad] │ │
│ │ │ │
│ │ • EditorApplication.delayCall → 안전한 초기화 │ │
│ │ • EditorApplication.update → 연결 폴링 │ │
│ │ • SessionState → Play 모드 전환 시 생존 │ │
│ └──────────────────────┬─────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ OpenClawConnectionManager │ │
│ │ (싱글톤 - 모드 간 공유) │ │
│ │ │ │
│ │ • 명령을 위한 HTTP 폴링 │ │
│ │ • 메인 스레드 실행 큐 │ │
│ │ • 자동 재연결 │ │
│ │ • 중첩 객체 지원 JSON 파싱 │ │
│ └──────────────────────┬─────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ OpenClawTools (50개 도구) │ │
│ │ │ │
│ │ • Scene/GameObject/Component 조작 │ │
│ │ • 디버그 도구 (스크린샷, 하이어라키) │ │
│ │ • 입력 시뮬레이션 (키보드, 마우스, UI) │ │
│ │ • 에디터 제어 (리컴파일, 새로고침) │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
│
│ HTTP
▼
┌──────────────────────────────────────────────────────────────┐
│ OpenClaw Gateway │
│ http://localhost:18789 │
│ │
│ 엔드포인트: │
│ • POST /unity/register - Unity 세션 등록 │
│ • POST /unity/heartbeat - 세션 유지 │
│ • GET /unity/poll - 명령 폴링 │
│ • POST /unity/result - 도구 실행 결과 전송 │
└──────────────────────────────────────────────────────────────┘
Assets > Create > OpenClaw > Config로 생성하고 Resources 폴더에 배치합니다.
| 설정 | 설명 | 기본값 |
|---|---|---|
gatewayUrl |
OpenClaw Gateway URL | http://localhost:18789 |
apiToken |
선택적 API 토큰 | (비어있음) |
autoConnect |
시작 시 연결 | true |
showStatusOverlay |
Game 뷰에 상태 표시 | true |
captureConsoleLogs |
AI용 로그 캡처 | true |
allowCodeExecution |
코드 실행 허용 | true |
allowFileAccess |
파일 작업 허용 | true |
allowSceneModification |
씬 변경 허용 | true |
You: 내 씬에 어떤 GameObjects가 있어?
OpenClaw: [debug.hierarchy 실행]
씬 구성:
▶ Main Camera [Camera, AudioListener]
▶ Directional Light [Light]
▶ Player [PlayerController, Rigidbody]
▶ Model [MeshRenderer]
▶ UI Canvas [Canvas, GraphicRaycaster]
▶ PlayButton [Button]
You: 로그인 플로우 테스트해줘 - 사용자명 "TestPlayer" 입력하고 Play 클릭
OpenClaw:
[input.clickUI {name: "UsernameInput"} 실행]
[input.type {text: "TestPlayer"} 실행]
[input.clickUI {name: "PlayButton"} 실행]
[debug.screenshot 실행]
완료! 사용자명 입력 클릭, "TestPlayer" 입력, Play 버튼 클릭했습니다.
결과를 보여주는 스크린샷 첨부.
You: PlayerController 스크립트 업데이트했어, Unity 리컴파일해줘
OpenClaw: [editor.recompile 실행]
스크립트 리컴파일 요청됨. Unity가 곧 리로드됩니다.
- Gateway 상태 확인:
openclaw gateway status - URL 확인: 기본값
http://localhost:18789 Window > OpenClaw Plugin에서 오류 확인
- 플러그인은
SessionState를 사용하여 도메인 리로드에서 생존 - Play 모드 전환 후 자동 재연결
- 멈춘 경우
editor.refresh사용 또는 "Force Reconnect" 클릭
- Play 모드:
ScreenCapture사용 (UI 포함) - Editor 모드:
Camera.main.Render()사용 (오버레이 UI 없음) - 정확한 게임 스크린샷은 Play 모드 사용
Unity의 "Enter Play Mode Settings"는 빠른 반복을 위해 도메인 리로드를 건너뛸 수 있지만, 이는 스크립트 리컴파일을 방지합니다.
증상:
- Play 모드 재진입 시 코드 변경 미적용
- 스크립트 저장에도 이전 동작 유지
- Play 모드 중
editor.refresh또는editor.recompile효과 없음
해결:
Edit → Project Settings → Editor이동- "Enter Play Mode Settings" 찾기
- ✅ "Reload Domain" 체크
설정 효과:
| 설정 | Reload Domain ON | Reload Domain OFF |
|---|---|---|
| 스크립트 변경 | ✅ Play 시 적용 | ❌ 수동 새로고침까지 무시 |
| Play 모드 진입 | ~2-5초 | ~0.5초 |
| 정적 변수 | 리셋 | 유지 |
| 적합한 상황 | 활발한 코딩 개발 | 코드 변경 없는 테스트/플레이 |
팁: 개발 중에는 "Reload Domain" ON 유지. 코드 변경 없이 빠른 반복이 필요할 때만 비활성화.
ClawHub에 퍼블리시하거나 스킬로 설치할 때, 스킬 메타데이터에서 disableModelInvocation을 설정할 수 있습니다:
| 설정 | AI 자동 호출 | 사용자 명시적 요청 |
|---|---|---|
false (기본값) |
✅ 허용 | ✅ 허용 |
true |
❌ 차단 | ✅ 허용 |
이유: Unity 작업 중 AI가 자율적으로 씬 확인, 스크린샷, GameObject 검사 등 보조 작업을 수행하는 것이 유용함.
true 사용 시기: 민감한 도구 (결제, 삭제, 메시지 전송 등)에 적합
# 스킬 메타데이터 예시
metadata:
openclaw:
disableModelInvocation: true # Unity 플러그인 권장값- 개발 전용: 프로덕션 빌드에서는
allowCodeExecution비활성화 - TextMeshPro: TMPro 유무와 관계없이 플러그인 작동 (리플렉션 사용)
- Unity 6: 지연 초기화로 UPM EPIPE 크래시 방지
버전 히스토리는 CHANGELOG.md 참조.
MIT 라이선스 - LICENSE 참조
Made with 🦞 by the OpenClaw community