【问题标题】:Rigidbodies going inside each other in Unity刚体在 Unity 中相互进入
【发布时间】:2017-12-17 03:29:07
【问题描述】:

我该如何解决这个问题?

详细信息:从游戏视图中可以看到,宝石从屏幕的右上方掉落。当它们快速下落并以类似的旋转相互撞击时,它们会相互进入。

【问题讨论】:

    标签: c# unity3d unity5 rigid-bodies


    【解决方案1】:

    对我来说,那颗宝石看起来还不错。如果碰撞速度非常快,碰撞也可以穿过物体。

    插值和连续网格检测都提高了物理性能。

    我建议您编写 3 行代码,以在对象快速运行时提高物理性能,并在对象运行缓慢时将其切换为正常。您可以每帧进行一次接近测试以检查快速物体(物理速度变量)以了解它们接近的物体,并使快速物体和接近物体的物理特性最大化。

    我会使用和你写的一样的,使用刚体速度是完美的,除了:

     private void Update ()
     {
         var vel = rgd.velocity;
         speed = vel.sqrMagnitude;//uses 5-20 times less processor power
    
         if (speed >= 4) // it's the same
    

    Magnitude 使用平方根数学,这是处理器上最昂贵的运算之一。作为每帧平方根和除法实例的鹰派是所有高级程序员为简化代码所做的事情。

    如果您必须找到不使用物理的物体的速度,那么您必须从每帧的最后一帧位置删除它们的当前位置,以找到它们的速度矢量,这将与刚体相同。使用 posA posB 变量调用最后一帧的速度……即对于没有刚体的对象。

    【讨论】:

    • 如果我在刚体组件中将“碰撞检测”设置为“连续动态”,对性能的影响有多大?
    • 网格物理在统一性上是不稳定的,插值是对象在帧之间的位置,因为它就像一块垫脚石,连续性也差不多,它们可以让您充分控制大多数场景,您的预算每个连续的3-10个简单的物理对象,即值得几个标准对象不知道多少。您可以通过了解 50 个或 100 个标准弹性物体是否将您的 PC 速度降至 20 FPS 来衡量您的预算
    • 为场景中的最大物理对象创建一个信封到键盘控制,该控制返回一个具有 5-10 条物理精度线的函数,该函数可以使用 [ ctrl p+/- ] 调整物理性能,用于最小增强 spd 和增强透视中的光线投射可见对象。并使其打印:0-10 级的 phsx,并在您进行时添加到您的函数中,使其有很多行的小 phsics 动画精神,最终得到一个 15 行的函数,并将相同的函数复制并粘贴到不同的优先级游戏列表。
    • 我明白了...非常感谢您的解释! :)
    【解决方案2】:

    这是我编写的代码,我在我的对象上使用了它。

    bool fast;
    Rigidbody rgd;
    float speed;
    
    private void Start ()
    {
        rgd = gameObject.GetComponent<Rigidbody>();
    }
    
    private void Update ()
    {
        var vel = rgd.velocity;
        speed = vel.magnitude;
    
        if (speed >= 2)
        {
            rgd.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
        }
        else
        {
            rgd.collisionDetectionMode = CollisionDetectionMode.Discrete;
        }
    }
    

    【讨论】:

    • 这很好,只是幅度使用平方根,这需要大约 20-70 次乘法运算等效处理时间,不建议在编程中使用 deffo,尤其是在多体上。您每帧执行 20 次,即花费 400/2000 次翻牌。当您不需要知道精确的幅度时,有平方幅度用于比较。嗯,我昨天在这个页面上被否决了,我的建议和你的一样。erm。 docs.unity3d.com/ScriptReference/Vector3-sqrMagnitude.html
    • 其实,是的,你应得的。那么我可以问我如何在没有幅度的情况下做到这一点?你说“当一个物体快速运动时提高物理性能”,那么我怎么知道它是否在不知道大小的情况下快速运动呢?谢谢。
    • 我会把它写在答案字段中,因为在那里写代码更容易。
    猜你喜欢
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多