Unity3D,"knocked away" 类型的光源对象?

Unity3D, "knocked away" type light object?

在Unity场景中,想象一下

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

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

通常你会说:"give the large object a mass of a few thousand, and the sticks a mass of only 1 or 2 kg"。

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

如果您将大对象的 angular 阻力设置得较高,那么这不是您想要的,因为它的其他行为。

首先,我让木棍具有运动性(因此它们会站起来而不会倒下),然后当大物体敲打它时..

protected void OnCollisionEnter(Collision collisionInfo) {

    rb.isKinematic = false;
}

也许唯一的方法是

如何在 Unity/PhysX 环境中做到这一点?

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

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

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

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

public class BoomableTrigger : MonoBehaviour {

    public Boomable tell;

    protected void OnTriggerEnter(Collider other) {

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

然后,要真正"throw"当你的车撞到它时,它会以一种幽默的方式向前移动..

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 突然坠落,一旦车辆撞击它,它 "flies away" 从车辆上掉下来。

实验表明,为了获得很好的喜剧效果,以及将其向前抛出(第一个子句),您确实需要制作它 "fall forward",这需要一些矢量化。

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