PUN作用: 搭建多人 在线 / 局域网 网络游戏
使用的版本: Unity2017.4.7+、PUN 2 - FREE
Appid配置网址: PUN
中国区官网: 中国区官网
教程参考地址: 地址
20190826补: Photon逻辑顺序: 连接到服务器——加入某房间——主客户端加载场景。类似LOL自定义模式 注:PUN会根据统一的版本号、Appid,加入主客户端的房间,使所有客户端加载同一个场景
作用:PUN会根据Appid和版本号,确认你们属于同一个应用。
配置网址:传送门
导入SDK后出现提示框:
🚩如果你以前在PUN网页上配置过:
你可以直接输入你申请的Appid,点Setup Project;或Skip跳过,选择Project里的PhotonServerSettings,将配置好的Appid填入该位置。
🚩若你是第一次使用:
则填入你的邮箱,点Setup Project,会出现注册、进入他们网站之类的。
完成注册后,创建Pthton PUN的应用,根据a做即可。
查看Photon全部日志信息
日志信息改为Full,可查看Photon全部日志信息。
PUN默认连接海外云服务器。想用中国区服务器,就要进行如下配置:
🚩进入中国区官网:中国区官网
🚩点击试用购买——申请免费中国区光子云——把创建好的Appid复制进去,提交
注意:该Appid未填入申请中国区时,仍是海外区Appid。当申请后就变成中国区的了。所以Appid可多创建几个,一个用于中国区,一个海外。
使用中国区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、创建新场景
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();
}
}
}
1、因为我们现在刚申请了中国区服务器,客服会在1-2工作日完成配置,现在还没配置好,所以我们现在如果使用中国区服务器Unity会报错。
所以我们暂且使用海外服务器,不用填CN,LoadBalancingClient脚本不用改,Appid用海外的即可。
2、运行,即可看到成功输出信息了
PUN连接顺序: 连接服务器–加入房间
此时的代码,只实现了加入服务器,没写加入到服务器房间的逻辑。
我们也不能将加入房间的代码直接放在进行连接之后,因为连接服务器也需要时间,直接加入房间不可能成功。
所以我们要用回调加入房间。以下提供的两种方法,建议方法2。
a、 继承IConnectionCallbacks并实现接口(里面有连接回调接口)
b、 OnConnected连接回调接口改为:
public void OnConnected()
{
PhotonNetwork.JoinRandomRoom();
}
改为继承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
现在我们测试,发现已经加入房间成功了
设置一个房间的连接人数
[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
}
大家还有什么问题,欢迎在下方留言!