我正在尝试创建一个函数,以从对象的子集生成随机对象,并从其中包含值的子集的值。
当前我正在使用switch / case,它可以工作,我只是好奇是否有更好的方法。
包含主要功能的类:
public class Loot : MonoBehaviour, IPointerClickHandler {
enum BaseType {Sword, Dagger};
enum BaseQuality {Weak, Normal, Strong}
public void OnPointerClick(PointerEventData eventData) {
Array baseTypes = Enum.GetValues(typeof(BaseType));
Array baseQualities = Enum.GetValues(typeof(BaseQuality));
System.Random random = new System.Random();
String baseType = baseTypes.GetValue(random.Next(baseTypes.Length)).ToString();
String baseQuality = baseQualities.GetValue(random.Next(baseQualities.Length)).ToString();
int damage = 0;
switch(baseQuality) {
case "Weak":
damage = -1;
break;
case "Strong":
damage = 1;
break;
}
Weapon weapon = new Weapon();
switch(baseType) {
case "Sword":
weapon = new Sword();
break;
case "Dagger":
weapon = new Dagger();
break;
}
weapon.Name = baseQuality + " " + baseType;
weapon.Attack += damage;
Debug.Log("created " + weapon.Name + " with attack " + weapon.Attack);
}
}
武器课:
public class Weapon : Item {
public int Attack { get; set; }
}
剑类(匕首类基本相同):
public class Sword : Weapon {
public Sword() {
Attack += 3;
}
}
这是按原样进行的,但是我很好奇,当我实现更多武器类型和质量时,是否有一种更动态的方式来做到这一点。
答案 0 :(得分:0)
我将使Random变量成为全局变量。但是我认为它不会变得更加动态。
所以是的,只需将System.Random random = new System.Random();
放在方法上方,就可以了。
(您每次输入该方法都会生成一个新的随机对象,但是如果只生成一次,那应该没问题)
希望我能帮忙,祝您有愉快的一天。
答案 1 :(得分:0)
如果您的构造函数没有参数,则可以使用反射,这种方法的代码会更短
Type[] weaponTypes= new Type[] { typeof(Sword), typeof(Dagger) };
Weapon weaponInstance = (Weapon)Activator.CreateInstance(types[baseType]);