Гибкая/модульная система базы данных для RPG(не RPG)
Добавлено: 28 окт 2017, 12:58
Долгое время ломаю голову как сделать удобную и гибкую базу данных для объектов игрового мира (Игра - реалистичное выживание, типа DayZSA). Есть простая система где объекты присваиваются к какой-то группе (классу), например так -
Далее существует функция для использования данных переменных -
В общем все нормально, но мне не нравится что может существовать пустая переменная. Представим что из еды у меня *вода, которая утоляет только *жажду, переменная SetHunger - пустая, но ладно в этом предмете у меня всего-лишь 2 переменные, если представить другие объекты, например оружие, то там может быть намного больше пустых переменных, которые могут мешать работе с настройкой. Я знаю что можно сделать стандартные настройки или в будущем проверки в функциях, но это какие-то костыли?
Далее перейдем к неким локальным переменных, даже скорее динамичным. Представим что у нас еда не просто в одном экземпляре (одноразовая), а определенное её кол-во (многоразовая).
Как-то так. Теперь скрипт который лежит на объектах сцены.
Ну и типа когда кушаем, еда тратится и восполняет нам значения, когда она закончится можем её уничтожить, либо в самой игре обыграть как-нибудь, например как использование в виде сырья (крафт).
Общую картину описал. А теперь вопрос, можно ли избежать повторений ненужных переменных? Ладно для компуктера - ок, но человеку же не так удобно с эти всем работать. Да, конечно есть вариант с базой данных через XML, но не является ли это некими костылями?
Если что, я опираюсь на игру DayZSA, у игры система спрятана от чужих глаз, но мне очень нравится насколько там все выглядит гибким для настроек, типа вот тебе и предмет, который является как инструментом, так и оружием, и возможным сырьем (это моё воображение, возможно там не так, но в общем предметы имеют не просто один точный класс (тип), будто какая-то крутецкая модульная система).
Могу рассказать как я пытался реализовать сам такую систему, но все провалилось из-за проблем с реализацией функций объектов, да и ошибок там, наверно, много (особенно с оптимизацией).
Синтаксис:
Используется csharp
public class Player : MonoBehaviour //Типа игрок
{
public float Hunger = 100;
public float Thirst = 100;
void Update ()
{
Hunger -= 0.01f;
Thirst -= 0.01f;
Hunger = Mathf.Clamp(Hunger, 0, 100);
Thirst = Mathf.Clamp(Thirst, 0, 100);
if(Hunger == 0)
print("Умираю с голода");
if(Thirst == 0)
print("Умираю с жажды");
}
}
public class Food //Типа еда
{
public float SetHunger;
public float SetThirst;
}
{
public float Hunger = 100;
public float Thirst = 100;
void Update ()
{
Hunger -= 0.01f;
Thirst -= 0.01f;
Hunger = Mathf.Clamp(Hunger, 0, 100);
Thirst = Mathf.Clamp(Thirst, 0, 100);
if(Hunger == 0)
print("Умираю с голода");
if(Thirst == 0)
print("Умираю с жажды");
}
}
public class Food //Типа еда
{
public float SetHunger;
public float SetThirst;
}
Далее существует функция для использования данных переменных -
Синтаксис:
Используется csharp
void Eating (Food food) //Типа кушаем еду
{
Hunger += food.SetHunger;
Thirst += food.SetThirst;
}
{
Hunger += food.SetHunger;
Thirst += food.SetThirst;
}
В общем все нормально, но мне не нравится что может существовать пустая переменная. Представим что из еды у меня *вода, которая утоляет только *жажду, переменная SetHunger - пустая, но ладно в этом предмете у меня всего-лишь 2 переменные, если представить другие объекты, например оружие, то там может быть намного больше пустых переменных, которые могут мешать работе с настройкой. Я знаю что можно сделать стандартные настройки или в будущем проверки в функциях, но это какие-то костыли?
Далее перейдем к неким локальным переменных, даже скорее динамичным. Представим что у нас еда не просто в одном экземпляре (одноразовая), а определенное её кол-во (многоразовая).
Синтаксис:
Используется csharp
public class Food //Типа еда с доп настройками
{
public string Name;
public float SetHunger;
public float SetThirst;
public float MaxHunger;
public float MaxThirst;
public Food(string n, float sh, float st, float mh, float mt)
{
Name = n;
SetHunger = sh;
SetThirst = st;
MaxHunger = mh;
MaxThirst = mt;
}
}
public Food[] DataBaseFoods = new Food[]() //Типа база данных всех ед
{
new Food("Waterbottle", 0, 10, 0, 40),
};
{
public string Name;
public float SetHunger;
public float SetThirst;
public float MaxHunger;
public float MaxThirst;
public Food(string n, float sh, float st, float mh, float mt)
{
Name = n;
SetHunger = sh;
SetThirst = st;
MaxHunger = mh;
MaxThirst = mt;
}
}
public Food[] DataBaseFoods = new Food[]() //Типа база данных всех ед
{
new Food("Waterbottle", 0, 10, 0, 40),
};
Как-то так. Теперь скрипт который лежит на объектах сцены.
Синтаксис:
Используется csharp
public class FoodScript : MonoBehaviour //Типа скрипт который весит на объекте сцены и является носителем локальных динамичных переменных
{
public int ID;
public float NowHunger = DataBaseFoods[ID].MaxHunger;
public float NowThirst = DataBaseFoods[ID].MaxThirst;
}
{
public int ID;
public float NowHunger = DataBaseFoods[ID].MaxHunger;
public float NowThirst = DataBaseFoods[ID].MaxThirst;
}
Ну и типа когда кушаем, еда тратится и восполняет нам значения, когда она закончится можем её уничтожить, либо в самой игре обыграть как-нибудь, например как использование в виде сырья (крафт).
Общую картину описал. А теперь вопрос, можно ли избежать повторений ненужных переменных? Ладно для компуктера - ок, но человеку же не так удобно с эти всем работать. Да, конечно есть вариант с базой данных через XML, но не является ли это некими костылями?
Если что, я опираюсь на игру DayZSA, у игры система спрятана от чужих глаз, но мне очень нравится насколько там все выглядит гибким для настроек, типа вот тебе и предмет, который является как инструментом, так и оружием, и возможным сырьем (это моё воображение, возможно там не так, но в общем предметы имеют не просто один точный класс (тип), будто какая-то крутецкая модульная система).
Могу рассказать как я пытался реализовать сам такую систему, но все провалилось из-за проблем с реализацией функций объектов, да и ошибок там, наверно, много (особенно с оптимизацией).