2015-11-09 57 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以外的任何東西,因爲它是直接的祖先。