Unity3d Unet同步gameObject列表

时间:2016-03-28 04:00:40

标签: networking unity3d multiplayer unity5

我正在尝试使用unity3d的网络引擎unet在网络上同步一个gameObjects列表。该列表在服务器上初始化,并添加对象。我希望这个列表能够在所有玩家之间同步,这样如果一个玩家添加它,它就会在整个网络中更新,如果一个玩家删除了一个项目,它就会通过网络进行更新。我知道我应该使用clientRPC或命令,但是我无法弄清楚如何使用它们。没有很好的例子,我可以找到同步这样的列表。如果有人能指出我正确的方向,那就太棒了。

1 个答案:

答案 0 :(得分:1)

希望操作列表的客户端必须在服务器上执行命令,该命令将告诉所有客户端如何操作列表。假设您在所有播放器对象上都有以下NetworkBehaviour(所有播放器对象都在其各自的客户端上具有本地播放器权限)。

public void ListManipulator : NetworkBehaviour
{
    public void AddToList(GameObject obj)
    {
        if (!isLocalPlayer)
            throw new InvalidOperationException("This can only be called for the local player!");
        if (obj.GetComponent<NetworkIdentity>() == null)
            throw new InvalidOperationException("Network only knows about GameObjects that have a NetworkIdentity!");

        CmdAddToList(obj);
    }

    [Command]
    void CmdAddToList(GameObject obj)
    {
        // this code is only executed on the server
        RpcAddToList(obj); // invoke Rpc on all clients
    }

    [ClientRpc]
    void RpcAddToList(GameObject obj)
    {
        // this code is executed on all clients
        localCopyOfList.Add(obj);
    }
}

请注意,每个客户端都有自己的列表本地副本:localCopyOfList

此外,如果您不能保证目标对象具有NetworkIdentity组件,您可以改为为它们指定名称或ID或类似名称,并使用这些组件来传达要添加或删除的项目。