我真的很想做我想象中很简单的事情:我有两个从同一个预制件中实例化的网格物体(战斗机),我希望它们不会重叠。预制件设置为具有盒式对撞机。理想情况下,我让动画师处理该位置。我尝试了几种方法:
我真的很想避免采用手动方法。我如何防止这种重叠?
编辑:盒对撞机上未设置isTrigger
答案 0 :(得分:3)
刚体是高度可配置的,您需要有限的物理功能集。使用您列举的第三个解决方案,并将旋转冻结在刚体中。有关更多详细信息,请参见the rigidbody page。
作为旁注,您可以考虑使用胶囊对撞机,以使角色更容易彼此“滑动”。
答案 1 :(得分:2)
尽管不一定要防止重叠,但是您可以为字符创建边界。根据您的操作,这将非常简单。
如果要设置距离范围以防止字符彼此之间太近,则可以使用以下等式
Vector3 focalPOne = focalPointOfCharacterOne();
Vector3 focalPTwo = focalPointOfCharacterTwo();
float dx = focalPOne.x - focalPTwo.x;
float dy = focalPOne.y - focalPTwo.y;
float dz = focalPOne.z - focalPTwo.z;
// calc distance along z plane
if (Math.Sqrt((dx * dx) + (dy * dy)) < minDistance)
{
// person is too close to the others head.
if (Math.abs(dz) < minHeightAbove)
{
// go to previous position.
}
// if there is no vertical elivation, you can go
// straight to moving them back to previous position
}
enter code here
如果这不是您想要的,请告诉我,以便我可以编辑或删除它。
创建的周边看起来像这样。
答案 2 :(得分:1)
要使您的角色及其各自的对撞机发生碰撞,都需要具有RigidBody组件。这是确保角色在共享预制件时不会互相穿过的唯一方法。
您不必通过物理引擎处理字符的分离/拒绝。只需使盒碰撞器触发,然后使用onTiggerEnter通过C#脚本中的代码处理分隔即可。
这里有一个冲突检测矩阵可以为您提供帮助,https://docs.unity3d.com/Manual/CollidersOverview.html。这张图片也很好地总结了它(出于某种原因,在文档中它在两个单独的表中):