unity3d - 如何防止对撞机相互穿过?

标签 unity3d game-physics

我无法将游戏对象保存在封闭空间内。当他们到达边缘时,会有一些短暂的向后推,但随后他们会直接穿过墙壁。

我在播放器上使用 Box Collider,在关卡的墙壁上使用 Mesh Collider。我对移动由玩家控制的玩家角色( spaceship )都有问题。还有射弹,它们是着火的,忘记了以恒定的速度移动。

这是我的播放器的移动代码。它正在 FixedUpdate() 中运行功能。

//Movement
    haxis = Input.GetAxis("Horizontal") * speed;
    vaxis = Input.GetAxis("Vertical") * speed;

    moveVector.x = haxis;
    moveVector.z = vaxis;

    if(moveVector.magnitude > 1)
    {
        moveVector.Normalize();
    }

    rigidbody.MovePosition(transform.position + moveVector * speed);

使用子弹,它们被赋予速度并且引擎计算它们的动画。他们正在使用 Box Collider,它被设置为触发器,所以他们没有物理。但我使用 OnTriggerEnter摧毁他们。
//Projectiles without physics collisiions
function OnTriggerEnter (other : Collider) {
    Destroy(gameObject);
}

一些但不是所有的子弹在击中网格对撞机壁时会被摧毁。玩家有时会撞到它并停下来,但通常可以通过它。我怎样才能使与网格碰撞器的碰撞每次都起作用?

最佳答案

我有一个弹球原型(prototype),在同样的领域也给我带来了很多麻烦。这些是我几乎(但尚未完全)解决这些问题所采取的所有步骤:

对于快速移动的物体:

  • 将刚体的 Interpolate 设置为“Interpolate”(这不会影响实际的物理模拟,但会正确更新对象的渲染 - 从渲染的角度来看,仅在重要对象上使用它,例如玩家或弹球,但不用于射弹)
  • 将碰撞检测设置为连续动态
  • 将脚本 DontGoThroughThings ( https://www.auto.tuwien.ac.at/wordpress/?p=260 ) 附加到您的对象。该脚本巧妙地使用了我在其他答案中发布的 Raycasting 解决方案,将违规对象拉回碰撞点之前。

  • Edit -> Project Settings -> Physics :
  • 将罚球的最小穿透设置为非常低的值。我已将我的设置为 0.001
  • 将 Solver Iteration Count 设置为更高的值。我已将我的设置为 50,但您可能可以少得多。

  • 所有这些都会在性能上受到惩罚,但这是不可避免的。默认值在性能上是软的,但并不是真正用于正确模拟小型和快速移动的对象。

    关于unity3d - 如何防止对撞机相互穿过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9688237/

    相关文章:

    sockets - Hololens UDP服务器从不接收消息

    c# - Unity Survival Shooter Enemy 不受伤害 - Android

    android - 我想为 android 和 ios 构建一个视频游戏应用程序,但我担心从哪里开始

    java - 为Android游戏创建 "stick controls"?

    javascript - 三.JS FPS控制左右扫射

    c# - 如何将 float 转换为 int?

    c# - 定义 iTween 路径时的恒速问题

    algorithm - 用不超过 8 个顶点的多边形包围 map 上的零点簇

    c++ - 将时间步固定为 2500 FPS?

    c# - Visual Studio 不再显示代码中的错误