서비스
교육 철학

Network System (네트워크 시스템)

Abstract

📌
네트워크 시스템은 서버와 TCP 연결을 유지하며 패킷을 주고받는 틀입니다. 연결·재조립·하트비트·이벤트 통지처럼 어느 게임에서나 똑같은 부분은 프레임워크가 하고, 패킷이 어떻게 생겼는지(헤더 길이, 직렬화 방식)만 게임이 채워 넣습니다.
먼저 판단할 것 — 이 모듈이 필요한가
상황
맞는 도구
랭킹·로그인·상점처럼 "요청 한 번, 응답 한 번"
WebRequest (HTTP). 이 모듈은 과하다
자체 게임 서버와 실시간으로 주고받는다 (MMO, 턴제 대전, 채팅)
이 모듈
빠른 액션의 실시간 동기화 (FPS, 격투)
UDP 기반 전용 솔루션(Netcode for GameObjects, Photon 등). 이 모듈은 TCP 전용이다
프레임워크가 해 주는 것 / 내가 만들어야 하는 것
프레임워크
게임 코드
소켓 연결·종료, 비동기 송수신
INetworkChannelHelper 구현 — 헤더 길이, 직렬화·역직렬화
TCP 스트림에서 패킷 경계 잘라 내기 (헤더 길이만큼 읽고 → 본문 길이만큼 읽기)
Packet 을 상속한 패킷 클래스들
받은 패킷을 Id 로 핸들러에 배달
IPacketHandler 를 구현한 핸들러들
하트비트 타이머, 누락 횟수 집계
하트비트 패킷의 내용 (SendHeartBeat)
연결·종료·오류를 EventComponent 로 통지
이벤트 구독, 재접속 정책
사용 흐름
NetworkComponent network = GameEntry.GetComponent<NetworkComponent>(); EventComponent events = GameEntry.GetComponent<EventComponent>(); events.Subscribe(NetworkConnectedEventArgs.EventId, OnConnected); events.Subscribe(NetworkClosedEventArgs.EventId, OnClosed); events.Subscribe(NetworkErrorEventArgs.EventId, OnError); // MyChannelHelper 는 INetworkChannelHelper 를 구현한 게임 쪽 클래스 INetworkChannel channel = network.CreateNetworkChannel("Game", ServiceType.Tcp, new MyChannelHelper()); channel.Connect(System.Net.IPAddress.Parse("127.0.0.1"), 9000); // 연결 이벤트를 받은 뒤 channel.Send(LoginPacket.Create(userId));
C#
복사
Connect 는 비동기입니다. 바로 다음 줄에서 Send 하면 아직 연결 전입니다. NetworkConnected 이벤트를 받고 나서 보냅니다.
ToyboxNightmare 에서는
쓰지 않습니다. 싱글플레이 게임입니다. 멀티플레이 확장을 생각한다면, 위 표의 세 번째 줄에 해당하는 장르(실시간 액션)라 이 모듈보다 UDP 기반 솔루션이 맞습니다.
⚠️
이 에디션에서 다른 점 · 주의할 점
•
기본 제공되는 INetworkChannelHelper 구현체가 없습니다. 직접 만들지 않으면 채널을 만들 수 없습니다. 프로토콜(Protobuf, MessagePack, 자체 바이너리 등)은 자유입니다.
•
본문의 NetworkComponentInspector 는 이 에디션에 없습니다. 런타임 Debugger 창의 Network 탭을 씁니다.
•
이벤트 이름은 실제로는 NetworkConnectedEventArgs 처럼 ...EventArgs 가 붙은 클래스이며 EventComponent.Subscribe(XxxEventArgs.EventId, handler) 로 받습니다.
•
WebGL 에서는 브라우저가 TCP 소켓을 허용하지 않아 동작하지 않습니다.

Network System (네트워크 시스템)

개요

게임 프레임워크의 네트워크 시스템은 게임 내 네트워크 통신을 처리하기 위한 포괄적인 솔루션을 제공합니다.
이를 통해 여러 네트워크 채널을 생성하고 관리하며, 다양한 서버에 연결하고, 커스터마이징 가능한 패킷 핸들러를 이용해 데이터를 송수신할 수 있습니다.
이 문서에서는 네트워크 시스템의 아키텍처, 구성 요소, 사용 패턴을 다룹니다.
참고: HTTP를 통한 리소스 다운로드는 [다운로드 시스템(Download System)]을 참조하세요.

네트워크 시스템 아키텍처 (Network System Architecture)

네트워크 시스템은 게임 프레임워크 전반에서 사용되는 컴포넌트-헬퍼 패턴을 따릅니다.
NetworkComponent는 Unity 레벨에서 동작하는 컴포넌트이며, 프레임워크 핵심 모듈인 INetworkManager와 통합됩니다.

핵심 구성 요소 (Core Components)

NetworkComponent

NetworkComponent는 네트워크 기능에 접근할 수 있는 주요 Unity 컴포넌트입니다.
이 컴포넌트는 INetworkManager를 초기화하고, 네트워크 이벤트를 EventComponent로 전달합니다.
주요 역할:
•
네트워크 채널 생성 및 관리
•
네트워크 이벤트를 EventComponent에 전달
•
Unity 친화적인 네트워크 인터페이스 제공

