Пожалуйста! Помогите с uNet, как им вообще пользоваться!?

Сеть в Unity3D

Пожалуйста! Помогите с uNet, как им вообще пользоваться!?

Сообщение Wmyx 23 июн 2018, 17:06

Здравствуйте, я уже наверно неделю пытаюсь освоить 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. А изучить хочется, но информации мало (или на английском, но знать бы мне его)!

Заранее, всем спасибо и удачи!
Wmyx
UNец
 
Сообщения: 5
Зарегистрирован: 23 июн 2018, 16:07

Re: Пожалуйста! Помогите с uNet, как им вообще пользоваться!?

Сообщение KanycTa 07 авг 2018, 15:56

uNet'ом пользоваться легко...
Для создания объекта у всех клиентов нужно его зарегистрировать в NetworkManager (для обхода использования Resources.Load) или просто оставить на сцене повесив на него компонент NetworkIdentity (для этого не потребуется его регистрация)

Синтаксис:
Используется csharp
//пример создания объекта на серверной стороне

if(isServer)
{
GameObject go = Instantiate(prefab) as GameObject;
NetworkServer.Spawn(go);
}
 


Такие объекты можно создавать только на серверной стороне, на клиентах может они и будут но другие клиенты их не будут видеть... (авторитарность)


Для отправки сообщений не нужно использовать RPC, достаточно зарегистрировать хэндлы на приём определённых сообщений


Скрытый текст:
Писал по памяти, извиняюсь за ошибки

Синтаксис:
Используется csharp

//Вид сообщения
public class ChatMessage : MessageBase
{
public string name;
public string text;
}

public const short CHAT_MSG = 5000;//номер хэндла

void Start()
{

if(isServer){
//регистрация обработчика на приём сообщений от клиента
NetworkServer.RegisterHandler(CHAT_MSG,SV_OnReceivedMessage);
}else if(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]

Синтаксис:
Используется csharp
[SyncVar]
public Vector3 server_position;

void Update()
{
if(isServer)
{
//указываем серверную позицию
server_position = transform.position;
}else
{
//применяем серверную позицию на клиентах
transform.position = server_position;
}
}

 




SetReady - нужен для того чтобы не забивать сетевой канал не нужной информацией пока клиент игры загружается или еще что-то делает... Как только клиент загрузился можно делать клиент готовым и он сразу будет ждать ответ с сервера о готовности его объекта на сервере, как ответ придёт объект появится и на клиенте...

Если что пиши http://vk.com/salavan73 помогу чем смогу...
Аватара пользователя
KanycTa
UNIт
 
Сообщения: 107
Зарегистрирован: 25 июл 2018, 18:41
Откуда: г. Ульяновск
  • Сайт


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4