forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на Unity (http://forum.boolean.name/forumdisplay.php?f=147)
-   -   Black Bird (Unity Project Web Version) (http://forum.boolean.name/showthread.php?t=17107)

HolyDel 08.04.2013 00:50

Ответ: Black Bird (Unity Project Web Version)
 
выйти в гараж не работает.
здоровье при сбитии часто бывает меньше 100
зато исчезли глюки с неначислением фрагов!
хотелось бы чтобы показывали в каких комнатах играют друзья по контакту.
хотелось бы чтобы при сбитии чувака писалось кто и кого сбил.
новая комната - рульная!

pax 08.04.2013 07:08

Ответ: Black Bird (Unity Project Web Version)
 
Цитата:

Сообщение от HolyDel (Сообщение 256537)
хотелось бы чтобы показывали в каких комнатах играют друзья по контакту.

С облаком без собственного сервера вроде бы такое не провернуть... единственный вариант - в открытые параметры комнаты записывать строку с id пользователей через запятую и обновлять, но если будет много комнат, то будет тяжелый пакет со списком комнат...

moka 08.04.2013 14:02

Ответ: Black Bird (Unity Project Web Version)
 
Цитата:

Сообщение от pax (Сообщение 256545)
С облаком без собственного сервера вроде бы такое не провернуть... единственный вариант - в открытые параметры комнаты записывать строку с id пользователей через запятую и обновлять, но если будет много комнат, то будет тяжелый пакет со списком комнат...

Можно сделать записи в бд, где ID будет сам ID пользователя в VK. И далее вся инфа о статусе.
Далее когда запрашиваешь друзей, тут зависит, в facebook можно получить список пользователей которые тоже пользовались приложением. Такой список имеет ID пользователей, делаем простой запрос в БД с "ID IN (id_пользователей)". Таким образом получим список и статусы.
Но если нету возможности получить список друзей связанных с игрой, то тут проблема в том что будет либо слишком много ID для запросов - и нужно как-то оптимизировать.
Можно сделать автономный кеш, и держать список друзей у себя где-то, так можно будет сделать.
Такая фича очень положительно скажется на рентабельности игроков, особенно если иметь возможность приглашения друга в бой по одному клику.

pax 08.04.2013 14:12

Ответ: Black Bird (Unity Project Web Version)
 
Получить друзей, играющих в приложение с помощью апи вконтакта легко, проблема в том, что если писать это дело в базу, то база сильно опухнет, да и запрашивать это постоянно надо будет.

Фотон имеет открытые поля для комнат, которые можно задать при создании и в дальнейшем изменить. Эти открытые поля доступны в списке комнат, принятых с облака. Я правда не знаю, как повлияет на обновление списка комнат такое поле со списком id игроков. И как часто фотон рассылает список комнат.

moka 08.04.2013 16:07

Ответ: Black Bird (Unity Project Web Version)
 
Цитата:

Сообщение от pax (Сообщение 256557)
Получить друзей, играющих в приложение с помощью апи вконтакта легко, проблема в том, что если писать это дело в базу, то база сильно опухнет, да и запрашивать это постоянно надо будет.

Фотон имеет открытые поля для комнат, которые можно задать при создании и в дальнейшем изменить. Эти открытые поля доступны в списке комнат, принятых с облака. Я правда не знаю, как повлияет на обновление списка комнат такое поле со списком id игроков. И как часто фотон рассылает список комнат.

Зачем эти данные держать постоянно? Обнуляем их смело при выходе игрока из игровой сессии, и если есть какая-то нестабильность - то периодически (дневной скрипт), для чистки старых данных.
Таблица никогда не вырастит больше чем в день отыграет игроков.
Тем более она будет ужасно мелкой.

Если на стороне сервера запросы в VK API по запросу списка игроков будет не блокирующим (асинхронно), то не вижу никакой проблемы, подгружать такие данные как виджет. Ни с точки зрения нагрузки, ни с точки зрения производительности.

pax 08.04.2013 16:40

Ответ: Black Bird (Unity Project Web Version)
 
Я не знаю, полностью ли ты понимаешь какая технология выбрана:
1. Данные на сервере хранятся с помощью php+mysql.
2. При заходе в игру клиент подключается к лобби в облаке фотона, в котором на сервере вообще никакой логики нельзя добавить.
3. Сервера независимые.

Ты предлагаешь записывать в базу через php/mysql при создании боев подключаемых к ним пользователей. И с помощью того-же php/mysql запрашивать эти данные при каждом обновлении списка комнат?

Тут ситуация такая - клиент может выйти ничего не сказав php серверу об этом. И игрок останется в базе в какой-то комнате. Ну и остальные "преимущества" с этим связанные.

moka 08.04.2013 17:35

Ответ: Black Bird (Unity Project Web Version)
 
Цитата:

Сообщение от pax (Сообщение 256567)
Я не знаю, полностью ли ты понимаешь какая технология выбрана:

Это не с технологией связано, а архитектурой.

Цитата:

Сообщение от pax (Сообщение 256567)
1. Данные на сервере хранятся с помощью php+mysql.

Это ок. Запрос с даже 50 ID по Primary Key с IN оператором - очень быстрая операция.
Цитата:

Сообщение от pax (Сообщение 256567)
2. При заходе в игру клиент подключается к лобби в облаке фотона, в котором на сервере вообще никакой логики нельзя добавить.

Это при заходе в онлайн в саму игру, а не конкретный матч?
То есть на сервере нету никакой области логики "при коннекте клиента"? Ни при соединении ни при отключении?
Цитата:

Сообщение от pax (Сообщение 256567)
3. Сервера независимые.

Это ничего не меняет.
Если #2 всё же возможен. Тогда всё что нужно - это отослать простой HTTP запрос на PHP мелкий скрипт (только игровой сервер может слать естественно), или если игровой сервер имеет прямой доступ к бд - так даже лучше естественно. При подсоединении к бд - создаём запись: "user_id, 0", где 0 - это id матча. Т.к. мы в лобби он 0.
Далее когда начинается матч (подсоединяемся к игровой инстанции), обновляем запись, ставим id матча заместо 0.
По окончанию матча - обнуляем снова.
При выходе из игры (полностью), трём запись.
Если нету возможностей оперировать данными на уровне lobby, тогда делаем только для матчей. Ну или если уж совсем хочется, можно сделать и простой "ping-pong" с php скриптом, раз в минуту, от клиента.
И иметь процесс, каждые например 3 минуты, что будет тереть все записи с timestamp старее 3 минут.
Индексировать по timestamp естественно тоже нужно, чтобы скорость поиска была приемлемой.

Два варианта, оба вполне реальны. Первый естественно лучше. Но как понимаю нету центрального "Мастера", следственно с фотоном такое будет не просто и прийдётся извращаться, как во втором варианте.

Цитата:

Сообщение от pax (Сообщение 256567)
Ты предлагаешь записывать в базу через php/mysql при создании боев подключаемых к ним пользователей. И с помощью того-же php/mysql запрашивать эти данные при каждом обновлении списка комнат?

Записывать данные в бд при создании матча - да.
Но вот получение списка, я бы минимализировал на стороне клиента по времени. Не каждое обновление списка, а по таймеру. Чаще чем каждые 3 минуты клиенту не нужен обновлённый список кто в онлайне.

Цитата:

Сообщение от pax (Сообщение 256567)
Тут ситуация такая - клиент может выйти ничего не сказав php серверу об этом. И игрок останется в базе в какой-то комнате. Ну и остальные "преимущества" с этим связанные.

Поэтому нужен скрипт на сервере для сборки старых данных - это нормальная процедура если у тебя нету ответственной точки контроля данного списка и зависимостей записей с источником (матч серверами).

pax 08.04.2013 18:23

Ответ: Black Bird (Unity Project Web Version)
 
Цитата:

Сообщение от MoKa (Сообщение 256568)
То есть на сервере нету никакой области логики "при коннекте клиента"? Ни при соединении ни при отключении?

Нету, сервер только рассылает пакеты.

moka 08.04.2013 19:07

Ответ: Black Bird (Unity Project Web Version)
 
Цитата:

Сообщение от pax (Сообщение 256576)
Нету, сервер только рассылает пакеты.

Тогда второй вариант - имхо, единственная возможность иметь список "кто-онлайн".

А вообще я бы написал node.js процесс в 150 строк, который бы в памяти хранил бы хэшь таблицу пользователей, сам бы таймером это дело и обчищал, и имел бы 3 REST запроса: PUSH, DELETE, GET.
Матч сервер кидает ID матч сервера и ID пользователя.
При выходе DELETE с ID пользователя - почистит пользователя.
И GET - с ID пользователя. Это заставит процесс сделать запрос в VK API для получения списка друзей приложения, далее при получении ответа, соберёт массив из хеш таблицы по ID пользователей. Чаще всего конечно он будет пустым :D.
И выдаст ответом.

Ну и простой интервал - раз в минуту почистить хеш таблицу.

Такой процесс будет очень эффективен, за счёт node.js асинхронности и не блокируемости запросов, также не нужна БД, т.к. хеш таблица в памяти.
Сотни тысяч пользователей - вполне простая задача для такого процесса.

Это по сути всё то же что я описал ранее как второй вариант, только проще, шустрее и эффективнее.
Очевидно - что это ну должно быть зависимой туулзой - а лишь nice-to-have, и клиент при неудачном запросе на получение списка друзей - не должен валиться, очевидно и для PHP + MySQL так же.

ЗЫ,
Могу даже написать такой мелкий процесс, и дать инструкции как это дело запустить будет на сервере (если он конечно позволяет ставить и запускать что хотите, а не тупо виртуальный).

pax 08.04.2013 22:54

Ответ: Black Bird (Unity Project Web Version)
 
Я думаю nodejs у Сереги нет возможности сейчас запустить, так что возможно потом. Проще в параметры комнаты записывать список игроков.

EvilChaotic 09.04.2013 00:57

Ответ: Black Bird (Unity Project Web Version)
 
Overpower Changelist:
- 100% жизней после рееспавна.
- После смерти противника, ракеты не перенаводятся на его новую позицию.
- Горящие обломки самолетов с использованием физики.
- Должны показываться ники игроков.
- Кнопка при выходе из карты поправлена.
- Теперь есть респавн в 5 секунд.
- Враг, который сбил вас теперь виден на экране. Также можно посмотреть что у него стоит из апгрейдов.
- Переделан свет на карте 01 ( Город )
- Добавлен обсерв скрин.
- Новый, читабельный шрифт.
- Переработана часть интерфейса.
- Улучшены эффекты.
- Добавлена новая тестовая карта, тестим переходы на новые карты.
- Ракеты, от которых увернулись больше не активны.
- Добавлены первые характеристики корабля
- Смена карты работает в лоббии.
- Чуть снижена музыка.
- Работает отображение хп противника.
- Сервер переехал, теперь он может выдержать больше игроков.
- Ракеты, пули больше не пролетают сквозь дома.
- Оптимизация по эффектам
- Сортировка вещей в магазине
- Нормальная подсветка чата
- Ребаланс GAU-16 более быстрые снаряды, больше урона
- Исправлена коллизия на уровне. По идее самолет больше не должен уничтожатся при облете препятствий.
- Звуки порезаны, новые звуки на смене предметов.
- Новые предметы:
1) Ракеты М301
2) Пушка GAU-16
3) Расцветка "Боевая" и "Черный ястреб"
- Исправлен баг с незачислением убийств.
- Добавлена кнопка выхода. Для выхода нужно зажать TAB и нажать на кнопку "Выйти"
- Оптимизации по базе данных.
- Подправлены ценники в магазинах.
- Ребаланс некоторых ракет и пушек.
- Ребаланс ценников за фраг.
- Теперь вы подсвечиваетесь в скорборде зеленым цветом.
- Исправлено налезание текста друг на друга в магазине.
- Добавлен счетчик серверов в лобби экране.
- Исправлена потеря подключения на переходах в меню и уровнях.



