게임 오브젝트용 Netcode로 첫 번째 멀티플레이어 게임 제작

저는 유니티에서 디벨로퍼 애드보킷으로 근무하는 에스테반 말도나도입니다. 제 업무는 Unity Gaming Services에 대한 정보를 공유하고 새로운 교육 자료를 제작하여, 개발자가 적절한 툴을 통해 멀티플레이어 게임 개발을 시작할 수 있도록 지원하는 것입니다.
NGO(게임 오브젝트용 Netcode)는 그러한 솔루션 중 하나로, Unity 게임 엔진을 위해 개발된 퍼스트파티 미드레벨 네트워킹 라이브러리입니다. Netcode 솔루션은 멀티플레이어 개발 프로젝트에서 아주 중요합니다.
유니티 디벨로퍼 애드보킷의 역할 중에는 유니티의 툴을 보여 주는 샘플 게임을 제작하는 것이 있는데, 저는 은하계의 아기 고양이들(Galactic Kittens)이라는 NGO 샘플을 맡아 진행하게 되었습니다.
게임 업계에서 전문적인 작업을 많이 진행해 봤지만 개인적으로 멀티플레이어 게임은 거의 제작해 본 적이 없었습니다. 따라서 이번 작업은 샘플을 사용하는 개발자에게도 학습의 기회가 되는 동시에, 저에게 있어서도 처음으로 멀티플레이어 게임을 제작해 볼 수 있는 학습의 기회였습니다.
저희 팀은 샘플의 난이도 수준, 기본 메카닉, 캐릭터 능력(이후 제거됨) 등 갤럭틱 고양이의 개념을 구체화했습니다.
세련된 아트 에셋, 음악 및 SFX, 프로그래밍 지원을 통해 샘플 게임을 구현하여 이번 샘플 프로젝트를 성공적으로 제작하기 위해, 뛰어난 역량을 지닌 Bromio의 팀과 힙을 합쳤습니다. Bromio 팀과의 공동 목표는 Unity에서 게임 오브젝트용 Netcode를 활용해 멀티플레이어 게임을 제작하는 방법을 간단하고 초보자도 쉽게 이해할 수 있게 안내하는 것이었습니다.
이번 포스팅에서는 프로토타입부터 안정적인 출시까지 은하계의 아기 고양이들을 위한 개발 여정을 다루며, 이 샘플을 활용하여 멀티플레이어 프로젝트를 시작하는 방법을 소개합니다.
개발에 대해 자세히 알아보기 전에, 다음은 새로운 샘플 게임 Galactic Kittens의 간략한 개요입니다. 이 샘플은 Multiplayer 네트워킹의 몇 가지 기본을 배울 수 있도록 설계된 2D 협동 공간 모험입니다.
이 샘플은 멀티플레이어 개발에 필요한 기술을 학습하기 위한 목적으로 제작되었습니다.
- 자동 씬 전환을 포함한 네트워크 세션 관리
- 기본 2D 이동 동기화(스프라이트 시트 변경사항 포함)
- 런타임 시 서버 측 게임 오브젝트 생성
- 서버에서 클라이언트로 메인 플레이어의 소유권 이전
- 연결된 모든 클라이언트 전반에서 VFX 제작
- 음향 효과와 음악을 모든 클라이언트에서 재생하는 방법
- 플레이어 및 게임 스탯(체력, 물리친 적 등)에 대한 정보를 전달하고 게임 UI에 표시
우리 웹사이트에서 은하계의 고양이들에 대해 자세히 알아보세요. GitHub에서 샘플을 직접 다운로드하여 코드를 살펴볼 수도 있습니다.
비록 저는 멀티플레이어 게임을 제작해 본 경험이 많지 않았지만, 유니티는 사용자가 NGO를 사용하는 데 도움이 되는 많은 공개 리소스를 제공하고 있습니다.
이러한 리소스 덕분에 Unity Multiplayer 기술 자료를 사용하여 기본 네트워크 개념과 용어에 쉽게 익숙해질 수 있었습니다. 그런 다음 Hello World 프로젝트 튜토리얼을 참고하고 간단한 샘플을 학습하면서 나름의 성과를 얻기 시작했습니다.
몇 번의 시행착오를 겪고 나서 간단한 기본 프로토타입을 처음부터 만들 수 있게 되었습니다.

