一, 簡介
玩過 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