Ваша проблема неправильно фиксируется, простое исправление было бы:
if (Input.GetMouseButton(0))
{
Ray currentTouchPos = movementCam.ScreenPointToRay(Input.mousePosition);
Vector2 direction = currentTouchPos.origin - firstTouchPos.origin;
float distance = Vector3.Distance(transform.position, Vector3.zero);
targetPosition = (Vector3)(playerPos + direction * speed);
if (targetPosition.sqrMagnitude > radius * radius) //if our calculated position is greater than the radius...
targetPosition = targetPosition.normalized * radius; //set our calculated position to be exactly on the radius.
}
Дрожание было вызвано тем, что ваш объект покинул радиус одного кадра, а в следующем кадре был бы зафиксирован обратно к радиусу,только для того, чтобы попытаться снова выйти за пределы радиуса в следующем кадре.
Таким образом удаляется троичный оператор, что означает, что он будет вести себя одинаково по всем кадрам, а не переключаться между зажимом и перемещением каждого кадра.
Вот несколько дополнительных советов по этой проблеме, как только вы исправите вышеуказанную проблему:
Вы должны умножить speed и followDelay на time.deltaTime, чтобы сгладить их по кадрамправильно.
Вы, вероятно, должны применять движение камеры во время LateUpdate () вместо Update (), LateUpdate () происходит после всех ваших обновлений, что может происходить во время перемещения объектов Update () до и послеВаш код камеры вызывается, заставляя его вести себя немного непоследовательно от кадра к кадруМне, применение движения в LateUpdate () к камере означает, что ваша камера перемещается только тогда, когда все ваши объекты «обосновались» на своем месте после их обновления, что делает ее более последовательной.
Кроме того, вы технически используете Lerp() здесь не так, это не должно вызывать дрожание, но это не совсем то, как следует использовать lerp.Вы уверены, что не хотите использовать Vector3.MoveTowards ()?