Остается большая не решенная задача:
Как сделать выборку топ лучших из базы данных и все это вставить в юнити? По пониманию в пхп я испытываю проблемы довольно сильные.
Знаю, что запрос должен выглядеть примерно так:
SELECT `name`, `frags` FROM `users` ORDER by `frags` DESC LIMIT 50
Только как должен выглядеть пхп скрипт я не представляю :''(( И как это потом в json отправить. Может кто-нибудь сможет помочь?

И еще небольшое непонимание, как получить NetworkPlayer.name, зная только PhotonView?

Спасибо!

moka 09.04.2013 01:36

Ответ: Black Bird (Unity Project Web Version)
 
Метод friends.getAppUsers для получения друзей с сервера вызвать нельзя.. Хрень блин.

Нужен AOuth либо SID для запроса. Какой способ посоветуете? SID - выглядит весьма защищёно.
Получается есть другой способ - получаем всех друзей пользователя и сравниваем с зарегенными пользователями - и такой список храним, и обновляем периодически, туповато если честно.
Встречный вопрос - на клиенте, можешь делать клиентские запросы, JS в идеале?

pax 09.04.2013 02:05

Ответ: Black Bird (Unity Project Web Version)
 
Серег, какой mysqlapi ты используешь? Стандартный? PDO? Самый простой вариант - вернуть из php echo json_encode($response); где response это то что вернут твой sql запрос и обработанный с помощью FetchAll. Ответ можно на клиенте распарсить с помощью JSON библиотеки.

МоКа, на клиенте любой js вызывается без проблем из Unity. К тому же у Сереги было мое решение, получающее друзей в игре и выводящее их аватары.

moka 09.04.2013 02:53

Ответ: Black Bird (Unity Project Web Version)
 
Цитата:

Сообщение от pax (Сообщение 256615)
МоКа, на клиенте любой js вызывается без проблем из Unity. К тому же у Сереги было мое решение, получающее друзей в игре и выводящее их аватары.

Проку от этих данных на клиенте никаких, т.к. серверу нужно их знать. Теоретически их может быть слишком много, и не влезть в HTTP запрос если слать на сервер, плюс - даверять ли?
А практически, можно сделать и так. Но это имхо не стабильно как-то?

pax 09.04.2013 07:09

Ответ: Black Bird (Unity Project Web Version)
 
Почему не влезть в HTTP запрос? Что-то я потерял нить.

Имея id друзей на клиенте самое простое - можно выделить бои, созданные друзьями, если комнате добавить id создателя, либо комнату называть по id создателя. Это на половину решит задачу и достаточно просто.


Часовой пояс GMT +4, время: 17:58.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot