繁体   English   中英

如何在两个类之间统一修改List <>?

[英]How to modify List<> between two classes in unity?

我正在统一编写一个程序,允许您单击一个多维数据集并选择表示顶点的球体,如下所示:

有顶点的多维数据集

一旦选择了这些球体,它们将被添加到GameObject类型GameObject selectedSpheres列表GameObject

我创建了两个类文件Cube.csVertex.cs VertexCube继承,而CubeMonoBehaviour 在多维数据集中,我有一个成员列表,用于存储选定的球体。

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

错误

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

多维数据集

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]);
        }
    }
 }

顶点

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);
        }
    }
}

由于顶点继承了多维数据集形式,并且多维数据集具有更新功能

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

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

因此,继续尝试:

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

您的代码存在一些问题:

  1. Vertex不应从Cube数据集继承,因为顶点不是多维数据集。
  2. 这种继承创建了许多列表:每个顶点都有自己的列表selectedSpheres因为它从Cube继承了列表。 我希望您认识到,现在的方式是,每个顶点都将自己插入其自己的列表中,因此每个selectedSpheres将始终具有0或1个元素。
  3. addToSelect (可能还有其他方法)不应是public ,因为您不想从其他类中调用它。 正如您的评论所说,它不能是私有的 ,因为继承的类无法使用它。 如果您坚持继承,则必须对其进行保护
  4. 打印selectedSpheres[0]是不好的,因为在您的情况下,列表可能为空,并且会生成您超出范围的参数。

我会说所有这些问题都是由继承引起的: 多维数据集具有顶点,而不是顶点是多维数据集 您应该在多维数据集中有一个顶点列表,一个布尔值(用来告诉您是否选择了顶点),以及一个多维数据集中的方法可以遍历顶点列表并返回所选的顶点(这与CubeselectedSpheres等效) )。

您可以有一个抽象类或一个接口来表示两个类的共同点,例如isSelectedaddToSelect以便两个类都可以addToSelect实现/继承,但同样,不要让VertexCube继承。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM