没有NetworkServer.Spawn的SyncVar

时间:2015-11-09 08:07:13

标签: unity3d unity-networking

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

也就是说,我需要一种方法使SyncVar适用于服务器和客户端上存在的对象,但最初并不是通过NetworkServer.Spawn生成的。有没有办法手动配置NetworkIdentity,以便Unity网络系统能够理解某些东西是同一个对象?

我能够自己在网络中唯一地识别这些对象,我只需要一种方法将它传达给Unity。 NetworkIdentity.netId只读,所以这不是一个选项。

1 个答案:

答案 0 :(得分: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以外的任何东西,因为它是它的直接祖先。