Построение своих собственных сетевых серверов Юнити.

(For new projects, you should use the new networking system introduced in 5.1 . This information is for legacy projects using the old networking system.)

Исходный код для всех индивидуальных сетевых серверов может быть загружен с Unity website . Эта сборка включает в себя connection tester (тестировщик соединений), facilitator (посредник), master server (управляющий сервер) и proxy server (прокси сервер).

Все сборки исходников содержат сетевую библиотеку RakNet 3.732, которая управляет базовыми сетевыми функциями и поддерживает плагины, которые используют сетевые серверы.

  • Xcode 3.0 проект для Mac OS X
  • Makefile для Linux и Mac OS X
  • Visual Studio 2008 solution

Проекты Xcode и Visual Studio могут быть просто открыты, скомпилированы и собраны. Чтобы собрать проект Makefile просто запустите “make”. Он должен работать со стандартными настройками компиляции на Linux и Mac OS X, если у вас gcc , то должно заработать. Для Linux возможно потребуется установить библиотеку ncurses.

Структура

The Master Server

В Master Server используется внутренняя структура база данных (database ), чтобы отслеживать информацию о хостах.

Хосты отправляют сообщения с идентификатором сообщений RUM_UPDATE_OR_ADD_ROW, содержащие всю информацию о хосте. Это обрабатывается в функции OnReceive() в файле LightweightDatabaseServer.cpp . Это то место, куда первоначально приходят все сообщения, и поэтому хорошая точка отсчёта, если вы хотите отследить как обрабатываются сообщения. Создаётся таблица со структурой базы данных database для каждого типа игры game type , которые устанавливаются когда вы исполняете функцию MasterServer.RegisterHost . Все типы игр сгруппированы вместе в таблице, если таблицы не существует, она создаётся динамически в функции CreateDefaultTable() .

Данные с информацией о хосте модифицируются Master Server. IP адрес и порт регистрируемой игры, в таком виде, как их видит Master Server, добавляются в данные о хосте. Таким образом, мы можем с уверенностью определить правильный внешний IP и порт в случаях, когда хост имеет приватный адрес (NAT адрес). IP и порт внутри данных о хосте передаются игровым сервером как приватные адрес и порт и это сохраняется для дальнейшего использования. Если Master Server замечает, что клиент запрашивает данные о хосте для игрового сервера и этот сервер имеет тот же IP адрес, то он будет использовать приватный адрес сервера вместо внешнего. Это происходит в случае, когда клиент и сервер подключены к одной и той же локальной сети, используют один и тот же маршрутизатор с NAT адресацией. Поскольку у них будет одинаковый внешний адрес и они не смогут подключиться друг к другу через него, им необходимо использовать приватные адреса и в этом случае это сработает.

Клиенты отправляют сообщения с идентификатором сообщения ID_DATABASE_QUERY_REQUEST и какой тип игры game type они ищут. Из структуры базы данных выбирается таблица или список хостов и отправляются клиенту. Если ничего не найдено, отправляется пустлй список хостов.

Все сообщения, отправляемые к Master Server должны содержать информацию о версии, которая проверяется в функции CheckVersion() . В настоящее время каждая версия Юнити будет задавать новую внутреннюю версию Master Server и это будет здесь проверяться. Так что если последовательность действий коммуникации Master Server в какой-то момент поменяется, будет возможным обнаружить более старые версии и по возможности перенаправить на другую версию Master Server (если это вообще нужно) или изменить обработку этого сообщения для учёта различий.

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

Допустим вы создали онлайн игру и перед вами встала задача добавить возможность сохранения набранных очков пользователем, с возможностью вывода этих очков в HiScore. Для этого вам необходимо хранить эти очки на сервере с возможностью постоянного доступа к нему.

Я использовал бесплатный хостингwww.byethost.com . И так регестрируемся на www.byethost.com , на почту вам должно прийти письмо с логином и паролем. Авторизуемся на сайте, потом заходим в панель управления. Выбираем MySQL Database :





В появившемся окне в поле вводим имя вашей базы данных, и жмем Create Database . База данных создана теперь заходим в панель управления базой данных, жмем кнопку Admin . У вас должно появиться следующее окошко:






Создадим новую таблицу в которой будем хранить имя пользователя и набранные очки. В поле «Имя» введите название таблицы, например «scores» , в поле «Количество столбцов» введите «2», и нажмите «Ок» . Появится окно где нужно заполнить названия столбцов и тип хранимых данных. В первом столбце будем хранить имя пользователя: поле - name , тип - varchar , длинна - 20. Второй столбец: поле – score , тип int. Нажимае «Сохранить» , таблица создана. Теперь выберите созданную таблицу, у вас появится окно со структурой таблицы, и внизу будет надпись «Индекс не определен» . Напротив столбца «Name» нажмите «ещё» и выберите "добавить индекс".





База данных создана, теперь необходимо осуществить доступ к ней. Так как на сервере порт 3306 закрыт для внешнего доступа , по которому осуществляется связь с MySQL , мы не можем удаленно, из нашего приложения осуществлять доступ к базе данных. По этому мы создадим php скрипт в котором будет осуществляться доступ к нашей БД, чтение и запись данных и расположим его на сервере, а из приложения уже будем получать данные через этот скрипт.

И так создайте следующий php-скрипт:


