Хранение данных в игре

AndreyKl
Сообщения: 51
Регистрация: 22 фев 2011

Хранение данных в игре

Сообщение AndreyKl »

Slimper писал(а): ↑09 дек 2011, 14:12Причина проста, "с" в русской и английской раскладки разные буквы, хотя внешне и не отличаются, недавно для C# сделал специальную клавишу Изображение

Причина не только в этом, похоже как-то косо работает код на опере, в преварительном просмотре, того и накосячил

Код для подключения неймспейсов БД:

Код: Выделить всё

using UnityEngine;

using MySql.Data;
using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Collections;
using System.Collections.Generic;
Аватара пользователя
Vasaka
MOSC Team
Сообщения: 3195
Регистрация: 24 янв 2011

Хранение данных в игре

Сообщение Vasaka »

AndreyKl писал(а): ↑09 дек 2011, 17:49Причина не только в этом, похоже как-то косо работает тег на опере, в преварительном просмотре, того и накосячил

Есть такое дело в предварительном просмотре оперы.
Может и в других браузерах тоже, но пока никто ещё не сообщал об этом. Очень много народу на опере. По крайней мере у нас.

Ещё, не работают споелеры иногда.
А именно, когда редактируешь уже созданное сообщение, в предпросмотре выглядит всё без спойлеров. А когда сохраняешь, всё нормально.

Может на форуме Юнити есть информация что он требует для работы и возможности какой .NET может использовать?
Я что-то не смог на русском найти, а Английский не знаю в таком объёме, чтобы понимать о чём пишут. Отдельные слова только.
Scampada
Сообщения: 51
Регистрация: 04 дек 2011

Хранение данных в игре

Сообщение Scampada »

Vasaka писал(а): ↑09 дек 2011, 18:03Я что-то не смог на русском найти, а Английский не знаю в таком объёме, чтобы понимать о чём пишут. Отдельные слова только.

По этой теме хрен найдешь что-то понятное. Вроде со второй .NET оно работает.
Slimper
Сообщения: 101
Регистрация: 25 янв 2011

Хранение данных в игре

Сообщение Slimper »

AndreyKl писал(а): ↑09 дек 2011, 17:49Причина не только в этом, похоже как-то косо работает код на опере, в преварительном просмотре, того и накосячил

Vasaka писал(а): ↑09 дек 2011, 18:03Ещё, не работают споелеры иногда.
А именно, когда редактируешь уже созданное сообщение, в предпросмотре выглядит всё без спойлеров. А когда сохраняешь, всё нормально.


Вообще предварительный просмотр, много какие вещи не полностью обрабатывает, насколько я знаю, скрипты он вообще не обрабатывает, они только после отправки подключаются, часть бб-кодов по этому и не работаю.
AndreyKl
Сообщения: 51
Регистрация: 22 фев 2011

Хранение данных в игре

Сообщение AndreyKl »

Vasaka писал(а): ↑09 дек 2011, 18:03Может на форуме Юнити есть информация что он требует для работы и возможности какой .NET может использовать?
Я что-то не смог на русском найти, а Английский не знаю в таком объёме, чтобы понимать о чём пишут. Отдельные слова только.

PDFка в посте на предыдущей странице взята именно с сайта Unity, по ней же и подготовил пример. Там всё описывается под 2.0 фреймворк (держит ли юнайти более высокие фреймворки нужно проверять)
Аватара пользователя
Snake_B
MOSC Team
Сообщения: 333
Регистрация: 25 янв 2011

Хранение данных в игре

Сообщение Snake_B »

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


я не уверен что поиск нам там вообще будет нужен... после генерации галактики скорее всего сразу будут создаваться все звезды (gameObject) на галактической карте.... я так то проверю ещё, но мне кажется даже несколько тысяч звезд занимать памяти много не будут (тут скорее вопросы к юнити, как она будет хранить и обрабатывать эти объекты и сколько будет на это тратить памяти)...
я так вообще пока склоняюсь в сторону массивов... те более, что проблем с указанием размера в коде при создании нет ни каких...
тем более на галактической карте вроде как данные для всех звезд будут одинаковые....
а вот как хранить в игре данные звездных систем (какие в них планеты, параметры планет и т.п.).... я пока как то не могу определиться... но как то массивы тут не сильно вписываются.... возможно классами.... но мне надо бы почитать про классы в си шарп.... что они могут и как с ними работать... ну или может тут кто выскажет по этому поводу соображения...
как то так....

