如何防止字符重叠

时间:2018-07-03 19:58:29

标签: unity3d

我真的很想做我想象中很简单的事情:我有两个从同一个预制件中实例化的网格物体(战斗机),我希望它们不会重叠。预制件设置为具有盒式对撞机。理想情况下,我让动画师处理该位置。我尝试了几种方法:

  1. 将动画师配置为“动画物理”。没有检测到碰撞
  2. 取消选中根运动,并使用游戏对象的变换位置移动角色。没有检测到碰撞
  3. 取消选中根运动,为每个角色添加刚体,然后使用游戏对象的位置移动角色。可以检测到碰撞,但是反应受物理学控制,这使它看起来不自然,因为我想要的只是避免字符彼此通过,即只希望将字符向后推直到不再碰撞为止。

我真的很想避免采用手动方法。我如何防止这种重叠?

编辑:盒对撞机上未设置isTrigger

3 个答案:

答案 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

如果这不是您想要的,请告诉我,以便我可以编辑或删除它。

创建的周边看起来像这样。

enter image description here

答案 2 :(得分:1)

要使您的角色及其各自的对撞机发生碰撞,都需要具有RigidBody组件。这是确保角色在共享预制件时不会互相穿过的唯一方法。

您不必通过物理引擎处理字符的分离/拒绝。只需使盒碰撞器触发,然后使用onTiggerEnter通过C#脚本中的代码处理分隔即可。

这里有一个冲突检测矩阵可以为您提供帮助,https://docs.unity3d.com/Manual/CollidersOverview.html。这张图片也很好地总结了它(出于某种原因,在文档中它在两个单独的表中):

enter image description here