Unity DragNDrop 3d объектов

изучаю unity и хочу реализовать dran and drop систему для 3d объектов, иcпользую raycast, все работает, объект перетаскивается, однако при быстром перемещении мыши объект , как-будто слетает. Для больше понимания проблемы оставляю ссылку на видео

  public class DragAndDrop : MonoBehaviour
{
    Ray ray;
    RaycastHit hit;
    private void Start()
    {
        
    }
    private void Update()
    {
        if (Input.GetMouseButton(0))
        {
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(ray, out hit))
                {
                if (hit.collider.gameObject.GetComponent<Selectable>() != null)
                    {
                    hit.collider.gameObject.transform.position = new Vector3(hit.point.x, hit.point.y, hit.collider.gameObject.transform.position.z);
                    print("Координаты: " + hit.point + " " + "Объект: " + hit.collider.gameObject.name);
                    }
                else
                    {
                        print("Это не куб");
                    }
                }
        }
    }
}

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

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

Проблема в этой строчке: if (hit.collider.gameObject.GetComponent<Selectable>() != null). Пока у вас нажата ЛКМ, вы пытаетесь получить компонент, но, если его нет, то двигать нечего и ничего не происходит.

Можете закэшировать объект, который пытаетесь получить и обнулять его, когда кнопка мыши будет отпущена. Таким образом вы не будете каждый кадр делать вызов GetComponent, а будете брать объект из кэша, если он существует.

Также, вместо GetComponent<Selectable>() != null можете использовать TryGetComponent, который вернет и true, когда компонент есть и сам компонент

→ Ссылка