我有一个包含各种预制件的清单。
此列表中的每个预制件都有一个附加了各种子类的脚本,这些子类包含一个整数' dicesides' (代表6/8/10双面骰子)。它们来自一个共同的基类' dice_BaseClass'。
我想创建一个方法来查看此列表中的每个预制件,在预制件中找到子类(这是一个难点),抓取dicesides变量并使用掷骰子方法。
下面是我的狡猾代码的一些简化示例
骰子父类
public class dice_BaseClass : MonoBehaviour {
private int dicesides = 8;
public int DiceSides {
get
{
return dicesides;
}
set
{
dicesides = value;
}
}
}
骰子儿童班'蓝色' - 只需设置dicesides
public class dice_ChildClass_Red : dice_BaseClass
{
public void Start () {
DiceSides = 12;
}
}
骰子儿童班' RED' - 只需设置dicesides
public class dice_ChildClass_Blue : dice_BaseClass
{
public void Start () {
DiceSides = 8;
}
}
然后在另一个包含附加了这些子脚本的预制件列表的类中......
public void RollDice () {
foreach (GameObject go in goList){
var diceClass = teffect.GetComponent<dice_BaseClass>();
print (diceClass.DiceSides);
}
然而,这并不起作用。它只获取基类默认dicesides int。
我也尝试过研究泛型,认为这可能与它有关。下面的内容都是胡说八道,但也许看看我的思维过程已经消失并失败将会很有用。
public void GenericTest<T>() where T : dice_BaseClass {
foreach (GameObject go in goList){
var testClass1 = teffect.GetComponent(typeof(T));
var testClass2 = effectClass.GetType();
var testClass3 = teffect.GetComponent("effectClass2");
//effectClass = teffect.GetComponent(GetType().Name);
print ("Hi " + effectClass2 );
}
}
非常感谢您阅读和了解您的任何提示/解决方案。
答案 0 :(得分:1)
您可以将 DiceSides 属性标记为虚拟,并在Child
类中覆盖它,如下所示:
public class Base
{
public virtual int sides { get { return 8; } }
}
public class Child : Base
{
public override int sides { get { return 10; } }
}
测试:
var arr = new [] { new Child(), new Base(), };
foreach (var a in arr) {
Console.WriteLine(a.sides);
}
结果:
10
8
答案 1 :(得分:1)
我没有看到你在哪里调用Start
,所以DiceSides
属性永远不会在子类中设置。您应该在构造函数中设置属性:
public class dice_ChildClass_Red : dice_BaseClass
{
public dice_ChildClass_Red() {
DiceSides = 12;
}
}
public class dice_ChildClass_Blue : dice_BaseClass
{
public dice_ChildClass_Blue() {
DiceSides = 8;
}
}