我正在尝试销毁任何处于一定高度以下的游戏对象(假设为-5)。
我尝试了foreach方法,该方法接受所有游戏对象,然后使用if比较它。如果比较为TRUE,则有一个简单的Destroy(go);
public float MinimalYLocation;
GameObject[] Objects;
void Start () {
Scene scena = SceneManager.GetActiveScene();
Objects = scena.GetRootGameObjects();
}
void Update () {
foreach (GameObject gobject in Objects) {
float Height = gobject.transform.position.y;
if (Height < MinimalYLocation){
Destroy(gobject);
}
}
}
我设置了一个场景,其中包含3个不同高度的立方体和一个摄像机。脚本在相机中。当第一个立方体掉落时,它被破坏了。然后,我收到大量垃圾邮件进行管理:
MissingReferenceException:“ GameObject”类型的对象已被破坏,但您仍在尝试访问它。
第二个和第三个立方体没有被破坏。预期的响应是,所有游戏对象在达到高度-5时都会被破坏
答案 0 :(得分:5)
这不会是可扩展的方法。您会发现,随着越来越多的GameObject在场景中活动,这对您的游戏性能产生了严重影响。
我建议您添加一个延伸到所有游戏区域边界并位于此“ -5” z位置的平面。为飞机提供对撞机触发器,并销毁所有触摸飞机的物体。使飞机没有纹理(又是不可见的)。
这将消除在每一帧中进行的更新带来的巨大负担。
答案 1 :(得分:-5)
因此,感谢paulsm4,我认为对象列表必须每次都更新。 这是正确的代码:
public float MinimalYLocation;
GameObject[] Objects;
void Start () {
Scene scena = SceneManager.GetActiveScene();
Objects = scena.GetRootGameObjects();
}
void Update () {
foreach (GameObject gobject in Objects)
{
float Height = gobject.transform.position.y;
if (Height < MinimalYLocation){
Destroy(gobject);
Scene scena = SceneManager.GetActiveScene();
Objects = scena.GetRootGameObjects();
}
}
}