🟥 前言
PUN作用: 搭建多人 在线 / 局域网 网络游戏
使用的版本: Unity2017.4.7+、PUN 2 - FREE
Appid配置网址: PUN
中国区官网: 中国区官网
教程参考地址: 地址
20190826补:
Photon逻辑顺序:
连接到服务器——加入某房间——主客户端加载场景。类似LOL自定义模式
注:PUN会根据统一的版本号、Appid,加入主客户端的房间,使所有客户端加载同一个场景
🟧 Appid配置
作用:PUN会根据Appid和版本号,确认你们属于同一个应用。
配置网址:传送门
导入SDK后出现提示框:
🚩如果你以前在PUN网页上配置过:
你可以直接输入你申请的Appid,点Setup Project;或Skip跳过,选择Project里的PhotonServerSettings,将配置好的Appid填入该位置。
🚩若你是第一次使用:
则填入你的邮箱,点Setup Project,会出现注册、进入他们网站之类的。
完成注册后,创建Pthton PUN的应用,根据a做即可。
查看Photon全部日志信息
日志信息改为Full,可查看Photon全部日志信息。
🟨 连接地区设置
PUN默认连接海外云服务器。想用中国区服务器,就要进行如下配置:
1️⃣ 获得中国区Appid
🚩进入中国区官网:中国区官网
🚩点击试用购买——申请免费中国区光子云——把创建好的Appid复制进去,提交
注意:该Appid未填入申请中国区时,仍是海外区Appid。当申请后就变成中国区的了。所以Appid可多创建几个,一个用于中国区,一个海外。
2️⃣ 程序设置
使用中国区Appid需要进行以下程序设置:
🚩LoadBalancingClient 脚本:
public string NameServerHost = “ns.exitgames.com”;
改为:
public string NameServerHost = “ns.photonengine.cn”;
🚩Unity 的 PhotonServerSettings——Fixed Region填入 CN
20210320测试:
现在不许输入 CN ,输入反而连接不上
**注意:**若用海外的服务器,则LoadBalancingClient脚本不用改,不用填CN,Appid用海外的即可。
🟩 搭建大厅
实现连接到服务器。
1️⃣ 场景及连接脚本
1、创建新场景
2、新建空物体,将如下代码挂上去
using UnityEngine; using Photon.Pun; public class Launcher : MonoBehaviour { //此客户端的版本号。用户之间通过gameVersion(允许你做出破坏性的改变)进行隔离。 string gameVersion = "1"; void Awake() { // 这确保我们可以在主客户端和同一房间的所有客户端上使用photonnet . loadlevel()自动同步它们的级别 PhotonNetwork.AutomaticallySyncScene = true; } void Start() { ConnectServer(); } //连接到服务器 public void ConnectServer() { // 检查是否连接了服务器 if (!PhotonNetwork.IsConnected) { //首先连接到光子在线服务器。 PhotonNetwork.GameVersion = gameVersion; PhotonNetwork.ConnectUsingSettings(); } } }
2️⃣ 查看初步结果
1、因为我们现在刚申请了中国区服务器,客服会在1-2工作日完成配置,现在还没配置好,所以我们现在如果使用中国区服务器Unity会报错。
所以我们暂且使用海外服务器,不用填CN,LoadBalancingClient脚本不用改,Appid用海外的即可。
2、运行,即可看到成功输出信息了
3️⃣ 利用加入服务器成功的回调,实现加入服务器房间
PUN连接顺序:
连接服务器–加入房间
此时的代码,只实现了加入服务器,没写加入到服务器房间的逻辑。
我们也不能将加入房间的代码直接放在进行连接之后,因为连接服务器也需要时间,直接加入房间不可能成功。
所以我们要用回调加入房间。以下提供的两种方法,建议方法2。
🚩 方法1:IConnectionCallbacks
a、 继承IConnectionCallbacks并实现接口(里面有连接回调接口)
b、 OnConnected连接回调接口改为:
public void OnConnected() { PhotonNetwork.JoinRandomRoom(); }
🚩方法2:MonoBehaviourPunCallbacks(推荐)
改为继承MonoBehaviourPunCallbacks。可增加如下回调:
#region Pun Callbacks // 连接服务器成功回调 public override void OnConnectedToMaster() { PhotonNetwork.JoinRandomRoom(); } //连接服务器回调 public override void OnDisconnected(DisconnectCause cause) { Debug.LogWarningFormat("OnDisconnected() was called by PUN with reason {0}", cause); } // 加入房间成功回调 public override void OnJoinedRoom() { Debug.Log("OnJoinedRoom"); } //加入房间失败回调 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()); } #endregion
现在我们测试,发现已经加入房间成功了
4️⃣ 设置房间连接人数
设置一个房间的连接人数
[Tooltip("最大连接人数")] public byte maxPlayersPerRoom = 4; //加入房间失败回调 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}); }
最终代码
using UnityEngine; using Photon.Pun; using Photon.Realtime; public class Launcher : MonoBehaviourPunCallbacks { #region Parameters //此客户端的版本号。用户之间通过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); } // 加入房间成功回调 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 }