283 lines
7.3 KiB (Stored with Git LFS)
Markdown
283 lines
7.3 KiB (Stored with Git LFS)
Markdown
# Unity ↔ StreamDock 통신 플러그인 사용 가이드
|
|
|
|
## 🎮 개요
|
|
이 가이드는 Unity 게임과 Mirabox StreamDock 간의 실시간 통신을 위한 플러그인 사용법을 설명합니다.
|
|
|
|
## 📋 시스템 요구사항
|
|
|
|
### StreamDock 측
|
|
- **Node.js**: v14.0.0 이상
|
|
- **StreamDock 소프트웨어**: 미라박스에서 제공하는 최신 버전
|
|
- **포트**: 15732 (WebSocket), 15733 (HTTP)
|
|
|
|
### Unity 측
|
|
- **Unity**: 2019.4 LTS 이상
|
|
- **.NET 4.x** 또는 **.NET Standard 2.1**
|
|
- **WebSocket 지원**: System.Net.WebSockets
|
|
|
|
## 🚀 설치 및 설정
|
|
|
|
### 1. StreamDock 플러그인 설치
|
|
|
|
```bash
|
|
# 플러그인 폴더로 이동
|
|
cd SDNodeJsSDK/unity-communication-plugin
|
|
|
|
# 의존성 설치
|
|
npm install
|
|
|
|
# 플러그인 실행
|
|
npm start
|
|
```
|
|
|
|
### 2. Unity 프로젝트 설정
|
|
|
|
1. **스크립트 복사**
|
|
- `Unity_Scripts/StreamDockCommunicator.cs` → Unity 프로젝트의 `Scripts` 폴더
|
|
- `Unity_Scripts/GameController.cs` → Unity 프로젝트의 `Scripts` 폴더
|
|
|
|
2. **GameObject 설정**
|
|
```
|
|
GameManager (Empty GameObject)
|
|
├── StreamDockCommunicator 컴포넌트
|
|
└── GameController 컴포넌트
|
|
```
|
|
|
|
## 🔧 사용법
|
|
|
|
### StreamDock 플러그인 설정
|
|
|
|
1. **StreamDock 소프트웨어 실행**
|
|
2. **플러그인 폴더 지정**: `SDNodeJsSDK/unity-communication-plugin`
|
|
3. **버튼 추가**:
|
|
- "Unity 이벤트 전송" 버튼
|
|
- "Unity 상태 수신" 버튼
|
|
|
|
### Unity 스크립트 설정
|
|
|
|
```csharp
|
|
// StreamDockCommunicator 설정
|
|
[SerializeField] private string serverUrl = "ws://localhost:15732";
|
|
[SerializeField] private bool autoConnect = true;
|
|
|
|
// 이벤트 연결
|
|
streamDock.OnStreamDockMessageReceived.AddListener(OnStreamDockMessage);
|
|
streamDock.OnConnected.AddListener(OnStreamDockConnected);
|
|
streamDock.OnDisconnected.AddListener(OnStreamDockDisconnected);
|
|
```
|
|
|
|
## 📡 통신 프로토콜
|
|
|
|
### WebSocket 메시지 형식
|
|
|
|
#### Unity → StreamDock
|
|
```json
|
|
{
|
|
"type": "game_state_update",
|
|
"data": {
|
|
"playerHP": 100,
|
|
"playerScore": 1500,
|
|
"currentLevel": 3
|
|
},
|
|
"timestamp": 1640995200000
|
|
}
|
|
```
|
|
|
|
#### StreamDock → Unity
|
|
```json
|
|
{
|
|
"type": "streamdock_button_clicked",
|
|
"data": {
|
|
"buttonId": "action1",
|
|
"action": "send_event"
|
|
},
|
|
"timestamp": 1640995200000
|
|
}
|
|
```
|
|
|
|
## 🎯 이벤트 타입
|
|
|
|
### Unity에서 전송하는 이벤트
|
|
- `game_state_update`: 게임 상태 업데이트
|
|
- `player_action`: 플레이어 액션
|
|
- `level_complete`: 레벨 완료
|
|
- `test_message`: 테스트 메시지
|
|
|
|
### StreamDock에서 전송하는 이벤트
|
|
- `streamdock_button_clicked`: 버튼 클릭
|
|
- `dial_rotate`: 다이얼 회전
|
|
- `dial_press`: 다이얼 누름
|
|
- `request_game_state`: 게임 상태 요청
|
|
|
|
## 🛠️ 개발 예제
|
|
|
|
### 1. 기본 연결 테스트
|
|
|
|
```csharp
|
|
public class StreamDockTest : MonoBehaviour
|
|
{
|
|
[SerializeField] private StreamDockCommunicator communicator;
|
|
|
|
void Start()
|
|
{
|
|
// 연결 이벤트 구독
|
|
communicator.OnConnected.AddListener(() => {
|
|
Debug.Log("StreamDock 연결됨!");
|
|
});
|
|
|
|
// 메시지 수신 이벤트 구독
|
|
communicator.OnStreamDockMessageReceived.AddListener((type, data) => {
|
|
Debug.Log($"이벤트 수신: {type}");
|
|
});
|
|
}
|
|
}
|
|
```
|
|
|
|
### 2. 게임 상태 동기화
|
|
|
|
```csharp
|
|
public class GameStateManager : MonoBehaviour
|
|
{
|
|
[SerializeField] private StreamDockCommunicator communicator;
|
|
|
|
public void UpdatePlayerHP(int newHP)
|
|
{
|
|
// Unity 내부 상태 업데이트
|
|
playerHP = newHP;
|
|
|
|
// StreamDock으로 상태 전송
|
|
communicator.UpdateGameState(hp: newHP);
|
|
}
|
|
|
|
public void AddScore(int points)
|
|
{
|
|
// Unity 내부 상태 업데이트
|
|
score += points;
|
|
|
|
// StreamDock으로 상태 전송
|
|
communicator.UpdateGameState(score: score);
|
|
}
|
|
}
|
|
```
|
|
|
|
### 3. StreamDock 버튼 이벤트 처리
|
|
|
|
```csharp
|
|
public class StreamDockEventHandler : MonoBehaviour
|
|
{
|
|
[SerializeField] private StreamDockCommunicator communicator;
|
|
|
|
void Start()
|
|
{
|
|
communicator.OnStreamDockMessageReceived.AddListener(HandleStreamDockEvent);
|
|
}
|
|
|
|
private void HandleStreamDockEvent(string eventType, object data)
|
|
{
|
|
switch (eventType)
|
|
{
|
|
case "button_clicked":
|
|
// 버튼 클릭 시 게임 액션 실행
|
|
ExecuteGameAction();
|
|
break;
|
|
|
|
case "dial_rotate":
|
|
// 다이얼 회전 시 볼륨 조절
|
|
AdjustVolume(data);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## 🔍 디버깅
|
|
|
|
### StreamDock 플러그인 로그 확인
|
|
```bash
|
|
# 플러그인 실행 시 로그 출력
|
|
npm start
|
|
```
|
|
|
|
### Unity 콘솔 로그
|
|
- Unity Console 창에서 연결 상태 및 메시지 확인
|
|
- `Debug.Log()` 출력 확인
|
|
|
|
### HTTP API 테스트
|
|
```bash
|
|
# 상태 확인
|
|
curl http://localhost:15733/status
|
|
|
|
# 이벤트 전송
|
|
curl -X POST http://localhost:15733/send-event \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"eventType": "test", "data": {"message": "test"}}'
|
|
```
|
|
|
|
## 🚨 문제 해결
|
|
|
|
### 연결 문제
|
|
1. **포트 확인**: 15732, 15733 포트가 사용 가능한지 확인
|
|
2. **방화벽 설정**: Windows 방화벽에서 포트 허용
|
|
3. **서버 실행 확인**: `npm start` 명령어로 서버 실행
|
|
|
|
### Unity 연결 실패
|
|
1. **WebSocket 지원 확인**: .NET 4.x 또는 .NET Standard 2.1 사용
|
|
2. **URL 확인**: `ws://localhost:15732` 올바른지 확인
|
|
3. **재연결**: 자동 재연결 기능이 5초마다 시도
|
|
|
|
### 메시지 전송 실패
|
|
1. **JSON 형식 확인**: 올바른 JSON 형식인지 확인
|
|
2. **연결 상태 확인**: Unity와 StreamDock이 모두 연결되어 있는지 확인
|
|
3. **로그 확인**: Unity Console과 StreamDock 로그 확인
|
|
|
|
## 📚 고급 기능
|
|
|
|
### 1. 커스텀 이벤트 추가
|
|
```csharp
|
|
// Unity에서 커스텀 이벤트 전송
|
|
communicator.SendMessageToStreamDock("custom_event", new {
|
|
action = "special_skill",
|
|
power = 100,
|
|
target = "boss"
|
|
});
|
|
```
|
|
|
|
### 2. 다중 Unity 인스턴스 지원
|
|
```csharp
|
|
// Unity 인스턴스 ID 추가
|
|
communicator.SendMessageToStreamDock("game_state_update", new {
|
|
instanceId = "unity_001",
|
|
gameState = currentGameState
|
|
});
|
|
```
|
|
|
|
### 3. 실시간 게임 통계
|
|
```csharp
|
|
// 게임 통계 전송
|
|
communicator.SendMessageToStreamDock("game_stats", new {
|
|
playTime = Time.time,
|
|
enemiesKilled = enemyCount,
|
|
itemsCollected = itemCount
|
|
});
|
|
```
|
|
|
|
## 🎮 게임 통합 예제
|
|
|
|
### RPG 게임
|
|
- **HP/MP 표시**: StreamDock 버튼에 실시간 표시
|
|
- **스킬 단축키**: StreamDock 버튼으로 스킬 발동
|
|
- **인벤토리 관리**: 다이얼로 아이템 선택
|
|
|
|
### 액션 게임
|
|
- **콤보 카운터**: StreamDock에 콤보 수 표시
|
|
- **특수 액션**: StreamDock 버튼으로 특수 스킬
|
|
- **보스 체력**: StreamDock에 보스 HP 표시
|
|
|
|
### 퍼즐 게임
|
|
- **레벨 진행도**: StreamDock에 현재 레벨 표시
|
|
- **힌트 시스템**: StreamDock 버튼으로 힌트 제공
|
|
- **타이머**: StreamDock에 남은 시간 표시
|
|
|
|
---
|
|
|
|
**Happy Gaming! 🎮** |