我正在开发一个 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