Вот в размышлениях. Есть уже наполовину готовая написанная система, но по мне она выглядит в коде убого..
Все сводится к тому, что в ресурсах есть такого плана код:
Синтаксис:
Используется csharp
public class Items : MonoBehaviour {
public Weapon[] weapons;
public Armor[] armors;
public Help[] helps;
public Ammo[] ammos;
public Misc[] miscs;
}
[System.Serializable]
public class Weapon
{
public string name;
public int id;
public ItemMiscs.WeaponType type;
public GameObject prefab, prefabForHands;
[TextArea(2, 5)]
public string description;
public int damage;
public float weight;
public int state;
public int cost;
public int count, maxCount;
public WeaponEffect[] effects;
}
[System.Serializable]
public class Armor
{
public string name;
public int id;
public ItemMiscs.ArmorType type;
public GameObject prefab;
[TextArea(2, 5)]
public string description;
public int resist;
public float weight;
public int state;
public int cost;
public WeaponEffect[] effects;
}
[System.Serializable]
public class Help
{
public string name;
public int id;
public GameObject prefab;
[TextArea(2, 5)]
public string description;
public int weight;
public int state;
public int cost;
public HelpEffect[] effects;
}
// и т.д.
public Weapon[] weapons;
public Armor[] armors;
public Help[] helps;
public Ammo[] ammos;
public Misc[] miscs;
}
[System.Serializable]
public class Weapon
{
public string name;
public int id;
public ItemMiscs.WeaponType type;
public GameObject prefab, prefabForHands;
[TextArea(2, 5)]
public string description;
public int damage;
public float weight;
public int state;
public int cost;
public int count, maxCount;
public WeaponEffect[] effects;
}
[System.Serializable]
public class Armor
{
public string name;
public int id;
public ItemMiscs.ArmorType type;
public GameObject prefab;
[TextArea(2, 5)]
public string description;
public int resist;
public float weight;
public int state;
public int cost;
public WeaponEffect[] effects;
}
[System.Serializable]
public class Help
{
public string name;
public int id;
public GameObject prefab;
[TextArea(2, 5)]
public string description;
public int weight;
public int state;
public int cost;
public HelpEffect[] effects;
}
// и т.д.
Сам инвентарь игрока такого вида:
Синтаксис:
Используется csharp
public class Backpack
{
public int caps { get; set; } // деньги игрока
public List<Item> weapons; // оружие игрока
public List<Item> armors; // броня игрока
public List<Item> helps; // помощь игрока (различные абилки, хилки и прочее)
public List<Item> ammos; // боеприпасы игрока
public List<Item> miscs; // хлам игрока
}
public class Item
{
public enum ItemType { Weapon, Armor, Help, Ammo, Misc }
public ItemType itemType;
public int id;
public int state;
public int count;
public Item (int id, int state, int count)
{
this.id = id;
this.state = state;
this.count = count;
}
}
{
public int caps { get; set; } // деньги игрока
public List<Item> weapons; // оружие игрока
public List<Item> armors; // броня игрока
public List<Item> helps; // помощь игрока (различные абилки, хилки и прочее)
public List<Item> ammos; // боеприпасы игрока
public List<Item> miscs; // хлам игрока
}
public class Item
{
public enum ItemType { Weapon, Armor, Help, Ammo, Misc }
public ItemType itemType;
public int id;
public int state;
public int count;
public Item (int id, int state, int count)
{
this.id = id;
this.state = state;
this.count = count;
}
}
В котором по сути просто описываю тип предмета, ид (тип и ид для получения данных из Items), состояние предмета (для износа/ремонта) и количество этого предмета.
Исходя из этого весь код из за switch'ей и if'ов растянулся на хз сколько строк..Для ввода нового или незначительного изменения существующего приходится переписывать кучу кода.. Это все надоело и стал искать иные способы..
Дальнейшие размышления списку всех предметов по - есть некий базовый класс Item, у которого находятся общие черты предмета (название, ид, вес и прочее). И производные от него классы по типу предмета. Вот так:
Синтаксис:
Используется csharp
public class ItemsNew : MonoBehaviour {
public List<ItemWeapon> weapons;
public List<ItemArmor> armors;
public List<ItemHelp> helps;
public List<ItemAmmo> ammos;
public List<ItemMisc> miscs;
}
// Базовый класс предмета
[System.Serializable]
public class Item
{
public string name; // название предмета
public int id; // ID предмета
public float weight; // вес предмета
public string description; // описание предмета
public int cost; // стоимость предмета (в случае оружия/брони - при 100% состоянии)
public string prefab; // название префаба (из папки Resources), для мира
}
// Класс предмета раздела Оружие
[System.Serializable]
sealed public class ItemWeapon : Item
{
public bool legendary; // такое оружие можно встретить только один раз
public enum WeaponType { Light, Hard, Energy, Explosing, Melee, Handed } // Легкое, Тяжелое, Энерго, Взрывчатка, Холодное, Ближний бой
public WeaponType weaponType; // тип оружия
public int damage; // урон оружия
public int state; // состояние оружия (полностью целого)
public int count; // количество в обойме (если это ближний бой, холодное или взрывчатка, то 0 (или 1))
public string prefabHand; // название префаба (из папки Resources), для рук
}
// Класс предмета раздела Броня
[System.Serializable]
sealed public class ItemArmor : Item
{
public bool legendary; // такую броню можно встретить только один раз
public enum ArmorType { Light, Medium, Hard, Energy } // Легкая, Средняя, Тяжелая, Энерго
public ArmorType armorType; // тип брони
public int resist; // защита брони
public int state; // состояние брони (полностью целой)
}
// Класс предмета раздела Помощь
[System.Serializable]
sealed public class ItemHelp : Item
{
public enum HelpType { Drug, Book } // Препарат, Книга/Журнал
public HelpType helpType; // тип помощи
public enum EffectType { Strength, Perception, Endurance, Charisma, Intellect, Agility, Lucky, LightWeapon, HardWeapon, EnergyWeapon, ExplosingWeapon, MeleeWeapon, HandedWeapon, Repair, Medicine, Science, Theft, Break, Secrecy, Oratory, Barter, Critical, AntiRadiaton, AntiPoison, AntiHabit, RadiationAway, PoisonAway, HabitAway, Health, MaxHealth, MaxWeight }
public EffectType type; // тип получаемого эффекта
public int actionTime; // время действия эффекта в секундах (по истечении этого времени эффект пропадает), если -1, то перманентное действие (просто добавляет на постоянку)
public bool percent; // если true, то эффект добавляет процент к определенному показателю
public int effectValue; // значение эффекта
}
// Класс предмета раздела Боеприпасы
[System.Serializable]
sealed public class ItemAmmo : Item
{
// добавить тип боеприпасов
}
// Класс предмета раздела Разное
[System.Serializable]
sealed public class ItemMisc : Item
{
// дополнительные поля для разного пока не нужны
}
public List<ItemWeapon> weapons;
public List<ItemArmor> armors;
public List<ItemHelp> helps;
public List<ItemAmmo> ammos;
public List<ItemMisc> miscs;
}
// Базовый класс предмета
[System.Serializable]
public class Item
{
public string name; // название предмета
public int id; // ID предмета
public float weight; // вес предмета
public string description; // описание предмета
public int cost; // стоимость предмета (в случае оружия/брони - при 100% состоянии)
public string prefab; // название префаба (из папки Resources), для мира
}
// Класс предмета раздела Оружие
[System.Serializable]
sealed public class ItemWeapon : Item
{
public bool legendary; // такое оружие можно встретить только один раз
public enum WeaponType { Light, Hard, Energy, Explosing, Melee, Handed } // Легкое, Тяжелое, Энерго, Взрывчатка, Холодное, Ближний бой
public WeaponType weaponType; // тип оружия
public int damage; // урон оружия
public int state; // состояние оружия (полностью целого)
public int count; // количество в обойме (если это ближний бой, холодное или взрывчатка, то 0 (или 1))
public string prefabHand; // название префаба (из папки Resources), для рук
}
// Класс предмета раздела Броня
[System.Serializable]
sealed public class ItemArmor : Item
{
public bool legendary; // такую броню можно встретить только один раз
public enum ArmorType { Light, Medium, Hard, Energy } // Легкая, Средняя, Тяжелая, Энерго
public ArmorType armorType; // тип брони
public int resist; // защита брони
public int state; // состояние брони (полностью целой)
}
// Класс предмета раздела Помощь
[System.Serializable]
sealed public class ItemHelp : Item
{
public enum HelpType { Drug, Book } // Препарат, Книга/Журнал
public HelpType helpType; // тип помощи
public enum EffectType { Strength, Perception, Endurance, Charisma, Intellect, Agility, Lucky, LightWeapon, HardWeapon, EnergyWeapon, ExplosingWeapon, MeleeWeapon, HandedWeapon, Repair, Medicine, Science, Theft, Break, Secrecy, Oratory, Barter, Critical, AntiRadiaton, AntiPoison, AntiHabit, RadiationAway, PoisonAway, HabitAway, Health, MaxHealth, MaxWeight }
public EffectType type; // тип получаемого эффекта
public int actionTime; // время действия эффекта в секундах (по истечении этого времени эффект пропадает), если -1, то перманентное действие (просто добавляет на постоянку)
public bool percent; // если true, то эффект добавляет процент к определенному показателю
public int effectValue; // значение эффекта
}
// Класс предмета раздела Боеприпасы
[System.Serializable]
sealed public class ItemAmmo : Item
{
// добавить тип боеприпасов
}
// Класс предмета раздела Разное
[System.Serializable]
sealed public class ItemMisc : Item
{
// дополнительные поля для разного пока не нужны
}
Но в таком случае все опять же сводится к тому, что придется делать кучу Свитчей и Ифов, для определения типа предмета и от этого плясать дальше. Шило на мыло..
Можно заменить на один описывающий список:
Синтаксис:
Используется csharp
public class ItemsNew : MonoBehaviour {
public List<Item> items; // тут будем хранить все ItemWeapon, ItemArmor и прочее, доступные в игре
}
public List<Item> items; // тут будем хранить все ItemWeapon, ItemArmor и прочее, доступные в игре
}
Но опять же получится, что придется определять тип производного класса через базовый, но уже через GetType() (рефлексия?).. единственно удобство что придется обращаться к одному списку, а не к нескольким..
Тоже самое и с самим инвентарем игрока. Если сделаем в виде одного списка, то опять определение типа и прочее, прочее.. Или я под утро уже совсем куда-то побрел не туда или и правда не хватает мысли.. Хожу, блин, все вокруг, да около.. Или в любом случае придется описывать методы в инвентаре, которые будут получать то или иное через кучу Свитчей/Ифов?