我是团结的新手,我认为这将是一块蛋糕,但现在我觉得我咬得比我嚼得多。
我正在尝试建立一个权威的服务器游戏,客户端玩家将他们想要的动作发送到服务器,然后服务器向所有客户端发送实际的移动位置信息。
当客户端连接到服务器时,服务器使用RPC调用在所有客户端上创建播放器对象。在播放器脚本Awake()
函数中,我创建了一个NetworkView
对象,并将其动态附加到播放器对象以进行同步。因此,当每个新玩家连接到游戏服务器时,所有玩家客户都这样做,所以每个人都可以看到其他人。
我遇到的问题是当玩家客户端想要移动时,客户端尝试使用动态附加的NetworkView
对服务器进行RPC调用,以发送所需的移动,但RPC调用失败,给出了SERVER(而不是客户端)上的错误,服务器无法找到NetworkViewID
。
我的代码没有打印出这个错误,所以我猜它必须是内部的代码,当它从客户端收到RPC消息时打印出来,并尝试将其与相应的NetworkViewID
匹配服务器,当它不能,它打印错误?
我只是想知道团结是如何工作的......对所有客户端和服务器上的对象“A”具有相同的NetworkViewID
,并且所有客户端和服务器上的对象“B”具有相同的ID(但是来自“A”的不同ID?
如果是这样,那么在客户端和服务器上实例化的NetworkView
对象如何知道自己分配哪个ID,这样当它们通过网络在不同的计算机上完成时它们都匹配?这是由unity自动完成的,还是我必须自己将ID发送给所有NetworkView
个对象?但我无法与对象交谈,告诉他们使用哪个ID,因为我首先不知道NetworkID
,因为显然需要与NetworkView
对象交谈!它就像试图问某人他们的名字,但你需要他们的名字才能问他们。所以它无法运作。
我的问题是,首先,玩家对象上没有NetworkView
。创建对象后,播放器对象上的脚本会动态附加NetworkView
。由于这是在所有客户端上完成的,并且几乎同时在服务器上完成,他们如何知道将相同的ID分配给相同的对象,以便它们可以相互RPC?
我还在某处读到“所有者ID”始终为零?
对不起,我是团结的新手,并试图全力以赴。所有人都可以给我内幕消息吗?