Как создать наилучшую систему с характеристиками героев C#

Есть вот такой скрипт:

    public class data_character : MonoBehaviour
{
    public class barbarian
    {
        public static string rare = "common";
        public static int baby_amount = 0;
        public static int classic_amount = 0;
        public static int super_amount = 0;
    }...
}

Дальше после "..." еще несколько классов. Вопрос такой: как из другого скрипта например создать массив (ну или лист) всех классов у которых например rare == "epic"

Если в данном коде это не реализуемо, порекомендуйте пожалуйста другие варианты решения. Заранее спасибо!


Ответы (1 шт):

Автор решения: aepot

Ну в лоб, так в лоб.

Берём класс

public class CharacterData
{
    public readonly string Name;
    public readonly string Rare;
    public int BabyAmount;
    public int ClassicAmount;
    public int SuperAmount;

    public CharacterData(string name, string rare)
    {
        Name = name;
        Rare = rare;
    }  
}

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

public static class CharacterDataManager
{
    public static readonly CharacterData[] Values = CreateData().ToArray();

    private static IEnumerable<CharacterData> CreateData()
    {
        yield return new CharacterData("barbarian", "common");
        yield return new CharacterData("mage", "epic");
        // и так далее добавляйте строки
    }
}

Теперь ответ на вопрос, как получить rare == "epic"

using System.Linq;
CharacterData[] epics = CharacterDataManager.Values.Where(x => x.Rare == "epic").ToArray();

Ну или циклом

foreach (CharacterData epic in CharacterDataManager.Values.Where(x => x.Rare == "epic"))
{
    Debug.Log(epic.Name);
}

Ну или вообще без Linq, если так понятнее

foreach (CharacterData epic in CharacterDataManager.Values)
{
    if (epic.Rare == "epic")
    {
        Debug.Log(epic.Name);
    }
}

Как взять объект по имени, если требуется

CharacterData barbarian = CharacterDataManager.Values.First(x => x.Name == "barbarian");
barbarian.BabyAmount++;
→ Ссылка