이 시점에는 위 이미지처럼 커스텀 로비와 실제 UI 및 실질적인 연결 관리 기능이 없었습니다. 해당 프로토타입은 각각 세 개의 충돌 지점을 가지고 화면에서 이동하며, 플레이어가 스페이스바를 누르면 큐브 총알을 발사하는 두 척의 동일한 우주선입니다. 클라이언트 전반에서 오브젝트 생성과 이동 동기화를 충분히 보여 줄 수 있었습니다.
단지 시작에 불과했지만, Bromio 팀의 도움을 받아 프로젝트를 완성하고 실행 가능한 샘플로 만들 수 있다는 자신감을 가질 수 있었습니다.
첫 번째 프로젝트를 진행한 후에는 Bromio 팀과 함께 프로토타입을 정식 제작에 사용 가능하도록 구체화하는 작업에 착수했습니다. Bromio 팀도 멀티플레이어 게임 제작 경험이 많지 않았지만 기꺼이 일을 맡아 목표 달성을 위해 도움을 주었습니다.
더 효율적인 진행을 위해 게임을 서로 분리된 요소로 세분화했는데, 아티스트들은 에셋을 담당하고 프로그래머들은 게임의 핵심 로직을 담당하여 개발을 병행했습니다.
Galactic Kittens의 아기 고양이들의 아트 스타일이 어떻게 발전했는지 간략하게 확인해 보세요.
한편, Bromio의 주요 개발자와 함께 Galactic Kittens를 작동하는 게임 샘플로 만드는 과정에서 재미있고 도전적인 측면을 알아보았습니다.
개발 과정에서 가장 어려운 과제는 연결 관리와 캐릭터 선택이었습니다. 캐릭터 데이터를 개별 ScriptableObject 파일에 저장해야 했는데, 프로젝트를 다운로드하면 이를 확인할 수 있습니다.
이 파일에는 각 우주 탐험가에 대한 필수 정보가 있으며, UI에 표시할 스프라이트(플레이어와 우주선)와 게임플레이 씬이 시작되었을 때 각 플레이어에 대해 생성해야 하는 프리는 포함되어 있습니다.
캐릭터 선택 화면에서 주요 문제는 클라이언트 연결 해제 이벤트를 인지하고 UI를 통해 해당 이벤트를 처리하는 것이었습니다.
개발자들이 본인의 게임에서 실제로 이를 어떻게 처리할 수 있는지 보여 주기 위해, 사용자가 같은 캐릭터를 선택할 수 없도록 설정했습니다. 사실은 추가 제약이 없다는 점에서 플레이어가 동일한 캐릭터를 선택하도록 하는 편이 더 쉽습니다.

연결 관리에서 다음 과제는 게임 세션 도중에 연결이 해제되는 플레이어 이벤트였습니다. 이러한 이벤트를 처리하려면 퇴장하는 플레이어에 맞춰 게임을 조정해야 할 뿐만 아니라, 게임이 진행되는 동안에는 다른 플레이어의 입장을 제한해야 했습니다. 호스트 인스턴스가 캐릭터 선택 화면에 있을 때만 새로운 연결이 들어오는 것을 연결 관리자에서 허용하도록 했습니다. 물론 이러한 방식은 만능 솔루션이 아닙니다. 어떤 게임에서는 진행 중인 세션에서 플레이어가 나중에 참여할 수도 있고, 다른 게임에서는 이것이 불가능할 수도 있죠. 최적의 경험을 위한 방식은 개발자가 결정할 몫입니다.
플레이어에게 표시되는 적이나 운석의 복잡한 AI나 멋진 동작 로직 없이 게임플레이를 단순하게 유지하려 했습니다. 그렇게 함으로써 사용자에게 NGO 라이브러리 사용 방법을 제시하는 것에 집중하며 전체 게임 샘플을 제공할 수 있었습니다.
그 결과, 다음 두 가지 주요 유형의 적과 하나의 운석 장애물을 구현했습니다.
스페이스 슈팅 게임 스페이스 고스트 메트로리트
두 가지 적은 모두 무작위 이동 패턴을 선택하며, 그 중에서도 스페이스 슈터는 레이저로 반격할 수 있는 유일한 적 캐릭터입니다. 이러한 적을 만드는 방법과 자체 로직을 추가하는 방법에 대한 자세한 내용은 개발자 가이드를 참조하세요.
보스 전투를 구현할 때에는 게임 로비와 플레이어 우주선 동작 및 단순한 적을 구현하며 익힌 모든 내용을 바탕으로 최종 보스 전투 경험을 빠르게 제작할 수 있었습니다.
한 가지 특별한 과제는 보스가 입장하기 전에 소리와 이미지로 표시되는 경고 알림의 타이밍이었습니다. 결과적으로는 일반 플레이 경험이 끝나고 최종 보스 전투가 시작된다는 신호를 보내기 위해 이벤트를 통해 클라이언트 및 서버 RPC를 전송했습니다.

