помогите найти ошибку в коде C# Unity

пытаюсь написать код , перемещения объекта курсором мыши при зажатой ЛКМ Но , после клика кнопкой мыши , опрос функций OnMouseExit и OnMouseEnter прекращается Из модулей подключен BoxCollider2D. Подскажите в чем ошибка?

public class scr_obj : MonoBehaviour
{
    bool flag_mouse = false;
    

    void OnMouseEnter()
    {
        flag_mouse = true;
        print("flag_mouse   " + flag_mouse);
    }

    void OnMouseExit()
    {
        flag_mouse = false;
        print("flag_mouse   " + flag_mouse);
    }

    void Update()
    {
        print("update");
        if (flag_mouse==true)
        {
            Vector2 mouse_pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Vector2 obj_pos = transform.position;

            Vector2 new_obj_pos = new Vector2(mouse_pos.x, mouse_pos.y);

            transform.position = new_obj_pos;
            
        }

    }
}

Ответы (1 шт):

Автор решения: Andrew

как-то так:

private Vector3 _screenPoint;
private Vector3 _offset;

void OnMouseDown() {

    _offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, _screenPoint.z));
}

void OnMouseDrag()
{
    Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _screenPoint.z);
    Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + _offset;
    transform.position = curPosition;
}

или так:

private Vector2 _previousPos;
private bool _isMouseDown;

void OnMouseDown() {
    _isMouseDown = true;
    _previousPos = Input.mousePosition;
}

void OnMouseDrag(){
    if(!_isMouseDown)
        return;

    Vector2 currentPos = Input.mousePosition;
    Vector2 paddlePos = currentPos - previousPos;

    transform.position = paddlePos;

    _isMouseDown = false;
    _previousPos = currentPos;
}

код не проверял

А для 3д перетаскивания в юнити раньше был отдельный стоковый скрипт. Уже не помню как назывался, но, вероятно гугл подскажет если понадобится.

→ Ссылка