Искал в других вопросах, но не нашел, как это сделать в С#. Пробовал использовать функцию Map, но она не доступна в С#.
Я хочу использовать цикл для ссылки на значения в объектах в классе StrainsManager:
public StrainsManager Ba2;
public StrainsManager Ba3;
public StrainsManager Ba4;
public StrainsManager Ba5;
public StrainsManager Ba6;
public StrainsManager Ba7;
public StrainsManager Ba8;
void Update()
{
for (int i = 2; i < 9; i++)
{
string strainString = "Ba" + i;
PlayerPrefs.SetFloat(strainString + "Cost", strainString.cost);
PlayerPrefs.SetFloat(strainString + "IPSAdd", strainString.IPSAdd);
PlayerPrefs.SetFloat(strainString + "Time", strainString.time);
PlayerPrefs.SetFloat(strainString + "CostMod", strainString.costMod);
PlayerPrefs.SetFloat(strainString + "InfectMod", strainString.infectMod);
}
}
Без цикла for мне пришлось бы набирать по 5 строк на объект:
void Update()
{
PlayerPrefs.SetFloat("Ba2Cost", Ba2.cost);
PlayerPrefs.SetFloat("Ba2IPSAdd", Ba2.IPSAdd);
PlayerPrefs.SetFloat("Ba2Time", Ba2.time);
PlayerPrefs.SetFloat("Ba2CostMod", Ba2.costMod);
PlayerPrefs.SetFloat("Ba2InfectMod", Ba2.infectMod);
}
Очевидно, что вторая часть в первом коде не работает (straString.cost), потому что straString является строкой, а не объектом класса StrainsManager. Возможно ли приведенное выше для цикла for или мне нужно сделать это вручную, набрав 35 строк для этих 7 объектов?
Вы можете объявить List<StrainsManager>
или StrainsManager[]
вместо того, чтобы объявлять их явно. Затем просто переберите список/массив, обращаясь к каждому элементу по очереди.
По моему опыту, это лучшая долгосрочная стратегия, чем обращение к именам переменных через строку. Если вы (или кто-то другой, касающийся кода) решите изменить способ их именования, тогда вы будете готовы к всевозможным неприятностям, и отследить будет неинтересно.
public StrainsManager[] StrainsManagerArray = new StrainsManager[7];
/*
* Wherever you're setting Ba2-Ba8, instead set StrainsManagerArray[0-6]
*/
void Update()
{
foreach (StrainsManager strainsManager in StrainsManagerArray)
{
//Access each StrainsManager here
}
}
Я специально PlayerPrefs.SetFloat
реализации PlayerPrefs.SetFloat
, так как я не уверен на 100%, как это работает (хотя у меня есть честное предположение). Надеюсь, это довольно просто, куда идти отсюда, хотя.
Вы можете сохранить Dictionary<string, StrainsManager>
чтобы сопоставить ключи "Ba #" с вашими экземплярами StrainsManager
.
void Update()
{
for (int i = 2; i < 9; i++)
{
string strainString = "Ba" + i;
map[strainString].Cost = strainString.cost; //follow this pattern for the other properties.
//PlayerPrefs.SetFloat(strainString + "IPSAdd", strainString.IPSAdd);
//PlayerPrefs.SetFloat(strainString + "Time", strainString.time);
//PlayerPrefs.SetFloat(strainString + "CostMod", strainString.costMod);
//PlayerPrefs.SetFloat(strainString + "InfectMod", strainString.infectMod);
}
}
Попробуйте этот фрагмент кода:
void Update()
{
var items = new Dictionary<string, StrainsManager>
{
{ nameof(Ba2), Ba2 },
{ nameof(Ba3), Ba3 },
{ nameof(Ba8), Ba8 },
};
foreach (var item in items)
{
PlayerPrefs.SetFloat($"{item.Key}Cost", item.Value.cost);
PlayerPrefs.SetFloat($"{item.Key}IPSAdd", item.Value.IPSAdd);
PlayerPrefs.SetFloat($"{item.Key}Time", item.Value.time);
PlayerPrefs.SetFloat($"{item.Key}CostMod", item.Value.costMod);
PlayerPrefs.SetFloat($"{item.Key}InfectMod", item.Value.infectMod);
}
};
List<StrainsManager>
илиStrainsManager[]
вместо того, чтобы объявлять их явно. Затем просто переберите список / массив.Ba2
,Ba3
и т. Д.), Вы, вероятно, делаете это неправильно. Вероятно, вам следует использовать массив, список или другую структуру данных для хранения всех этих переменных. Намного легче иметь дело сBa[n]
потому что вы можете заменить переменную наn
.