在Unity场景中,想象
一个大的滑动物体(也许是出于某种原因而滑动的“装运容器”或“沙发”)
在地面上有一些2m高的轻木棍轻轻地粘在地面上。
在现实生活中,木棒会站在那里(开始时,实际上在PhysX中很难做到这一点),当大物体撞到它们时,
大对象将完全不受影响
木棍会被快速敲打掉,可能会反弹一两次,然后降落在某个地方
我发现在Unity中很难做到这一点。
通常,您会说:“给大物体质量几千,而棒状物的质量只有1或2公斤”。
但是我发现那真的行不通-棍棒确实会绕着大型滑动物体旋转。
如果将大对象的角阻力设置为较高,则不是您想要的其他行为。
首先,我使木棍运动起来(这样,木棍可以站起来而不会跌落),然后当大物体重击时..
protected void OnCollisionEnter(Collision collisionInfo) {
rb.isKinematic = false;
}
也许唯一的方法是
在自然界中,木棍不受大物体的影响
当他们触摸(触发)时,实际上只是独立地使摇杆随机“飞起来”。 (让棍子只与地面,风景相撞。)
如何在Unity / PhysX环境中执行此操作?
答案 0 :(得分:5)
(将我的评论转换为答案)
小物体会影响现实生活中的大物体,但是影响很小(所以可能有太多的木棍?)。还是问题出在木棍插在地面上的方式?我用立方体(1000公斤)和一些气瓶(1公斤)创建了测试场景。所有物体都自由地站立在地面上。这是当立方体撞击圆柱体时的样子:
答案 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中自然地工作,可能是运动学上的翻转。但是,如果必须这样做,它将很好地工作。