Vasaka
Она проясняет самую тёмную область для меня на данный момент.


да... только при чем тут "ТЗ: галактическая карта"?
кто там у нас ещё админ.... режьте тему на части... создайте "обсуждение проблем баз данных" (или хранения данных в игре).... и переносите туда сообщения не по теме...

krupennikov
Мое предложение следующее.
Использовать только по одному классу на каждую сущность (корабль, звезда, планета, ну и т.д.). А так же использовать виртуальную БД, очень мне понравившуюся в шарпе, - DataTable. Эта база данных находится в ОЗУ (памяти). В любой момент можно легко сохранить, загрузить, обратиться к любой ячейке данных.
Как все это будет происходить.


предложение отличное... и расписано хорошо...
теперь осталось написать пример.... при чём в юнити... и тогда так и сделаем... если конечно оно всё заработает....
хотя... если у нас уже есть классы... почему бы нам прям в них данные не хранить то?

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



вы давайте без кивков в сторону структуры игры.... там как бы есть ещё юнити с её проектами.... и там ещё разбираться и разбираться как её научить это всё использовать...

да и вообще... по поводу МОДОВ.... вы коней то не гоните... тут и так работы до фига и больше, а если ещё и на моды всё время оглядываться.... я предлогаю пока если и думать про моды, то только минимальные.... изменеия каких то характеристик (в основном кораблей) в xml.... что игроки делают довольно часто... об остальном думаю не стоит пока заикаться....
есть большие сомнения что игра сможет по популярности быть сравнимой хотя бы с цивой.... а взять циву... если брать рунет.... для 4-ки и десятки полноценных модов не набереться.... для МОСКа оптимистично 10 часть от поклонников цивы.... один мод что ли?
получится игра, будет популярной, тогда можно сделать, а пока не стоит....
в конце концов для желающих будут доступны исходники.... с ними при желании можно полностью игру переделать, ни какие возможности той же цивы с SDK и рядом валяться не будут...

AndreyKI
Просто мое предложение: некий класс SpaceObject


тоже хорошо звучит... но теорию я вам и сам рассказать могу... нужны примеры в юнити...

AndreyKI
На мой взгляд достаточно написать некий класс SpaceShip, сделать массив/список/словарь с использованием этого класса, далее любая выборка делается очень просто.


вот дальше с примером хорошо.... а слабо также расписать как работать с планетами...
есть класс звезд, с заполнеными данными (данные по звезде и по планетам).... я так понимаю для данных планет свой класс (ну и что-то там с наследованием))...
мы выбрали звезду, как сделать выборку данных по планетам в её системе...
пример нужен (если всё таки будут классы)...

AndreyKI
Так же для пошаговых стратегий для мультика придется переделывать всю систему, дабы предотвратить сейв/лоад (пока само правильное решение в серии Space empires) - но графический движек всеравно останется тот же.


какую систему переделывать... на фига.... какой save/load... разверни свою мысль...

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


как оно будет в реальности (скорее всего)))....
у нас будут отдельные сцены:
1. галактика
2. звездная система (то что реализовано в 0.1.2.04)
3. планетная система
4. экран битв
5. экран просмотра корабля (возможно он же будет использоваться для конструктора)

да и то как сцены... по понятиям юнити это будет одна и та же сцена... просто объекты будут далеко друг от друга и будут переключаться камеры...

1. при создании игры генерируем данных всей галактики (каждую звезду, планету, поля астероидов, кометы)... все данные из файлов (про генерацию планет там, например, считываются в момент генерации)...
2. Открываем сцену галактики и даем команду юнити создать объекты типа звезда (ну и там туманности)
ИЛИ возможно всё таки сначала стартовую систему игрока... но в любом случае галактика будет создаваться при создании игры и меняться практически не будет (ну там если только какое оружие для "создания" новых/сверхновых звезд)....
в любом случае данные галактики после старта передаются объектам юнити и не загружаются / удаляются....
3. при выборе звездной системы, мы обнуляем сцену звездная система и по данным хранящимся в памяти генерируем сцену (создаем объекты в юнити, даем им координаты и т.д.)...
4. при выборе планеты такое же делаем со сценой планетная система...

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

