Встроенное сетевое решение

Добавлен , опубликован
В этой статье я хочу коротко показать как работает сеть в Unity3D. Несмотря на то что встроенная сетевая реализация в юнити хромает, статья будет интересна тем кто собирается переходить на другие серверные решения такие как Photon или SmartFoxServer.
Я покажу как делается соеденение с сервером, создается сервер и отправляются сообщения между клиентами.

Для начала создадим новую сцену

Получится вот такое:

Далее выберем нашу основную камеру и создадим новый скрипт, назовем его NetworkExample

В нем создаем класс OnGUI, для реализации графической части нашей наработки:
void OnGUI()
{

}
До реализации отрисовки частей интерфейса нужно определить пару переменных которые нам потребуются:
  • bool isServerStarted; отвечает за то, когда сервер запущен
  • bool isPlayerConnected; отвечает за то, когда игрок присоединился к серверу
  • string ip = "127.0.0.1"; сюда мы будем записывать айпи сервера к которому мы будем присоединяться

Теперь мы продолжим работать с классом OnGUI() и добавим вот такую часть кода:

void OnGUI()
{
    if (!isPlayerConnected)
    {
        if (!isServerStarted)
        {
            if (GUILayout.Button("Start Server"))
            {
                Network.InitializeServer(32, 3333, false);
                // 32 - максимальное количество игроков
                // 3333 - порт
                // последний параметр проверка на использование NAT
            }
            if (GUILayout.Button("Connect"))
            {
                Network.Connect(ip, 3333);
            }

            ip = GUILayout.TextArea(ip); // рисуем окно с вводом айпи
        }
        else
        {
            // игрок создал сервер и может начать игру
            if (GUILayout.Button("Spawn"))
            {
                isPlayerConnected = true;
            }
        }
    }
}
Что это значит:
  1. Идет проверка присоединился ли игрок к серверу, если нет, то проверяется не запустил ли игрок сервер, если обе проверки отрицательны то мы рисуем интерфейс для создания сервера и присоединения к существующему.
  2. Если проверка на создания сервера положительна то игрок может начать игру.

Далее добавим вот это

void OnServerInitialized()
{
    isServerStarted = true;
}

void OnConnectedToServer()
{
    isServerStarted = true;
}
Первый метод вызывается когда был создан сервер и соответственно мы отмечаем это в своей переменной. Второй, когда игрок присоединился к серверу и выполняет аналогичную функцию.
Теперь, когда игроки могут подключатся к серверу и создавать сервер займемся передачей сообщений между ними. Как пример мы сделаем что бы игроки могли выбирать цвет и заставлять появляться кубы на сцене.
В конец класса мы добавим:
[RPC]
void SpawnBox(string color)
{
    GameObject cube = Instantiate(prefab, new Vector3(0, 25, 0), Quaternion.identity) as GameObject;
    switch (color)
    {
        case "green":
            cube.renderer.material.color = Color.green;
            break;
        case "black":
            cube.renderer.material.color = Color.black;
            break;
        case "white":
            cube.renderer.material.color = Color.white;
            break;
    }
}
Как вы заметили в начале класса появился атрибут [RPC] он ставится перед всеми методами которые мы будем вызывать при сетевой связи.
Внутри метода у нас создание на сцене объекта клона prefab, который мы должны объявить в начале нашего кода:
public GameObject prefab;
Далее мы обрабатываем аргрумент который передается во время вызова метода и меняем цвет кубика.
Теперь осталось дело за малым: создать объект и вызвать все таки этот метод.
Метод OnGUI() у нас немного дополнился:
void OnGUI()
{
    if (!isPlayerConnected)
    {
        if (!isServerStarted)
        {
            if (GUILayout.Button("Start Server"))
            {
                Network.InitializeServer(32, 3333, false);
            }
            if (GUILayout.Button("Connect"))
            {
                Network.Connect(ip, 3333);
            }
            ip = GUILayout.TextArea(ip);
        }
        else
        {
            if (GUILayout.Button("Spawn"))
            {
                isPlayerConnected = true;
            }
        }
    }
    // если игрок соединился даем возможность спавнить кубики
    else
    {
        if (GUILayout.Button("Spawn Box"))
        {
            networkView.RPC("SpawnBox", RPCMode.All, currentcolor);
        }
        // кнопки с цветом кубиков
        if (GUILayout.Button("White"))
        {
            currentcolor = "white";
        }
        if (GUILayout.Button("Black"))
        {
            currentcolor = "black";
        }
        if (GUILayout.Button("Green"))
        {
            currentcolor = "green";
        }
    }
}
У нас появилась переменная currentcolor которую надо не забыть добавить в начало кода:
  • string currentcolor = "white";
Теперь рассмотрим что происходит по нажатии кнопки SpawnBox:
Для вызова сетевых методов мы используем
netowrkView.RPC("метод с атрибутом rpc", RPCMode - этот параметр отвечает за то кому отправлять сообщение о вызове метода, и третий параметр это аргумент метода)
Ну что, теперь с кодом покончено, осталось создать куб который будет появляться на сцене и привязать компонент networkView который требуется для вызова RPC методов. Делается это все просто:
  1. На объект MainCamera Вешаем компонент NetworkView и перетаскиваем скрипт NetworkExample в Observed что-бы получилось вот так:
  1. Создаем куб и вешаем на него компонент rigidbody
Далее указываем в скрипте Network Example prefab - тот самый куб
Еще нужно не забыть в настройках проекта указать работу в бекграунд режиме:
Edit>Project Settings> Player
Готово! Теперь можно добавить Plane что бы наши кубики не улетали в вечность, или придумать что-то интересней. Если есть вопросы пишите. Извиняюсь за ошибки и неточности, это моя первая статья.
В итоге получим вот такое:

Исходник

`
ОЖИДАНИЕ РЕКЛАМЫ...