В этой статье я хочу коротко показать как работает сеть в 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; } } } }
Что это значит:
- Идет проверка присоединился ли игрок к серверу, если нет, то проверяется не запустил ли игрок сервер, если обе проверки отрицательны то мы рисуем интерфейс для создания сервера и присоединения к существующему.
- Если проверка на создания сервера положительна то игрок может начать игру.
Далее добавим вот это
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 методов. Делается это все просто:
- На объект MainCamera Вешаем компонент NetworkView и перетаскиваем скрипт NetworkExample в Observed что-бы получилось вот так:
- Создаем куб и вешаем на него компонент rigidbody
Далее указываем в скрипте Network Example prefab - тот самый куб
Еще нужно не забыть в настройках проекта указать работу в бекграунд режиме:
Edit>Project Settings> Player
Готово! Теперь можно добавить Plane что бы наши кубики не улетали в вечность, или придумать что-то интересней. Если есть вопросы пишите. Извиняюсь за ошибки и неточности, это моя первая статья.
В итоге получим вот такое:
Исходник
Смотрите также:
Комментарии
Здесь еще никто не оставил комментарий
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]