Unity3D,“撞倒”类型的灯光对象?

时间:2018-08-22 06:06:52

标签: unity3d game-physics physx

在Unity场景中,想象

  • 一个大的滑动物体(也许是出于某种原因而滑动的“装运容器”或“沙发”)

  • 在地面上有一些2m高的轻木棍轻轻地粘在地面上。

在现实生活中,木棒会站在那里(开始时,实际上在PhysX中很难做到这一点),当大物体撞到它们时,

  • 大对象将完全不受影响

  • 木棍会被快速敲打掉,可能会反弹一两次,然后降落在某个地方

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

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

但是我发现那真的行不通-棍棒确实会绕着大型滑动物体旋转。

如果将大对象的角阻力设置为较高,则不是您想要的其他行为。

首先,我使木棍运动起来(这样,木棍可以站起来而不会跌落),然后当大物体重击时..

protected void OnCollisionEnter(Collision collisionInfo) {

    rb.isKinematic = false;
}

也许唯一的方法是

    实际上,
  • 在自然界中,木棍不受大物体的影响

  • 当他们触摸(触发)时,实际上只是独立地使摇杆随机“飞起来”。 (让棍子只与地面,风景相撞。)

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

2 个答案:

答案 0 :(得分:5)

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

小物体会影响现实生活中的大物体,但是影响很小(所以可能有太多的木棍?)。还是问题出在木棍插在地面上的方式?我用立方体(1000公斤)和一些气瓶(1公斤)创建了测试场景。所有物体都自由地站立在地面上。这是当立方体撞击圆柱体时的样子: enter image description here

答案 1 :(得分: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中自然地工作,可能是运动学上的翻转。但是,如果必须这样做,它将很好地工作。