【问题标题】:Unity Networking: Using syncliststringUnity 网络:使用同步列表字符串
【发布时间】:2018-07-31 18:04:44
【问题描述】:

我有一个标记为仅服务器的游戏管理器对象(在网络标识上),我想跟踪游戏中的中立游戏对象。

我需要一种在列表更改时将列表同步到所有客户端的方法。所以我一直在尝试使用 SyncListString。但是,由于并非所有客户端上都存在 Game Manager 对象,因此我收到此错误“没有找到 x 的 SyncList 消息的目标”。很公平。

所以我想我会在游戏管理器对象中使用普通字符串列表,在我的播放器对象上使用 SyncListString,并使用命令函数对其进行更新。但是,我不能将 SyncListString 设置为等于 Game Manager 列表,因为它们是不同的类型。

我做错了吗?有没有更好的办法?

我很想使用 isServer 语句将我在游戏管理器中的所有代码放入我的玩家脚本中......也许我应该这样做?

感谢您的帮助!

【问题讨论】:

    标签: unity3d networking


    【解决方案1】:

    如果我没有正确回答您的问题,您应该在游戏的每个实例上创建游戏管理器对象。 然后用 Command 更新你的 SyncListString。

    您可以将游戏管理器设为静态(单例设计模式)。

    之后,您的静态 SyncListString 可以从任何地方访问,但必须在 Command 函数中对其进行更新。

    【讨论】:

    • 非常感谢!所以我在其网络标识上取消了游戏管理器“仅限服务器”框,所以所有对象都有一个副本。我以前从未听说过单例设计。为什么我需要将游戏管理器设为静态?有一个syncListString(只通过命令更新)不够吗?
    • 好吧,您需要一个游戏管理器实例(以及其中的列表)假设您有两个游戏管理器,因为可能会发生错误。因此你有两个列表。哪一个有你游戏世界的真相?它可以把事情搞砸。将这些本质上应该只有其中一个的东西制作成单例是一种很好的做法,以避免将来可能出现的问题。
    • 另外,我是否需要在我的播放器脚本中使用一个 SyncListString 变量来引用 GameManager 中的 SyncListString? (或者我应该将游戏管理器 SyncListString 设为全局?)
    • 没有。您需要将您的列表设为公开静态(如果您的游戏管理器具有单例模式,无论如何都会发生这种情况)并从您想要的任何地方访问它。像'GameManager.ListOfGameStuff.Add() ..'
    • 目前,我每个客户端都有一个游戏管理器实例。如果我只将其设为服务器,则无法从非主机客户端访问同步列表。
    【解决方案2】:

    我尝试将游戏管理器同步列表字符串设为静态,但是 我收到一个错误“Synclist ....不能是静态的

    你应该让你的类静态而不是列表本身。 如果你不想那样做。只需参考 Game Manager 并使用那里的列表。 (你的名单必须是公开的)

    【讨论】:

    • "静态类 GameManager 不能从 NetworkBehaviour 派生"
    • 我设法让它在不使用静态类或变量的情况下工作。我现在的问题是 SyncListStruct - 知道任何体面的例子吗?
    • 你应该为此提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多