如何销毁高度以下的游戏物体

时间:2019-06-20 18:34:51

标签: c# unity3d

我正在尝试销毁任何处于一定高度以下的游戏对象(假设为-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时都会被破坏

2 个答案:

答案 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();
   }
  }
}