Поместите объект без наложения других
У меня проблема в одном из моих проектов в единстве. В основном у меня есть система, в которой вы щелкаете объект, а затем щелкаете где-то внутри области, и объект перемещается в эту позицию. проблема в том, что эти объекты не могут перекрываться. И они не могут использовать физику. обнаруживать столкновения друг с другом. Я работал над этим в течение долгого времени, я получил кое-что, но все еще не полностью работал, и я надеялся, что кто-то мог помочь мне.
Что я в основном делаю, так это нахожу все объекты рядом с кликом, а затем, если есть некоторые, просто вычисляю направления между кликом и этими объектами, а затем добавляю их в положение, которое, кажется, работает, иногда они не перекрываются в другой раз, когда они делают, и они пойти далеко, и мне нужно, чтобы они были рядом с щелчком.
код:
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;
}
поведение:
1 ответ
Вы можете легко сделать это, используя Physics2D.OverlapCircleAll
public static Collider2D [] OverlapCircleAll (точка вектора 2, радиус с плавающей точкой, int layerMask = DefaultRaycastLayers, число с плавающей точкой minDepth = -Mathf.Infinity, число с плавающей точкой maxDepth = Mathf.Infinity);
этот метод возвращает массив коллайдеров, вы можете просто проверить перекрытие, если длина возвращаемого массива больше единицы и может обрабатываться соответствующим образом.