본문 바로가기

- GameProgramming/- Unity 3D

★ 12. 포톤 클라우드 (Photon Cloud) Marco Polo 튜토리얼 [1/3]

반응형

Marco Polo 튜토리얼


Marco Polo 튜토리얼은 Unity3D 기반의 튜토리얼입니다.
이 튜토리얼에서는 Photon Cloud 를 이용한 멀티 플레이어 어플리케이션을 어떻게 개발하는지에 대해 알려드립니다.

# 목차

  • 개요
  • 걸어가는 바이킹들
  • Photon Cloud
  • 기초부터 시작하기
  • Reception 룸 얻기
  • Marco Polo 위치 동기화
  • 외치고 응답하기
  • Switch "It"
  • 결론

# 개요

이 튜토리얼은 첫 파트에서 Photon Unity Networking(약어 : PUN) 데모 하나를 단계별로 보여줍니다. PUN 패키지를 임포트하여 Photon Cloud 를 사용할 수 있도록 설정한 다음 실행해볼 것입니다.

두 번째 파트에서는 Photon Unity Networking 패키지와 Photon Cloud 서비스로 멀티 플레이어 기능 개발에 대해 설명합니다.


# 필요 사항

이 튜토리얼에서는 유니티 에디터와 프로그래밍 기본 지식이 있다는 가정하에 진행합니다. 샘플 코드는 C#으로 작성되어 있지만 유니티 스크립트에서 동일하게 작동합니다.


# 걸어가는 바이킹

에셋 스토어에서 Photon Unity Networking 샘플에 있는 "Viking Demo" 를 우선 살펴보겠습니다.

Photon Cloud: Marco Polo Vikings
Photon Cloud: Marco Polo Vikings

패키지에 필요한 것들이 모두 들어 있기 때문에 유니티에서 새 프로젝트를 생성합니다.
아래 사진처럼 "Marco Polo Tutorial" 이라는 이름을 적고 생성하겠습니다.


에셋 스토어에서 "Photon Viking Multiplayer Showcase" 를 검색하여 다운로드 후 유니티에 패키지를 임포트합니다.

프로젝트에는 3개의 폴더가 있습니다. "DemoVikings", "Photon Unity Networking" 과 "Plugins" 폴더입니다. PUN과 플러그인 디렉토리에는 프로젝트에서 필요한 모든 네트워킹 코드가 들어있습니다. "Vikings" 폴더에는 샘플 프로젝트가 들어있습니다. 최근에는 "PhotonChatApi" 폴더도 추가되었습니다.

Photon Cloud Screenshot: Viking Demo



# Wizard

PUN 셋업 Wizard 는 네트워크 설정과 멀티 플레이어 게임인 Photon Cloud 개발을 위한 편리한 방식을 제공해줍니다.
클라우드? 네. 클라우드입니다. Photon Server 들이 모여있는 것으로 게임에서 사용할 수 있습니다. 일부를 설명하도록 하겠습니다.

"Free Plan" 으로 클라우드를 사용하면 의무사항이 없이 무료로 사용할 수 있으며 이메일 주소를 입력만하면 Wizard 가 마법처럼 처리해줍니다.

Photon Cloud ScreenShot : Cloud Registration


신규 계정은 즉시 "AppId" 를 발급 받습니다. 만약 이메일 주소가 이미 등록된 것이라면 관리 화면을 오픈하라고 할 것입니다. 로그인하여 "AppId" 를 복사한 후 입력 필드에 붙여 넣어주시면 됩니다.

AppId를 저장했으면 이 단계는 끝난 것입니다.

PUN 버전 1.60부터 "PhotonServerSettings" 파일에 "Auto-Join Lobby" 를 체크로 설정해야합니다. 프로젝트 윈도우에서 이 값을 설정하려면 파일을 검색 후 선택하세요. "Auto-Join Lobby" 를 체크하면 PUN 이 기본 로비로 참여하게하며 룸 목록을 제공합니다.


# 바이킹 걸어다니게 하기

모든 작업이 완료되면 바이킹을 움직여보게 할 차례입니다. 멀티 플레이어 액션입니다.

"DemoVikings\Scenes\VikingScene" 씬을 오픈하고 데모를 스탠드얼론으로 Build and run 해보겠습니다.

