引言
在早些时候,我写过一篇《使用Photon PUN创建简单对战游戏》的联机教程,这篇教程只是很简单的实现了更新房间、创建房间、加入房间的功能,其中还有很多的BUG,需要进行修复。最近因为要用到Photon PUN这个插件,所以又进行了一些探索,今天主要是针对更新房间这个操作进行进一步实现,如果想看原生的官方教程,可以查看Photon官网。
初始准备
前期的准备可以参考我之前的那篇文章,今天主要是针对房间更新这个BUG进行修复。为了有更好的联机服务,我也向Photon的中国光子云申请了中国区APPid,申请官网
完成申请之后要更改一些东西,首先回到unity中,找到LoadBalancingClient.cs这个脚本,修改这一行的内容为
再更改固定地区为cn
在开始实现之前,我们先思考一下,大厅的房间列表更新一般会有哪几种情况,我这里罗列了三种:
1.房主建好房间,但未开始游戏,此时别的玩家进入大厅需要更新房间列表,玩家可以进行准备
2.房主建好房间,已开始游戏,此时别的玩家进入大厅需要更新房间列表,玩家可以直接进入游戏
3.房主和玩家都退出房间,此时需要更新大厅房间列表
这三种并不代表所有情况,但是都需要一个功能,那就是随时随地更新房间列表,而不是当房间信息更新时进行更新,所以我们需要主动去触发房间更新,然后获取到列表里面,这里就引入了Photon PUN里面的一些新功能。在大厅界面,我们新建一个按钮用来主动更新房间列表,然后为其绑定事件函数。
我们回到之前写的加入或创建房间的回调事件中,进行一些修改,加入的时候设置了大厅类型
/// <summary>
/// 当成功连接该服务器
/// </summary>
public override void OnConnectedToMaster()
{
NamePanel.SetActive(true);//显示名字面板
StartInitPanel.SetActive(false);//隐藏开始初始化面板
TypedLobby typedLobby = new TypedLobby("customSqlLobby", LobbyType.SqlLobby);//设置当前大厅类型为sqllobby
PhotonNetwork.JoinLobby(typedLobby);//加入大厅
Debug.Log("加入大厅成功");
}
在创建房间的按钮事件里,进行修改,添加两个筛选的条件,可以理解为这个房间的自定义的参数,主要为了,Photon官方的解释就是类似数据库的筛选条件,可以更加精确地区分你的房间。这里我们随便设置了两个参数,参数的类型和命名由你自己定,注意命名不能以下面的方式进行。
public const string ELO_PROP_KEY = "C0";
public const string MAP_PROP_KEY = "C1";
/// <summary>
/// 创建或加入房间按钮
/// </summary>
public void joinOrCreateRoomBtn()
{
if (RoomnameInputField.text.Length <= 2)
{
return;
}
LobbyPanel.SetActive(false);
RoomOptions roomOptions = new RoomOptions { MaxPlayers = 4,IsOpen=true};//房间最大人数4人
roomOptions.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable { { ELO_PROP_KEY, 100 }, { MAP_PROP_KEY, "Map1" } };
roomOptions.CustomRoomPropertiesForLobby = new string[] { ELO_PROP_KEY,MAP_PROP_KEY};
PhotonNetwork.JoinOrCreateRoom(RoomnameInputField.text, roomOptions, default);
RoomPanel.SetActive(true);
}
不能使用的命名参数:
ALTER
CREATE
DELETE
DROP
EXEC
EXECUTE
INSERT
INSERT INTO
MERGE
SELECT
UPDATE
UNION
UNION ALL
接下来我们写一个获取房间列表的函数和按钮事件
/// <summary>
/// 获取到房间列表的函数,传入sql大厅筛选参数
/// </summary>
/// <param name="sqlLobbyFilter"></param>
private void GetCustomRoomList(string sqlLobbyFilter)
{
//新建一个大厅类型,
TypedLobby typedLobby = new TypedLobby("customSqlLobby", LobbyType.SqlLobby);
bool isgetsuce=PhotonNetwork.GetCustomRoomList(typedLobby, sqlLobbyFilter);
if (isgetsuce)
{
Debug.Log("获取房间列表成功");
}
else
{
Debug.Log("获取失败");
}
}
public void UpdateRoomInfoBtn()
{
GetCustomRoomList("C1='Map1'");
}
如此,就可以进行主动刷新了。
但是,刚才讲到房主未开始游戏时,玩家进去之后会有一个准备按钮,但是如果房主已经开始游戏,此时就要切换成进入游戏按钮,所以这里需要进行一些修改,会用到一个非常实用的功能,就是photon里面的哈希值设置,具体用法如下:
//设置参数 我这里设置的是游戏是否已经开始的一个参数
ExitGames.Client.Photon.Hashtable MGameState = new ExitGames.Client.Photon.Hashtable();
MGameState["gamestate"] = 1;//1代表游戏进行中 0代表游戏未开始
PhotonNetwork.CurrentRoom.SetCustomProperties(MGameState);
//获取参数
if (PhotonNetwork.CurrentRoom.CustomProperties.ContainsKey("gamestate"))
{
if ((int)(PhotonNetwork.CurrentRoom.CustomProperties["gamestate"]) == 1)
{
readyBtn.SetActive(false);
startBtn.SetActive(false);
enterGameBtn.SetActive(true);
}
else
{
readyBtn.SetActive(true);
startBtn.SetActive(false);
enterGameBtn.SetActive(false);
}
print(PhotonNetwork.CurrentRoom.CustomProperties["gamestate"]);
}
其实只要可以同时设置这个,就可以分发到其他玩家那里,对应的步骤也就简单了,不过我这里建议满四个人或者固定人数开始游戏比较好,如果没有达到相应的人数,就不能开始游戏。当然也可以尝试一下不满人就加入,这里我技术水平有限,还遇到一些问题,需要后面再解决,有想法的大佬可以交流一下啊。需要项目源码可以私聊我,我们一起交流一下。