在统一中,我正在创建一个程序,允许您单击一个立方体并选择代表顶点的球体,如下所示:
选择这些球体后,它们将被添加到selectedSpheres
类型的GameObject
列表中。
我创建了两个类文件 - Cube.cs
和Vertex.cs
。 Vertex
继承自Cube
继承的MonoBehaviour
。在Cube中,我有一个存储所选球体的成员列表。
我定义了一个函数addToSelected()
,它将输入添加到selectedSpheres
列表中。函数内的print语句每次都打印为true。但是Update()
函数中的print语句打印出一个Argument超出范围的错误,如下所示,而addToSelected()
表明它已经工作了8次:
从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);
}
}
}
答案 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)
您的代码存在一些问题:
Vertex
不应继承自Cube
,因为顶点不是多维数据集。selectedSpheres
,因为它继承了Cube
的列表。我希望你意识到它现在的方式,每个顶点都将自己插入到自己的列表中,所以每个selectedSpheres
总是有0或1个元素。 addToSelect
(可能还有其他方法)不应该是 public ,因为您不想从其他类中调用它。它不能像你的评论那样私有,因为那时继承的类无法使用它;如果您坚持继承,则必须 受保护 。selectedSpheres[0]
很糟糕,因为在您的情况下,列表可能为空,这会产生超出范围异常的参数。我说所有这些问题都是由继承引起的:立方体有顶点而顶点是立方体。您应该在多维数据集中有一个顶点列表,一个布尔值来判断是否选择了顶点,并且多维数据集中的方法可以遍历顶点列表并返回所选的那些(相当于{{1} }'Cube
)。
你可以有一个抽象类或接口来表示两个类共有的东西,比如selectedSpheres
或者isSelected
,所以这两个类都会实现/继承它,但同样,不是使addToSelect
继承自Vertex
。