"main menu"가 팝업되고 플레이어의 이름과 룸 이름을 입력하며 (아무것도 없는) "Room Listing" 이 있습니다. 룸을 "PoloRoom"이라고 적고 "Go" 를 클릭하게되면 씬이 변경되며 바이킹이 나타나게됩니다. 한 명의 바이킹 뿐이지만 이제 시작일 뿐입니다.


이제 유니티 에디터에서 데모를 시작하면 "Room Listing" 에는 하나의 룸이 있습니다. 이제 그 룸에 참가하게 되면 여러 명의 바이킹 들을 볼 수 있습니다.

Photon Cloud 스크린샷 : Vikings


벌써 첫 번째 튜토리얼의 마지막입니다. PUN 패키지를 받고 임포트하고 설정하는 것을 학습했습니다. 특별한 것은 없지만 중요한 사항입니다. 게임을 테스트하기 위해 멀티 플레이어 게임을 실행하는 방법을 학습했습니다.


# Photon Cloud

Photon Cloud
Photon Cloud

"Photon Cloud" 가 하는 일은 정확히 무엇일까요?

기본적으로 Photon Server 에 여러 개의 PC가 수행되고 있는 것입니다. 서버들의 "Cloud" 는 Exit Games에서 관리되며 멀티 플레이어 게임에 대하여 서비스의 번거로움을 없애는 서비스로 제공되고 있습니다. 서버들은 필요시 추가되기 때문에 몇명의 플레이어든 수용할 수 있습니다.

Photon Cloud 가 완전히 무료는 아니지만 비용이 저렴하며 특히 일반적인 호스팅과 비교해볼 경우 매우 저렴합니다.
이 링크에서 가격 정책을 살펴보실 수 있습니다. https://www.photonengine.com/ko-kr/realtime/Pricing#plan-20

Photon Unity Networking 은 Photon Cloud를 관리해주며 내부적으로 처리되고 있습니다. 모든 사람은 최초에 "Name Server" 로 접속합니다. "Name Server" 는 클라이언트의 AppId로 클라이언트 앱을 체크하고 클라이언트가 사용하기 원하는 지역을 체크합니다. 그리고 "Name Server"는 마스터 서버로 클라이언트를 포워딩 해줍니다.

마스터 서버는 지역 서버들의 허브 역할을 합니다. 마스터 서버는 존재하고 있는 모든 게임에 대해서 알고 있습니다. 게임(룸)이 생성되거나 플레이어가 참여할 때 클라이언트는 "Game Server" 라고 하는 다른 머신으로 포워드됩니다.

PUN의 셋업은 매우 간단하며 호스트 비용, 성능 또는 유지 관리에 신경 쓸 필요가 없습니다.


# 룸

Photon Cloud 는 "룸 기반 게임"을 염두에 두고 구축 되었으며 이 의미를 다시 해석해보자면 매치당 플레이어 수(예를 들어 10 이하)를 제한하고있어 모든 사람과는 분리되어 있는 것입니다.

Photon 에서 룸은 식별하기 위한 이름입니다. 현재 룸의 목록이 있지만, 플레이어는 기존의 룸에 들어가기 위해 임의의 매치 메이크를 사용할 수 있습니다. 룸의 목록은 로비에서 제공됩니다. 룸 안에서는 일반적으로 사람들이 보낸 메시지를 모두 받게 됩니다. 룸을 떠나면 플레이어들은 서로 소통할 수 없으므로 가급적 빠르게 룸에 입장 해야합니다.

룸에 입장하기 위한 가장 좋은 방식은 무작위 매치메이킹입니다. 서버에게 룸 또는 특정 속성을 가진 룸을 요청합니다.

모든 룸에는 식별자로서 이름을 가지고 있습니다. 룸이 가득 차 있거나 폐쇄되지 않았다면 이름으로 룸에 입장할 수 있습니다. 마스터 서버가 앱을 위해 안성맞춤으로 룸의 목록을 제공할 수 있습니다.


# 로비

마스터 서버에는 어플리케이션을 위한 로비가 있는데 로비는 게임을 위한 룸의 목록을 제공합니다. PUN 은 자동적으로 기본 로비에 입장시키며 룸의 목록을 얻어옵니다. 반드시 있어야 하는 것은 아닙니다. 만약 룸의 이름을 안다면 직접 룸에 입장할 수도 있고 무작위 게임에 입장할 수도 있습니다.

