Netcode

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Netcode

Сообщение Visochestvo 07 дек 2023, 13:23

Всем здравствуйте.
Пытаю сделать мультиплеер на андройд. Который работает в одной сети, например через Wi-Fi с помощью "Netcode".
Проблема в том что не получается присоединиться к Host'у, но при это к серверу присоединяется.
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Netcode

Сообщение Saltant 08 дек 2023, 01:20

порты нужно открыть очевидно, на хосте.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Netcode

Сообщение Visochestvo 08 дек 2023, 04:14

Пришел домой сегодня еще раз протестил и все заработало.
Сейчас проблема в другом. Не могу поменять переменную на сервере/хосте через клиента.
От клиента хочу вызвать функцию, но получаю ошибку. При этом на объекте у которого скрипт есть NetworkObject

Unity.Netcode;
NetworkBehaviour

[ServerRpc]
public void TestServerRpc
{
// что то там.
}

Я не очень разбираюсь в мультиплеере.
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Netcode

Сообщение Alkos26Rus 08 дек 2023, 11:45

как функцию то вызываешь?
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Netcode

Сообщение Visochestvo 08 дек 2023, 13:10

Из скрипта который находится на объекте клиента и хосте

public TestScript testScript;

if(isClient) + если нажал на кнопку
testScript.TestServerRpc();
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Netcode

Сообщение Alkos26Rus 08 дек 2023, 14:40

Не сильно разбираюсь в Netcode, но причиной может быть не правильный атрибут [ServerRpc] может нужен [ClientRpc], в зависимости от того где ждешь срабатывания функции. А второе еще есть параметр RequireOwnership [ServerRpc(RequireOwnership = false)], разрешающий не только владельцу вызывать методы.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Netcode

Сообщение Visochestvo 08 дек 2023, 15:10

Alkos26Rus писал(а):Не сильно разбираюсь в Netcode, но причиной может быть не правильный атрибут [ServerRpc] может нужен [ClientRpc], в зависимости от того где ждешь срабатывания функции. А второе еще есть параметр RequireOwnership [ServerRpc(RequireOwnership = false)], разрешающий не только владельцу вызывать методы.


[ServerRpc(RequireOwnership = false)]
пробовал, тоже самое.

[ClientRpc] вроде как вызывается только на клиенте.

Ошибка.
KeyNotFoundException: The given key 'TestServer' was not present in the dictionary.
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Netcode

Сообщение Visochestvo 08 дек 2023, 15:42

Проблему решил.
Оказалось клиент не успевал подключиться к хосту как я отправлял выполнить функцию на сервере.

При нажатии на кнопку подключиться клиенту, клиент подключался и сразу отправлял выполнить функцию на хост.
Решил путем подключиться к серверу, выполнить функцию с задержкой в 1 сек. Invoke().
А еще лучше было бы, проверять подключился ли клиент к хосту и потом выполнять функцию.
(пока не знаю как это условие выглядит)
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Netcode

Сообщение Visochestvo 08 дек 2023, 16:28

Может кто знает как хранить информацию при переходе сцены.
Создать отдельный скрипт с переменными и в нем хранить все + dontdestroyonload ?
Раньше я использовал playerprefs
Или создать условие что бы только хост мог читать/записывать playerprefs, а клиент берет от сервера
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Netcode

Сообщение Saltant 08 дек 2023, 19:45

Visochestvo писал(а):Не могу поменять переменную на сервере/хосте через клиента.
Я не очень разбираюсь в мультиплеере.

Переменные меняются через NetworkVariable<T> тип переменной.

https://docs-multiplayer.unity3d.com/ne ... kvariable/
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Netcode

Сообщение Saltant 08 дек 2023, 20:00

Visochestvo писал(а):Проблему решил.
Решил путем подключиться к серверу, выполнить функцию с задержкой в 1 сек. Invoke().

Что бы быть уверенным что объект готов к отправке/принятию RPC, нужно переопределить метод OnNetworkSpawn в NetworkBehaviour скрипте.
https://docs-multiplayer.unity3d.com/ne ... /#spawning
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Netcode

Сообщение Visochestvo 13 дек 2023, 02:02

Пытаюсь разобраться как работает ServerRpc и ClientRpc.
Почему у клиента не появляется ссылка на testObj?
И Хотелось бы расспросить я так понял ServerRpc это вызов только на сервере с клиентов, а ClientRpc это вызов с сервера на Клиенты? я правильно понимаю? Как правильно будет управлять игровыми объектами которые взаимодействуют с клиентом? Например клиент нажал "кнопку" нужно подвинуть(переместить) игровой объект. Вызывать через сервер двигать им или через клиента?

