Unet,如何同步计数器以检查所有玩家是否准备就绪

时间:2018-04-10 10:17:03

标签: unity3d networking multiplayer unity3d-unet

我正在使用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;
            }

        }
    }

1 个答案:

答案 0 :(得分:1)

UNET有一个Lobby system,它完全符合我的想法。它具有每个玩家的就绪状态,因此当所有玩家都准备就绪时游戏开始。

我建议使用它,因为它可以节省您重新实现辍学,重新加入等事情......