원본 글 : https://doc.photonengine.com/ko-kr/pun/current/demos-and-tutorials/pun-basics-tutorial/game-scenes
플레이어 수에 따라 적정한 레벨을 로드하는 로직을 구현
우선 게임 매니저를 생성하고 스크립트를 만든다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class GameManager : MonoBehaviour { public void OnLeftRoom() { SceneManager.LoadScene(0); } public void LeaveRoom() { PhotonNetwork.LeaveRoom(); } } | cs |
일단은 방에서 나가는 함수와 로비씬으로 돌아가는 함수만 존재한다.
버튼을 하나 생성하여 게임매니저의 LeaveRoom() 함수와 연결.
PhotonNetwork.LeaveRoom()함수가 불리면 내부에서 OnLeftRoom()함수를 호출하는듯 하다.
그리고 원본글따라 여러개의 게임씬을 생성하고 빌드세팅에서 씬을 세팅해준다.
3번이 너무 짧아서 4번과 통합하였다.
경기장 로드 함수를 게임매니저에 추가해준다.
1 2 3 4 5 6 7 8 9 | private void LoadArena() { if(!PhotonNetwork.isMasterClient) { Debug.LogError("PhotonNetwork : Trying to Load a level but we are not the master Client"); } Debug.Log("PhotonNetwork : Loading Level : " + PhotonNetwork.room.PlayerCount); PhotonNetwork.LoadLevel("Room for " + PhotonNetwork.room.PlayerCount); } | cs |
PhotonNetwork.LoadLevel()은 마스터 클라이언트에서만 호출되어야 하므로 isMasterclient를 이용해 체크한다.
automaticallySyncScene(1 로비만들기 참고)을 true로 했기 때문에 룸 안에 접속한 클라이언트들은 포톤이 레벨로드함.
플레이어들의 연결 관찰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public override void OnPhotonPlayerConnected(PhotonPlayer newPlayer) { Debug.Log("OnPhotonPlayerConnected() " + newPlayer.NickName); if (PhotonNetwork.isMasterClient) { Debug.Log("OnPhotonPlayerConnected isMasterClient " + PhotonNetwork.isMasterClient); LoadArena(); } } public override void OnPhotonPlayerDisconnected(PhotonPlayer otherPlayer) { Debug.Log("OnPhotonPlayerDisconnected() " + otherPlayer.NickName); if (PhotonNetwork.isMasterClient) { Debug.Log("OnPhotonPlayerDisconnected isMasterClient " + PhotonNetwork.isMasterClient); LoadArena(); } } | cs |
플레이어들이 연결 또는 연결을 끊으면 로그를 남기고 마스터클라이언트에서는 LoadArena() 함수를 실행함
로비에서 경기장 로드
1 2 3 4 5 6 7 8 | if(PhotonNetwork.room.PlayerCount == 1) { Debug.Log("We load the 'Room for 1' "); // #Critical // Load the Room Level. PhotonNetwork.LoadLevel("Room for 1"); } | cs |
Launcher 스크립트의 OnJoinedRoom() 함수에 위와 같이 추가한다.
룸에 입장하면 룸의 플레이어수를 체크하여 1이면 Room for 1 씬으로 이동하겠다는 뜻.
위와 같이 설정하고 Launcher씬으로 가서 게임을 실행한 후 Play 버튼을 누르면
Play버튼 클릭 → Launcher스크립트의 Connect()함수 호출
→ connected 상태가 아니므로 ConnectUsingSettings() 함수 호출하여 연결
→ OnConnectedToMaster() 함수 호출 → JoinRandomRoom() 함수 호출
→ 룸 참여에 실패할테니 OnPhotonRandomJoinFailed() 함수 호출 → CreateRoom() 함수 호출하여 룸 생성
→ 룸 생성하여 참가가 성공하면 OnJoinedRoom() 함수 호출 → PlayerCount가 1이므로 LoadLevel() 함수 호출
→ Room for 1 씬으로 전환
이렇게 진행이 될 것이다.
Room for 1 씬에서 나가기 버튼을 누르면
Leave Game버튼클릭 → GameManager의 LeaveRoom() 함수 호출
→ OnLeftRoom() 함수 호출 → 0번 씬(Launcher 씬)으로 전환
이렇게 진행이 된다.
그런데 이렇게 Launcher씬으로 전환되면 OnConnectedToMaster()함수가 호출된다. 이유는 모름 그렇게 만들었나보다.
그래서 나가기 이후에 Room for 1씬으로 다시 전환되는 문제가 발생한다.
1 2 3 4 5 6 7 8 | bool isConnecting; // Connect 함수에서 true로 변경 isConnecting = true; // OnConnectedToMaster() 안에서 if(isConnecting) PhotonNetwork.JoinRandomRoom(); | cs |
그래서 isConnecting 변수를 만들어 Connect() 함수 실행시에만 true로 만들어주고.
true일때만(버튼을 눌렀을때만) 방에 들어가도록 변경하였다.
'프로그래밍 공부 > Photon' 카테고리의 다른 글
7. 네트워킹을 위한 플레이어 변경 (0) | 2018.08.07 |
---|---|
5. 플레이어 만들기 / 6. 플레이어 카메라 동작 (0) | 2018.08.07 |
2. 로비 UI (0) | 2018.08.06 |
1. 로비 만들기 (0) | 2018.08.06 |
Photon 시작하기 (0) | 2018.08.06 |