Хотя для Vector3
операторы ==
и !=
используют только приблизительную точность 0.00001
, вы перемещаете каждый кадр на расстояние порядка movementSpeed * 0.017
единиц - в зависимости от вашего movementSpeed
- все же не исключено, что у вас никогда нет фрейма, в котором позиция находится именно внутри этого 0.00001
порога!
Как сказано в комментариях, вы должны скорее использовать Vector3.MoveTowards
, который предотвращает любые выбросы
Рассчитать позицию между точками, указанными в текущем и цели, не двигаясь дальше, чем расстояние, указанное maxDistanceDelta.
Затем, чтобы убедиться, что вы действительно достигли originPos
, а не только порога 0.00001
вокруг него, я бы объединил Vector3.Distance
и Mathf.Approximately
.
В качестве альтернативы вы также можете использовать Vector3.Equals
Возвращает true, если данный вектор точно равен этому вектору.
Из-за плавающей запятой неточности, это может вернуть false для vec торы, которые по существу (но не совсем) равны. Используйте оператор ==, чтобы проверить два вектора на приблизительное равенство.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveObjects : MonoBehaviour
{
public float movementSpeed;
private Vector3 originPos;
private void Start()
{
originPos = transform.position;
}
// Update is called once per frame
void Update()
{
if (DetectCollision.moveGate)
{
transform.position += Vector3.right * Time.deltaTime * movementSpeed;
}
else
{
if (!Mathf.Approximately(Vector3.Distance(transform.position, originPos), 0))
// if(transform.position.Equals(originPos)
{
transform.position = Vector3.MoveTowards(transform.position, originPos, Time.deltaTime * movementSpeed);
}
}
}
}