дык вот... вот примерно исходя из этого мне надо знать... где/как/в чем мне лучше хранить данные...
массивы, классы, БД...
вот вы тут и определитесь.... решите что больше подходит... сделайте примитивные примеры, проверьте работоспособность в юнити...
думаю при желании код может кто-нибудь написать, а вон Васяка проверит будет ли оно в юнити работать... если вам религия не позволяет юнити установить...
потом...возможно лучше несколько вариантов... с их плюсами и минусами...
и примеры...
решили там например классами, написали - заполнение данных (вообще инициализация), изменение, считывание (и как мне получить / передать именно нужный мне объект.... я как то не ожидал, что для этого понадобиться отдельный массив... сюрприз))), загрузка/сохранение (в том числе отдельным потоком).... думаю мне для начала хватит...ну и это всё проверить на работоспособность в юнити.... мне читать портянки на три страницы про БД которых из-за НЕТ 4.0 я скорее всего и использовать то не смогу.... не когда... (вы как бы ещё учитывайте.... я 1-го ноября начал делать протоип... до этого я про си шарп бегло читал с год назад про переменные.... т.е. шарп для меня темный лес... хотя счас уже посветлело конечно)))... вообще больше пишу на делфи, но там с базами данных я не работал и классы даже там не являются моей сильной стороной)...
а вообще.... оно как бы движок удобный... и потом на том что мы наваяем можно при желании сделать что-то другое... поэтому я думаю не стоит при выборе сильно ориентироваться на пошаговость....

Оффтоп

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

Васяка
Я не знаю точно на чём работает Юнити. Витя сказал, что использует .NET 2.0, а Диман проверял работу готовой сборки на ХР без фреймворка. Всё работало.


пусть юнити ставит на чистую систему.... и что там юнити запоет....
и можете чего-нить ему прописать... что например появилось в НЕТ 4 или 3.5...
как юнити на это реагировать будет... что там у игрока будет, дело десятое, счас надо определиться что юнити использует для сборки...

и энто... как он запускал.... через launcher? и он запустился? может чистая система уже была с нет 2.0 ?

AndreyKI
Уточни необходимую БД - методы доступа могут немного различатся.
Васяка
Ждём Витю, что он скажет.


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

вот вам кстати....

Код: Выделить всё

using UnityEngine;

using System.Collections;

public class StarDiameter : MonoBehaviour {

private Transform[] starPointTmp;

//////////////////////////////////////////////////////////////////////////////////

void AObj_Diameter (int Obj_Diameter){
float BObj_Diameter = Obj_Diameter / 5.0F;
transform.localScale += new Vector3(BObj_Diameter, BObj_Diameter, BObj_Diameter);
if (Obj_Diameter == 0) {
renderer.enabled = false;}
starPointTmp = new Transform[GlobalData.StarCnt];
int tmp = 0;
if (GlobalData.StarCnt > 0){
foreach(Transform Star in GlobalData.starPoint){
starPointTmp[tmp] = Star;
tmp++;}}
GlobalData.starPoint = new Transform[GlobalData.StarCnt + 1];
GlobalData.starPoint[GlobalData.StarCnt] = transform;
tmp = 0;
if (GlobalData.StarCnt > 0){
foreach(Transform Star in starPointTmp){
GlobalData.starPoint[tmp] = Star;
tmp++;}}
GlobalData.StarCnt = GlobalData.StarCnt + 1;
}

}


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

и такой вот вариант
Transform[] starPointTmp = new Transform[GlobalData.StarCnt];
или объявление как private
я так понимаю по большому счету без разницы как его объявлять? ну и другие переменные...


по планам на прототип...
сейчас планирую сделать вывод информации о планете при наведении... примерно как на скриншоте:
Изображение
я думаю многие узнали от куда скриншот.... ?
старкрафт... главное меню... у кого стоит, можете посмотреть как эта информация появляется... хочу сделать как то так же...
оттуда же и зеленые сетки планет при наведении на них мыши... которые уже сделаны... близзарды всё таки молодцы... атмосфернее (имхо) только герои 3.... но они нам не подходят ))
да да Васяка.... ты многое упустил :-p

потом выбор объекта... вывод о выбранном информации на панель "описание выбранного объекта" И на панель "дополнительной информации" (которая выезжает по пробелу)....
потом открытие планетной системы... планета, спутники, ползунки и 2D вид поверхности для баз (последние два меняются от выбранного объекта, для планеты свои, для спутников свои, но выглядеть примерно одинаково будут, ну как то так)....
следующей будет карта галактики.... генерация, отображение, всё такое.... законы для генерирования спиральной галактики я уже на бумажке прикинул:

