@liss48

Как сделать правильное перемещение объектов курсором без выталкивания за коллайдеры?

Есть такой код перемещения объектов, скрипт лежит на каждом объекте который можно передвигать курсором.

public void OnMouseDrag()
    {
        Vector2 newPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        newPosition.x = Mathf.Clamp(newPosition.x, -2.73f, 2.84f);
        newPosition.y = Mathf.Clamp(newPosition.y, -4.94f, 2.21f);

        Collider2D hitCollider = Physics2D.OverlapPoint(newPosition);

        if (hitCollider == null || hitCollider.gameObject == gameObject)
        {
            newPosition.x = Mathf.SmoothDamp(transform.position.x, newPosition.x, ref velocity.x, smoothTime, maxSpeed);
            newPosition.y = Mathf.SmoothDamp(transform.position.y, newPosition.y, ref velocity.y, smoothTime, maxSpeed);

            _rb.MovePosition(newPosition);
        }
    }


Если пробовать толкать одним объектом множество других, то они будут выталкиваться за Edge Collider2D.
Эти строчки отвечают за то, чтобы объекты не могли двигаться дальше игрового поля:
newPosition.x = Mathf.Clamp(newPosition.x, -2.73f, 2.84f);
newPosition.y = Mathf.Clamp(newPosition.y, -4.94f, 2.21f);

Это работает, но на игровом поле также присутствуют и другие объекты с коллайдерами, и с ними такой трюк уже не срабатывает т.к я не смогу захватить все координаты
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
@liss48 Автор вопроса
Написал ответ сам

private void OnMouseDrag()
    {
        _newPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        _newPos.x = Mathf.Clamp(_newPos.x, -2.73f, 2.84f);
        _newPos.y = Mathf.Clamp(_newPos.y, -4.94f, 2.21f);

        Collider2D hitCollider = Physics2D.OverlapPoint(_newPos);

        if (CheckAccessMove())
        {
            if (hitCollider == null || hitCollider.gameObject == gameObject)
            {
                _newPos.x = Mathf.SmoothDamp(transform.position.x, _newPos.x, ref velocity.x, smoothTime, maxSpeed);
                _newPos.y = Mathf.SmoothDamp(transform.position.y, _newPos.y, ref velocity.y, smoothTime, maxSpeed);

                _rb.MovePosition(_newPos);
            }
        }
    }

    private bool CheckAccessMove()
    {
        RaycastHit2D[] hits = Physics2D.LinecastAll(new Vector2(transform.position.x, transform.position.y), _newPos);

        foreach (RaycastHit2D hit in hits)
        {
            Collider2D collider = hit.collider;

            if (collider.gameObject == gameObject)
                continue;

            if (collider != null)
                return false;
        }

        return true;
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы