09/29 - Photon Pun2 - 네트워크 멀티플레이 게임, 환경설정

멀티플레이 게임 서버를 직접 만들면 서버 프로그램 개발뿐 아니라 호스팅, 보안, 운영과 유지보수도 맡아야 한다. Photon PUN 2를 사용하면 Photon Cloud의 서버 기능을 이용하여 룸 기반 멀티플레이를 구현하고 게임 로직에 집중할 수 있다. 다만 게임 로직 자체가 자동으로 만들어지는 것은 아니다.
PhotonServerSettings에 설정한 Realtime App ID를 사용하여 연결한다. 실제 접속에는 App ID 외에 연결 설정과 서버 선택 과정도 관여한다.연결 흐름은 App ID로 게임 식별 → 마스터 서버 접속 → 룸 검색 또는 생성 → 게임 서버의 룸 입장이다. 로비에서는 룸 목록의 변경 사항을 받을 수 있지만, 게임 오브젝트와 플레이어의 게임 플레이 상태를 동기화하는 범위는 같은 룸에 참가한 플레이어들이다. 룸의 마스터 클라이언트는 룸 안의 한 플레이어를 뜻하며, 마스터 서버와 다른 개념이다.
PhotonLobbyManager.cs에 사용된 Photon APIpublic class PhotonLobbyManager : MonoBehaviourPunCallbacks — MonoBehaviourPunCallbacks는 Unity의 MonoBehaviour 기능을 가지면서 Photon의 연결·로비·룸 콜백을 override할 수 있게 한다. 이 스크립트처럼 Photon 콜백 메서드를 재정의할 때 MonoBehaviour 대신 상속한다.
public override void OnConnectedToMaster() — 마스터 서버에 접속하여 매칭 작업을 할 수 있게 되면 호출된다. 이 코드에서는 이어서 PhotonNetwork.JoinLobby()를 요청한다.public override void OnJoinedLobby() — 로비 입장이 완료되면 호출된다. 로비 입장과 룸 입장은 서로 다른 단계다.public override void OnLeftLobby() — 로비에서 나간 뒤 호출된다. 룸에 입장하면 로비에서는 나가게 된다.public override void OnJoinRandomFailed(short returnCode, string message) — JoinRandomRoom()이 입장할 룸을 찾지 못하면 호출된다. returnCode는 실패 코드, message는 설명이며, 이 코드에서는 새 룸을 만든다.public override void OnJoinedRoom() — 자신이 룸에 입장한 뒤 호출된다. 이때 현재 룸과 플레이어 정보를 화면에 표시한다.public override void OnLeftRoom() — 자신이 룸에서 나간 뒤 호출된다. 다른 플레이어가 나간 경우의 콜백과 구별한다.public override void OnPlayerEnteredRoom(Player newPlayer) — 다른 플레이어가 현재 룸에 들어왔을 때 호출된다. newPlayer가 들어온 플레이어다.public override void OnPlayerLeftRoom(Player otherPlayer) — 다른 플레이어가 현재 룸에서 나갔을 때 호출된다. otherPlayer가 나간 플레이어다.public override void OnDisconnected(DisconnectCause cause) — Photon 서버와의 연결이 끊어졌을 때 호출된다. cause가 종료 원인이며, 이 코드는 ServerTimeout 또는 ClientTimeout이면 재접속을 시도한다.PhotonNetwork.ConnectUsingSettings() — PhotonServerSettings에 저장된 App ID 등의 설정으로 연결을 시작한다. 연결이 완료되었는지는 이후 콜백으로 확인한다.PhotonNetwork.Disconnect() — Photon 연결을 종료한다. 종료 과정이 완료되면 OnDisconnected()가 호출된다.PhotonNetwork.Reconnect() — 연결이 끊어진 뒤 마스터 서버로 다시 접속을 시도한다. 반환값 true는 시도를 시작했다는 뜻이지, 연결 완료나 이전 룸 재입장을 뜻하지 않는다.PhotonNetwork.JoinLobby() — 로비 입장을 요청한다. 완료되면 OnJoinedLobby()가 호출된다.PhotonNetwork.LeaveLobby() — 로비 퇴장을 요청한다. 완료되면 OnLeftLobby()가 호출된다.PhotonNetwork.JoinRandomRoom() — 입장 가능한 룸을 찾아 입장을 요청한다. 찾지 못하면 OnJoinRandomFailed()가 호출된다.PhotonNetwork.CreateRoom("ComeOn", options) — 이름이 ComeOn인 룸을 options 설정으로 만들도록 요청한다. 이 코드의 RoomOptions options = new RoomOptions(); options.MaxPlayers = 4;는 새 룸의 최대 인원을 4명으로 지정한다.PhotonNetwork.LeaveRoom() — 현재 룸에서 나가도록 요청한다. 완료되면 OnLeftRoom()이 호출된다.PhotonNetwork.AutomaticallySyncScene = true — 같은 룸의 플레이어가 마스터 클라이언트의 씬 로드를 따라가도록 설정한다. 모든 게임 오브젝트 상태가 자동으로 동기화된다는 뜻은 아니다.PhotonNetwork.NickName = "Player" — 로컬 플레이어의 닉네임을 설정한다. 이 코드는 접속할 때 Player로 지정한다.PhotonNetwork.GameVersion = "1.1" — 함께 매칭될 게임 버전을 지정한다. 이 코드는 ConnectUsingSettings() 직후에 설정하며, Photon 문서상 인증 단계 전에 설정값이 반영될 수 있다.PhotonNetwork.IsConnected — 현재 Photon 연결 여부를 나타낸다. 연결 과정의 세부 단계나 룸 작업 가능 여부까지 뜻하지는 않는다.PhotonNetwork.InLobby, PhotonNetwork.InRoom — 각각 현재 로비와 룸에 들어가 있는지 나타낸다.PhotonNetwork.NetworkClientState — 현재 연결 단계를 ClientState 값으로 나타낸다. 이 코드는 PeerCreated와 Disconnected를 확인하여 연결 버튼 상태를 정한다.PhotonNetwork.CountOfPlayersOnMaster — 마스터 서버에서 룸을 찾는 등의 작업을 하는 플레이어 수다. 현재 로비 인원이라는 뜻은 아니다.PhotonNetwork.CountOfRooms — 사용 중인 룸 수를 나타내는 통계다. 위 통계와 함께 주기적으로 갱신되므로 즉시 변하는 실시간 카운터로 보지 않는다.PhotonNetwork.CurrentRoom — 자신이 참가 중인 Room 객체다. 룸 밖에서는 null이며, room.Name, room.PlayerCount, room.MaxPlayers로 룸 이름과 현재·최대 인원을 읽는다.PhotonNetwork.PlayerList — 현재 룸의 플레이어 목록이다. 각 Player의 ActorNumber는 그 룸 안에서의 번호, NickName은 닉네임, IsMasterClient는 해당 플레이어가 룸의 마스터 클라이언트인지 나타낸다.Window → Multiplayer Play Mode를 열면 한 컴퓨터에서 여러 플레이어를 실행해 멀티플레이 동작을 시험할 수 있다. 메뉴가 보이지 않으면 Package Manager에 Multiplayer Play Mode 패키지가 설치되어 있는지 확인한다. 이 도구는 테스트 실행 환경이며, Photon의 로비나 룸 자체는 아니다.
새 글이 올라오면 Develog 알림으로 알려드려요
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
Develog는 단순히 글을 쓰는 공간이 아닙니다. 성장의 과정을 기록하고, 그 기록으로 나를 증명하며 원하는 기회를 얻는 곳이길 바랐습니다. 누군가의 꿈으로 향하는 중간다리가 되는 것, 그것이 Develog를 만든 이유입니다.

