본문으로 건너뛰기

룸 관리

게임 룸은 플레이어들이 함께 게임을 플레이하는 공간입니다. 각 룸은 독립된 게임 상태를 가집니다.

룸 생성

룸 생성은 cb.game.createClient() 가 반환한 룸 인스턴스의 createRoom() 으로 합니다. cb.game.createRoom(...) 는 아직 공개되지 않아 호출 시 에러를 던집니다.

📌 룸 생성 채널은 WebSocket 메시지 create_room 전용입니다. REST 룸 생성 엔드포인트는 없습니다(REST /rooms 는 조회/상태/통계용 GET 전용).

typescript
import ConnectBase from 'connectbase-client'

const cb = new ConnectBase({ appId: 'YOUR_APP_ID', publicKey: 'cb_pk_...' })

// 룸 인스턴스 생성 후 연결
const room = cb.game.createClient({ clientId: 'player_123' })
await room.connect()

// 기본 설정으로 룸 생성
const state = await room.createRoom()
console.log('룸 ID:', state.roomId)

// 커스텀 설정으로 룸 생성
const state2 = await room.createRoom({
  roomId: 'my-custom-room',  // 선택사항, 미지정시 자동 생성
  tickRate: 64,              // 초당 틱 수 (기본 64)
  maxPlayers: 10,            // 최대 플레이어 수 (기본 100)
  metadata: {                // 커스텀 메타데이터
    mapName: 'arena',
    gameMode: 'deathmatch'
  }
})

ℹ️ 플랫폼별 룸 생성 노출: JS 는 위 room.createRoom()(WS), UnrealUConnectBaseGameRoom::CreateRoom(Blueprint-callable)로 노출됩니다. Unity / Godot 는 룸 생성을 노출하지 않고 join/leave/sendAction 만 지원하므로, JS·Unreal·admin 이 만든 룸에 입장만 합니다.

룸 참가

typescript
// 룸 ID로 참가
const state = await game.joinRoom('room-id')

// 메타데이터와 함께 참가
const state = await game.joinRoom('room-id', {
  nickname: 'Player1',
  team: 'red'
})

console.log('현재 플레이어:', state.players)

룸 퇴장

typescript
await game.leaveRoom()

룸 목록 조회

typescript
// HTTP API로 룸 목록 조회
const rooms = await game.listRooms()

rooms.forEach(room => {
  console.log(`${room.id}: ${room.playerCount}/${room.maxPlayers} 플레이어`)
})

룸 설정 타입

typescript
interface GameRoomConfig {
  roomId?: string              // 룸 ID (선택)
  categoryId?: string          // 카테고리 ID (선택)
  tickRate?: number            // 틱 레이트 (기본 64)
  maxPlayers?: number          // 최대 플레이어 수 (기본 100)
  metadata?: Record<string, string>  // 커스텀 메타데이터
}

룸 정보 타입

typescript
interface GameRoomInfo {
  id: string
  appId: string
  categoryId?: string
  playerCount: number
  maxPlayers: number
  tickRate: number
  isRunning: boolean
  createdAt: number
  metadata?: Record<string, string>
}

플레이어 이벤트

typescript
// 플레이어 입장 감지
game.on('onPlayerJoined', (player) => {
  console.log(`${player.clientId} 입장`)
  console.log('메타데이터:', player.metadata)
})

// 플레이어 퇴장 감지
game.on('onPlayerLeft', (player) => {
  console.log(`${player.clientId} 퇴장`)
})

플레이어 타입

typescript
interface GamePlayer {
  clientId: string                    // 클라이언트 ID
  userId?: string                     // 사용자 ID (인증된 경우)
  joinedAt: number                    // 입장 시간 (timestamp)
  metadata?: Record<string, string>   // 커스텀 메타데이터
}