Odin + Raylib로 만든 3D 멀티플레이어 FPS 게임.
UDP 기반 클라이언트-서버 아키텍처로, 권위 서버(authoritative server) 모델을 사용합니다.
- FPS 컨트롤러 (이동, 달리기, 앉기, 점프, 헤드밥)
- 3종 무기 시스템 (Pistol / Rifle / Shotgun) — 히트스캔 사격, 재장전, 반동, 스웨이
- AI 타겟 (순찰 + 추격 AI)
- PvP 전투 (플레이어 간 히트스캔)
- 벽/장애물 차폐 (wall occlusion)
- UDP 네트워킹 (최대 4인)
- 클라이언트 사이드 예측 (client-side prediction) + 서버 재조정 (reconciliation)
- 엔티티 보간 (entity interpolation)
- Odin 컴파일러
- Raylib (Odin vendor 패키지에 포함)
# 빌드
odin build ./src -out:fps-game
# 빌드 (디버그)
odin build ./src -out:fps-game -debug./fps-game# 서버 실행
./fps-game --server
# 클라이언트 접속
./fps-game --connect 127.0.0.1
./fps-game --connect 192.168.1.100:27015기본 포트는 27015입니다.
| 키 | 동작 |
|---|---|
| WASD | 이동 |
| Mouse | 시점 |
| Space | 점프 |
| Left Shift | 달리기 |
| Left Ctrl | 앉기 |
| LMB | 사격 |
| R | 재장전 |
| 1 / 2 / 3 | 무기 전환 (Pistol / Rifle / Shotgun) |
| Mouse Scroll | 무기 순환 |
| Escape | 일시정지 |
src/
├── main.odin # 진입점, 게임 루프, UI
├── player.odin # FPS 컨트롤러, HP/사망/리스폰
├── gun.odin # 무기 시스템, 히트스캔
├── world.odin # 맵 환경 (벽, 장애물)
├── target.odin # AI 타겟 (순찰/추격)
├── entity.odin # 엔티티 ID 시스템
├── net.odin # 패킷 프로토콜 (UDP)
├── net_state.odin # 직렬화 가능한 게임 상태
├── server.odin # 전용 서버 (헤드리스)
├── client.odin # 클라이언트 네트워크
├── predict.odin # 클라이언트 사이드 예측
└── interpolation.odin # 엔티티 보간
- 서버: 60Hz 고정 틱, 물리/전투 시뮬레이션 실행, 매 틱 스냅샷 브로드캐스트
- 클라이언트: 입력 전송 → 서버 스냅샷 수신 → 로컬 예측으로 즉각 반응
- 프로토콜:
Packet_Header(9바이트) + payload, 스냅샷 ~1220바이트 (MTU 이내) - 신뢰성: pressed 이벤트 3프레임 중복 전송으로 UDP 패킷 손실 대응
- FPS 컨트롤러 + 무기 시스템
- AI 타겟 (순찰/추격)
- UDP 클라이언트-서버 네트워킹
- 클라이언트 사이드 예측 + 서버 재조정
- 엔티티 보간
- PvP 전투
- 플레이어 간 충돌
- 스코어보드 / 킬피드
- 서버 사이드 히트 검증 (지연 보상)
- 게임 모드 (데스매치, 팀전)
- 맵 파일 로딩
- 사운드