보스의 동작은 연결된 플레이어에게 가할 공격 세트를 무작위로 선택하는 FSM(유한 상태 머신)으로 구성됩니다. 이를 위해 보스 상태에서 다른 상태로의 전환을 처리하는 BossController라는 C# 클래스를 사용했습니다. 이 전투를 뒷받침하는 코드와 자체 보스 상태를 추가하는 방법에 대한 정보는 개발자 가이드를 참조하세요.
이 샘플 게임을 제작하는 미션을 성공으로 이끈 가장 중요한 리소스는 Unity Multiplayer Networking Discord 서버였으며, 이 커뮤니티에 많은 질문을 던져 적절한 답변을 얻을 수 있었습니다. 커뮤니티를 통해 실제로 멀티플레이어 게임을 제작하는 다른 개발자들과 대화하고, Unity 멀티플레이어 서비스 크리에이터와도 소통할 수 있었습니다. 풍부하고 종합적인 지식을 담고 있는 커뮤니티가 프로젝트의 완성에 매우 큰 도움이 되었습니다.
저는 유니티에서 일하며 멋진 네트워킹 전문가들과 협업을 수행합니다. 이들은 멀티플레이어 개발을 시작하는 모든 사람을 지원하는 유용한 리소스와 기술 자료를 개발하죠. Unity 멀티플레이어 기술 자료 사이트는 기본 네트워킹 용어에 익숙해지기부터 지연 처리, NGO 코딩에 이르기까지 여러 번 유용했습니다.
우리는 확실히 가상의 아기 고양이에 대해 기대하고 있습니다. 여러분과 미래의 NGO 사용자들 모두 멀티플레이어를 학습하는 과정에서 이 샘플을 활용하여 올바른 방향으로 나아갈 수 있기를 바랍니다. 언제든지 Discord 서버 또는 포럼에서 질문하거나 피드백 및 제안 사항을 공유해 주세요.
제가 배우고 싶은 내용 중 하나는 Multiplayer 게임 샘플에 오브젝트 풀링을 추가하는 방법입니다. 이 기술을 사용하면 게임 세션 중에 반복적으로 생성되는 오브젝트에 필요한 메모리를 사전 할당할 수 있습니다. 이전의 실험에서 오프라인 Unity 프로젝트에 이 기술을 시도한 바 있으며, 이를 통해 게임의 런타임 효율성을 확실히 개선할 수 있습니다. 이 기술은 보스 룸 및 기타 UGS 샘플에도 적용되었습니다.
자체적으로 멀티플레이어 개발 과정을 시작하려는 경우, 유니티 팀에서 제공하는 매우 다양한 리소스를 활용해 더 쉽게 진행할 수 있습니다.
게임 오브젝트용 Netcode 페이지부터 시작하면 패키지에 더 익숙해질 수 있습니다. 그런 다음, 은하계의 아기 고양이들 샘플을 통해 NGO를 살펴보거나 간단한 샘플로 몇 가지 단계를 진행하면 됩니다.
학습 과정을 시작한 후에는 Unity Multiplayer Networking Discord 서버에 참여하여 포럼을 살펴볼 것을 권장합니다. Galactic Kittens가 지나치게 단순하거나 충분하지 않은 과제라고 생각한다면, NGO 개발을 정식으로 제작에 사용 가능한 3D 샘플 게임인 Boss Room을 확인해 보세요.
게임을 온라인으로 전환하는 데 Unity Gaming Services는 Lobby 또는 Matchmaker 서비스를 추가하거나, Vivox를 통한 음성 및 텍스트 채팅, P2P Relay 서비스 또는 게임 서버 호스팅과 같은 호스팅 솔루션 등 더 많은 도움이 될 수 있습니다. 감사합니다!
최신 동향과 멀티플레이어의 미래에 대해 자세히 알아보려면 미국, 영국, 일본, 일본에서 실시한 1,500건 이상의 설문조사 응답이 집계된 2022 Unity Multiplayer 리포트를 읽어 보세요.
