BurningTimesAi/프로젝트/수상한잡화점/시뮬레이터/04_MCP_호출_스니펫_v1.md

192 lines
6.3 KiB
Markdown
Raw Normal View History

---
type: 설계문서
project: 수상한잡화점
subject: Unity MCP 호출 스니펫 — 기획팀장용 복붙 템플릿
version: v1
date: 2026-04-17
status: 초판
author: 개발팀장
target_users: 기획팀장, /balance, /level 에이전트
---
# Unity MCP 호출 스니펫 v1
## 1. 사용 전제
1. **Unity Editor 기동 중** (`D:/NerdNavis/FilGoodBandits/DeckBuilding` 프로젝트 열림)
2. **Unity MCP 연결 상태** (`mcp__unity-mcp__*` 도구 사용 가능)
3. **독립 시뮬 어셈블리 컴파일 완료** (`Assets/Sim/NerdNavis.Sim.asmdef`)
4. **시나리오 JSON 파일 준비** (스키마: `02_시나리오_JSON_스키마_v1.md`)
검증 방법:
```
mcp__unity-mcp__execute_code (code: "UnityEngine.Debug.Log(\"MCP OK\");")
```
## 2. 3종 템플릿
### 2-1. 단일 실행 스니펫
**용도**: 시나리오 1건 즉시 실행하여 결과 확인.
**복붙용 프롬프트** (기획팀장이 Claude/PM에게 전달):
```
Unity MCP로 아래 시나리오 1건 실행해주세요:
- 시나리오 파일: {경로 예: D:/NerdNavis/FilGoodBandits/DeckBuilding/Assets/Sim/Scenarios/anchor_stage1.json}
- 출력 모드: stdout
- 결과 요지 요청: pc_survived, pc_remaining_hp_ratio, total_turns, defence_active_ratio
```
**MCP 도구 호출** (실행자가 실제 수행):
```csharp
mcp__unity-mcp__execute_code
code: """
using NerdNavis.Sim;
var runner = new SimulationRunner();
var result = runner.Run("Assets/Sim/Scenarios/anchor_stage1.json");
UnityEngine.Debug.Log(UnityEngine.JsonUtility.ToJson(result, true));
"""
```
**기대 결과**: Unity Console에 결과 JSON 출력 (§03 포맷 v1 준수). `read_console` 로 회수 가능.
### 2-2. 파라미터 스윕 스니펫
**용도**: 한 축 또는 여러 축 값들을 그리드 형태로 N회 반복 실행, 통계 집계.
**복붙용 프롬프트**:
```
Unity MCP로 파라미터 스윕을 실행해주세요:
- 베이스 시나리오: {경로}
- 스윕 축:
- PCDefence_Mul: [0.2, 0.3, 0.4, 0.5]
- monsters[0].attack_dmg: [3, 5, 7]
- 모드: cartesian
- 셀당 반복: 10회
- 결과 집계 요지 요청: 각 셀의 pc_survived_ratio + pc_remaining_hp_mean
```
**MCP 도구 호출**:
```csharp
mcp__unity-mcp__execute_code
code: """
using NerdNavis.Sim;
var runner = new SimulationRunner();
var sweep = runner.RunSweep("Assets/Sim/Scenarios/sweep_defence_mul.json");
UnityEngine.Debug.Log(UnityEngine.JsonUtility.ToJson(sweep, true));
"""
```
**결과 해석 예시**:
```
cells[0] (Mul=0.2, dmg=3): survived=1.0, HP_mean=62.3
cells[1] (Mul=0.2, dmg=5): survived=1.0, HP_mean=34.8
cells[2] (Mul=0.2, dmg=7): survived=0.6, HP_mean=12.1
... (총 4 × 3 = 12 cells)
```
### 2-3. 배치 비교 스니펫
**용도**: 서로 다른 시나리오·전략 N개를 한 번에 실행하여 결과 비교.
**복붙용 프롬프트**:
```
Unity MCP로 전략 비교 배치 실행 해주세요:
- 배치 파일: {경로}
- 포함 시나리오: strategy_never, strategy_always, strategy_touch_hold
- 랭킹 기준: pc_remaining_hp_ratio
- 결과 요지 요청: 전략별 ranking + deltas
```
**MCP 도구 호출**:
```csharp
mcp__unity-mcp__execute_code
code: """
using NerdNavis.Sim;
var runner = new SimulationRunner();
var batch = runner.RunBatch("Assets/Sim/Scenarios/strategies_compare.json");
UnityEngine.Debug.Log(UnityEngine.JsonUtility.ToJson(batch, true));
"""
```
## 3. 파일 기반 결과 회수 (출력 모드 `file`)
시나리오 입력에 `"output_mode": "file"` 또는 호출 시 지정:
```csharp
mcp__unity-mcp__execute_code
code: """
using NerdNavis.Sim;
var runner = new SimulationRunner();
var result = runner.Run("Assets/Sim/Scenarios/anchor_stage1.json");
ResultEmitter.EmitFile(result, "Assets/Sim/Output/anchor_stage1_result.json");
UnityEngine.Debug.Log("saved");
"""
```
이후 Read 도구로 파일 내용 조회:
```
Read: D:/NerdNavis/FilGoodBandits/DeckBuilding/Assets/Sim/Output/anchor_stage1_result.json
```
## 4. 프로젝트 외부 저장 (기획팀 `.cache/` 등)
시뮬 결과를 Unity 외부 기획 워크스페이스에 직접 저장:
```csharp
mcp__unity-mcp__execute_code
code: """
using NerdNavis.Sim;
var runner = new SimulationRunner();
var result = runner.Run("Assets/Sim/Scenarios/anchor_stage1.json");
ResultEmitter.EmitFile(result, @"D:/NerdNavis/NerdNavisAi/기획팀/.cache/sim_results/anchor_stage1.json");
"""
```
## 5. 에러 진단 체크리스트
### 5-1. MCP 연결 실패
- Unity Editor 상태 확인 (`manage_editor` 호출)
- MCP 서버 재시작 (Claude Code 재연결)
- Transport 모드 `stdio:6400` 확인 (교훈: 2026-04-14 Transport HTTP Local 불일치)
### 5-2. 컴파일 에러
- `Assets/Sim/*.cs` 변경 후 `refresh_unity` 호출하여 재컴파일
- Editor Console 스캔: `read_console`
### 5-3. 시나리오 파싱 실패
- 스키마 버전 확인 (`schema_version: "1.0"`)
- JSON 유효성 검사 (외부 툴 또는 `JsonUtility.FromJson` try/catch 확인)
- `ScenarioValidationException` 메시지 참조
### 5-4. 결과가 이상 (비현실적 값)
- `seed` 고정 여부 (`deterministic` 모드인지 확인)
- `global_value` 기본값 오버라이드 확인
- 상세 로그 활성화(`record_detail: true`)로 tick 추적
## 6. 실행 흐름 예시 (전체 파이프라인)
```
1. 기획팀장: 시나리오 JSON 작성
2. PM 또는 기획팀장: Claude Code에서 본 문서 §2-1 프롬프트 전달
3. Claude: mcp__unity-mcp__execute_code 호출
4. Unity Editor: SimulationRunner.Run() 실행
5. Claude: read_console 로 결과 JSON 회수
6. 기획팀장: 결과 JSON 분석·밸런스 튜닝
7. (반복) 시나리오·스윕 조정하여 다시 §2
```
## 7. 변경 이력
- **v1 (2026-04-17)**: 초판. MCP 연결 미확인 상태에서 작성 — 실제 실행 검증은 Unity Editor 기동 + MCP 연결 시점에 수행 (C23 정직).
## 8. 기각안
- **기각안 A**: Unity Editor 외부에서 .NET 직접 실행 → Unity 테이블 의존성·Addressable 로드 등 환경 재현 비용 과도. Editor 내 실행이 최선
- **기각안 B**: PlayMode 강제 전환 후 시뮬 → 시뮬 독립성 저해·프레임 락·기존 InGame 로직 간섭. EditMode + 독립 Runner가 깔끔
- **기각안 C**: Headless 모드 배치 빌드 실행 → 빌드·CI 파이프라인 복잡. MCP `execute_code` 즉시 실행이 기획팀 피드백 루프 최적