0

我正在开发一个 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 函数负责创建管道的部分。我已将管道预制件附加到检查器中的管道 GameObject 上。

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

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

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

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

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

<<<------------------------编辑------------------------>

地形的FBX模型的链接

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

4

0 回答 0