放置对象而不重叠其他

时间:2018-03-29 13:16:04

标签: c# unity3d qvector3d

我在我的一个团结项目中遇到了问题。我基本上有一个系统,你单击一个对象,然后你点击一个区域内的某个地方,对象就到了那个位置。问题是那些物体不能重叠。他们不能使用物理学。检测相互之间的关系。我一直在研究这个问题很长一段时间我得到的东西但仍然没有完全正常工作,我希望有人可以帮助我。

我基本上做的是让所有对象靠近点击,然后如果有一些只是计算点击和这些对象之间的方向,然后将它们添加到似乎工作的位置,有时他们不会重叠其他他们这样做了,他们走得很远,我需要它们靠近点击。

代码:

public Vector3 GetPossiblePosition(List<GameObject> nearbyDiscs, Vector3 position)
{ 
    float initialY = transform.position.y;
    Vector3 idealPosition = position;
    List<Vector3> directions = new List<Vector3>();

    if(nearbyDiscs.Count > 0)
    {
        foreach (GameObject disc in nearbyDiscs)
        {
            Vector3 newDirection = position - disc.transform.position;
            directions.Add(newDirection);
        }

        for (int i = 0; i < directions.Count; i++)
        {
            idealPosition += directions[i] / directions.Count;
            List<GameObject> discs = CheckForNearbyDiscs(idealPosition);
            if (discs.Count < 1)
                break;
        }
    }
    idealPosition.y = initialY;
    return idealPosition;
}

行为:

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用 Physics2D.OverlapCircleAll

轻松完成此操作

public static Collider2D [] OverlapCircleAll(Vector2 point,float radius,int layerMask = DefaultRaycastLayers,float minDepth = -Mathf.Infinity,float maxDepth = Mathf.Infinity);

此方法返回一个碰撞器数组,如果返回数组的长度大于1,则可以简单地检查重叠,并且可以相应地处理。