2015-11-09 35 views
3

我在运行时生成并配置了一些有点复杂的对象树。既然服务器和客户端都需要这样做的信息,我希望双方都能独立生成对象,然后将联网的部分链接起来以便后续同步。SyncVar without NetworkServer.Spawn

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

我有能力在网络上唯一识别这些对象,我只需要一种方法与Unity进行通信。 NetworkIdentity.netId是只读的,所以这不是一个选项。

回答

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的发送方法将消息发送到服务器。

您还需要根据MessageBase为实际消息定义消息类。

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

注意:请确保您没有任何基础的网络的消息交相辉映,似乎是在统一的bug /功能(至少是我最后一次尝试它),在它不工作,如果你的消息来源于MessageBase以外的任何东西,因为它是直接的祖先。