【问题标题】:Place object without overlap others放置对象不重叠其他
【发布时间】:2018-03-29 13:16:04
【问题描述】:

我在一个统一的项目中遇到了问题。我基本上有一个系统,您可以单击一个对象,然后单击某个区域内的某个位置,然后该对象就会到达该位置。问题是这些对象不能重叠。他们不能使用物理学。检测相互碰撞。我已经为此工作了很长时间,我得到了一些东西,但仍然没有完全工作,我希望有人可以帮助我。

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

代码:

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;
}

行为:

【问题讨论】:

  • 您的问题令人困惑。我的理解是你有一个用户点击的位置。然后你找到一定范围内的所有对象,你想找到所有这些点的中间?
  • 是的,你说对了一半,但不是在中间,我想在点击附近获得一个可用位置以放置我的对象@Franck
  • 如果你真的不想使用物理,你可以使用一种网格:网格的每个点都被一个大于对象大小的单位隔开。跨度>
  • 我有一个类似的系统,问题是这次需要在没有网格的情况下执行此操作,而我没有到达那里。
  • @AndréMarques 所以你有一个网格形状,你想遵循一个网格定位,比如说我们在 2d 中简化,你的对象是 50,50 并且是 100x100,如果你点击 75 ,75 你想知道你与那个对象有冲突,但是如果你点击 101,50 你想要从 100,0 延伸到 200,100 的点 150,50 是吗?也许预期结果的图片也会有所帮助。

标签: c# unity3d qvector3d


【解决方案1】:

您可以使用 Physics2D.OverlapCircleAll 轻松做到这一点

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

该方法返回一个colliders数组,如果返回数组的长度大于1,你可以简单地检查重叠并进行相应的处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-14
    • 2015-01-12
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 2012-09-24
    • 2014-04-16
    • 1970-01-01
    相关资源
    最近更新 更多