네트워크 채널 (Network Channels)

네트워크 채널은 네트워크 연결 및 통신을 처리하는 핵심 엔티티입니다.
각 채널은 특정 서버와의 연결을 나타내며, 자체적인 패킷 핸들러와 프로토콜을 설정할 수 있습니다.

채널 관리 (Channel Management)

네트워크 시스템은 여러 네트워크 채널을 생성할 수 있으며, 각각 독립적으로 설정할 수 있습니다.
이를 통해 동시에 서로 다른 서버(예: 게임 서버, 채팅 서버, 인증 서버 등)에 연결할 수 있습니다.
메서드
설명
CreateNetworkChannel
지정된 이름, 서비스 타입, 헬퍼로 새로운 네트워크 채널 생성
DestroyNetworkChannel
지정된 이름의 네트워크 채널 제거
HasNetworkChannel
특정 이름의 네트워크 채널 존재 여부 확인
GetNetworkChannel
특정 이름의 네트워크 채널 가져오기
GetAllNetworkChannels
모든 네트워크 채널 가져오기

서비스 타입 (Service Types)

네트워크 채널을 생성할 때는 서비스 타입을 지정해야 하며, 이는 사용되는 네트워크 프로토콜을 결정합니다.
서비스 타입
설명
ServiceType.Tcp
신뢰성 있고 순서가 보장되는 TCP 전송 사용
ServiceType.TcpWithSyncReceive
동기적 수신을 포함한 TCP 전송 사용

네트워크 이벤트 (Network Events)

네트워크 시스템은 네트워크 관련 이벤트 발생 시 이를 EventComponent로 전달하여 게임 이벤트 시스템과 통합합니다.
이벤트
설명
NetworkConnected
연결이 성립될 때 발생
NetworkClosed
연결이 종료될 때 발생
NetworkMissHeartBeat
하트비트 누락 시 발생
NetworkError
네트워크 오류 발생 시 발생
NetworkCustomError
커스텀 네트워크 오류 발생 시 발생

네트워크 채널 헬퍼 (Network Channel Helper)

네트워크 시스템은 헬퍼 패턴을 사용하여 패킷 처리 방식을 커스터마이징할 수 있습니다.
네트워크 채널 생성 시 INetworkChannelHelper 구현체를 제공해야 합니다.
INetworkChannelHelper의 주요 역할:
•
패킷 핸들러 등록 (Initialize 에서 networkChannel.RegisterHandler)
•
패킷 직렬화 및 역직렬화 (Serialize, DeserializePacketHeader, DeserializePacket)
•
패킷 헤더 길이 정의 (PacketHeaderLength)
•
하트비트 패킷 전송 (SendHeartBeat)
•
연결 직전 준비 (PrepareForConnecting)

디버깅 및 모니터링 (Debugging and Monitoring)

NetworkComponentInspector

원작은 런타임 중 네트워크 채널을 모니터링할 수 있는 커스텀 인스펙터를 제공합니다. (이 에디션에는 에디터 확장이 없어 이 인스펙터가 없습니다. 같은 정보를 런타임 Debugger 창의 Network 탭에서 봅니다.)
표시 정보:
•
네트워크 채널 개수
•
각 채널의 연결 상태
•
서비스 타입 및 주소 패밀리
•
로컬 및 원격 주소
•
패킷 통계 (송신/수신)
•
하트비트 정보

사용 예제 (Usage Example)

일반적인 네트워크 시스템 사용 절차는 다음과 같습니다:
1.
INetworkChannelHelper를 구현한 네트워크 채널 헬퍼 생성
2.
GameEntry에서 NetworkComponent 가져오기
3.
헬퍼를 사용하여 네트워크 채널 생성
4.
서버에 연결
5.
이벤트 등록
6.
패킷 송수신 처리

하트비트 메커니즘 (Heartbeat Mechanism)

네트워크 시스템에는 연결 끊김을 감지하기 위한 내장 하트비트 메커니즘이 있습니다.
시스템은 설정된 간격으로 자동으로 하트비트 패킷을 보내며, 응답이 없으면 NetworkMissHeartBeat 이벤트를 발생시킵니다.
INetworkChannel이 제공하는 하트비트 관련 속성:
•
HeartBeatInterval : 하트비트 패킷 전송 간격
•
HeartBeatElapseSeconds : 마지막 하트비트 전송 이후 경과 시간
•
MissHeartBeatCount : 연속으로 누락된 하트비트 개수

결론 (Conclusion)

네트워크 시스템은 게임 내 네트워크 통신을 처리하기 위한 유연하고 강력한 솔루션을 제공합니다.
•
여러 네트워크 채널 지원
•
커스터마이징 가능한 패킷 처리
•
다양한 네트워크 요구사항 및 프로토콜 대응
또한 이벤트 시스템과의 통합을 통해, 네트워크 이벤트도 게임 내 다른 이벤트들과 일관된 방식으로 처리할 수 있습니다.