Photon PUN 二 大廳 & 房間


一, 簡介

  玩過 LOL , dota2, 王者榮耀 等MOBA類的游戲,就很容易理解大廳和房間了.

  LOL中一個服務器就相當與一個大廳; 什么電一,電二 ,,, 聯通一區等 每一個區就相當於一個大廳.

  而開始游戲創建一個自定義游戲的時候 , 就是創建了一個房間 對應 PhotonNetwork.CreateRoom() 函數 .

  LOL普通匹配就像是一個有對應匹配算法的 PhotonNetwork.JoinRandom() .

二, 使用 

  ① 連接到服務器

  服務器的地址在這里設置

  

  勾選Auto-Join Lobby 后程序就會自動加入到房間 , 不需要再在代碼中實現加入大廳

  在適當的地方調用 PhotonNetwork.ConnectUsingSettings(string _GameVersion)  ; 即可連接到大廳.

  連接大廳成功與失敗對應兩個函數

  首先腳本需要繼承自  Photon.PunBehaviour 

    public class Launcher : Photon.PunBehaviour
    {

        /// <summary>
        /// 成功連接到大廳
        /// </summary>
        public override void OnConnectedToPhoton()
        {
            
        }

        /// <summary>
        /// 連接大廳失敗
        /// </summary>
        /// <param name="error"></param>
        private void OnFailedToConnect(NetworkConnectionError error)
        {
            Debug.Log("fail to Connect");
        }
    }

  ② 監控房間列表

  重寫 Photon.PunBehaviour.OnReceivedRoomListUpdate() ;

public override void OnReceivedRoomListUpdate(){

}

  ③ 設置玩家昵稱  PhotonNetwork.playerName = "PlayerName";

  ④ 創建房間 PhotonNetwork.CreateRoom("roomName", new RoomOptions() { MaxPlayers = MaxPlayersPerRoom },(TypedLobby)null );

   第一個參數是房間名, 第二個參數房間參數, 第三個參數 房間所在的大廳 默認大廳是null

  ⑤ 加入房間 

 

  /// <param name="roomName">獨一無二的房間名</param>
  /// <param name="expectedUsers">玩家在房間中的順序</param>
  /// <returns>加入是否成功</returns>
  public static bool JoinRoom(string roomName, string[] expectedUsers)

 

三. 完整代碼

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

namespace com.Lobby
{
    public class Launcher : Photon.PunBehaviour
    {
        #region PUBLIC

        //客戶端版本
        public string _gameVersion = "1.0";

        //玩家名字
        public InputField nameField;

        //房間列表
        public RectTransform LobbyPanel;

        #endregion

        #region PRIVATE 

        private bool isConnecting;
        #endregion

        private void Awake()
        {
            //#不重要
            //強制Log等級為全部
            PhotonNetwork.logLevel = PhotonLogLevel.Full;

            //#關鍵
            //我們不加入大廳 這里不需要得到房間列表所以不用加入大廳去
            PhotonNetwork.autoJoinLobby = true;

            //#關鍵
            //這里保證所有主機上調用 PhotonNetwork.LoadLevel() 的時候主機和客戶端能同時進入新的場景
            PhotonNetwork.automaticallySyncScene = true;
        }

        // Use this for initialization
        void Start()
        {
            Connect();

            SetPlayerName();
        }

        /// <summary>
        /// 連接到大廳
        /// </summary>
        private void Connect()
        {
            isConnecting = true;

            //已經連接上了服務器
            if (PhotonNetwork.connected)
            {
                Debug.Log("Connected");
            }
            else
            {
                PhotonNetwork.ConnectUsingSettings(_gameVersion);
            }
        }
        /// <summary>
        /// 成功連接到大廳
        /// </summary>
        public override void OnConnectedToPhoton()
        {
            base.OnConnectedToPhoton();
        }

        /// <summary>
        /// 連接大廳失敗
        /// </summary>
        /// <param name="error"></param>
        private void OnFailedToConnect(NetworkConnectionError error)
        {
            Debug.Log("fail to Connect");
        }

        public void CreateARoom()
        {
            if (PhotonNetwork.connected)
            {
                //創建房間成功
                if (PhotonNetwork.CreateRoom(nameField.text, new RoomOptions { MaxPlayers = 4 }, null))
                {
                    Debug.Log("Launcher.CreateARoom 成功");
                    PhotonNetwork.LoadLevel("Room");
                }
            }
        }

        public override void OnPhotonCreateRoomFailed(object[] codeAndMsg)
        {
            Debug.Log("Launcher Create Room faileds");
        }

        public void PlayerNameChanged()
        {
            if (string.IsNullOrEmpty(nameField.text))
            {
                PlayerPrefs.SetString("PlayerName", "default");
            }
            else
            {
                SetPlayerName();
            }
        }

        public void SetPlayerName()
        {
            if (string.IsNullOrEmpty(nameField.text))
            {
                if (PlayerPrefs.HasKey("PlayerName"))
                {
                    nameField.text = PlayerPrefs.GetString("PlayerName");
                }
            }

            PhotonNetwork.playerName = nameField.text;
            PlayerPrefs.SetString("PlayerName", nameField.text);
        }

        public override void OnReceivedRoomListUpdate()
        {

            Debug.Log("OnReceivedRoomListUpdate");

            RoomInLobby[] ts = LobbyPanel.GetComponentsInChildren<RoomInLobby>();
            foreach (RoomInLobby t in ts)
            {
                Destroy(t.gameObject);
            }

            RoomInfo[] rooms = PhotonNetwork.GetRoomList();
            foreach (RoomInfo room in rooms)
            {
                GameObject g = GameObject.Instantiate(Resources.Load("Lobby/RoomItem") as GameObject);
                Text t = g.transform.Find("Text").GetComponent<Text>();
                t.text = room.Name;
                g.name = room.Name;
                g.transform.SetParent(LobbyPanel);
                g.transform.localScale = Vector3.one;
            }
        }
    }
}

 這里有整個工程的代碼 https://github.com/Luckeee/mahjong


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM