Здравствуйте, я уже наверно неделю пытаюсь освоить uNet и каких-то результатов нет. Я хорошо освоил старый Network, который сейчас считается устаревшим и потому, что он устаревший, я решил изучить новый uNet. Но как им пользоваться!? Я чтобы вам было удобно ответить мне, разделю вопросы. Пожалуйста, если вы знаете ответы на мои вопросы, ответьте.
1. Как создать объект у всех клиентов?
Скрытый текст:
Я смог найти метод NetworkServer.Spawn, вроде бы то что надо, но нет! Он не создает объект у всех игроков, а только у тех, кто "Ready", а это нужно пользоваться методом NetworkServer.SetClientReady, но как им пользоваться я так и не понял. После я начал искать в интернете способы создать объект у всех клиентов, но там был другой способ, через [ClientRPC] и [Command],где использовался NetworkIdentity.AssignClientAuthority, ну это я вообще не понял что за вещь, потому что нигде нормального описание к этому методу нет (или есть, просто я не нашел). Если что, компоненты я на объект (префаб) я ставил NetworkIdentity и NetworkTransform. Так что, создать объект у всех клиентов у меня никак не получалось, если вы все-таки знаете как создать объект у всех клиентов, опишите подробно пожалуйста.
2. Как отправлять RPC?
Скрытый текст:
Я пытался сделать обычный чат и для этого мне нужно было отправлять RPC всем игрокам и дальше показывать все на экране. На старом Network все делалось за пару секунд, тут же вообще ничего не понятно. Как мне отправить RPC всем? Я узнал, что теперь делаются обработчики через NetworkServer.RegisterHandler, а вызываются через NetworkServer.SendToAll и думал что все будет просто. Но не тут все было, как создать обработчик и вызывать его в определенное нужное мне время я так и не понял, т.к. на вики Unity какая-та старая версия метода NetworkServer.SendToAll и если сделать, как написано на вики Unity, то естественно выдаст ошибку из-за несоответствия типов в аргументах (входных данных). Так что по сути, я вообще не продвинулся в RPC на новом uNet. Только вот недавно узнал про [ClientRPC] и [Command], но так и не понял что они делают и как работают. Если вы все-таки знаете как отправить RPC на новом uNet, опишите подробно пожалуйста.
Только вот эти два вопроса меня интересуют, если я пойму как делать это, то пойму весь uNet. Так что прошу люди добрые, объясните как это сделать, я уже умираю от этого uNet. А изучить хочется, но информации мало (или на английском, но знать бы мне его)!
uNet'ом пользоваться легко... Для создания объекта у всех клиентов нужно его зарегистрировать в NetworkManager (для обхода использования Resources.Load) или просто оставить на сцене повесив на него компонент NetworkIdentity (для этого не потребуется его регистрация)
if(isServer){ //регистрация обработчика на приём сообщений от клиента
NetworkServer.RegisterHandler(CHAT_MSG,SV_OnReceivedMessage); }elseif(isLocalPlayer && isClient) { //регистрация обработчика на приём сообщений от сервера
NetworkClient.allClients[0].RegisterHandler(CHAT_MSG,CL_OnReceivedMessage); } }
//метод вызывается когда пришло сообщение от клиента void SV_OnReceivedMessage(NetworkMessage msg) {
var dec = msg.ReadMessage<ChatMessage>();//дальше оперируем с данными
//рассылаем все клиентам пришедшее сообщение
NetworkServer.SendToAll(CHAT_MSG,dec); }
//метод вызывается когда пришло сообщение с сервера void CL_OnReceivedMessage(NetworkMessage msg) {
var dec = msg.ReadMessage<ChatMessage>();//дальше оперируем с данными }
Для простой синхронизации позиции объектов достаточно использовать атрибут [SyncVar]
void Update() { if(isServer) { //указываем серверную позицию
server_position =transform.position; }else { //применяем серверную позицию на клиентах transform.position= server_position; } }
SetReady - нужен для того чтобы не забивать сетевой канал не нужной информацией пока клиент игры загружается или еще что-то делает... Как только клиент загрузился можно делать клиент готовым и он сразу будет ждать ответ с сервера о готовности его объекта на сервере, как ответ придёт объект появится и на клиенте...