본문 바로가기

게임제작

Intentional Descent 1-1 유니티 Mirror 사용법

Mirror 라이브러리로 구현한 멀티플레이 기능 정리

Unity에서 Mirror 라이브러리를 사용하여 간단한 멀티플레이 시스템을 구현했습니다. 이번 프로젝트에서는 다음과 같은 기능들을 만들었습니다.

 

git url 👇

https://github.com/kimdalho/IntentionalDescent

작업 시연 영상

아래 영상에서 구현한 기능들을 확인하실 수 있습니다.

 

 

NetwrokManager

Mirror를 사용하여 멀티 플레잉 게임을 만들기 위한 핵심 제어 구성요소를 가지고있는 클래스 입니다.

 

네트워크 관리자는 멀티플레이어 게임의 네트워킹 측면을 관리하기 위한 구성 요소입니다. 많은 유용한 기능을 한곳에 모아서 멀티플레이어 게임을 만들고, 실행하고, 디버깅하는 것을 가능한 한 간단하게 만듭니다.

 

네트워크 관리자의 기능

  •  게임 상태 관리
  • 스폰 관리
  • 씬 관리
  • 디버깅 정보
  • 사용자 정의

게임상태 관리

네트워킹 멀티플레이어 게임은 클라이언트, 데디케이티브 서버 또는 Client이자 서버인 Host 모드 세자기 모드로 실행 가능합니다.

 

스폰관리

네트워크 관리자를 사용하여 프리펩에서 네트워크 게임 객체의 인스턴스화를 관리합니다.

쉽게 말해 동기화 될 몬스터 또는 플레이어의 생성을 관리해줍니다.

 

단, 게임을 중지하면 플레이어의 게임 객체또한 파괴됩니다.

위에서 설명 드린 내용처럼 게임 플레이 중에 동적으로 생성하려는 다른 프리펩도 네트워크 관리자에 등록해야합니다.

 

시작위치

인스턴스화 할 대상의 좌표를 지정하는 역할 또한 수행합니다.

저는 위치 선택이 동작이 안되어 직접 생성된 플레이어를 배치하는 코드를 작성했습니다.

 

 

 

구현한 기능 리스트

1. 호스트 룸 만들기

  • 게임의 호스트가 되는 플레이어가 방을 생성할 수 있습니다.
  • 방 생성 시 다른 플레이어들이 해당 방에 접속할 수 있는 상태로 전환됩니다.

호스트 룸을 만들기 위해서는 Mirror 라이브러리에서 지원하는 NetworkRoomManager의 이해가 필요합니다.

 

NetworkRoomManager Doc

https://mirror-networking.gitbook.io/docs/manual/components/network-room-manager

 

 

NerworkRoomManagerNerworkManager 상속받은 자식 클래스입니다.

 

간략하게 설명드리자면 룸의 최소 인원,최대 인원, 그리고 게임이 시작 후 잠기므로

늦게 참여하는 것을 방지해주는 역할을 합니다.

 

Room Player Prefab

클라이언트가 연결될 시 RoomPlayer를 룸에 생성됩니다.

 

 

주요 코드

    private void OnClickButtonCreateRoom()
    {
    	//IDNetworkRoomManager는 제 프로젝트를 위해 NetworkRoomManager를 상속받은
        //자식 클래스입니다. 
        roomManager = IDNetworkRoomManager.singleton as IDNetworkRoomManager;
        if (roomManager != null)
        {
            roomManager.minPlayerCount = 1;
            roomManager.maxConnections = 8;

            roomManager.StartHost();
            
        }
        else
        {
            Debug.LogError($"Not found NetworkManager");
        }
        
    }

2. 게스트가 호스트의 IP 주소를 통해 룸에 접속하기

  • 게스트 플레이어는 호스트의 IP 주소를 입력하여 방에 접속할 수 있습니다.
  • 이 과정은 간단한 UI를 통해 이루어집니다.

룸 접속은 현제로는 많이 미흡하게 만들었습니다.

이는 테스트를 원활하게 하기위해서 입니다.

추후 EOS SDK 인스톨 이후 매칭 시스템을 추가 구현해볼 계획입니다.

 

2-1. 게스트가 접속한 방에서 나가기

  • 게스트는 접속 중인 방을 나갈 수 있으며, 나가면 로비 화면으로 돌아갑니다.

주요 코드

    private void OnClickRoomExit()
    {
    	//나가는 대상이 호스트인지 여부를 확인
        var mode = NetworkManager.singleton.mode;
        if(mode == NetworkManagerMode.Host)
        {
            NetworkManager.singleton.StopHost();
        }
        else
        {
            NetworkManager.singleton.StopClient();
        }
        
    }

3. 간단한 채팅 기능

  • 플레이어들 간의 커뮤니케이션을 위해 채팅 기능을 추가했습니다.
  • 채팅 메시지는 실시간으로 모든 플레이어에게 전달됩니다.

4. 게스트 레디 버튼

  • 게스트는 '레디' 버튼을 눌러 준비 상태를 표시할 수 있습니다.
  • 레디 상태는 호스트와 다른 게스트들에게 표시됩니다.

5. 모든 플레이어가 레디 시 게임 스타트 버튼 활성화

  • 모든 플레이어가 준비 완료 상태가 되면, 호스트가 게임을 시작할 수 있는 버튼이 활성화됩니다.
  • 이를 통해 게임이 자연스럽게 시작됩니다.