1. RND (0 -360), через sin/cos - получаем круг из звезд....
2. RND (0 - диаметр галактики) - распределяем их равномерно по площади круга... тут возможно через параболу (y = x*x) распределение не равномерное... в центре больше, к краям меньше... но тут надо подумать... посмотреть картинки галактик.... как там оно вообще должно быть.... да и насчет центра галактики определиться... что там... звезды или массивная черная дыра (говорят так бывает))), если ЧД, тогда генерировать звезды не от 0...
3. приведение к осям веток спирали.... от количества веток рассчитываем линии веток... и по расстоянию от ближайшей ветки считаем оставить звезду на месте или сдвинуть ближе к оси.... тут тоже через рандом (точнее через несколько))....
4. искривление веток спирали... проходимся по всем звездам и по удалению от центра галактики сдвигаем их в обратную сторону от вращения галактики (ну как то так).... при чем значения сдвига увеличивается от центра не линейно... наверно ))
это пока так... на бумажке... как делать буду посмотрю ещё...

ну и ваши предложения по доработкам... внеочереди...

делаю, что успею до нового года... потом минимум до лета у меня будут другие проекты... но думаю это не страшно.... как раз ребята контент подсобирают... а то за полтора месяца несколько рисунков для интерфейса как то не радуют....
Изображение
Scampada
Сообщения: 51
Регистрация: 04 дек 2011

Хранение данных в игре

Сообщение Scampada »

Snake_B писал(а): ↑10 дек 2011, 03:36а вот как хранить в игре данные звездных систем (какие в них планеты, параметры планет и т.п.).... я пока как то не могу определиться... но как то массивы тут не сильно вписываются.... возможно классами.... но мне надо бы почитать про классы в си шарп.... что они могут и как с ними работать... ну или может тут кто выскажет по этому поводу соображения...

А не в Шарпе ли можно создавать многомерные массивы неоднородной формы? Т.е. не в виде прямоугольника, а в виде треугольника там или вообще пятииконечной звезды?
Но если нельзя, то с классами будет лучше. Создаем "массив звезд" - массив указателей на объекты "звезда". Класс "звезда" содержит динамические массивы планет, через объекты планет с указателями на след. элемент. При инициализации игры массив звезд инициализируется обьектами, которые инициализируются, в том числе заполняясь случайным количеством планет.
А с классами в шарпе, по-моему, вроде все так же, как в плюсах... Разве нет?
Аватара пользователя
Snake_B
MOSC Team
Сообщения: 333
Регистрация: 25 янв 2011

Хранение данных в игре

Сообщение Snake_B »

> А с классами в шарпе, по-моему, вроде все так же, как в плюсах... Разве нет?

а у меня где то написано что я знаю плюсЫ?
я уже шарп то знаю лучше, чем плюсЫ...
Изображение
AndreyKl
Сообщения: 51
Регистрация: 22 фев 2011

Хранение данных в игре

Сообщение AndreyKl »

Scampada писал(а): ↑10 дек 2011, 13:41А с классами в шарпе, по-моему, вроде все так же, как в плюсах... Разве нет?
С классами всё так же, но укзателей считай что нет в помине (я то их таки нашел), но лучше их не использовать, майкрософт всеми силами прятала их по глубже.

Snake_B писал(а): ↑10 дек 2011, 03:36
SpaceObject

тоже хорошо звучит... но теорию я вам и сам рассказать могу... нужны примеры в юнити...

Пример мне предоставить сложно, так с юнайти только ознакамливаюсь. Но на мой взгляд нужно четко разграничить графическую часть и игровое ядро, в таком случае это будет что-то вроде

Код: Выделить всё

class SpaceObject

