Как создать наилучшую систему с характеристиками героев 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++;