신규 PUN 버전에서는 PhotonServerSetting 안에 "Auto-Join Lobby" 설정을 할 수 있습니다. 기본 값은 로비에 참여하지 않는 것입니다.


# Application IDs 와 게임 버전

모든 사람들이 동일한 서버에 접속하면 플레이어를 구분할 것이 필요하게 됩니다.

각 게임(어플리케이션)은 클라우드에 있는 각각의 "AppId"를 받게 됩니다. 플레이어들은 항상 클라이언트가 동일한 "AppId"를 가진 플레이어들과 만나게 됩니다.

또한 "게임 버전"이 있어 플레이어들을 버전에 따라 분리할 수 있습니다.


# 기초부터 시작하기

이제 새로운 것을 시작해보겠습니다. 튜토리얼을 간단하게 하기 위해 MMO를 생성하지 않고 아이들에게 인기 있는 Marco Polo(몬스터가 있는)를 생성할 것입니다. Wikipedia explains what "Marco Polo game" means 를 참고하시면 어떤 것을 만들지에 대한 기본적인 이해를 하실 수 있을 것입니다. https://en.wikipedia.org/wiki/Marco_Polo_(game)


# 리셉션 : 룸 얻기

시작하기 전에 플레이어들을 룸으로 입장하도록 해야합니다. 룸 안에서는 돌아 다닐 수 있고 다른 사람들이 볼 수 있습니다.

"Marco Polo" 라는 폴더를 만들고 "RandomMatchMaker" 라는 C# 스크립트를 생성합니다. 이 스크립트에는 유니티의 Start 메소드가 포함되어 있는데 이 메소드가 최대한 빠르게 접속할 수 있도록 하는 가장 좋은 위치입니다.

PUN 패키지에서 가장 중요한 클래스는 PhotonNetwork 입니다. PhotonNetwork 는 유니티의 네트워크 클래스와 유사하며 사용해야하는 모든 메소드들이 포함되어있습니다.

이미 PhotonServerSettings 파일에 AppId 를 저장했기 때문에 PhotonNetwork.ConnectUsingSettings 를 호출하여 접속할 수 있습니다. gameVersion 파라미터는 이 버전을 식별하기 위해 모든 짧은 문자열이 사용될 수 있습니다. 여기에서는 "0.1" 을 사용하도록 하겠습니다.

플레이 모드로 들어가면 접속 후 로비로 이동하지만 아무런 출력이 없으므로 우리는 알지 못합니다. 상태를 몇개 보도록 하겠습니다. 최소한의 GUI 를 이용한 코드는 아래와 같습니다.

Code Example C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class RandomMatchMaker : MonoBehaviour
{
    void Start()
    {
        PhotonNetwork.ConnectUsingSettings("0.1");
    }
    void OnGUI()
    {
        GUILayout.Label(PhotonNetwork.connectionStateDetailed.ToString());
    }
}
cs

이 스크립트는 아직 씬에 없습니다. 새로운 게임 오브젝트를 하나 생성하여 "Scripts" 라고 이름을 변경합니다. 이렇게 이름을 붙이면 나중에 카메라에 의존하지 않고 더 쉽게 스크립트를 찾을 수 있습니다.

"Scripts" 게임 오브젝트에 RandomMatchMaker 를 추가하고 씬을 저장 후 실행합니다. 레이블은 특정 상태에서 시작하여 로비 안으로 들어가면 끝나게 됩니다. OnConnectedToMaster 상태에서 멈추었다면 PhotonServerSettings 에서 "Auto Join Lobby" 를 할 수 있도록 변경해야합니다.


# PUN 이 호출합니다.

Unity 처럼 PUN은 코드 내에서 무엇인가 발생했다면 특정 메소드를 호출합니다. 현재 우리는 "로비에 도착" 또는 "룸을 찾음" 및 "룸을 찾을 수 없음" 등과 같은 것에 주목하고 있습니다. PUN은 PhotonNetworkingMessage 이름을 가진 enum 구조체에 콜백들을 정의해 놓았습니다. 좋습니다. 코드에서 쉽게 콜백을 구현하기 위해서는 클래스를 일부 변경하는 것이 좋습니다. RandomMatchMaker 에서 "MonoBehaviour" 를 찾아서 Photon.PunBehaviour 로 교체합니다. 파일의 시작 부분에서 PunBehaviour 의 네임스페이스인 using Photon; 을 추가합니다.

