- Unity3D и MySQL
- Создание сервера для онлайн ММО игр на PHP ч. 8 — Клиентская часть на Unity
- Setting up a server backend for your Unity3D Game using LEMP (Linux, Nginx, MySQL, PHP)
- Connect to our server instance and Set it up
- Install and Setup Nginx webserver and PHP
- Install and Setup MySQL Database Server
- (OPTIONAL) Install PHPMYADMIN to manage your database
Unity3D и MySQL
Наверное каждый, кто делал игру для социальной сети или просто онлайн игру сталкивался с проблемой подключения и сохранения данных в базу данных. В этой статье я постараюсь подробно описать как установить подключение и передать данные в базу данных 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:
', '', '')") or die (mysql_error()); //Выводим текст Done echo "Done"; ?>
Данный скрипт принимает данные из движка и заносит их в базу данных MySQL. Обратите внимание, название скрипта PHP (connect.php) должно соответствовать названию скрипта в значении переменной url. Вроде бы на этом всё… Надеюсь эта информация стала полезной для кого-либо.
Это моя первая статья, надеюсь всё подробно описал и Вы решили свою проблему.
Создание сервера для онлайн ММО игр на PHP ч. 8 — Клиентская часть на Unity
Разобравшись в архитектуре сервера, реализовав механизм простого расширения его функционала путем добавления пользовательского кода через WEB админ панель и игровых локаций захотелось наконец посмотреть как бы это все работало и выглядело в игре.
Т.к. сервер для игры является авторитарным то клиентская часть должна была содержать:
- интерфейс UI с разнообразными меню и кнопочками, джойстиком
- клиентскую часть подключения к серверу по протоколу websocket (о котором я писал ранее) для отправки команд и получения ответа во время игры
- возможность работать по http протоколу (для первичной регистрации, авторизации и загрузки на клиент графики и желательно асинхронно)
- из желательного было так же поддержка тайловых карт из коробки
Начать решил с 2D онлайн игры с перспективой перехода к 3D. Т.к. ранее я не имел дело с игровыми движками то выбрал наиболее популярный — Unity который имеет хорошую документацию в т.ч. на русском языке, множество обучающих видео, да и главная страница их сайта мотивировала выбрать именно этот движок использующий язык программирования С# для написания кода помимо встроенного инструментария для работы со сценами, анимацией, картами, камерой и др.
В своей первой статье я рассказывал, что информации о том как сделать свою онлайн игру без использования платных сервисов (Photon, FireBase, PlayFab, Mirror и др.) весьма мало, а еще меньше тех, что могут выдержать нагрузку более пары десятков человек и то что останется будет на английском языке. Так что в России я с какой то стороны первопроходец реализующий целый сервис с API и нужно не упасть в грязь лицом реализуя примеры интеграции.
Я бы хотел сказать что первым делом я разработал API, документацию по работе админ панели и на базе этого создал клиент — но это не так и по факту было в обратной последовательности: вступая на этот неизвестный путь я вообще не понимал чего следует ждать, десятки раз переделывал клиентскую и серверную часть — постоянно что то не устраивало (как по архитектуре кода, так и по скорости) и так прошло около 4х месяцев и в очередной раз сидя ночью в номере отеля в Африке я анонсировал первую рабочую версию API по работе с сервером и первые примеры добавления игровых механик в сервер через WEB.
Можно было создать метод API, описать через Lua, Java Script или PHP (на выбор, подробнее писал об этом тут) во встроенной IDE код что этот метод будет делать на сервере, сделать этот метод публичным (все это через WEB админ панель) и вызвать с клиентского приложения (который к тому моменту был никак не описан и не структурирован). Для демонстрации метод добавлял на карту Гоблина.
Так же я заранее позаботился о том, что нужен инструмент отладки запросов по API (аналог swagger или postman, но в рамках той же админ панели), а т. к. Unity может портировать игры в том числе и на браузеры (webgl игры которые можно в т.ч. размещать на независимых от сервера сайтах) стало возможным не только слать запросы и видеть ответ, но и тут же наблюдать за тем что происходит в игре, выглядело это так:
Сделав это пришла пора привести в порядок код клиентской части игры и реализовать все в виде плагина на Unity. Для себя я выделил следующие важные факторы
- Код должен представлять собой плагин для Unity и содержать функционал приемки и отправки пакетов.
- Структура кода игры должна повторять структуру плагина расширяя его классы дополнительным функционалом.
- Использовать ООП (объектно‑ориентированный подход) т. к. я уже привык с ним работать в PHP (хотя бы постараться его применять в коде игры).
- Для описания запросов к серверу и ответов использовать «структуры» (позже из за проблем с кодированием и декодирования json struct пришлось переделать в обычные классы но их назначение осталось прежним).
- На каждом «префабе» в Unity (то есть на любом игровом объекте с которым можно взаимодействовать) должен быть «повешен» фаил — класс который принимает от главного контроллера пакетов пакет именно этого префаба и обновляет данные (например изменение позиции, жизней, маны, запуск новой анимации и т. д).
- Должны быть из коробки решены проблемы с которыми сталкиваются разработчики при разработке онлайн игры (интерполяция, экстраполяция, поддержка работы с websocket соединением в версии для пк, мобильных устройств и браузеров и связанные с последней проблемы, такие как ввод теста, изменение размера окна, потеря фокуса и т. д.).
- Поддержка функционала бесшовного мира сервера и переход между локациями.
- В проекте должно быть 2 сцены (сцена авторизации/регистрации и пустая сцена, где на лету меняется карта и префабы на ней).
- Readme к папкам и файлам проекта.
Клиентская часть лежит в открытом доступе, структура того что получилось изображена на скриншотах ниже.
Если кому то станет более интересна тема интеграции в Unity взаимодействия с серверным API в данной реализации я так же подготовил плейлист на своем канале Youtube где я объясняю как что работает сам плагин (хотя при разработке игры предполагается что разработчику не нужно углубляться в это).
В следующих статьях я расскажу как именно реализовываются игровые механики на сервере и в клиенте, а в моем профиле вы найдете ссылки на другие статьи проекта my-fantasy.ru.
Setting up a server backend for your Unity3D Game using LEMP (Linux, Nginx, MySQL, PHP)
Setting up a server backend for your Unity3D Game using LEMP (Linux, Nginx, MySQL, PHP). We will keep this blog post quite straight forward, for in-depth details and explanation, please watch our above video instead.
If not redirected automatically after account creation, login to their Console (Dashboard) here:
In the video, we went straight to creating our instance, but we first need to setup our SSH keys which we can assign and use during server creation.
SSH keys are like a two part file-based security system, where you provide one public file to the server and then use a private file while connecting to the server via SSH.
Its a better form of security system than plain-text password system and quite the standard when it comes to server security and access.
Download and open PuttyGen (link at top of this post).
Make sure type of key is set to SSH2-RSA2 and click generate. Move your mouse in the empty space to generate the key.
Then save the public key and private key separately (name them so you can recognize which is which).
There is one more step involved using Puttygen which we missed in the video. You need to convert your saved Private Key to OPENSSH format and re-save it again.
This OPENSSH format private key is what we will use in our SSH client to connect to our server.
Now lets add our SSH key to the Scaleway Console so it can be used while creating our server.
Head over to Profile->Credentials in Scaleway Console (or click below link).
Click Add a New SSH Key and paste the contents of the Public Key we generated and saved earlier (you can open that file in Notepad to copy its content).
Give your SSH Credential a name and add it.
SSH part all done. Let’s move towards creating our instance.
- Click on Instances on your left sidebar, under Compute.
- Create an Instance.
- Change Availability Zone to Amsterdam (Stardust, their cheapest instance type is only available there at present).
- Choose Ubuntu 20.04 as OS/Instance Image.
- Select Stardust in Instance Type.
- Enter name of your Instance and relevant tags (OPTIONAL).
- Make sure the SSH key we added earlier is shown here.
- Make sure the ESTIMATED COST for 1 Month shows below 2 Euro (which includes a public IP).
- Create a new instance.
Congratulations, we have our Linux/Ubuntu server created now. Time to move to next step, connecting to it and setting it up
Connect to our server instance and Set it up
You can use any SSH client of your choice to connect to your server (Putty being most popular), we will use MobaXTerm which is our favorite (link at top reference box).
- Download, install and Open MobaXTerm.
- Click Sessions tab, enter your server’s public IP (copy it from the Console) in Remote Host, enter root as username.
- Click Advanced SSH settings tab below. Check mark Use private key.
- Click the browse button and select the previously saved SSH Private Key (OPENSSH).
- Click OK to save your server’s profile and it should connect automatically.
Once connected, lets do some initial setup of our server.
From here onwards, you can just keep copy-pasting the server commands from this post in your MobaXTerm (shift + insert or right click in it to paste the command).
# Update Server Repos apt update # Install Zip/Unzip and VNStat for bandwidth monitoring and iftop for traffic apt install -y zip unzip vnstat iftop
!! (OPTIONAL FOR YOU) !!
Make a sub-directory in /home (home directory) to download and unzip our backend service’s code
cd /home mkdir rpg cd rpg # Download wget "https://github.com/insthync/rpg-php-service/archive/refs/tags/1.18.zip" # Unzip files and move them unzip 1.18.zip ls # Move all files from rpg-php-service folder to current folder mv rpg-php-service/* ./
Install and Setup Nginx webserver and PHP
Let’s install Nginx Webserver and PHP and some of its modules
apt install -y nginx php-fpm php-mbstring php-curl php-intl php-xml php-json php-mysqlnd php-mysql phpenmod mbstring
Configure Nginx Webserver to serve PHP/HTML files on our server’s Public IP from our backend’s directory (/home/rpg)
# If asked which editor to use, choose nano nano /etc/nginx/sites-enabled/default
Delete everything in that file, replace it with below content (copy-paste it) and press Ctrl + W and Enter to save the file changes
Press Ctrl + W to save the file.
Run below commands to test your nginx changes (conf file) and restart the webserver.
#This checks that your nginx conf is all good, if so, restart the nginx server nginx -t service nginx restart
Install and Setup MySQL Database Server
apt update apt install software-properties-common -y apt install mariadb-server -y
MySQL (mariadb) is now installed, lets run its post-installation security script
mysql_secure_installation
- Press enter when asked for root password as initially its blank
- Press Y and enter to change root password, enter your new password and press enter to save
- Keep pressing Y to everything else
Let’s login to MySQL to create our Database and assign it a user to access it
Please note that below are normal SQL queries to create a database, create a user with password and then assign privileges on that database to that user
create database rpgDB; CREATE USER 'rpg_user'@'%' IDENTIFIED BY 'passwordhere'; GRANT ALL ON rpgDB.* TO 'rpg_user'@'%'; FLUSH PRIVILEGES; QUIT;
Then you can use the above created database and its user info in the configuration file of your backend service (shown in video, skipped here).
(OPTIONAL) Install PHPMYADMIN to manage your database
PHPMYADMIN is a well known GUI-based database management tool, but we personally recommend using a desktop-client based management tool like HeidiSQL (shown in video).
Nevertheless, here is how you install PHPMYADMIN, to hide and secure our phpmyadmin’s access, please change hiddenmysql to whatever directory name you want.
apt install -y phpmyadmin ln -s /usr/share/phpmyadmin /home/rpg/hiddenmysql
Your PHPMYADMIN will be accessible at http://YOURPUBLICIP/hiddenmysql
If you get a count or count-related error in phpmyadmin, please follow these steps
*Please do restart the services using below step before trying to access your backend code or even phpmyadmin
Let’s do a final restart of all our services
service nginx restart service php7.4-fpm restart service mysql restart