如何在Unity中实现高速物体的碰撞

13

我尝试为Android创建游戏,但是遇到高速物体碰撞问题。

我有一个带有Sphere Collider和Bouncy材质的球体,以及一个具有以下参数(Gravity=false,Interpolate=Interpolate,Collision Detection = Continuous Dynamic)的RigidBody。

此外,我还有3个带有Box Collider和Bouncy材质的墙壁。

这是我的球体代码。

function IncreaseBallVelocity() {
rigidbody.velocity *= 1.05;
}

function Awake () {
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse);

InvokeRepeating("IncreaseBallVelocity", 2, 2);
}
在项目设置中,我设置了:“惩罚力最小穿透深度”=0.001,“求解器迭代次数”=50。
当我开始玩时,它很正常(它反弹),但当速度变得很快时,球体就穿过了墙壁。
有人能帮帮我吗?
谢谢。
var hit : RaycastHit;

var mainGameScript : MainGame;

var particles_splash : GameObject;

function Awake () {
rigidbody.AddForce(4, 4, 0, ForceMode.Impulse);

InvokeRepeating("IncreaseBallVelocity", 2, 2);
}

function Update() {
if (rigidbody.SweepTest(transform.forward, hit, 0.5))
    Debug.Log(hit.distance + "mts distance to obstacle");
if(transform.position.y < -3) {
    mainGameScript.GameOver();
    //Application.LoadLevel("Menu");
}
}

function IncreaseBallVelocity() {
rigidbody.velocity *= 1.05;
}

function OnCollisionEnter(collision : Collision) {
Instantiate(particles_splash, transform.position, transform.rotation);
}

编辑:增加更多信息

  1. 固定时间步长=0.02,允许的最大TIR=0.333。
  2. 在编辑器和安卓设备上运行游戏没有区别。
  3. 不是这样。当我设置为0.01时看起来还好。
  4. 我的挡板是一个没有刚体的盒子碰撞体,墙也是一样的。
  5. 它们都在同一层中(当速度正常时都可以工作),PhysicsManager中的值都是默认值(与图像中相同),除了“ Solver Interation Co...”=50。
  6. 不是这样。当我改变速度时,它会穿过其他墙壁。
  7. 我使用标准立方体,但我会扩展/缩小它以适应我的屏幕和其他物体,当我将墙扩展得更多时,它就会弹跳。
  8. 不是这样。这是从视频http://www.youtube.com/watch?v=edfd1HJmKPY中的简单项目示例。
  9. 我不使用重力。
2个回答

5

请参考以下内容:

  1. 类似的SO问题
  2. 一个社区脚本,使用光线追踪来帮助管理快速运动的物体
  3. UnityAnswers帖子,指向(2)中的脚本

您还可以尝试更改物理固定时间步长。这个值越小,Unity就会更多地计算场景的物理特性。但要注意,将此值设置得太小,例如<=0.005,可能会导致游戏不稳定,特别是在便携设备上。

上面的脚本最适用于子弹或小物体。您可以手动强制刚体碰撞测试:

public class example : MonoBehaviour {
    public RaycastHit hit;
    void Update() {
        if (rigidbody.SweepTest(transform.forward, out hit, 10))
            Debug.Log(hit.distance + "mts distance to obstacle");

    }
}

我尝试为物理引擎设置固定的时间步长0.01,它起作用了,现在球体可以更稳定地站立,但当它加速时,我仍然遇到同样的问题。我尝试使用DontGoThroughThings,但我不确定这是否是正确的方法,我只是将代码复制到我的Sphere JS脚本中,我需要设置更多的东西吗? - Kec
@Kec 不需要,只要你的球体有一个刚体组件。该脚本仅适用于非常粗略的测试,并使用您对象的中心进行测试。但由于您有一个球体,您可以轻松地进行射线投射,找到最近的命中点,如果该命中点<球体的半径,则停止球体。 - Jerdak
我尝试了各种方法但都没有奏效。现在我有这段代码,你能告诉我应该做出哪些更改吗?我已经将代码添加到问题中。谢谢帮助。 - Kec

