<네트워크의 세계란?>
처음에 네트워크라는 개념을 이해하기가 매우 어렵다.
예시를 들어보자면, Rick & Morty를 본 사람은 평행 우주 개념에 대한 이해가 있을 것이다.
평행우주는 내가 살고 있는 세계가 다중으로 존재하고 있다는 것이다.
위의 이미지처럼 똑같은 내가 동시에 다른 시공간에 존재하고 있는 것이다.
그렇기 때문에 다른 우주에 있는 나는 같은 존재이지만 동시에 다른 존재이기도 하다.
위의 이미지를 자세히 보면 등장인물은 모두 동일하지만 행동이 조금씩 다르다.
네트워크의 개념은 평행 우주의 개념과 동일하다.
네트워크는 네트워킹하고 있는 유저의 수만큼 세계를 만든다.
그리고 다른 세계에 있는 캐릭터들을 동기화시켜서
다른 세계에 있는 캐릭터를 같은 캐릭터인 것처럼 보이게 하는 것이다.
말로 설명하면 추상적이라 잘 이해가 되지 않을 것 같아 도식화로 네트워크 세계를 표현해보았다.
Rick & Morty의 평행우주와는 다르게 네트워크의 평행우주에는 master(방장)가 존재한다.
master는 평행우주에서 최초의 세계를 생성한다. master가 생성한 세계를 다른 유저가 접속을하는 것처럼 보이지만, 사실은 다른 유저의 클론이 접속하는 것이다.
만약에 네트워크에 접속하는 유저가 4명이라면,
동일한 세계가 4개가 생기는 것이고 유저는 총 16명이 되는 것이다.
Photon Network PUN이란?
PUN은 Photon Unity Networking의 약칭이며, Unity 상의 멀티플레이어 네트워크 리얼타임 온라인 기능을 강화한 키트로서 기존 Unity Networking과도 호환됩니다. 로우레벨부터 완전히 새로 제작되었으며 Photon Cloud/Server를 게임 백엔드로 사용했기 때문에 개발하기에 상당히 편리합니다.
*PUN과 PUN2의 코드 라이브러리가 약간 다르니 미리 이를 숙지해두어야 한다.
PUN2에 PUN의 라이브러리 코드를 사용하는 삽질은 하지 마시길... 포스팅 작성자는 PUN2를 사용합니다.
<포톤네트워크 사용해보기>
포톤네트워크 기본구조
01. 포톤 네트워크 계정 생성
02. 네트워크 연결
03. 로비
04. 방 생성/ 방 입장
05. 플레이어 동기화 시키기
01. 포톤 네트워크 계정 생성
1. 포톤 엔진에 가입해서 계정을 생성한다.
2. 우측 상단에 있는 사용자 아이콘을 눌러서 public cloud > your application으로 간다.
3. appID주소를 복사한다.
4. unity에서 새로운 프로젝트를 만든다.
5. asset store에서 PUN2 asset을 import 한다.
6. PUN wizard에 본인의 appID를 입력한다.
02. 네트워크 연결
1. NetworkMgr이라는 게임 오브젝트를 생성한 후에
NetworkMgr스크립트를 만들어서 게임오브젝트에 넣는다.
2. NetWorkMgr 스크립트를 열어서 아래와 같이 작성한다.
(보라색 밑줄쳐진 것이 수정 부분)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | using System.Collections; using System.Collections.Generic; using UnityEngine; using Photon.Pun; using Photon.Realtime; using UnityEngine.SceneManagement; public class NetworkMgr: MonoBehaviourPunCallbacks { private void Awake() { PhotonNetwork.AutomaticallySyncScene = true; } //네트워크 연결 private void Start() { PhotonNetwork.GameVersion = "1.0"; PhotonNetwork.ConnectUsingSettings(); } } | cs |
ConnectUsingSettings
즉시, 온라인 상태로 만들어줍니다.
bool PhotonNetwork.automaticallySyncScene
방의 모든 클라이언트가 마스터 클라이언트와 동일한 레벨을로드해야하는지 여부를 정의합니다.
03. 로비
방을 여러개 만들 때만 로비가 필요하다.
(방을 선택해야 될 때)
작성자는 한 개의 방만 필요하기 때문에 따로 로비를 생성하지 않음.
04. 방 생성/ 방 입장
네트워크에 연결 된 이후에 랜덤하게 방에 입장한다.
처음에는 방이 없기 때문에 방입장에 실패할 경우에 새로운 방을 생성한다.
1 2 3 4 5 6 7 8 9 10 11 | public override void OnConnectedToMaster() { Debug.Log("Connect To Master"); PhotonNetwork.JoinRandomRoom(); } public override void OnJoinRandomFailed(short returnCode, string message) { //maxplayer설정(방 생성시) RoomOptions roomOptions = new RoomOptions(); roomOptions.MaxPlayers = 2; //방생성 PhotonNetwork.CreateRoom("virtualWrld", new RoomOptions { MaxPlayers = 2 }); } |
virtual void OnConnectedToMaster
방의 모든 클라이언트가 마스터 클라이언트와 동일한 레벨을로드해야하는지 여부를 정의합니다.
방에 입장한 이후에 플레이어를 생성한다.
네트워크에 연결 후에 플레이어가 생성되어야 통신이 되기 때문이다.
1 2 3 4 5 | //방에 입장한 후에 플레이어 생성 public override void OnJoinedRoom() { PhotonNetwork.Instantiate("cube", Vector3.zero, Quaternion.identity); } | cs |
인스턴스할 플레이어는 project창에 Resources폴더를 만들어서 prefab으로 생성한다.
전체 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | using System.Collections; using System.Collections.Generic; using UnityEngine; using Photon.Pun; using Photon.Realtime; public class NetworkMgr : MonoBehaviourPunCallbacks { private void Awake() { PhotonNetwork.AutomaticallySyncScene = true; } // Use this for initialization void Start () { PhotonNetwork.GameVersion = "1.0"; PhotonNetwork.ConnectUsingSettings(); } //포톤 서버에 접속 public override void OnConnectedToMaster() { PhotonNetwork.JoinRandomRoom(); } public override void OnJoinRandomFailed(short returnCode, string message) { RoomOptions roomOptions = new RoomOptions(); roomOptions.MaxPlayers = 2; PhotonNetwork.CreateRoom("room", roomOptions); } //방에 입장한 후에 플레이어 생성 public override void OnJoinedRoom() { PhotonNetwork.Instantiate("cube", Vector3.zero, Quaternion.identity); } } | cs |
동기화 관련 포스팅은 내일.....
<참조>
https://support.photonengine.jp/hc/ko/articles/236154968-Tanks-Multiplayer-with-PUN-Part-1-
https://doc.photonengine.com/en-us/pun/v2/demos-and-tutorials/pun-basics-tutorial/intro
https://doc.photonengine.com/ko-kr/pun/current/connection-and-authentication/regions
https://doc.photonengine.com/ko-kr/pun/v2/getting-started/pun-intro
http://doc-api.photonengine.com/en/pun/v2/class_photon_1_1_pun_1_1_mono_behaviour_pun_callbacks.html
'Project > Galapagos' 카테고리의 다른 글
유체역학 이론 Day01(구간 반복 시키기 - Bound Movement) (0) | 2018.12.14 |
---|---|
네트워크 Day3 (포톤네트워크 PUN2 - 동기화) (2) | 2018.12.13 |
네트워크 Day1 (포톤네트워크 PUN2 - 테스트) (0) | 2018.12.10 |
장치 연결 테스트 (0) | 2018.12.09 |
L-system: 생명체 시스템 (0) | 2018.11.19 |