[英]Efficient way to access variable based on index/reference in C#
好的,键入问题标题,我知道我可以使用数组。 但是,我想知道C#中是否有替代方法供我尝试使用。
我有一个电子表格,其中包含要应用于我的游戏船的升级。 每个条目都有四列,这些列使用int来指定升级类型,另一列具有要应用的数量,从而允许每个项目进行四次升级。
因此,在我的“船体”电子表格中,我有upgd_1_type,upgd_2_type,upgd_3_type,upgd_4_type(它们涉及七个升级类型之一)和updg_1_amnt等,以说明应用的数量。
我刚刚输入了以下代码,这是一个很棒的switch语句,其中包含许多可怕的重复代码,这让我想知道是否有更好的方法来做事情。
void GetHullUpgradeVals(GDEHullData hullDat){
switch(hullDat.upgd_1_type){
case (int)UPGRADES_HULL.COST:
upg_Hull_cost *= 1/hullDat.upgd_1_amnt; break;
case (int)UPGRADES_HULL.IMPACT_RES:
upg_Hull_impactRes *= hullDat.upgd_1_amnt; break;
case (int)UPGRADES_HULL.MASS:
upg_Hull_mass *= 1/hullDat.upgd_1_amnt; break;
case (int)UPGRADES_HULL.MAX_HEALTH:
upg_Hull_mxhlth *= hullDat.upgd_1_amnt; break;
case (int)UPGRADES_HULL.PICK_RAD:
upg_Hull_pickRad *= hullDat.upgd_1_amnt; break;
case (int)UPGRADES_HULL.REGEN:
upg_Hull_regen *= hullDat.upgd_1_amnt; break;
case (int)UPGRADES_HULL.PICK_RAD:
upg_Hull_pickRad *= hullDat.upgd_1_amnt; break;
}
switch(hullDat.upgd_2_type){
case (int)UPGRADES_HULL.COST:
upg_Hull_cost *= 1/hullDat.upgd_2_amnt; break;
case (int)UPGRADES_HULL.IMPACT_RES:
upg_Hull_impactRes *= hullDat.upgd_2_amnt; break;
case (int)UPGRADES_HULL.MASS:
upg_Hull_mass *= 1/hullDat.upgd_2_amnt; break;
case (int)UPGRADES_HULL.MAX_HEALTH:
upg_Hull_mxhlth *= hullDat.upgd_2_amnt; break;
case (int)UPGRADES_HULL.PICK_RAD:
upg_Hull_pickRad *= hullDat.upgd_2_amnt; break;
case (int)UPGRADES_HULL.REGEN:
upg_Hull_regen *= hullDat.upgd_2_amnt; break;
case (int)UPGRADES_HULL.PICK_RAD:
upg_Hull_pickRad *= hullDat.upgd_2_amnt; break;
}
switch(hullDat.upgd_3_type){
case (int)UPGRADES_HULL.COST:
upg_Hull_cost *= 1/hullDat.upgd_3_amnt; break;
case (int)UPGRADES_HULL.IMPACT_RES:
upg_Hull_impactRes *= hullDat.upgd_3_amnt; break;
case (int)UPGRADES_HULL.MASS:
upg_Hull_mass *= 1/hullDat.upgd_3_amnt; break;
case (int)UPGRADES_HULL.MAX_HEALTH:
upg_Hull_mxhlth *= hullDat.upgd_3_amnt; break;
case (int)UPGRADES_HULL.PICK_RAD:
upg_Hull_pickRad *= hullDat.upgd_3_amnt; break;
case (int)UPGRADES_HULL.REGEN:
upg_Hull_regen *= hullDat.upgd_3_amnt; break;
case (int)UPGRADES_HULL.PICK_RAD:
upg_Hull_pickRad *= hullDat.upgd_3_amnt; break;
}
switch(hullDat.upgd_4_type){
case (int)UPGRADES_HULL.COST:
upg_Hull_cost *= 1/hullDat.upgd_4_amnt; break;
case (int)UPGRADES_HULL.IMPACT_RES:
upg_Hull_impactRes *= hullDat.upgd_4_amnt; break;
case (int)UPGRADES_HULL.MASS:
upg_Hull_mass *= 1/hullDat.upgd_4_amnt; break;
case (int)UPGRADES_HULL.MAX_HEALTH:
upg_Hull_mxhlth *= hullDat.upgd_4_amnt; break;
case (int)UPGRADES_HULL.PICK_RAD:
upg_Hull_pickRad *= hullDat.upgd_4_amnt; break;
case (int)UPGRADES_HULL.REGEN:
upg_Hull_regen *= hullDat.upgd_4_amnt; break;
case (int)UPGRADES_HULL.PICK_RAD:
upg_Hull_pickRad *= hullDat.upgd_4_amnt; break;
}
}
我将用七个数组交换七个变量,并按索引进行引用,但是有没有一种方法可以根据索引选择变量? 诸如指针之类的东西可以给新变量提供对另一个变量的引用? 还有其他聪明的解决方案吗?
编辑:使用数组
void GetHullUpgradeVals(GDEHullData hullDat){
upgs_Hull[hullDat.upgd_1_type] = hullDat.upgd_1_amnt;
upgs_Hull[hullDat.upgd_2_type] = hullDat.upgd_2_amnt;
upgs_Hull[hullDat.upgd_3_type] = hullDat.upgd_3_amnt;
upgs_Hull[hullDat.upgd_4_type] = hullDat.upgd_4_amnt;
upgs_Hull[(int)UPGRADES_HULL.COST] = 1/upgs_Hull[(int)UPGRADES_HULL.COST];
upgs_Hull[(int)UPGRADES_HULL.MASS] = 1/upgs_Hull[(int)UPGRADES_HULL.MASS];
}
我不知道更优雅的解决方案。
嗨,大卫,再次!
您可以创建自定义变量。 这将是参考变量。 嗯...
例如:
public class IntVariable{
public int Value;
public void DivideAndMultiply(){ // for example some method we can create
Value *= 1 / Value;
}
}
并使用它:
IntVariable upg_Hull_cost;
IntVariable upg_Hull_impactRes;
//.....
IntVariable GetVariable(UpgradeType type) {
switch(type) {
case UpgradeType.COST:
return upg_Hull_cost;
case UpgradeType.IMPACT_RES:
return upg_Hull_impactRes;
//....
}
return null;
}
///...
void GetHullUpgradeVals(GDEHullData hullDat){
GetVariable(hullDat.upgd_1_type).Value = hullDat.upgd_1_amnt;
GetVariable(hullDat.upgd_2_type).Value = hullDat.upgd_2_amnt;
//...
GetVariable(UPGRADES_HULL.COST).DivideAndMultiply();
}
希望这会帮助您寻找其他解决方案。
您可以在游戏中将ScriptableObjects
用于数据库,物品,升级,AI等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.