1. 범위
- 대상: 멀티플레이(2인)에서
GameReady -> Game 구간의 이벤트 송수신
- 포함 이벤트:
- Ready 신호
- 게임 시작 동기화(startAt)
- 입력(horizontal, jumpTriggered, respawnRequested)
- 게임 종료(gameEnded)
- 연결 끊김(disconnect)
2. 핵심 구성요소
GameReadyViewModel
- 파일:
iOS/App/Sources/Presentation/GameReady/GameReadyViewModel.swift
- 역할: Ready 교환, 시작시각 동기화
GameViewModel
- 파일:
iOS/App/Sources/Presentation/Game/View/GameViewModel.swift
- 역할: 게임 시작 시
MultiplayerNetworkIO 바인딩, 종료 처리
MultiplayerNetworkIO
- 파일:
iOS/App/Sources/Presentation/Game/GameplayIO/MultiplayerNetworkIO.swift
- 역할: 실제 게임 이벤트 송수신/보간/타임아웃 감지
ConnectionSessionManaging (+ P2P/WS 구현)
- 파일:
iOS/Modules/NetworkKit/Sources/Interfaces/Common/ConnectionSessionManaging.swift
- 구현:
iOS/Modules/NetworkKit/Sources/P2P/NetworkSessionManager.swift
iOS/Modules/NetworkKit/Sources/WebSocket/WebSocketSessionManager.swift
3. 전체 플로우 요약
3-1. GameReady 단계
- 내 Ready를 1초 주기로 송신
- 상대 Ready 수신 시
isPeerReady = true
- Host가
NetworkGameStartSyncDTO(startAt) 1회 전송
- 상대는
onInputReceived에서 startAt decode 후 동일 시각에 게임 시작
3-2. Game 단계
GameViewModel.start()에서 multiplayerIO.bind(peerId:)
GameScene.update -> GameplayManager.update -> onDidUpdate(deltaTime)에서 tick() 호출
- 송신:
- horizontal: 15Hz + threshold + keepalive
- jump: 검증 통과 시점에
jumpTriggered 전송
- respawn: 확정 시점에
respawnRequested 전송
- game end: 자동 감지 or 명시 호출로
gameEnded 전송
- 수신:
- input decode 후 상태 반영
- remote moveX 보간 적용
- gameEnded 수신 시 승자 계산 보정 후 결과 처리