Попробуйте поместить свой физический код в функцию FixedUpdate()
, которая построена для расчета физики. тогда, если он отстает, вы можете изменить Fixed Timestep
в настройках физики.
Фиксированный временной шаг: Независимый от частоты кадров интервал, который определяет, когда выполняются физические вычисления и события FixedUpdate ().
https://docs.unity3d.com/Manual/class-TimeManager.html
EDIT
этот код:
if (Physics.Raycast (ray, out hit, Mathf.Infinity))
проверяет, попал ли лучевой поток в что-то, поэтому, когда указатель выходит из сферы, больше нечего ударить, поэтому условие if возвращает false, и вы не можете его переместить, чтобы решить проблему, добавьте большой квад или плоскость как прислушайтесь к своей камере и убедитесь, что она идеально заполняет обзор камеры, и что она скрывается за всеми остальными элементами сцены.
Вы также можете сделать сценарий, который установит этот план для вас.
РЕДАКТИРОВАТЬ 2
В качестве другого подхода к решению проблемы вы можете использовать flags .
Добавьте это к своей камере или отредактируйте в соответствии со своими потребностями.
public class DragObjects : MonoBehaviour
{
Camera thisCamera;
private Transform DraggingObject;
bool DraggingFlag = false;
RaycastHit raycast;
Ray ray;
Vector3 deltaPosition;
void Start()
{
thisCamera = GetComponent<Camera>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
ray = thisCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out raycast, Mathf.Infinity))
{
DraggingObject = raycast.collider.transform;
DraggingFlag = true;
deltaPosition = thisCamera.ScreenToWorldPoint (Input.mousePosition) - DraggingObject.position;
}
}
else if (Input.GetMouseButton(0))
{
if (DraggingFlag)
{
DraggingObject.position = new Vector3 (thisCamera.ScreenToWorldPoint (Input.mousePosition).x - deltaPosition.x, thisCamera.ScreenToWorldPoint (Input.mousePosition).y - deltaPosition.y, DraggingObject.position.z);
}
}
else if (Input.GetMouseButtonUp(0))
{
DraggingFlag = false;
}
}
}
Не забудьте обналичить ваш Camera.main
в переменной в начале, потому что он не работает и делает это в фоновом режиме:
GameObject.FindGameObjectsWithTag("MainCamera").GetComponent<Camera>();