🟥 目标
1、点“开始连接”,进入房间
2、将你的用户名发送到PUN,实现同步
类似游戏中能看到其他用户名字
3、点击开始连接,开始连接隐藏,出现正在连接中的字样。
🟧 开发过程
1️⃣ Unity界面
a、界面
完成目标中UI的设置与逻辑。代码自行编写。
b、脚本绑定
实现点击“开始连接”,进入房间。
- 开始连接按钮,绑定 Launcher 脚本的 Skode_JoinRoom
2️⃣ 用户名同步
告诉PUN你的名字,用于后面进行显示。
- 下脚本挂载到任意物体上,给该脚本绑定输入框
- 输入框的OnEndEdit,绑定该脚本动态(Dynamic string)的SetPlayerName方法
using UnityEngine; using UnityEngine.UI; using Photon.Pun; public class PlayerNameInputField : MonoBehaviour { #region Parameters public InputField inputField; const string playerNamePrefKey = "PlayerName"; string defaultName = string.Empty; #endregion #region Mono CallBacks void Start() { if (inputField != null) { if (PlayerPrefs.HasKey(playerNamePrefKey)) { defaultName = PlayerPrefs.GetString(playerNamePrefKey); inputField.text = defaultName; } } PhotonNetwork.NickName = defaultName; } #endregion #region Public Methods //设置玩家的名字,并将其保存在PlayerPrefs中以备将来使用。 //在OnEndEdit绑定动态 public void SetPlayerName(string value) { if (string.IsNullOrEmpty(value)) { Debug.LogError("输入框应输入玩家名字"); return; } PhotonNetwork.NickName = value; PlayerPrefs.SetString(playerNamePrefKey, value); } #endregion }
3️⃣ 点击开始连接后,开始连接隐藏
注意:在连接服务器失败OnDisconnected() 时,显示开始连接和输入名字:
Launcher最终代码:
using UnityEngine; using Photon.Pun; using Photon.Realtime; public class Launcher : MonoBehaviourPunCallbacks { #region Parameters [Tooltip("连接服务器失败后要显示的物体")] public GameObject[] failedShow; //此客户端的版本号。用户之间通过gameVersion(允许你做出破坏性的改变)进行隔离。 string gameVersion = "1"; [SerializeField] [Tooltip("最大连接人数")] byte maxPlayersPerRoom = 4; bool isPressPlay = false; #endregion #region Mono CallBacks void Awake() { // 这确保我们可以在主客户端和同一房间的所有客户端上使用photonnet . loadlevel()自动同步它们的级别 PhotonNetwork.AutomaticallySyncScene = true; } void Start() { ConnectServer(); } #endregion #region Public Method //绑定到开始连接上:连接到服务器房间 public void Skode_JoinRoom() { isPressPlay = true; //若还未连接服务器,则先连接服务器,再加入房间 if (!PhotonNetwork.IsConnected) ConnectServer(); else LoadRoom(); } #endregion #region Private Methods //连接到服务器 void ConnectServer() { // 检查是否连接了服务器 if (!PhotonNetwork.IsConnected) { //首先连接到光子在线服务器。 PhotonNetwork.GameVersion = gameVersion; PhotonNetwork.ConnectUsingSettings(); } } void LoadRoom() { PhotonNetwork.JoinRandomRoom(); } void LoadScene() { PhotonNetwork.LoadLevel("Room for " + PhotonNetwork.CurrentRoom.PlayerCount); } #endregion #region Pun Callbacks // 连接服务器成功回调 public override void OnConnectedToMaster() { if (isPressPlay) LoadRoom(); } //连接服务器失败回调 public override void OnDisconnected(DisconnectCause cause) { Debug.LogWarningFormat("OnDisconnected() was called by PUN with reason {0}", cause); for (int i = 0; i < failedShow.Length; i++) { failedShow[i].SetActive(true); } } // 加入房间成功回调 public override void OnJoinedRoom() { //主客户端加载场景即可。其他客户端进入房间后,会自动加载主客户端的场景 if (PhotonNetwork.IsMasterClient) LoadScene(); } //加入房间失败回调 public override void OnJoinRandomFailed(short returnCode, string message) { Debug.Log("we failed to join a random room, maybe none exists or they are all full. No worries, we create a new room."); //创建房间后,会自动加入房间。从而触发加入房间成功的回调。 PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = maxPlayersPerRoom }); } #endregion }
🟨 服务器房间设置
那么,我们来想一下:
- 我们建好房间了,可想更改房间参数,更改房间最大人数,怎么办呢?
- 以及更改了,有没有回调啊?
- 加入随即房间时,能不能自动筛选房间啊?
🚩服务器房间属性
完成服务器房间属性、自定义属性的设置、更改。