2

在 Unity 场景中,想象一下

  • 一个大的滑动物体(可能是一个“集装箱”或一个“沙发”由于某种原因滑动)

  • 途中有数根2m高的轻木棍轻轻地插在地上。

在现实生活中,棍子会站在那里(首先,这实际上在 PhysX 中很难实现),当大物体击中它们时,

  • 大物体将完全不受影响

  • 棍子会被轻快地击倒,可能会从地面反弹一两次,然后降落在某个地方

我发现这在 Unity 中很难做到。

通常你会说:“给大物体几千的质量,而棍子的质量只有 1 或 2 公斤”。

但是我发现这真的行不通- 棍子确实倾向于旋转大型滑动物体。

如果你将大物体的角度阻力设置得高,那不是你想要的,因为它是其他行为。

在第一个例子中,我使棍子运动(这样他们就可以站起来而不会摔倒),然后当大物体敲击它时......

protected void OnCollisionEnter(Collision collisionInfo) {

    rb.isKinematic = false;
}

也许这样做的唯一方法是

  • 事实上,这些棍子在物理上完全不受大物体的影响

  • 当他们触摸(触发)时,实际上只是独立地让棍子随机“飞走”。(让木棍只与地面碰撞,风景。)

如何在 Unity/PhysX 环境中执行此操作?

4

2 回答 2

5

(将我的评论转换为答案)

小物体会影响现实生活中的大物体,但影响很小(所以也许棍子太多了?)。或者问题可能出在棍子卡在地上的方式上?我用立方体(1000 公斤)和一些圆柱体(1 公斤)创建了测试场景。所有的物体都只是自由地站在地上。这是立方体撞击圆柱体时的样子: 在此处输入图像描述

于 2018-08-22T07:11:10.027 回答
1

我确实取得了巨大的成功,手动“繁荣”铅笔对象。因为它可能对某人有所帮助,所以方法如下。

通常,您会在相应图层上的对象下方有一个单独的触发器:

public class BoomableTrigger : MonoBehaviour {

    public Boomable tell;

    protected void OnTriggerEnter(Collider other) {

        tell.Triggered(other.GetComponent<Rigidbody>().velocity);
    }
}

然后,当您的车辆撞到它时,以一种幽默的方式真正“扔”它。

public class Boomable : MonoBehaviour {

    Rigidbody rb;
    // obvious setup not shown ..

    public void Triggered(Vector3 vehicleVelocity) {

        // (very likely tell your networking this happened ...)
        DoBoom(vehicleVelocity);
    }

    public void DoBoom(Vector3 vehicleVelocity) {

        // assume we are being hit by a large vehicle

        rb.isKinematic = false;

        // make it spring forwards humorously

        rb.velocity = vehicleVelocity * Random.Range(1f,3f);

        // and make it "snap-fall, forwards" ...

        Vector3 worldLeftwards =
           Vector3.Cross(vehicleVelocity, Vector3.up).normalized;
        rb.angularVelocity =
           worldLeftwards * -1f * Random.Range(5f,50f);
    }

这给了它一个真正的 Buster Keaton 快速坠落,一旦车辆撞击它,它就会从车辆上“飞走”。

实验表明,为了获得不错的喜剧效果,以及将其向前扔(第一个子句),您确实需要使其“向前倾斜”,这需要一些矢量化。

尚不清楚为什么它不能像@obywan 的回答那样在 PhysX 中自然工作,可能是运动学翻转。但是,如果您必须这样做,这将很好地工作。

于 2018-08-24T14:24:01.427 回答