2
我认为主要问题是对 Rigidbodyvelocity 进行操作。我建议尝试以下方法来解决这个问题:
  1. 重新设计你的代码,确保 IncreaseBallVelocity 和其他对 Rigidbody 进行的操作都在 FixedUpdate 中调用。检查是否有其他对 Transform.position 进行的操作。
  2. 尝试使用 AddForce 或类似的方法替换直接设置速度,这样物理引擎就有更高的机会计算所有依赖项。
  3. 如果还涉及到其他与物理计算相关的物品(例如主角人物等),请确保它们的代码也在 FixedUpdate 中运行。
我发现的另一个问题是缩放非常大的网格。当 GameObject 的缩放 <= 0.01 或 >= 100 时,对物理计算肯定会产生负面影响。根据文档这个Unity论坛帖子中的一位专家所说,应避免使用Transform.scale值!= 1。
还不满意吗?那么下一个测试将以高速度但没有加速度开始。在此阶段,我们想知道,是高速本身还是加速度导致了问题。有趣的是,了解物理引擎开始失败的速度值-请发布它们,以便我们进行比较。
编辑:还有一些需要调查的事情
6.7米/秒听起来并不算太快,所以我猜测出现问题可能是由于特殊原因或多种原因的组合。
  • 您的最大允许时间步长 是否足够高?为了测试,建议将其设置为Fixed Timestep 的 5 至 10 倍。请注意,这可能会降低帧率,但稍后可以解决这个问题。
  • 在编辑器播放器和 Android 上运行游戏有什么区别吗?
  • 由于0.01 FixedTimestep,您是否注意到帧速率下降?这可能表明物理引擎可能有问题。
  • 是否存在静态碰撞器(具有碰撞器但没有Rigidbody的对象),它们被移动或以其他方式操作?这将导致 PhysX 内部重新计算。
  • 图层方面呢:所有墙壁都在同一层中,或者所涉及的层已经在碰撞检测矩阵 中适当配置了吗?
  • 无反弹效果是否总是发生在同一堵墙上?如果是,请尝试将第一堵墙复制并放置到第二个位置,以查看是否出现了特定墙壁的问题。
  • 如果不需要花费太多精力,建议设置一些标准立方体作为墙壁,以确保transform.scale 不会出现问题(我有过这方面的非常糟糕的经历)。
  • 您是否在脚本中操纵重力或TimeManager.timeScale
  • 顺便问一下:您是否使用重力?(应该不会有问题)

好的,我已经进行了一些测试,这是结果:
  1. 当我设置速度=6.7时,球会在第一堵墙上弹跳,但它会穿过第二堵墙,在这种情况下,会调用OnCollisionEnter方法,但弹跳不起作用,也许是我使用的Bouncy材料有问题?
  2. 当我增加墙壁宽度或球半径时,弹跳效果很好。 所有Rigidbody的操作都在FixedUpdate中调用,我不使用IncreaseBallVelocity,我只是设置rigidbody.AddForce(6.7, 6.7, 0, ForceMode.Impulse);
- Kec
当我创建球时,我在开头设置了其比例参数,这就是全部内容。但是我更感兴趣的是它调用了OnCollisionEnter,但没有反弹,就好像“Bouncy”材料出了些问题。 - Kec
@Kec 嗯,Bounciness = 1Bounce Combine = Max 就可以了。关于缩放:根据文档论坛上大师之一的帖子,你应该避免使用 Transform.scale 值不等于 1。 - Kay
参数Bounciness = 1和Bounce Combine = Max已经设置好了。关于缩放,我将球设置为1、1、1,但其他物体我必须进行缩放以保持对称性,在这种情况下,我不得不增加球的速度,然后它再次发生(球穿过墙壁)?还有其他想法吗?谢谢帮助。 - Kec
@Kec 这是一个棘手但有趣的问题。我更新了我的答案并在推特上分享了一些更多的建议 - 让我们拭目以待。 - Kay
当我将Rigidbody附加到墙上并勾选“Is Kinematic”并设置Collirion Detection = Continuous时,它会卡在墙里。 - Kec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接