Скрытый текст:
using Unity.Netcode;

public class TestRpc : NetworkBehaviour
....

public GameObject testObj;

public struct TestStruct : INetworkSerializeByMemcpy
{
public TestRpc testRpc ;
public ulong clientId;
}

void Update()
{
if(IsOwner && Input.GetButton("Fire1"))
{
TestServerRpc(new TestStruct { testRpc = this.GetComponent<TestRpc>(), clientId = OwnerClientId });
}
}

[ServerRpc(RequireOwnership = false)]
public void TestServerRpc(TestStruct testStruct)
{
testStruct.testObj = Instantiate(Resources.Load("Prefabs/testObj")) as GameObject ;
testStruct.testObj.GetComponent<NetworkObject>().SpawnWithOwnership(testStruct.clientId);
}
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Netcode

Сообщение Saltant 18 дек 2023, 11:30

Visochestvo писал(а):И Хотелось бы расспросить я так понял ServerRpc это вызов только на сервере с клиентов, а ClientRpc это вызов с сервера на Клиенты? я правильно понимаю?

Да, правильно. В остальном я не понял что за чертовнищу ты делаешь. По RPC передаются примитивные типы (int, float, string и т.д Vector тоже передается по дефолту), создавая кастомные сериализаторы можно добиться того что бы передавались кастомные структуры с примитивными типами, но явно тебе это не нужно.

Напиши что ты конкретно хочешь делать вызывая ServerRPC.
Visochestvo писал(а):Например клиент нажал "кнопку" нужно подвинуть(переместить) игровой объект. Вызывать через сервер двигать им или через клиента?

Есть такой компонент NetworkTransform, если ты повесишь его на сетевой объект (геймобжект который с NetworkObject), то когда ты будешь двигать его на стороне сервера, на клиенте он автоматически будет тоже синхронизироваться.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Netcode

Сообщение Visochestvo 18 дек 2023, 23:08

Saltant писал(а):Напиши что ты конкретно хочешь делать вызывая ServerRPC.

Например я хочу создать объекте с клиента и что бы у клиента была ссылка на объект. + что бы другие клиенты могли ссылаться на него, а не что бы ссылку видел только один владелец.
Saltant писал(а):Есть такой компонент NetworkTransform, если ты повесишь его на сетевой объект (геймобжект который с NetworkObject), то когда ты будешь двигать его на стороне сервера, на клиенте он автоматически будет тоже синхронизироваться.

NetworkTransform и NetworkObject я знаю. Получается манипулировать (двигать) нужно только со стороны сервера?
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Netcode

Сообщение Saltant 19 дек 2023, 02:17

Visochestvo писал(а):Например я хочу создать объекте с клиента и что бы у клиента была ссылка на объект. + что бы другие клиенты могли ссылаться на него, а не что бы ссылку видел только один владелец.

С клиента отправляешь Rpc на сервер что хочешь создать объект, присылаешь например какой то id объекта (в зависимости от твоей структуры как ты че классифицируешь и обозначаешь), сервер берет инстантиирует прибаф нужный (ищет в своей базе по этому айди например), потом спавнит его вызывая метод Spawn с компонента NetworkObject этого прифаба, можно указать кто владелец будет вызвав вместо Spawn метод SpawnWithOwnership указав networkId клиента например который вызвал rpc на сервере, получать нетворк айди можно посмотрев переменную ServerRpcParams которая по дефолту указывается в Rpc методе типа [ServerRpc] void XyzwServerRpc(int somenumber, ServerRpcParams serverRpcParams = default) айдишник будет тут serverRpcParams.Receive.SenderClientId. В ответ клиенту в ClientRpc после спавна ты можешь послать networkid этого заспавленного объекта, клиент сможет найти его в базе NetworkSpawnManager у NetworkManager, в словаре SpawnedObjects, или же еще проще - переопредели метод в объекте который спавнишь OnNetworkSpawn он вызывается всегда на всех клиентах и сервере когда этот объект спавнится на сервере и там уже через условия if(IsServer) или if(IsClient) делай нужные действия.


Visochestvo писал(а):NetworkTransform и NetworkObject я знаю. Получается манипулировать (двигать) нужно только со стороны сервера?

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

Вот видео где все достаточно понятным языком объясняется по NetCode, у него же есть там на канале 6 часовое видео как он делает мультиплеерную игру для Steam на NetCode.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

След.

Вернуться в Почемучка

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

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