시작하기 전에...
필요한 배경지식을 간단히 정리해보겠다.
멀티플레이 시스템의 종류
- 전용 서버(Dedicated Server) :
클라이언트로부터 "행동 입력"을 받는 서버이다. 예를 들어, 클라이언트 A가 "총을 쐈다"라는 행동 입력을 보내면 서버에서 총알이 누군가를 맞췄는지, 만일 맞췄다면 데미지는 얼마나 넣을 것인지 등을 모두 "판정"하여 그 결과를 다른 클라이언트들에게 보내준다. 만일 클라이언트 측에서 조작된 입력(예: 1초에 100발 쏘기, 순간이동 등)을 보낸다면, 서버는 그 유효성을 판단하여 무시할 수 있다. 서버가 해킹되지 않는 이상 클라이언트 측에서 할 수 있는 조작-행동이 아무것도 없기 때문에, 가장 보안성이 높다. 그러나 비용이 가장 많이 든다. --> 배틀그라운드, 롤 - 리슨 서버(Listen Server) :
클라이언트가 서버 역할도 겸하는 연결 방식이다. 이러한 클라이언트를 "방장 또는 호스트"라고 일컫는다. 전용 서버와 같이 호스트가 유효성을 판정한다. 그러나 호스트 역할을 맡은 클라이언트가 조작된 입력을 보내는 것은 막을 수 없다. 또한 호스트가 중간에 게임을 종료한 경우, 새로운 호스트를 선정하는 절차도 필요해진다. 게임사에서 따로 서버를 운영할 필요가 없어서 비용이 들지 않지만 보안성이 꽤 낮다. --> 마인크래프트, 스타크래프트 - P2P(Peer-to-Peer) :
모든 클라이언트가 서로와 소통하는 구조이다. "서버"가 없으므로 따로 유효성을 검사하는 절차가 존재하지 않는다. 행동 입력과 결과 판정을 각자의 클라이언트에서 하며, 계속해서 서로의 월드 속 정보를 동기화한다. 매우 쉽게 구현할 수 있다. 그러나 아무 클라이언트나 조작을 가해도 그 조작이 다른 클라이언트에게 유효성 검사를 거치지 않은 채로 동기화되기 때문에, 가장 보안성이 낮은 연결 방식이다. --> 하이퍼 캐주얼 게임
동작 방식 (Dedicated Server)
- 전용 서버에서 클라이언트의 룸(서버 인스턴스) 생성 요청을 받는다. 요청이 유효하다면 룸을 생성한다.
- 전용 서버가 만든 룸을 True World로 선정한다.
- 전용 서버는 연결된 다른 클라이언트로부터 행동 입력을 실시간으로 받는다. (유효성을 검사한다)
- 받은 행동 입력은 True World에서만 실행되며, 그 결과를 연결된 다른 클라이언트에게 일방적으로 보낸다.
- 결과를 받은 이들은 그에 맞춰 각자의 월드를 구현한다.
동작 방식 (Listen Server)
- 전용 서버에서 클라이언트의 룸 생성 요청을 받는다. 요청이 유효하다면 룸을 생성한다.
- 호스트를 선정한다.
- 호스트는 자기 자신 & 연결된 다른 클라이언트로부터 행동 입력을 실시간으로 받는다. (유효성을 검사한다)
- 받은 행동 입력은 호스트의 월드에서만 실행되며, 그 결과를 자기 자신 & 연결된 다른 클라이언트에게 일방적으로 보낸다.
- 결과를 받은 이들은 그에 맞춰 각자의 월드를 구현한다.
- 참고 : 만일 플레이어가 3명이면, 월드도 3개다. 그 중 호스트의 월드를 True World로 선정하고, 그에 맞춰 동기화를 하는 것이다.
동작 방식 (P2P)
- 전용 서버에서 클라이언트의 룸 생성 요청을 받는다. 요청이 유효하다면 룸을 생성한다.
- 모든 클라이언트는 룸 안에 있는 다른 모든 클라이언트에게 자신의 행동 입력을 보낸다.
- 각각의 클라이언트는 받은 행동 입력을 자신의 월드에서 실행한다.
- 정해진 주기에 맞춰 서로의 "현재 월드 상태"를 동기화한다.
필수적으로 요구되는 서버
위에서 봤듯이 어떤 멀티플레이 시스템을 사용하든지 간에, 매치메이킹을 위한 전용 서버(Dedicated Server)는 반드시 필요하다. 전용 서버에서 모든 것이 이루어지는 게임은 당연히 필요할 것이고, 리슨 서버나 P2P 방식을 이용한다고 하더라도 "게임 시작"을 클라이언트가 요청했을 때 그 요청을 받고 호스트를 지정하거나 IP/포트를 공유할 수 있도록, 지속적으로 대기하고 있는 서버가 필요하기 때문이다.
필요한 Package
Unity Asset Store에서 PUN 2를 검색하면 다운로드 받을 수 있다;
https://assetstore.unity.com/packages/tools/network/pun-2-free-119922
PUN 2 - FREE | 네트워크 | Unity Asset Store
Get the PUN 2 - FREE package from Photon Engine and speed up your game development process. Find this & other 네트워크 options on the Unity Asset Store.
assetstore.unity.com
Package 세팅
- Window >> Photon Unity Networking >> PUN Wizard를 클릭한다.
- 만일 Photon Engine 계정이 있다면, Setup Project를 클릭한다. 로그인 하자마자 20 CCU라고 되어있는 창 밑에 AppID가 보일 것이다. 더블 클릭하여 복사해준 뒤, Unity Editor로 돌아와서 "AppId or Email" 칸에 붙여넣고, 밑에 있는 Setup Project를 눌러주면 된다.
- 만일 Photon Engine 계정이 없다 하더라도, Setup Project를 그대로 클릭한다. 그리고 "AppId or Email" 칸에 자신의 email을 친다. 그러면 그걸 통해서 계정을 생성할 수 있는 웹사이트로 이동할 것이다. 계정을 생성한 뒤, 2번 과정을 따라하면 된다. (만일 이게 잘 안 된다면, 그냥 공식 홈페이지에 들어가서 계정을 직접 생성한 뒤 왼쪽 상단의 Your 탭에서 Apps를 클릭하여 직접 AppId를 찾는 게 빠를 수도 있다!)