개요
유니티 게임을 만들다 보면 간혹, 통신을 위한 API가 필요한 경우가 있다.
통신을 위해서는 대표적으로 포톤을 많이 사용하지만, 이번에는 MIRROR를 사용해서 구현해 볼 생각이다.
MIRROR는 유니티가 원래 제공하던 UNET이 서비스 중단되면서 이 UNET을 기반으로 만들어서 에셋 스토어에 무료로 공개된 네트워크 API이다.
추가로 Mirror 네트워크는 동시 수천명 정도 접속 할 수 있는 규모라고 한다. 수천명 단위의 MMORPG정도는 구현 가능한 서버 프로그램이라고 한다.
https://assetstore.unity.com/packages/tools/network/mirror-129321
Mirror | 네트워크 | Unity Asset Store
Get the Mirror package from vis2k and speed up your game development process. Find this & other 네트워크 options on the Unity Asset Store.
assetstore.unity.com
MIRROR 네트워크 구현
1. Mirror 네트워크 구현을 위한 준비
위의 API를 프로젝트에 추가 한 후, RoomManager라는 이름의 빈 오브젝트를 만들어준다.
이후, RoomManager라는 스크립트를 생성 한 후, 빈 오브젝트에 컴포넌트로 붙여주고, 스크립트는 다음과 같이 작성한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror; //Mirror API를 사용하기 위한 using선언
//MonoBehabior 대신, API사용을 위해 NetworkRoomManager를 상속
public class RoomManager : NetworkRoomManager
{
//이후, Start와 Update는 필요없으니 지운다.
}
위와 같이 작성 후, 인스팩터창을 확인하면 스크립트 아래에 수많은 프로퍼티들이 보인다.
중요!
만약 RoomManager컴포넌트를 할당 했을 때 NetWork Info의 Transport가 none으로 되어 있다면!
RoomManager에 Kcp Transport 컴포넌트를 추가 한 후, 자기 자신을 할당시켜주면 된다!
(없다면 게임 실행이 안될것이다!)
2. 게임에 사용할 Scene할당
이 중, 우리는 Scene Management항목 아래의 Offline Scene과, Online Scene을 할당해줄것이고,
Room Settings항목 아래의 Room Scene과 GamePlay Scene을 할당해줄것이다.
RoomManager는 아래와 같이 작동한다.
Offline Scene | Online Scene | |
Offline Scene | Game Room Scene | Game Play Scene |
Room Scene | Game Play Scene |
RoomManager는 Offline Scene, Game Room Scene, Game Play Scene의 3단 구조로 Scene을 관리하면서 네트워크 통신에 도움을 주는 클래스이다.
Offline Scene과 OnlineScene은 각각 게임 네트워크 접속 이전과 게임 대기실을 담당한다.
Room Scene과 Game Play Scene은 각각 게임 시작 대기실과 실제로 플레이되는 멀티플레이씬을 담당한다.
위의 사진은 이미 할당되어 있지만 각자 만들고 있는 게임에서 다음과 같이 할당하면 될 것 같다.
예를 들어 아래와 같은 구성이라고 하면
(표에서 굵은 글씨로 작성되어있는 항목)
Offline Scene - 게임을 만들었을때 타이틀 씬
Game Room Scene - 게임에서 멀티 플레이를 눌렀을 때, 코드나 방에 입장하기 위해 필요한 씬
Game Play Scene - 실제로 멀티플레이가 구현되어 있는 씬
다음과 같이 할당해주면 된다. (위의 사진을 참고하자)
Offline Scene - Offline Scene
Online Scene - Game Room Scene
Room Scene - Game Room Scene
Game Play Scene - Game Play Scene
결국 Online Scene과, Room Scene은 같은 씬이 할당되는것이다.
3. Room Player Prefab, Player Prefab 할당
이제 RoomPlayer Prefab과 Player Prefab을 할당해야 한다.
두 프리팹은 서버와 플레이어가 통신하기 위해서 필요한 프리팹이다.
RoomPlayer Prefab은 대기실로 들어갔을 때, 게스트 플레이어에게 할당되는 인스턴스이다.
(쉽게 말하면 어떠한 방에 들어갔을 때, 게스트와 서버의 통신을 위해 자동으로 붙는 스크립트라고 생각하자.)
일단 빈 객체를 생성한 후,이름을 RoomPlayer로 바꾼 뒤, RoomPlayer라는 스크립트를 생성해준다.
Room Player스크립트는 다음과 같이 작성한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror; //Mirror API 사용을 위한 using선언
//RoomPlayer는 MonoBehabiour대신, NetworkRoomPlayer를 상속받는다.
public class RoomPlayer : NetworkRoomPlayer
{
//Start와 Update는 지워도 된다.
//추후에 필요한 기능이 있다면 여기 넣으면 된다.
}
이렇게 작성 해주고 컴포넌트를 추가시켜준다면 위와 같은 사진이 될 것이다.
그 후, 방금 만든 RoomPlayer오브젝트를 프리팹화 시켜준다.
(프리팹화는 오브젝트를 프로젝트 안에 드래그 드롭하면 파란색 정육면체 모양으로 바뀐다.)
(프리팹을 사용하는 이유는 객체가 여러 곳에 생성되거나 필요할 때, 저장되어 있는 오브젝트를 생성하기 위해 사용하는 기능이라 보면 된다.)
마찬가지 방법으로 GamePlayer 라는 오브젝트를 생성한 후, GamePlayer 라는 스크립트를 생성해 아래와 같이 적어주고, 컴포넌트를 추가해준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror; //Mirror API 사용을 위한 Using선언
//GamePlayer는 MonoBehaviour 대신, NetworkBehaviour를 사용해준다.
public class GamePlayer : NetworkBehaviour
{
//이후, 필요한 코드들은 여기에 작성
}
마찬가지로 GamePlayer도 프리팹화 시킨 뒤, 각각 Room Manager항목에 다음과 같이 할당한다.
Player Prefab - GamePlayer
Room Player Prefab - RoomPlayer
중요!
혹시나 프리팹이 제자리에 안 붙고 오류가 난다면 분명히 Network Identity 컴포넌트가 안붙어있을것이다.
만들어 둔 프리팹을 더블클릭하여 열리는 창에 Network Identity 컴포넌트를 붙여 둔 후, 저장하여 빠져나온 뒤 다시 할당시켜보자!!
4. 시작 버튼 구현
이제 마지막으로 스타트 버튼을 구현하자.
일단. 처음에 만들어 뒀던 Offline Scene을 열고, 그 안에 버튼을 생성한다. (버튼은 본인 마음대로 모양과 디자인을 만들면 된다.)
버튼의 OnClick메소드에 들어갈 스크립트를 열고, 스크립트에 들어갈 함수를 다음과 같이 작성한다.
public void CreateRoom(){
var manager = RoomManager.singleton;
//방 설정 작업
//추후에 여기에서 방에 대한 설정작업이 이루어질것이다.
manager.StartHost();
}
간단하게 버튼에는 starthost함수를 호출하는 기능만 있으면 자동으로 다음 씬이 호출된다.
5. 테스트
이제 테스트를 위해서 unity의 상단 메뉴 중 Edit 하위 항목인 Build Setting을 열어주자
개인적으로 만든 프로젝트라 이름이 다른 씬들이 있는데, 위의 Scene In Build 에다가 위에서 만든 씬들 모두를 넣어주자
(이 글에서는 씬 3개 Offline Scene, Game Room Scene, Game Play Scene을 만들었으니, 이 세개의 씬을 넣어주면 된다.)
그 후, 테스트를 진행하면 된다.
위에서 만들어 둔 버튼을 누르면 다음 대기실 씬으로 넘어가면서 다음과 같은 창이 나올것이다.
나는 기능을 넣기 위해 일단 하얀색 박스들을 만들어 뒀지만, 그렇지 않은 사람들은 Players라는 창이 생성되었을 것이고, 그 창 안에 Ready라는 버튼이 생겼을 것이다.
이 버튼은 참가한 모든 플레이어의 준비 상태를 알 수 있는 버튼이고, Ready 버튼을 누르면 바로 게임씬으로 넘어갈 것이다.
이렇게 기본적으로 Mirror네트워크를 활용해 멀티플레이를 구축하는 방법을 알아봤다.
시간이 더 남는다면 멀티플레이를 구현할 때 필요한 통신적 기술이나 여러 프로퍼티들에 들어가야 할 값들을 작성해보겠다.
![](https://blog.kakaocdn.net/dn/Qo97A/btsAy8i6zCO/1YxgguOKpcRh9hKouAv0pK/img.jpg)
대문사진을 위한 사진!
'Develop > Unity' 카테고리의 다른 글
[Unity] 로그라이크 맵 생성하기 (배열) (0) | 2023.11.29 |
---|---|
[Unity] 오브젝트 풀링 (1) | 2023.11.22 |
[Unity] 씬 로딩 시 start함수의 동작 (0) | 2022.01.12 |
[Unity] 플레이어 카메라 안에 가두기 (WorldToViewportPoint, ViewportToWorldPoint) (0) | 2022.01.06 |
[Unity] 유니티 FadeIn, FadeOut (코루틴 사용법) (0) | 2022.01.06 |