ProudNet 네트워킹 라이브러리를 사용한 멀티플레이어 탱크 게임 Unity 클라이언트 구현으로, Unity 공식 탱크 튜토리얼 템플릿을 기반으로 향상된 멀티플레이어 및 채팅 기능을 제공합니다.
이 Unity 클라이언트 프로젝트를 구축하기 전에 이전 문서의 탱크 서버 설정을 완료하고 다음 구성 요소가 설치되어 있어야 합니다.
project_root/ ├── tank_server/ # Server project (from previous setup) │ ├── Common/ │ ├── Server/ │ ├── Client/ │ └── Server_CPP/ ├── ProudNet/ # Required: Files from ProudNet installation │ ├── doc/ │ ├── include/ │ ├── lib/ │ ├── Sample/ │ └── util/ └── tank_unity_client/ # This Unity project (to be created) ├── Assets/ ├── Packages/ └── ProjectSettings/
ProudNet Unity 탱크 클라이언트 샘플 패키지는 다음에서 다운로드할 수 있습니다:
https://github.com/Nettention/proudnet_sample_tank_server/releases/tag/0.99 File: tank_unity_client_proudnet_sample.unitypackage
수동 설정 과정을 건너뛰고 싶은 분들을 위해, 모든 통합 단계가 이미 완료된 Unity 6 샘플 프로젝트를 제공합니다:
GitHub 리포지토리: https://github.com/Nettention/proudnet_sample_tank_unity_client
이 완료된 샘플 리포지토리에는 다음이 포함되어 있습니다:
완료된 샘플로 빠른 시작:
git clone https://github.com/Nettention/proudnet_sample_tank_unity_client.git
Assets/Proundnet_Demo/DemoScene/Demo_Networkd_Game_Desert.unity
이 옵션은 이 문서에 설명된 완전한 통합 과정을 거치지 않고 멀티플레이어 기능을 빠르게 테스트하고 싶은 개발자들에게 권장됩니다.
ProudNet 탱크 게임을 브라우저에서 바로 체험해보세요! 이는 AWS에 호스팅된 실제 멀티플레이어 서버에 연결되는 Unity 클라이언트의 라이브 WebGL 빌드입니다.
게임 기능 데모:
기술적 세부사항:
Unity 전용 게임 에셋과 ProudNet 통합 구성 요소를 포함합니다.
내용:
주요 구성 요소:
Plugins/
- Unity용 ProudNet DLL 파일Scripts/Network/
- ProudNet 통합 스크립트Proudnet_Demo/
- 멀티플레이어 지원이 포함된 샘플 게임 씬ProudNet 네트워킹을 사용한 Unity 클라이언트 구현입니다.
기능:
지원 플랫폼:
탱크 서버 프로젝트와 동일한 프로토콜 정의를 사용합니다.
공유 구성 요소:
시작하기 전에 다음 사항을 확인하세요:
탱크 클라이언트용 새 Unity 프로젝트를 생성합니다:
Unity Hub 사용:
Tank Unity Client
project_root/tank_unity_client/
예상 프로젝트 구조:
tank_unity_client/ ├── Assets/ ├── Packages/ ├── ProjectSettings/ └── UserSettings/
Unity 공식 탱크 튜토리얼 프로젝트를 기본 템플릿으로 가져옵니다:
Unity Asset Store를 통해:
가져오기 옵션:
Unity Tank Complete Project Import
가져온 탱크 템플릿이 올바르게 작동하는지 확인합니다:
unity_tank_client\Assets\_Tanks\Tutorial_Demo\Demo_Scenes\Demo_Game_Desert.unity
로 이동Unity 탱크 데모 씬
예상 싱글플레이어 동작:
네트워킹 기능을 추가하기 위해 ProudNet Unity 탱크 클라이언트 샘플 패키지를 가져옵니다:
예상 패키지 파일:
tank_unity_client_proudnet_sample.unitypackage
Unity에서 패키지 가져오기:
tank_unity_client_proudnet_sample.unitypackage
다운로드tank_unity_client_proudnet_sample.unitypackage
로 이동ProudNet Unity 탱크 클라이언트 샘플 패키지 가져오기
ProudNet 구성 요소가 올바르게 통합되었는지 확인합니다:
샘플 에셋 설치 확인:
Assets/ ├── Plugins/ │ └── ProudNet/ # Contains ProudNet DLLs │ ├── ProudNetClientUnity.dll │ ├── Andorid/ │ ├── WebGL/ │ └── x86_64/ ├── ProudNet_Demo/ # Demo scene and scripts │ ├── DemoScene/ │ └── ProudNetScripts/ └── Scripts/ └── Network/ # Network-related scripts
플랫폼 설정 확인:
Assets/Plugins/
에서 각 DLL 선택탱크 게임을 위한 기본 네트워크 구성을 설정합니다:
네트워크 구성 생성:
TankNetworkConfig
로 지정127.0.0.1
(테스트용 localhost)33334
(탱크 서버 포트와 일치)네트워크 구성 세부사항:
TankNetworkConfig 연결 설정:
참고: 처음에는 standalone 빌드를 위해 포트 33334를 사용합니다. 나중에 WebGL 빌드의 경우 C++ 서버 구현에서만 사용 가능한 WebSocket 포트 33335를 사용합니다(C# 서버는 WebSocket 연결을 지원하지 않음).
이전 문서에서 서버 설정을 완료했다면 생성된 PIDL 파일을 재사용할 수 있습니다:
옵션 A: 서버 프로젝트에서 복사 (권장)
탱크 서버 프로젝트를 사용할 수 있다면 편의 배치 스크립트를 사용하세요:
# Navigate to tank_server directory cd tank_server # Run the copy script copy_client_generated_to_unity.bat
스크립트 수행 작업:
Copies from tank_server/: ├── Server/Tank_stub.cs → unity_tank_client/Assets/Proundnet_Demo/ProudNetScripts/Generated/ ├── Server/Tank_proxy.cs → unity_tank_client/Assets/Proundnet_Demo/ProudNetScripts/Generated/ ├── Server/Tank_common.cs → unity_tank_client/Assets/Proundnet_Demo/ProudNetScripts/Generated/ └── Common/Vars.cs → unity_tank_client/Assets/Proundnet_Demo/ProudNetScripts/Common/
예상 출력:
===== ProudNet Generated Files Unity Copy Script ===== Copying PIDL generated files... 1 file(s) copied. 1 file(s) copied. 1 file(s) copied. Copying common files... 1 file(s) copied. Copy completed! The following files have been copied to Unity project: - ..\unity_tank_client\Assets\Proundnet_Demo\ProudNetScripts\Generated\Tank_stub.cs - ..\unity_tank_client\Assets\Proundnet_Demo\ProudNetScripts\Generated\Tank_proxy.cs - ..\unity_tank_client\Assets\Proundnet_Demo\ProudNetScripts\Generated\Tank_common.cs - ..\unity_tank_client\Assets\Proundnet_Demo\ProudNetScripts\Common\Vars.cs Press any key to continue...
옵션 B: 수동 PIDL 생성 (서버 프로젝트가 없는 경우)
서버 프로젝트가 없다면 다음이 필요합니다:
Tank.PIDL
파일에 대한 액세스ProudNet/util/PIDL.exe -cs Tank.PIDL -outdir Generated
실행프로토콜 호환성 이점:
탱크 Unity 클라이언트는 ProudNet RMI(Remote Method Invocation)를 기반으로 구축된 포괄적인 네트워킹 시스템을 사용합니다. 실제 스크립트 구조는 다음과 같습니다:
핵심 네트워크 스크립트:
Assets/ ├── Scripts/Network/ │ ├── GameNetworkManager.cs # Main network manager (Singleton) │ └── NetworkTank.cs # Individual tank network synchronization ├── Proundnet_Demo/ProudNetScripts/ │ ├── Common/ │ │ └── Vars.cs # Protocol version and server configuration │ └── Generated/ # Auto-generated from Tank.PIDL │ ├── Tank_common.cs # RMI message IDs and constants │ ├── Tank_proxy.cs # Client-to-server RMI calls │ └── Tank_stub.cs # Server-to-client RMI handlers
GameNetworkManager.cs - 주요 기능:
NetworkTank.cs - 개별 탱크 기능:
생성된 RMI 클래스 (Tank.PIDL에서):
SendMove
, SendFire
, SendTankHealthUpdated
)OnTankPositionUpdated
, OnSpawnBullet
, OnPlayerJoined
)중요 참고사항: Generated/
폴더의 파일들은 이전 문서의 C# 서버 구현 중에 생성된 정확히 동일한 파일입니다. 이는 서버와 Unity 클라이언트 간의 100% 프로토콜 호환성을 보장합니다. Unity 클라이언트는 동일한 PIDL 생성 네트워킹 코드를 재사용합니다.
구현된 주요 네트워크 기능:
Unity 탱크 클라이언트에는 ProudNet 통합이 포함된 사전 구성된 멀티플레이어 씬이 포함되어 있습니다:
네트워크 준비 씬 열기:
Assets\Proundnet_Demo\DemoScene\
로 이동Demo_Networkd_Game_Desert.unity
씬 열기ProudNet 네트워크 데모 씬
씬은 사전 구성되어 있지만 필요한 경우 네트워크 설정을 확인하거나 수정할 수 있습니다:
GameNetworkManager 설정 (이미 구성됨):
127.0.0.1
(테스트용 localhost)33334
(standalone 빌드용 TCP)33335
(WebGL 빌드 전용) [참고: 이 설정은 standalone 빌드에서는 inspector에 숨겨져 있지만 나중에 WebGL용으로 빌드할 때 사용됩니다]GameNetworkManager Inspector
사용자 정의 옵션:
Unity 클라이언트를 테스트하기 전에 탱크 서버가 실행 중인지 확인하세요:
C++ 서버
cd tank_server/Server_CPP run.bat
예상 서버 출력:
========== Tank Server Started ========== TCP Server listening on 0.0.0.0:33334 WebSocket Server listening on 0.0.0.0:33335/ws Ready to accept connections from all network interfaces ========================================== Server is running. Commands: status: Show connected clients
탱크 서버에 대한 Unity 클라이언트 연결을 테스트합니다:
Unity 에디터 테스트:
예상 서버 응답:
Client connected: Host ID = 6 New tank created for client 6 with tank type -1 and health 100.000000/100.000000 Not enough clients to create P2P group (need at least 2) ========== SendTankType Received ========== From client 6: tankType=-1 ========== SendTankType Processing Completed ==========
Unity 게임 뷰:
Unity 게임 초기 화면
여러 Unity 클라이언트로 멀티플레이어 기능을 테스트합니다:
두 번째 Unity 인스턴스:
Demo_Networkd_Game_Desert.unity
씬 추가Build/unity_tank_client.exe
)Windows Standalone 빌드 설정
빌드 완료
멀티 클라이언트 게임플레이
대안 테스트 방법:
예상 멀티 클라이언트 동작:
Unity Client 1 (Editor): [ProudNet] Connected to server successfully [ProudNet] Assigned Client ID: 6 [P2P] Other player joined: Client ID 7 [TankGame] Tank Type Selected: 1 (health: 225) [TankGame] Remote tank spawned for player 7 (Type: 0, health: 150) Unity Client 2 (Standalone): [ProudNet] Connected to server successfully [ProudNet] Assigned Client ID: 7 [P2P] Other player joined: Client ID 6 [TankGame] Tank Type Selected: 0 (health: 150) [TankGame] Remote tank spawned for player 6 (Type: 1, health: 225)
여러 클라이언트가 있는 서버 로그:
Client connected: Host ID = 6 New tank created for client 6 with tank type -1 and health 100.000000/100.000000 Not enough clients to create P2P group (need at least 2) Client connected: Host ID = 7 New tank created for client 7 with tank type -1 and health 100.000000/100.000000 Sending existing player info to new client: ID=6, Type=-1, Health=100.000000/100.000000 P2P group created with 2 members, Group ID: 8 ========== Tank Selection and Spawning ========== ========== SendTankSpawned Received ========== From client 6: position=(20.959999,11.930000), direction=212.665558, tankType=1, health=225.000000 Tank spawned for client 6 at (20.959999,11.930000) ========== SendTankSpawned Received ========== From client 7: position=(20.959999,11.930000), direction=212.665558, tankType=0, health=150.000000 Tank spawned for client 7 at (20.959999,11.930000)
여러 클라이언트에서 실시간 탱크 이동을 테스트합니다:
클라이언트 1 동작:
클라이언트 2 관찰:
예상 네트워크 메시지:
Client 1 → Server: SendMove(posX: 15.2, posY: 30.1, direction: 45) Server → Client 2: OnTankPositionUpdated(clientId: 3, posX: 15.2, posY: 30.1, direction: 45)
포탄 발사 동기화를 테스트합니다:
클라이언트 1 동작:
클라이언트 2 관찰:
예상 네트워크 메시지:
Client 1 → Server: SendFire(shooterId: 3, direction: 180, launchForce: 25, posX: 15.2, posY: 30.1) Server → Client 2: OnSpawnBullet(clientId: 3, shooterId: 3, direction: 180, force: 25, ...) Server → All: OnTankHealthUpdated(clientId: 4, health: 85, maxHealth: 100)
플레이어 간 실시간 메시징을 테스트합니다:
클라이언트 1 동작:
"Hello from Client 1!"
클라이언트 2 관찰:
"Player: Hello from Client 1!"
체력 동기화 및 피해 효과를 테스트합니다:
피해 시나리오:
예상 결과:
Unity 탱크 클라이언트를 웹 애플리케이션으로 배포합니다:
빌드 설정:
Demo_Networkd_Game_Desert.unity
가 포함되어 있는지 확인WebGL 빌드 설정
WebGL 플랫폼으로 전환한 후 ProudNet 플러그인 설정을 구성해야 합니다:
중요한 WebGL 제한사항: ProudNet은 WebGL 플랫폼이 선택되었을 때 에디터 내 플레이 모드를 지원하지 않습니다. 네트워킹 기능을 테스트하려면 WebGL 버전을 빌드하고 배포해야 합니다. WebGL 플랫폼에서는 네트워크 테스트를 위한 에디터 플레이 모드가 작동하지 않습니다.
단계 1: .NET DLL에 대한 에디터 비활성화
Assets/Plugins/ProudNet/
로 이동ProudDotNetClientUnity.dll
선택ProudNet .NET DLL 플랫폼 설정
단계 2: x86_64 DLL에 대한 에디터 비활성화
Assets/Plugins/ProudNet/x86_64/
로 이동ProudNetClient.dll
선택:
ProudNetClientPlugin.dll
선택:
ProudNet x86_64 DLL 플랫폼 설정
단계 3: WebGL 파일에 대한 에디터 활성화
Assets/Plugins/ProudNet/WebGL/
로 이동JSClient.jslib
선택:
NewJSClient.jslib
선택:
ProudNetClientPlugin-webgl.dll
선택:
ProudNet WebGL Files Platform Settings
Critical: If these settings are not configured correctly, the WebGL build will fail or the networking will not function properly.
Configure Unity's WebGL-specific settings for optimal local testing:
Publishing Settings (Critical for Local Testing):
WebGL Publishing Settings
Recommended WebGL Settings:
Publishing Settings: ├── Compression Format: Disabled (for local testing) ├── Name Files As Hashes: ❌ (unchecked) ├── Data Caching: ❌ (unchecked) ├── Debug Symbols: Off └── Power Preference: High Performance Memory Settings: ├── Initial Memory Size (MB): 32 ├── Maximum Memory Size (MB): 2048 ├── Memory Growth Mode: Geometric └── Geometric Memory Growth Cap (MB): 96
팁: 프로덕션 배포 시 다운로드 크기를 줄이기 위해 Gzip 압축 형식을 활성화할 수 있지만, 서버 호환성 문제를 피하기 위해 로컬 테스트에서는 비활성화하세요.
WebGL 네트워크 구성:
ws://localhost:33335/ws
(로컬 테스트)ws://your-server.com:33335/ws
WebGL 네트워크 구성
탱크 클라이언트의 웹 버전을 테스트합니다:
주의: WebGL 플랫폼이 선택된 상태에서는 Unity 에디터 플레이 모드에서 ProudNet 네트워킹이 작동하지 않습니다. 네트워킹 기능을 테스트하려면 전체 빌드 프로세스를 완료해야 합니다.
빌드 프로세스:
WebGL_Build/
로컬 웹 서버 설정:
중요: WebGL 빌드는 웹 서버에서 호스팅해야 하며 HTML 파일을 로컬에서 직접 열어서는 플레이할 수 없습니다.
방법 1: Python HTTP 서버
# WebGL 빌드 폴더로 이동 cd WebGL_Build/ # Python 3 (권장) python -m http.server 8000 # Python 2 (Python 3을 사용할 수 없는 경우) python -m SimpleHTTPServer 8000 # 사용자 정의 포트 예제 python -m http.server 3000
예상 Python 출력:
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 127.0.0.1 - - [23/May/2024 10:30:15] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [23/May/2024 10:30:15] "GET /Build/unity_tank_client.wasm HTTP/1.1" 200 -
방법 2: VS Code Live Server 확장
1. VS Code에서 WebGL_Build/ 폴더 열기 2. index.html 우클릭 3. "Open with Live Server" 선택 4. 브라우저가 자동으로 http://127.0.0.1:5500에서 열림
방법 3: Node.js http-server (대안)
# 전역 설치 (일회성 설정) npm install -g http-server # 빌드 폴더로 이동하여 서버 실행 cd WebGL_Build/ http-server -p 8000 # CORS 활성화 (필요한 경우) http-server -p 8000 --cors
접속 URL:
웹 브라우저 테스트:
http://localhost:8000
으로 이동예상 WebGL 동작:
WebGL 브라우저 게임플레이
일반적인 문제 및 해결 방법:
Assets/Plugins/
폴더에 있는지 확인디버깅 도구:
도움말:
ProudNet/doc/
폴더에서 제공