[英]How to modify List<> between two classes in unity?
我正在统一编写一个程序,允许您单击一个多维数据集并选择表示顶点的球体,如下所示:
一旦选择了这些球体,它们将被添加到GameObject
类型GameObject
selectedSpheres
列表GameObject
。
我创建了两个类文件Cube.cs
和Vertex.cs
。 Vertex
从Cube
继承,而Cube
从MonoBehaviour
。 在多维数据集中,我有一个成员列表,用于存储选定的球体。
我定义了一个函数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>();
您的代码存在一些问题:
Vertex
不应从Cube
数据集继承,因为顶点不是多维数据集。 selectedSpheres
因为它从Cube
继承了列表。 我希望您认识到,现在的方式是,每个顶点都将自己插入其自己的列表中,因此每个selectedSpheres
将始终具有0或1个元素。 addToSelect
(可能还有其他方法)不应是public ,因为您不想从其他类中调用它。 正如您的评论所说,它不能是私有的 ,因为继承的类无法使用它。 如果您坚持继承,则必须对其进行保护 。 selectedSpheres[0]
是不好的,因为在您的情况下,列表可能为空,并且会生成您超出范围的参数。 我会说所有这些问题都是由继承引起的: 多维数据集具有顶点,而不是顶点是多维数据集 。 您应该在多维数据集中有一个顶点列表,一个布尔值(用来告诉您是否选择了顶点),以及一个多维数据集中的方法可以遍历顶点列表并返回所选的顶点(这与Cube
的selectedSpheres
等效) )。
您可以有一个抽象类或一个接口来表示两个类的共同点,例如isSelected
或addToSelect
以便两个类都可以addToSelect
实现/继承,但同样,不要让Vertex
从Cube
继承。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.