如何在 Unity 中随机生成预制件而不与我的游戏地形发生碰撞

问题描述

我正在开发一个 3D 游戏,如果小鸟成功穿过管道,它就会得分,否则它就死了。我能够很好地实现这一点。

此外,我正在通过脚本生成管道(这是一个预制件)。生成的管道的位置在小鸟前面的随机位置。代码如下。这段代码写在负责游戏状态的 GameControl 脚本中。

public class GameControl : MonoBehavIoUr
{
 public GameObject pipe;
 public static GameControl instance;
          ..........
          ..........
          ..........
      void Update()
        {
          ..........
          ..........
          ..........
          spawnXposition = CurrentXpositionOfBird + Random.Range(-1,1);
          spawnYposition = CurrentYpositionOfBird + Random.Range(-1,1);
          spawnZposition = CurrentZpositionOfBird + Random.Range(50,100);
          SpawnPipe(spawnXposition,spawnYposition,spawnZposition);
        }
          ..........
          ..........
          ..........

   public void SpawnPipe(float x,float y,float z)
    {
        pipe.transform.position = new Vector3(x,y,z);
        CurrentZpositionOfScoringCollider = pipe.transform.position.z + 2.62f;
      
    }
}

SpawnPipe 函数负责创建管道的部分。我已将管道预制件附加到检查器中的管道游戏对象。

现在问题来了。当我生成管道时,我不希望它接触到地形的任何部分。如果它接触到我想重生,直到我将管道放在一个不接触地形的位置。为此,我在管道预制件中附加了一个脚本,并在 OnCollisionEnter 函数中销毁了管道。代码如下:

 private void OnCollisionEnter(Collision collision)
    {
       
        Destroy(GameControl.instance.pipe);
    }

上面的逻辑是,如果生成的管道与地形接触,则销毁它。在这种情况下,当生成的管道被销毁时,更新函数再次运行以生成新的管道。只要它不与地形碰撞,它会一次又一次地产生。

但我仍然能够看到管道实际上接触,很好地与地形融合。对于地形,我添加一个网格碰撞器,并使其成为检查了 isKinematic 的刚体。当鸟撞到地形时它工作得很好,我可以通过消息显示游戏

对于管道,我添加了 3 个盒子碰撞器,一个在管道底部,另外两个在管道侧面。当它与小鸟碰撞时,成功显示游戏结束消息。但是管道和地形之间的线圈没有被检测到。我不知道我哪里出错了。请帮忙。我对 Unity 也很陌生

地形的FBX模型链接

https://docs.google.com/uc?export=download&id=1kFUtPpQnopa7489i-iQwC2qEiQECbWCu

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)