{
public Double Mass;
public Double Radius;
//и другие параметры если понадобятся
}
class System:SpaceObject
{
//в этом случае - радиус - общая граница системы
public OrbitingSpaceObject[] StellarObjects; //тоесть в массив можно загнать всякие Planet, Star, AsteroidRing. Разумеется никто не запрещает делать отдельные массивы на планеты солнца, астероиды...
public List<MobileSpaceObject> MobileObjects; //хранит всё что движется и может быть уничтожено
public double Brigtness;
}
class OrbitingSpaceObject:SpaceObject
{
public StellarOrbit Orbit;
public System LocationSystem;
public Model ObjModel;
}
class MobileSpaceObject:SpaceObject
{
public System LocationSystem;
public 3DPosition Location; //xyz
public double Speed;
public Model ObjModel;
//другие опции
}
Можно спокойно загнать все системы в массив фиксированной длины, тоже касается всех остальных орбитальных обьектов. если мы загоним систему в этот массив а потом её же каждому обьекту в системе, то в памяти система будет всего одна (в массивах и других классах будет только ссылка)

Код: Выделить всё

Object a=new Object();

Object b=a;
В результате такой операции будет создана только один обьект, изменение b приведет к изменению a до тех пор, пока не не вызван b=a.Clone(); Copy или как-то так. После удаления a, b будет продолжать ссылаться на обьект, обьект удалится толко если удалить обе переменные (и то не сразу, а как мусорщик проснется). В функцию всегда передается копия, о передача массива как и с C++ может привести к изменению его содержимого.
Snake_B писал(а): ↑10 дек 2011, 03:36
есть класс звезд, с заполнеными данными (данные по звезде и по планетам).... я так понимаю для данных планет свой класс (ну и что-то там с наследованием))...
мы выбрали звезду, как сделать выборку данных по планетам в её системе...
Выбрали звезду, тянем её свойство LocationSystem (если имеется в виду система, то сразу тянем список обьектов). Получили систему в какой находится звезда, по массиву обьектов с орбитами ищем все классы типа Planet или вообще все обьекты IOwnerable у которых свойто Owner имеет определенное значение.


В твоей реализации все планеты сейчас - уникаьный обьект. В найденных мной примерах используют что-то вроде:

Код: Выделить всё

List<data> _GameItems;

data itm = new data();
itm.X=1;
itm.Y=2;
itm.Z=3; //на самом деле там 6 координат
_GameItems.Add(itm);
Пытаюсь выяснить, что такое data и как связано с интерфейсом.

Snake_B писал(а): ↑10 дек 2011, 03:36
какую систему переделывать... на фига.... какой save/load... разверни свою мысль...
может ничего переделывать и не придется (смотря как реализовать). Но существует такая проблема: в пошаговых играх ход обычно последовательный, следовательно один игрок может отдать приказы, посмотреть результат, загрузиться и отдать правильный приказ (к примеру это четко видно в героях в режими хот сиат - игрок угробил армию о монстра, загрузился и напал на другого монстра). основной выход - записать приказы игрока но не выполнять пока не походят все остальные игроки и тогда выполнить, игрок не увидит результата до следующего хода и не сможет откатиться.

Snake_B писал(а): ↑10 дек 2011, 14:55> А с классами в шарпе, по-моему, вроде все так же, как в плюсах... Разве нет?
а у меня где то написано что я знаю плюсЫ?
я уже шарп то знаю лучше, чем плюсЫ...
Помоему ООП и в африке ООП, меняется только синтаксис (к примеру двоеточие посли имени класса - наследование отчего угодно включая интерфейсы, виртуальные классы, абстрактные и т п, в java применялся extend для абстрактных) и базовый класс.
Аватара пользователя
Snake_B
MOSC Team
Сообщения: 333
Регистрация: 25 янв 2011

Хранение данных в игре

Сообщение Snake_B »

> Но на мой взгляд нужно четко разграничить графическую часть и игровое ядро

чё то мне это представляется сложным занятием.... там всё таки всё на юнити завязано... и на её проект...

> основной выход - записать приказы игрока но не выполнять пока не походят все остальные игроки и тогда выполнить, игрок не увидит результата до следующего хода и не сможет откатиться.

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

> В твоей реализации все планеты сейчас - уникаьный обьект.

а там по другому по моему сложно будет сделать...
выбираем объект на карте галактики.... запускаем скрипт на объекте StarSystem > Systems, в нем считываются данные и создаются все нужные объекты в звездной системе... включаем/выключаем камеры... вроде нормально.... нет? )

п.с. ну и еще одно имхо...
я думаю не стоит сильно убиваться по поводу скорости и размеров в памяти... тут основная нагрузка будет от 3D.... потеряв на базе данных (например) пару фпс ни чего страшного не произойдет.... на крайний случай потом можно оптимизировать особо проблемные участки...
Изображение
Закрыто