2015-11-09 1 views
3

У меня есть несколько сложное дерево объектов, которое генерируется и настраивается во время выполнения. Поскольку информация, необходимая для этого, доступна как для сервера, так и для клиента, я хотел бы, чтобы обе стороны генерировали объекты независимо друг от друга, а затем связывали сетевые компоненты для синхронизации.SyncVar без NetworkServer.Spawn

То есть мне нужен способ сделать работу SyncVar для объекта, который существует на сервере и клиенте, но не был первоначально порожден через NetworkServer.Spawn. Есть ли способ вручную настроить NetworkIdentity, чтобы сетевая система Unity понимала, что что-то является одним и тем же объектом?

У меня есть возможность однозначно идентифицировать эти объекты по сети самостоятельно, мне просто нужен способ сообщить об этом Unity. NetworkIdentity.netId - только для чтения, так что это не вариант.

ответ

0

Если вы сделаете всю инициализацию исключительно сервером, а затем нажали на клиенты, вы удалите необходимость синхронизации после этого. Это также устранит необходимость иметь дело с дублирующейся информацией (что в конечном итоге будет потрачено впустую процессорного времени на стороне клиента).

Однако, если вы хотите, чтобы клиенты также создавали данные, я бы предложил вам отправить им соответствующие сообщения на сервер с их данными, тогда сервер может создать для них объекты.

обработчики сообщений Настройки с 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; 
} 

ПРИМЕЧАНИЕ: Убедитесь, что вы не основывают любой из ваших сетевых сообщений друг от друга, кажется, ошибка/функция в Unity (по крайней мере, в последний раз, когда я пробовал), где она не работает, если ваше сообщение происходит от чего-либо другого, кроме MessageBase, поскольку он является непосредственным предком.

Смежные вопросы