В какой момент производить запись в БД?

Сеть в Unity3D

В какой момент производить запись в БД?

Сообщение DarkDeivel 21 сен 2017, 18:32

Всем привет! Добрался я до такой для меня важной темы как сохранение прогресса в БД. Проблема в том что я не совсем понимаю в какие моменты мне отправлять данные в БД и как лучше. Наверное что касается денег там попроще будет, во время покупки\продажи\подбора отправлять запрос в БД и обновлять значение(если я не прав поправьте пожалуйста), а вот как быть с координатами х,у,z? Каждый кадр отправлять это круто слишком, может быть отправлять каждые там 3-5 секунд в БД новые значения? Спасибо всем за помощь!

Я использую Photon Cloud.
DarkDeivel
UNITрон
 
Сообщения: 251
Зарегистрирован: 03 окт 2011, 14:02

Re: В какой момент производить запись в БД?

Сообщение Shekn 22 сен 2017, 15:35

Достаточно будет сохранять все состояния игроков раз в минуту (или пол минуты, как хочется) и при выходе из игры.
https://tugcga.github.io/
Аватара пользователя
Shekn
UNIт
 
Сообщения: 95
Зарегистрирован: 05 фев 2016, 14:20

Re: В какой момент производить запись в БД?

Сообщение DarkDeivel 22 сен 2017, 16:00

Shekn писал(а):Достаточно будет сохранять все состояния игроков раз в минуту (или пол минуты, как хочется) и при выходе из игры.


Спасибо за первый ответ! Про выход из игры я конечно думал, но вдруг резко выкинет(интернет отвалится или свет выключат). Как сохранять инвентарь? Я вот читал что каждый предмет сохраняется отдельной строчкой в таблице, так тогда этих строчек могут быть десятки\сотни тысяч, это нормально? В какой момент нужно всё сохранять(подобрал\купил\выкинул)?
DarkDeivel
UNITрон
 
Сообщения: 251
Зарегистрирован: 03 окт 2011, 14:02

Re: В какой момент производить запись в БД?

Сообщение Woolf 22 сен 2017, 17:26

Я использую Photon Cloud


ээм.. А как там можно что-то записать в БД? Вы что же, из клиента пишете в базу? Так категорически нельзя делать, это страшная уязвимость.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: В какой момент производить запись в БД?

Сообщение DarkDeivel 23 сен 2017, 07:11

Woolf писал(а):
Я использую Photon Cloud


ээм.. А как там можно что-то записать в БД? Вы что же, из клиента пишете в базу? Так категорически нельзя делать, это страшная уязвимость.


Я хочу от него отказаться т.к. я на нем учился, но я сразу заранее про БД и спрашиваю когда и как записывать.

Как быть с инвентарем? Почитал в инете информацию. Пришел к выводу что должна быть таблица где прописывается игрок и предмет какой он имеет в инвентаре... У ла2 предметы хранятся в xml в виде:

Синтаксис:
Используется xml
<?xml version="1.0" encoding="UTF-8"?>
-<list>
-<item name="short_sword" id="1">
-<for>
<set stat="pAtk" order="0x08" val="8"/>
<set stat="mAtk" order="0x08" val="6"/>
<set stat="rCrit" order="0x08" val="8"/>
<add stat="accCombat" order="0x10" val="0"/>
<set stat="pAtkSpd" order="0x08" val="379"/>
<enchant stat="pAtk" order="0x0C" val="0"/>
<enchant stat="mAtk" order="0x0C" val="0"/>
</for>
</item>
</list>


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

Можно конечно сделать таблицу в БД и назвать её items и в каждой строчке эти параметры указывать, но почему-то мне кажется вариант xml как выше лучше?
DarkDeivel
UNITрон
 
Сообщения: 251
Зарегистрирован: 03 окт 2011, 14:02

Re: В какой момент производить запись в БД?

Сообщение IDoNotExist 24 сен 2017, 14:57

DarkDeivel писал(а):Как быть с инвентарем? Почитал в инете информацию. Пришел к выводу что должна быть таблица где прописывается игрок и предмет какой он имеет в инвентаре...

Не предмет, а его ID, по этому ID уже тащим из xml файла данные предмета.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: В какой момент производить запись в БД?

Сообщение DarkDeivel 25 сен 2017, 07:28

IDoNotExist писал(а):
DarkDeivel писал(а):Как быть с инвентарем? Почитал в инете информацию. Пришел к выводу что должна быть таблица где прописывается игрок и предмет какой он имеет в инвентаре...

Не предмет, а его ID, по этому ID уже тащим из xml файла данные предмета.

Можете подсказать где должны эти xml хранится, не в клиенте же? И как считать его тому же клиенту.
DarkDeivel
UNITрон
 
Сообщения: 251
Зарегистрирован: 03 окт 2011, 14:02

Re: В какой момент производить запись в БД?

Сообщение IDoNotExist 25 сен 2017, 08:28

DarkDeivel писал(а):Можете подсказать где должны эти xml хранится, не в клиенте же? И как считать его тому же клиенту.

Хранить на сервере, передавать с сервера на клиент.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: В какой момент производить запись в БД?

Сообщение Alex_Hell 27 сен 2017, 01:02

если хочешь надежно и в меру не-крякабельно, то вся логика на сервере, например клиент говорит серву "открой сундук", серв выполняет код который проверяет шанс выпадения предмета, выдает предмет в инвентарь (в памяти, и сохраняет синхронно/асинхронно в БД возможно сразу а возможно батчами раз в N сек), и сообщает клиенту что он получил и должен показать юзеру.

конфиги предметов - статы урон, и что там еще - храни на сервере, передавай при старте на клиент в виде JSON (не XML), в юнити есть парсер JSON. Для серва тоже - на PHP,Java.

Как БД не выбирай файлы, они запароться могут, и работать "правильно" с ними сложней, изучи СУБД типа MySQL, и юзай SQL скрипты с серверной стороны вызываемые на UPDATE/INSERT/SELECT.

В таблице предметов можешь ввести например:
(long) UserId - (long) ItemTypeId
1 - 1
1 - 2
2 - 1
2 - 3

тут понятно какие предметы имеются в инвентаре какого игрока,
а по ItemTypeId понятно что за характеристики из сопутствующего связанного конфига ItemTypeId -> ItemInfo , с любыми под-параметрами, в зависимости от того на сколько универсальна система - какие атрибуты и на сколько одинаковые у предметов есть, может быть, может быть если это Урон у всех оружий, Броня у доспехов, тут можешь делить ItemType еще как Id 1 например Оружий, Id 2 Броня.
Главное во всех ID не запутаться, т.к. каждый из своего множества, т.е апельсины с человеками не смешивать
Alex_Hell
UNец
 
Сообщения: 11
Зарегистрирован: 15 окт 2014, 14:24

Re: В какой момент производить запись в БД?

Сообщение Alex_Hell 27 сен 2017, 01:05

DarkDeivel писал(а):
Shekn писал(а):Достаточно будет сохранять все состояния игроков раз в минуту (или пол минуты, как хочется) и при выходе из игры.

Я вот читал что каждый предмет сохраняется отдельной строчкой в таблице, так тогда этих строчек могут быть десятки\сотни тысяч, это нормально?

СУБД для миллионов строк и придуманы, есть индексы для быстрого поиска, чтобы не выбирать все строки в поиске предметов нужного игрока по ID, или удалении предмета по Id предмета у Id игрока.
Alex_Hell
UNец
 
Сообщения: 11
Зарегистрирован: 15 окт 2014, 14:24


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0