已经搜索了其他问题,但尚未找到如何在c#中执行的操作。使用Map函数进行了尝试,但在c#中不可用。
我想使用一个for循环来引用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);
}
很显然,第一个代码的第二部分不起作用(strainString.cost),因为trainString是一个字符串,而不是StrainsManager类的对象。上面的for循环是否可能,或者我必须手动为这7个对象键入35行吗?
答案 0 :(得分:5)
您可以维护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);
}
}
答案 1 :(得分:2)
您可以声明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
实现,因为我不确定100%如何运行(尽管我有一个合理的猜测)。希望这是很简单的选择。
答案 2 :(得分:1)
尝试以下代码段:
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);
}
};