【问题标题】:Unity3d Unet sync gameObject ListUnity3d Unet同步游戏对象列表
【发布时间】:2016-03-28 23:37:38
【问题描述】:

我正在尝试使用 unity3d 的网络引擎 unet 跨网络同步游戏对象列表。该列表在服务器上被初始化并且对象被添加到它。我希望这个列表在所有玩家之间同步,这样如果一个玩家添加到它,它会在网络上更新,如果一个玩家向它删除一个项目,它会在网络上更新。我知道我应该使用 clientRPC 或命令,但是我无法弄清楚如何专门使用它们。我找不到像这样同步列表的好例子。如果有人能指出我正确的方向,那就太好了。

【问题讨论】:

  • 你可以找到同步列表here

标签: networking unity3d multiplayer unity5


【解决方案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 或类似名称,并使用它们来传达要添加或删除哪些项目。

【讨论】:

  • 谢谢,这真的很有帮助,我想我现在明白了。
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 2016-02-01
  • 2012-12-29
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
相关资源
最近更新 更多