Как разделить код на стороне сервера и на стороне клиента

Возможно ли иметь отдельные проекты для клиента и сервера в Unity3D с помощью UNet?

Насколько я вижу, это кажется невозможным, официальной документации Unity3D не так много. ясно по этой теме и не нашел ни одного примера или статьи об этом.

Если вы используете NetworkManager, предоставляемый Unity3D, логика на стороне сервера сильно связана. и логика игрового клиента, можно ли разделить это на два разных проекта? Серверная часть должна быть просто безголовым сервером, а клиент должен быть обычным игровым клиентом без всей серверной логики. Если это возможно, как это должно выглядеть?


person Alejandro Morán    schedule 04.01.2018    source источник
comment
Unity позволяет использовать выделенный сервер или один клиент для размещения игры. Это действительно зависит от вас, как вы хотите, чтобы это работало. Но я считаю, что вы ищете класс NetworkServer. Это разделило логику сервера.   -  person Brandon Miller    schedule 04.01.2018
comment
@BrandonMiller Спасибо, кажется, это хорошая отправная точка, кажется, это то, что я искал.   -  person Alejandro Morán    schedule 04.01.2018
comment
@BrandonMiller Сейчас я столкнулся с похожей проблемой, давайте сосредоточимся на методе Spawn, который получает GameObject в качестве параметра, префабы должны храниться на сервере, а затем отправляться клиенту? нужен ли клиенту доступ к этим префабам?   -  person Alejandro Morán    schedule 05.01.2018
comment
Нет, префабы должны храниться в каждом клиенте, и когда они получают сообщение о порождении, они должны обрабатывать свои собственные экземпляры. Ваша цель — как можно меньше нагружать сервер. Используйте ресурсы клиентского ПК в своих интересах.   -  person Brandon Miller    schedule 05.01.2018
comment
@BrandonMiller Как это возможно? Сигнатура метода spawn получает GameObject в качестве первого параметра, что мы должны туда отправить?   -  person Alejandro Morán    schedule 06.01.2018


Ответы (1)


Используя класс Network, вы можете легко различать сервер и клиент.

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void OnGUI() {
        if (Network.isServer)
            GUILayout.Label("Running as a server");
        else
            if (Network.isClient)
                GUILayout.Label("Running as a client");

    }
}

Или в классе NetworkBehaviour есть свойства, которые позволяют сценариям знать, что контекст сетевого объекта в любое время.

  1. isServer — true, если объект находится на сервере (или хосте) и был создан.
  2. isClient — true, если объект находится на клиенте и был создан сервером.
  3. isLocalPlayer — true, если объект является объектом проигрывателя для этого клиента.
  4. hasAuthority — true, если объект принадлежит локальному процессу.
person Muhammad Faizan Khan    schedule 15.01.2018
comment
Спасибо за вашу помощь, но это не отвечает на мой первый вопрос о наличии сервера и клиента в разных проектах, этот способ кажется немного грязным по сравнению с основными методами, которые мы используем в других областях разработки, в которых код хорошо организован и разделен. . - person Alejandro Morán; 15.01.2018
comment
Я думаю, что UNET не предоставляет такую ​​​​функцию, но вы можете сделать выделенный сервер. кроме того, это не грязно или сложно. - person Muhammad Faizan Khan; 15.01.2018