이제 이 클래스는 PunBehaviour 이고 각각의 콜백을 개별적으로 오버라이드 할 수 있습니다. override 를 입력하면 IDE 가 해당 리스트를 표시해주기 때문에 쉽게 찾을 수 있습니다.

만약 IDE가 기본 메소드에 호출을 추가했다면 지워주시기 바랍니다. PUN 콜백에서는 아무 것도 없는 기본 구현 메소드를 호출 할 필요가 없습니다.

콜백은 PunBehaviour의 오버라이드일 필요는 없습니다. 이 메소드들은 이름과 파라미터 규약만 맞으면 됩니다. 또한 파라미터 없는 것으로 구현 할 수 있습니다.


# OnJoinedLobby

PUN의 콜백 메소드 중의 하나가 OnJoinedLobby 입니다. 플레이어가 로비에 들어갔을 때 호출됩니다.

당분간은 룸의 목록을 신경쓰지 않고 빠르게 룸 안에 들어가도록 할 것입니다. PhotonNetwork 에 JoinRandomRoom 메소드가 있습니다. 이 메소드는 룸에 무작위로 들어갑니다. 한번 해보겠습니다.

Code Example C#:
1
2
3
4
public override void OnJoinedLobby()
{
    PhotonNetwork.JoinRandomRoom();
}
cs


이 반복을 실행할 때, connectionStateDetailed 의 값은 여전히 JoinedLobby 로 끝나게 됩니다. 명백하게 JoinRandomRoom 는 몇가지 이유로 동작하지 않습니다.


만약 이 콜백이 호출되지 않을 때는 PhotonServerSettings 에서 "Auto-Join Lobby" 이 사용하도록 설정되어 있는지 확인해보세요.


# 에러 처리

에러의 경우 PUN은 로그와 콘솔(Ctrl+Shift+C)을 이용합니다. 만약 예상한 것처럼 동작하지 않거나 콘솔 출력창에 출력이 없다면 PhotonNetwork.logLevel 의 로그 레벨을 "더 높게 "로 설정하시면 됩니다.

Code Example C#:
1
2
// e.g. in Start();
PhotonNetwork.logLevel = PhotonLogLevel.Full;
cs

아래 출력된 예를 보세요.

Photon Cloud Screenshot: Marco Polo Photon View


이 튜토리얼에서는 로그 레벨을 기본 값으로 유지하고 OnPhotonRandomJoinFailed() 콜백을 추가할 것입니다.
에러가 발생하면 콘솔과 로그 파일에 정보가 출력될 것입니다. OnPhotonJoinRandomFailed 와 유사하니 혼동하지 마셔야합니다. (이것은 룸 생성에 실패했을 때 사용됩니다.)

Code Example C#:
1
2
3
4
void OnPhotonRandomJoinFailed()
{
    Debug.Log("Can't join random room!");
}
cs

위 사항으로 PUN 콜백은 override 하지 않아도 동작한다는 것을 증명합니다.


# 룸 생성하기

아무도 플레이하는 사람이 없거나 모든 룸이 플레이어로 꽉 차있으면 무작위로 룸에 참여할 수 없습니다. 이 사항을 플레이어에게 GUI 를 통해 알려주고 잠시 후에 다시 시도할 수 있도록 할 수 있지만 여기에서는 단순하게 룸을 생성하도록 하겠습니다.

PhotonNetwork 에서 "create room" 메소드를 찾아 보면 CreateRoom 이라는 메소드가 있습니다. 툴팁에 두 개의 오버로드 메소드가 있고 룸 이름을 null 로 넘겨주면 새로 룸 이름을 생성(GUID)해줍니다. 아직 룸 이름을 보여주지 않을 것이므로 null 을 넘겨주도록 하겠습니다.

Code Example C#
1
2
3
4
5
void OnPhotonRandomJoinFailed()
{
    Debug.Log("Can't join random room!");
    PhotonNetwork.CreateRoom(null);
}
cs

위의 코드를 입력하고 실행해보세요. 전보다 상태가 더 많이 변화되었으며 마지막에는 "Joined" 로 끝나게 됩니다. 이제 우리만의 룸에 들어가게 되었습니다.

다음 포스팅에서 나머지 내용과 관련되어 올리도록 하겠습니다.


참고한 사이트 : https://doc.photonengine.com/ko-kr/pun/current/tutorials/tutorial-marco-polo


반응형