게임업계 취업을 준비하다 보면 조금 불편한 현실을 마주하게 됩니다. 게임회사에 들어가고 싶은 사람은 많습니다. 특히 신입 채용은 더 그렇습니다. 공고 하나에 많은 지원자가 몰리고, 회사 입장에서는 비슷한 조건의 지원자 가운데 사람을 선택할 수 있습니다. 그래서 다른 산업에서 흔히 이야기하는 “처음부터 연봉을 낮춰 부르지 마세요.” “적극적으로 협상하세요.”

우리들의 게임 발매 이야기
Develog는 단순히 글을 쓰는 공간이 아닙니다. 성장의 과정을 기록하고, 그 기록으로 나를 증명하며 원하는 기회를 얻는 곳이길 바랐습니다. 누군가의 꿈으로 향하는 중간다리가 되는 것, 그것이 Develog를 만든 이유입니다.


게임업계 취업을 준비하다 보면 조금 불편한 현실을 마주하게 됩니다. 게임회사에 들어가고 싶은 사람은 많습니다. 특히 신입 채용은 더 그렇습니다. 공고 하나에 많은 지원자가 몰리고, 회사 입장에서는 비슷한 조건의 지원자 가운데 사람을 선택할 수 있습니다. 그래서 다른 산업에서 흔히 이야기하는 “처음부터 연봉을 낮춰 부르지 마세요.” “적극적으로 협상하세요.”
