我有一个在运行时生成和配置的有些复杂的对象树。由于服务器和客户端都可以获得执行此操作所需的信息,因此我希望双方独立生成对象,然后将网络部分链接起来以便以后进行同步。
也就是说,我需要一种方法使SyncVar
适用于服务器和客户端上存在的对象,但最初并不是通过NetworkServer.Spawn
生成的。有没有办法手动配置NetworkIdentity,以便Unity网络系统能够理解某些东西是同一个对象?
我能够自己在网络中唯一地识别这些对象,我只需要一种方法将它传达给Unity。 NetworkIdentity.netId
只读,所以这不是一个选项。
答案 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以外的任何东西,因为它是它的直接祖先。