Добавлен Devion,
опубликован
В этой статье я хочу коротко показать как работает сеть в 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;
Внутри метода у нас создание на сцене объекта клона 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 - этот параметр отвечает за то кому отправлять сообщение о вызове метода, и третий параметр это аргумент метода)
Для вызова сетевых методов мы используем
netowrkView.RPC("метод с атрибутом rpc", RPCMode - этот параметр отвечает за то кому отправлять сообщение о вызове метода, и третий параметр это аргумент метода)
Ну что, теперь с кодом покончено, осталось создать куб который будет появляться на сцене и привязать компонент networkView который требуется для вызова RPC методов. Делается это все просто:
- На объект MainCamera Вешаем компонент NetworkView и перетаскиваем скрипт NetworkExample в Observed что-бы получилось вот так:
- Создаем куб и вешаем на него компонент rigidbody
Далее указываем в скрипте Network Example prefab - тот самый куб
Еще нужно не забыть в настройках проекта указать работу в бекграунд режиме:
Edit>Project Settings> Player
Edit>Project Settings> Player
Готово! Теперь можно добавить Plane что бы наши кубики не улетали в вечность, или придумать что-то интересней. Если есть вопросы пишите. Извиняюсь за ошибки и неточности, это моя первая статья.
В итоге получим вот такое:
В итоге получим вот такое:
Исходник
`
ОЖИДАНИЕ РЕКЛАМЫ...
2 комментария удалено
Чтобы оставить комментарий, пожалуйста, войдите на сайт.