이번에는 플레이어들이 플레이하는 여러 씬들을 생성해보는 것에 대해 공부해볼까 합니다.
정보 출처
https://doc.photonengine.com/ko-kr/pun/current/demos-and-tutorials/pun-basics-tutorial/game-scenes
경기장 씬 생성
1. 새로운 씬을 생성하여 정확하게 "Room for 1"로 저장
2. UI/text를 생성하여 텍스트의 내용을 "Room for 1"로 변경
3. UI/Button을 생성하고 텍스트의 내용을 "Leave Game"으로 변경
4. 빈 오브젝트를 생성하고 이름을 GameManager 으로 변경
5. GameManager스크립트를 생성하여 아래의 코드를 작성
6. Button의 On Click 이벤트로 GameManager스크립트을 연결하여 LeaveRoom()을 호출하도록 함
7. "Room for 1"씬을 4개 복사하여 씬 이름과 텍스트를 "Room for 2", "Room for 3", "Room for 4"로 변경
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using Photon.Pun;
using Photon.Realtime;
namespace Com.MyCompany.MyGame
{
//MonoBehaviourPunCallbacks란
//.photonView와 PUN이 호출할 수 있는 모든 콜백 / 이벤트를 제공하는 클래스.
//클래스에서 제공하는 이벤트 / 메서드를 재정의하여 사용
public class GameManager : MonoBehaviourPunCallbacks
{
//MonoBehaviourPunCallbacks의 함수
//로컬 사용자 / 클라이언트가 방을 떠날 때 호출
public override void OnLeftRoom()
{
//메인씬으로 이동
SceneManager.LoadScene("Launcher");
}
//방을 떠나게 하는 함수
//버튼에 연결하여 호출
public void LeaveRoom()
{
//현재 방을 떠나 마스터 서버로 돌아가서 룸에 참여하거나 생성 가능
//성공시 OnLeftRoom() 호출
PhotonNetwork.LeaveRoom();
}
}
}
여기까지 하시면 4개의 다른 룸이 생성되었습니다.
또한 씬의 이름 마지막을 보시면 숫자로 되어있는 것을 보실 수 있을텐데, 플레이어의 수를 의미합니다.
플레이어의 수를 마지막 문자로 했기 때문에 룸안의 현재 플레이어 수와 관련된 씬을 바인딩하는 것을 매우 쉽습니다.
"configuration" 기반 접근법으로 예를 들어 주어진 룸 안의 플레이어 수로 씬 이름의 테이블 목록을 찾아 바인딩하게 할 수
있습니다.
경기장 로딩 루틴
이제 경기장 로딩을 하는 함수를 GameManager에 추가해보도록 하겠습니다.
1.GameManager스크립트를 오픈
2.아래의 코드를 추가
//경기장을 불러오는 함수
private void LoadArena()
{
//마스터 클라이언트가 아닐경우?
if (!PhotonNetwork.IsMasterClient)
{
Debug.LogError("마스터 클라이언트가 아니라 경기장을 불러올 수 없습니다.");
return;
}
Debug.LogFormat("방 로딩중 : {0}", PhotonNetwork.CurrentRoom.PlayerCount);
//방에 접속중인 플레이어의 수로 씬을 불러온다.
//PhotonNetwork.LoadLevel()는 반드시 마스터 클라이언트인 경우에만 호출되어야 함
PhotonNetwork.LoadLevel("Room for " + PhotonNetwork.CurrentRoom.PlayerCount);
}
원하는 경기장을 플레이어의 수에 따라 로드하는 기능을 구현해봤습니다.
플레이어들의 연결, 연결해제
다음으로 GameManager스크립트에 플레이어의 연결과 연결해제 기능을 구현해보겠습니다.
1. GameManager스크립트 오픈
2. 아래와 같이 코드 추가
//MonoBehaviourPunCallbacks의 함수
//원격 플레이어가 방에 들어올 때 호출
public override void OnPlayerEnteredRoom(Player other)
{
Debug.LogFormat("플레이어가 방에 입장했습니다. {0}", other.NickName);
//만약 마스터 클라이언트 일 경우?
if(PhotonNetwork.IsMasterClient)
{
Debug.LogFormat("플레이어가 방에 입장했습니다. 마스터 클라이언트: {0}", PhotonNetwork.IsMasterClient);
//경기장 불러오기
LoadArena();
}
}
//MonoBehaviourPunCallbacks의 함수
//원격 플레이어가 방을 떠나거나 비활성화 됬을 때 호출
public override void OnPlayerLeftRoom(Player other)
{
Debug.LogFormat("플레이어가 방을 떠났습니다.{0}", other.NickName);
//만약 마스터 클라이언트 일 경우?
if (PhotonNetwork.IsMasterClient)
{
Debug.LogFormat("플레이어가 방을 떠났습니다. 마스터 클라이언트: {0}", PhotonNetwork.IsMasterClient);
//경기장 불러오기
LoadArena();
}
}
}
로비에서 경기장 로딩
1. Launcher 스크립트 오픈
2. OnJoinedroom() 함수에 아래 코드를 추가
if (PhotonNetwork.CurrentRoom.PlayerCount == 1)
{
Debug.Log("Room for 1 씬을 불러옵니다.");
PhotonNetwork.LoadLevel("Room for 1");
}
3. Launcher 클래스에 변수 추가
private bool _isConnecting;
4. Connect() 함수 첫 부분에 코드 추가
_isConnecting = true;
5. OnConnectedMaster() 함수에 작성되있던 PhotonNetwork.JoinRandomRoom()에 if문 코드 추가
if (_isConnecting)
{
PhotonNetwork.JoinRandomRoom();
}
최종 결과
여기까지 진행하시면 방 입장과 방을 떠나는 기능이 정상적으로 작동하는 것을 볼 수 있습니다!
'Photon Engine' 카테고리의 다른 글
[Unity Photon] 공부 2(로비 UI) (0) | 2023.10.22 |
---|---|
[Unity Photon] 공부 1(로비) (0) | 2023.10.20 |