3

我有一个在运行时生成和配置的有点复杂的对象树。由于执行此操作所需的信息对服务器和客户端都可用,我希望双方独立生成对象,然后将联网的部分链接起来以进行同步。

也就是说,我需要一种方法来SyncVar处理存在于服务器和客户端上但最初不是通过NetworkServer.Spawn. 有没有办法手动配置 NetworkIdentity 以便 Unity 网络系统理解某物是同一个对象?

我有能力自己通过网络唯一地识别这些对象,我只需要一种方法将其传达给 Unity。NetworkIdentity.netId是只读的,所以这不是一个选项。

4

1 回答 1

0

如果您完全由服务器完成所有初始化,然后将其推送到客户端,则您无需在之后进行同步。这也将消除处理重复信息的需要(这最终会在客户端浪​​费 CPU 时间)。

但是,如果您想让客户端也创建数据,那么我建议您让他们将适当的消息与他们的数据一起发送到服务器,然后服务器可以为他们创建对象。

在服务器实例上使用 NetworkServer.RegisterHandler 为您需要处理的每种类型的消息设置消息处理程序,

public enum netMessages{
    hello = 101, 
    goodbye = 102, 
    action = 103,
}    

...

NetworkServer.RegisterHandler((short)netMessages.hello, new NetworkMessageDelegate(hdl_hello));
NetworkServer.RegisterHandler((short)netMessages.goodbye, new NetworkMessageDelegate(hdl_goodbye));

...

private void hdl_hello (NetworkMessage msg){
  nmgs_hello m = msg.ReadMessage<nmgs_hello>();
  ...
}

并使用 NetworkClient 的 Send 方法向服务器发送消息。

您还需要为实际消息定义基于 MessageBase 的消息类。

public class nmsg_hello : MessageBase {
  public int x;
  public float welcomeness;
}

注意:确保您的任何网络消息都不相互依赖,这似乎是 Unity 中的错误/功能(至少我上次尝试过),如果您的消息来自其他任何东西,它就不起作用比 MessageBase 因为它的直接祖先。

于 2015-11-19T09:42:12.257 回答