?PHP // Connect to Database $link = mysql_connect("hostname", "username", "password") or die(mysql_error()); mysql_select_db("databasename") or die(mysql_error()); // Get Data $name = $_POST["name"]; //Get name from Unity $score = $_POST["score"]; //Get score from Unity $action = $_POST[ "action" ]; //Get request action from Unity $unityHash = $_POST[ "hash" ]; //Get hash key from Unity //Секретный ключ для шифрования данных при передаче $secretKey="BRIGHTWORLDGAMES"; $phpHash = md5($name."-".$score."-".$secretKey); switch ($action) { case "GetScore": GetScores(); break; case "PostScore": if($phpHash == $unityHash) { PostScore(); } break; default: GetScores(); break; } //////////////////////////////////////////////////////////////////////////////////////// function PostScore() { $score = $_POST[ "score" ]; //score pass from Unity $name = $_POST[ "name" ]; //name pass from Unity //scores = имя вашей БД //name = Первый столбец //score = второй столбец $query = "INSERT INTO scores (name, score) VALUES ("" . $name . "", "" . $score . "")"; mysql_query($query) or die(mysql_error()); } //////////////////////////////////////////////////////////////////////////////////////// function GetScores() { if($_POST[ "size" ] != "") { $size = $_POST[ "size" ]; } else { $size = 10; } $query = "SELECT * FROM scores ORDER BY score DESC LIMIT " . $size; $results = mysql_query($query) or die(mysql_error()); //Return XML String to Unity echo "\n"; echo " \n"; if(mysql_num_rows($results) > 0) { while($line = mysql_fetch_array($results)) { echo " \n"; } } else { echo "No entries yet."; } echo " \n"; } //////////////////////////////////////////////////////////////////////////////////////// // Close mySQL Connection mysql_close($link); ?>

Hostname вы можете посмотреть на панели слева, имя пользователя и пароль к БД должны были прийти вам на почту. Назовите данный скрипт HiScore , и залейте его на сервер через ftp (адрес ftp также можно увидеть на панели слева) , в папку “htdocs” . На этом работа с сервером закончена, и можно переходить к клиентской части приложения.


Скачать видео и вырезать мп3 - у нас это просто!

Наш сайт - это отличный инструмент для развлечений и отдыха! Вы всегда можете просмотреть и скачать онлайн-видео, видео приколы, видео скрытой камеры, художественные фильмы, документальные фильмы, любительское и домашнее видео, музыкальные клипы, видео про футбол, спорт, аварии и катастрофы, юмор, музыка, мультфильмы, аниме, сериалы и многие другие видео совершенно бесплатно и без регистрации. Конвертировать это видео в mp3 и другие форматы: mp3, aac, m4a, ogg, wma, mp4, 3gp, avi, flv, mpg и wmv. Онлайн Радио - это радиостанции на выбор по странам, стилям и качеству. Онлайн Анекдоты - это популярные анекдоты на выбор по стилям. Порезка mp3 на рингтоны онлайн. Конвертер видео в мп3 и другие форматы. Онлайн Телевидение - это популярные TV каналы на выбор. Вещание телеканалов производится абсолютно бесплатно в режиме реального времени - эфир онлайн.

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

Итак, приступим, для начала создайте в Unity C# скрипт, назовите его MysqlConnect и внесите в него следующий код:

Using UnityEngine; using System.Collections; public class MysqlConnect: MonoBehaviour { private string username = ""; //Переменная для хранения имени private string pswd = ""; //Переменная для хранения пароля private string email = ""; //Переменная для хранения почтового ящика private string url = "http://www.localhost.ru/habr/connect.php"; //Переменная для хранения адреса //Создание метода, отвечающего за подключение и передачу данных void Connect() { WWWForm form = new WWWForm(); //Создаём новую форму //Добавляем в форму новые данные form.AddField("username", username); form.AddField("password", pswd); form.AddField("email", email); //Создаём новое подключение WWW connect = new WWW(url, form); //Если удалось установить подключение if (connect.isDone) { //Выводим в консоль ответ сервера Debug.Log(connect.text); } //Если при подключении возникла ошибка else if (connect.error == null) { //Выводим в консоль текст Error Debug.Log("Error"); } } //Создаём метод OnGUI() void OnGUI() { //Создаём текстовое поле для ввода имени пользователя username = GUI.TextField(new Rect(Screen.width/2-100, Screen.height/2-100, 200, 20), username, 12); //Создаём текстовое поле для ввода пароля pswd = GUI.TextField(new Rect(Screen.width/2-100, Screen.height/2-75, 200, 20), pswd, 12); //Создаём текстовое поле для ввода почтового ящика email = GUI.TextField(new Rect(Screen.width/2-100, Screen.height/2-50, 200, 20), email, 50); //Создаём кнопку для произведения подключения if (GUI.Button(new Rect(Screen.width/2-100, Screen.height/2-25, 200, 20), "Connect")) { Connect(); } } }

В данном скрипте производится запрос к PHP скрипту и ему передаются данные, введённые пользователем.

Теперь, давайте создадим PHP скрипт и назовём его connect.php:

Данный скрипт принимает данные из движка и заносит их в базу данных MySQL. Обратите внимание, название скрипта PHP (connect.php) должно соответствовать названию скрипта в значении переменной url. Вроде бы на этом всё… Надеюсь эта информация стала полезной для кого-либо.
Это моя первая статья, надеюсь всё подробно описал и Вы решили свою проблему.