我正在使用Unet制作多人炸弹人游戏。我正在尝试创建一个准备好的检查,以便在其他人都做好准备时启动游戏。
我尝试使用sync var,Command和Rpc调用,但似乎没有任何工作正常。
以这种方式使用Cmd调用(当玩家按下就绪按钮时调用)
[Command]
private void CmdIncreaseReady()
{
IncreaseReady();
RpcIncreaseReady();
}
[ClientRpc]
private void RpcIncreaseReady()
{
IncreaseReady();
}
private void IncreaseReady() {
playersReady++;
//ChechAllReady();
}
当在客户端上按下时,每个人的计数器都是0(它应该是1),当在服务器上按下时,服务器的计数器是2,客户端1。
我试图在!isServer和Rpc时调用Cmd,结果是当在客户端上按下时仍然没有更新,但它正确更新(两者上的计数器都是1),当按下服务器。
if (!isServer)
{
CmdIncreaseReady();
}
else
{
RpcIncreaseReady();
}
如果我删除了Cmd上的IncreaseReady()调用,结果与上面相同。
我已经尝试过使用[SyncVar]
到计数器,有和没有钩子,在钩子上传递1(增加计数器的数量)并将已经计数器增加并设置变量传递给数字,似乎没什么用。
我真的不知道如何让它继续工作。有人能帮助我吗?我真的很绝望。我到处搜寻。
脚本是游戏管理器,当每个客户都有他的版本时,它有一个Netework身份并拥有本地玩家权限。
我尝试了另一种方法,在Cmd和Rpc上传递增加的数字,在函数内部,只需设置playersReady = i。即使这样也行不通。
[UPDATE]:
所以,我找到了我想要解决的具体问题,它是同步非玩家对象的属性。 我试图用客户端权限生成游戏管理器,现在它似乎只在服务器上正确同步,客户端仍然没有调用Cmd propety。
查看检查器中的调试模式,我已经能够在服务器上看到hasAutority为true,但在客户端上为false。
这是我在玩家脚本上生成游戏管理器的代码片段:
void Update()
{
if (!sceneLoaded)
{
if(isServer & SceneManager.GetActiveScene().name == "Main Scene")
//if (SceneManager.GetActiveScene().name == "Main Scene")
{
if (connectionToClient.isReady)
{
var go = (GameObject)Instantiate(gameManager);
NetworkServer.SpawnWithClientAuthority(go, connectionToClient);
go.transform.SetParent(null);
//go.GetComponent<NetworkIdentity>().AssignClientAuthority(connectionToClient);
globalManager = go.GetComponent<FSM>();
//SetFSM();
sceneLoaded = true;
}
}
}
答案 0 :(得分:1)
UNET有一个Lobby system,它完全符合我的想法。它具有每个玩家的就绪状态,因此当所有玩家都准备就绪时游戏开始。
我建议使用它,因为它可以节省您重新实现辍学,重新加入等事情......