Photon Engine

[Unity Photon] 공부 3(게임 씬)

때류기 2023. 10. 24. 00:08

 

 

이번에는 플레이어들이 플레이하는 여러 씬들을 생성해보는 것에 대해 공부해볼까 합니다.

 

정보 출처 

https://doc.photonengine.com/ko-kr/pun/current/demos-and-tutorials/pun-basics-tutorial/game-scenes

https://doc.photonengine.com/ko-kr/pun/current/demos-and-tutorials/pun-basics-tutorial/gamemanager-levels

 

경기장 씬 생성

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