Unity UNet Lobby 的一些测试信息
测试简介
测试Unity Unet相关的一些机制。包括客户端身份判断,同步变量,Cmd函数,Rpc函数和Lobby连接断开机制
测试前提
1.LobbyController脚本在LobbyPlayer预设体上,继承了NetworkBehaviour。该预设体在客户端加入大厅后自动创建。(有几个玩家创建几个)。并且该预设体的NetworkIdentity权限设置为LocalPlayerAuthority。
2.大厅和游戏场景都只会有两个玩家。一个作为主机(服务端+客户端),一个作为客户端。
3.还有一些辅助测试脚本,此处略。
4.这里的所有测试Cmd,Rpc都没有加权限限制。
开始测试
测试1:(测试客户端身份判断)
在LobbyController脚本上分别判断isServer,isClient
因为有两个角色,所有会有两个LobbyPlayer,一个是LocalPlayer,一个是RemotePlayer
客户端身份判断 测试如下表:
判断的内容 | 主机方 | 客户端方 |
---|---|---|
isServer | Local : √ Remote : √ | Local : × Remote : × |
isClient | Local : √ Remote : √ | Local : √ Remote : √ |
测试2:(测试修改了同步变量的情况)
LobbyController脚本中有一个 [SyncVar] 同步变量:[SyncVar] int value = 50;
主机和客户端都可以更改该同步变量的值(值+1)。
⑴.没有Cmd请求服务器同步,单纯各自操作同步变量。
⑵.有Cmd请求服务器同步:修改值通过Cmd请求服务器改变同步变量。
测试如下表:
测试的内容 | 主机方 | 客户端方 |
---|---|---|
启动后的值 | Local : 初始化设置的值50 Remote : 初始化设置的值50 | ⑴.如果主机的值未变: Local : 初始化设置的值50 Remote : 初始化设置的值50 ⑵.如果主机的值变了: Local : 初始化设置的值50 Remote : 主机变了的值51 |
如果通过主机修改值 | Local : 值变成了51 Remote : 值变成了51 | Local : 值变成了51 Remote : 值变成了51 |
如果通过客户端修改值 | Local : 值不变50 Remote : 值不变50 | Local : 值变成了51 Remote : 值变成了51 |
如果通过客户端修改值 (通过Cmd请求服务端修改同步变量) | Local : 值不变50 Remote : 值变成了51 | Local : 值变成了51 Remote : 值变成了51 |
测试3:(测试调用了Cmd函数后的执行情况)
LobbyController脚本中有一个 [SyncVar] 同步变量:[SyncVar] int value = 50;
主机和客户端都可以更改该同步变量的值(值+1)。
都是通过Cmd函数请求服务器改变同步变量。
[Command]
void CmdValue(){
value++;
}
测试如下表:
测试的内容 | 主机方 | 客户端方 |
---|---|---|
主机调用Cmd函数 | Local : 执行Cmd 值变成了51 Remote : 执行Cmd 值变成了51 | Local : 没执行Cmd 值变成了51 Remote : 没执行Cmd 值变成了51 |
客户端调用Cmd函数 | Local : 没执行Cmd 值没变50 Remote : 执行Cmd 值变成了51 | Local : 没执行Cmd 值变成了51 Remote : 没执行Cmd 值变成了51 |
测试4:(测试调用了Rpc函数后的执行情况)
LobbyController脚本中有一个 [SyncVar] 同步变量:[SyncVar] int value = 50;
主机和客户端都可以更改该同步变量的值(值+1)。
都是通过Rpc函数改变同步变量。
[ClientRpc]
void RpcValue(){
value++;
}
测试如下表:
测试的内容 | 主机方 | 客户端方 |
---|---|---|
主机调用Rpc函数 | Local : 执行Rpc 值变成了51 Remote : 执行Rpc 值变成了51 | Local : 执行Rpc 值变成了51 Remote : 执行Rpc 值变成了51 |
客户端调用Rpc函数 | Local : 没执行Rpc 值没变50 Remote : 没执行Rpc 值没变50 | 报错:RPC Function xxxx called on client Local : 没执行Rpc 值变成了51 Remote : 没执行Rpc 值变成了51 |
测试5:(测试调用了Cmd函数后,Cmd函数再调用Rpc函数的执行情况)
LobbyController脚本中有一个 [SyncVar] 同步变量:[SyncVar] int value = 50;
主机和客户端都可以更改该同步变量的值(值+1)。
都是通过Cmd函数调用Rpc函数,来改变同步变量。
[Command]
void CmdValue(){
RpcValue();
}
[ClientRpc]
void RpcValue(){
value++;
}
测试如下表:
测试的内容 | 主机方 | 客户端方 |
---|---|---|
主机调用Rpc函数 | Local : 执行Cmd 执行Rpc 值变成了51 Remote : 执行Cmd 执行Rpc 值变成了51 | Local : 执行Rpc 没执行Cmd 值变成了51 Remote : 执行Rpc 没执行Cmd 值变成了51 |
客户端调用Rpc函数 | Local : 没执行Cmd 没执行Rpc 值没变50 Remote : 执行Cmd 执行Rpc 值变成了51 | Local : 执行Rpc 没执行Cmd 值变成了51 Remote : 没执行Cmd 没执行Rpc 值变成了51 |
测试6:(测试主机和客户端连接断开的情况)
主机和客户端目前已经在局域游戏中
主机和客户端都可以从游戏场景返回大厅或退出
myLobbyManager 为 NetworkLobbyManager的实例
// 返回大厅
public void OnClickBack(){
myLobbyManager.SendReturnToLobby ();
}
// 退出
public void OnClickCancel(){
if (isServer) {
myLobbyManager.StopHost ();
} else {
myLobbyManager.StopClient ();
}
}
测试如下表:
测试的内容 | 主机方 | 客户端方 |
---|---|---|
主机点击返回(客户端还在游戏中) | 主机返回了大厅,准备状态为false | 客户端跟随主机返回大厅,准备状态为false |
客户端点击返回(主机还在游戏中) | 主机跟随客户端返回了大厅,准备状态为false | 客户端返回了大厅,准备状态为false |
主机点击退出(客户端还在游戏中) | 主机返回大厅,从连接中断开 | 客户端跟随主机返回大厅,从连接中断开 |
客户端点击退出(主机还在游戏中) | 主机不影响 | 客户端返回大厅,从连接断开。如果主机还在游戏,则无法再加入主机。 |