Tanks, Multiplayer with PUN! (Part 2)
이번 편에서는 Unity에서 어떻게 Photon Cloud와 연결하고 네트워크화된 게임 장면의 준비작업 단계에 진입하느냐에 대해 설명해 보겠습니다.
Photon Cloud Service와 연결 구축
지난 편에서 Photon Server의 정보를 이미 구축했습니다. 이제 하나의 빈 게임 장면을 바로 만들고 이것을 “StartScene”이라고 부르겠습니다. 또한 앞으로 게임 프로젝트 관리가 편하도록 Asset →TanksPUN 아래에 저장하겠습니다.
Main Camera는 Solid Color를 선택하겠습니다. 따라서 현재의 설정은 다음과 같아야 합니다.
Game Session (with Photon Cloud) 구축
장면 중 하나의 빈 GameObject를 만들어 PhotonManager라고 부르고, 이 게임 장면의 게임 관리자로 삼을 수 있습니다. 이것은 하나만 있어야 하기 때문에 이것을 Singleton Object 타입으로 설정하겠습니다. (여기에서는 가장 간단한 처리를 소개해드리기 위해, 상세한 Singleton 사용법은 생략하도록 하겠습니다.)
현재 TanksPUN 아래 Scripts를 만드는데, 이것은 앞으로 우리가 이 프로젝트의 프로그램을 편리하게 저장할 수 있도록 해 줍니다. 또한 여기에 하나의 새로운 C# script를 만들어 “PhotonManager”라고 부르며 초기 내용은 다음과 같습니다.
using UnityEngine;
using System.Collections;
public class PhotonManager : Photon.PunBehaviour {
public static PhotonManager instance;
void Awake()
{
if(instance != null)
{
DestroyImmediate(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
instance = this;
}
}
이 PhotonManager.cs를 Scene 중의 PhotonManager (GameObject) 안으로 끌어 넣습니다. 이것은 MonoBehaviour가 아닌 Photon.PunBehaviour를 승계한다는 점을 주의해 주세요. 이 게임 요소는 나중에 Photon Cloud/Server와 소통하는 데 사용합니다. PUN은 PunBehaviour 내에 사용하기 편리하고 필요한 Events, CallBack Functions를 설정하여 우리가 운용할 수 있도록 도와줍니다. 따라서 나중에 우리는 그 안에서 개발한 게임 네트워크 기능을 override할 수 있습니다.
Awake()를 처리한 후, 이어서 Photon Cloud과 연결시킵니다. 가장 간단한 방식은 곧바로 GameManager 중의 Start()에 다음 script를 사용하는 것입니다.
void Start () {
PhotonNetwork.ConnectUsingSettings("TanksPUN_v1.0");
}
이 ConnectUsingSettings는 우리가 이전에 이미 설정한 Photon Services Setting의 값(AppID, Hosting, Protocol...)을 정보로 사용해 자동으로 Photon Cloud 내로 전송합니다. (Part1 기사를 참고하세요: Tanks, Multiplayer with PUN! Part1 )
또한 한 세트의 스트링 정보 TanksPUN_v1.0을 추가하는데, 이것은 우리가 연결한 것이 동일한 게임(AppID가 동일)이기는 하나 다른 버전일 수 있다는 것을 Photon Server에게 알리는 역할을 주로 합니다. 이렇게 하면 우리는 이후에 신버전, 구버전 프로그램의 호환성 문제를 처리할 수 있습니다. 버전이 다르면 접속 또는 자료 처리방식이 다를 수 있습니다.
Create or Join Game Room
PhotonNetwork에서 게임 룸(Game Room)을 만들 때 일부 간단한 설정이 필요합니다. 예를 들어 최대 수용 인원 수, 게임 룸의 숨김 여부 또는 폐쇄 여부의 상태 등이 있습니다.
또한 PUN에서 JoinOrCreateRoom을 사용할 때, 만약 이 게임 룸을 구축 및 초기화하지 않았다면 PhotonNetwork는 우리가 게임 룸을 만드는 것을 도와주며, 이후 이 게임 룸에 가입하려는 사람은 곧바로 게임 룸의 명칭을 사용할 수 있고, 동일한 호출 방식으로 이미 만든 게임 룸을 찾아 곧바로 진입할 수 있습니다.
그럼, 하나의 게임 룸 최대 수용 게이머를 4명으로 설정해 봅시다. 이는 다음과 같습니다.
public void JoinGameRoom()
{
RoomOptions options = new RoomOptions();
options.MaxPlayers = 4;
PhotonNetwork.JoinOrCreateRoom("Fighting Room", options, null);
}
이어서 StartScene 내에 하나의 UI Button을 설치하고 JoinRoomButton이라고 부릅니다. 이것의 OnClick() 내에서 PhotonManager로 방금 작성한 기능 JoinGameRoom()을 지정 호출합니다. 참고 화면은 다음과 같습니다.
Join Room Button → OnClick() → PhotonManager.JoinGameRoom()
그렇다면 JoinRoomButton을 클릭한 후 우리는 이미 Game Room에 진입했다는 것을 어떻게 알 수 있을까요? 이 때 PUNBehaviour가 기능을 수행합니다. 우리는 OnJoinedRoom이라고 불리는 기능을 Override할 수 있으며, 그 중 일부 매커니즘을 설정할 수 있습니다. 예를 들어 본 기기 게이머인지, 특수 도구를 부여해야 하는지, 기타 게임 장면을 로딩해야 하는지 또는 게임의 메시지 표시를 준비할 수 있는지를 식별하는 것 등이 있습니다.
public override void OnJoinedRoom()
{
Debug.Log("당신은 이미 게임 룸에 진입했습니다!!");
// Master Client의 경우,이니셜라이즈 작업을 진행/Scean을 로딩 후에 게임을 시작
if (PhotonNetwork.isMasterClient)
{
PhotonNetwork.LoadLevel("GameRoomScene");
}
}
여기까지 작업을 마친 후 게임 실행, Play를 테스트하면, 우리는 console에서 “당신은 이미 게임 룸에 진입했습니다!!”라는 스트링을 보게 될 것입니다.
이건 뭐지? 라고 생각하셨죠? 사실 이 스트링을 본다는 것은 우리의 초기 장면과 Photon Cloud/Server가 이미 정상적인 접속 운행을 시작했다는 것을 의마합니다! 설정 대성공!!😁👻🤖👏💕
만약 이 스트링이 없다면......괜찮아요. 실패는 성공의 어머니이니까요! Photon Cloud KR의 페이스북을 통해 질문해 주세요~
https://www.facebook.com/photoncloudkr/
다음 편에서는 게임 룸 장면(Game Room Scene)을 로딩하고 플레이어 캐릭터(Player Character)를 만든 후 그 행동을 제어해 보겠습니다. Unity의 범례 Tanks!로 가봅시다~
다음에 봐요~ 😁👻🤖👏💕
댓글
댓글 0개
댓글을 남기려면 로그인하세요.