如何修改List<>统一的两个班级之间?

时间:2015-11-01 17:49:45

标签: c# list oop unity3d

在统一中,我正在创建一个程序,允许您单击一个立方体并选择代表顶点的球体,如下所示:

Cube with vertices

选择这些球体后,它们将被添加到selectedSpheres类型的GameObject列表中。

我创建了两个类文件 - Cube.csVertex.csVertex继承自Cube继承的MonoBehaviour。在Cube中,我有一个存储所选球体的成员列表。

我定义了一个函数addToSelected(),它将输入添加到selectedSpheres列表中。函数内的print语句每次都打印为true。但是Update()函数中的print语句打印出一个Argument超出范围的错误,如下所示,而addToSelected()表明它已经工作了8次:

Error

addToSelected()类中的OnMouseDown()函数调用Vertex函数。这两个类的代码如下所示:

Cube.cs

public class Cube : MonoBehaviour {

    bool isSelected = false;
    GameObject[] Spheres;
    List<GameObject> selectedSpheres = new List<GameObject>();

    public void addToSelected(GameObject obj) {
        selectedSpheres.Add(obj);
        print(selectedSpheres.Contains(obj));
    }

    public void removeSelected(GameObject obj) {
        selectedSpheres.Remove(obj);
    }

    public void clearSelected() {
        selectedSpheres.Clear();
    }

    // Update is called once per frame
    void Update() {
        if(Input.GetKeyDown(KeyCode.Space)) {
            print(selectedSpheres[0]);
        }
    }
 }

Vertex.cs

public class Vertex : Cube {

    void OnMouseDown() {
        // this object was clicked - do something
        Renderer rend = GetComponent<Renderer>();

        if (rend.material.color != Color.red) {
            rend.material.color = Color.red; // #d96459
            addToSelected(this.gameObject);

        } else {
            rend.material.color = Color.white;
            removeSelected(this.gameObject);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

由于Vertex继承了Cube和Cube,因此具有Update函数

void Update() {
    if(Input.GetKeyDown(KeyCode.Space)) {
        print(selectedSpheres[0]);
    }
}

每次按空格键时,语句print(selectedSpheres[0]);都会在从Cube继承的所有对象中执行。在某些(或大多数)Vertex selectedSpheres为空的实例中,这就是为什么你得到一个超出范围错误的参数。此外,您已为每个Cube实例(因此也为Vertex)定义了selectedSpheres列表。因此,您的示例场景中有9个selectedSpheres个实例。解决此问题的最短方法是将selectedSpheres声明为静态。然后,对于Cube / Vertex的所有实例,您只有一个列表。

所以继续尝试:

static List<GameObject> selectedSpheres = new List<GameObject>();

答案 1 :(得分:1)

您的代码存在一些问题:

  1. Vertex不应继承自Cube,因为顶点不是多维数据集。
  2. 此继承创建了许多列表:每个顶点都有自己的列表selectedSpheres,因为它继承了Cube的列表。我希望你意识到它现在的方式,每个顶点都将自己插入到自己的列表中,所以每个selectedSpheres总是有0或1个元素。
  3. addToSelect(可能还有其他方法)不应该是 public ,因为您不想从其他类中调用它。它不能像你的评论那样私有,因为那时继承的类无法使用它;如果您坚持继承,则必须 受保护
  4. 打印selectedSpheres[0]很糟糕,因为在您的情况下,列表可能为空,这会产生超出范围异常的参数。
  5. 我说所有这些问题都是由继承引起的:立方体顶点顶点是立方体。您应该在多维数据集中有一个顶点列表,一个布尔值来判断是否选择了顶点,并且多维数据集中的方法可以遍历顶点列表并返回所选的那些(相当于{{1} }'Cube)。

    你可以有一个抽象类或接口来表示两个类共有的东西,比如selectedSpheres或者isSelected,所以这两个类都会实现/继承它,但同样,不是使addToSelect继承自Vertex