Как я могу проверить, достигла ли трансформация своего исходного положения? - PullRequest
0 голосов
/ 15 марта 2020
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 == true)
        {
            transform.position += Vector3.right * Time.deltaTime * movementSpeed;
        }
        else
        {
            if (transform.position != originPos)
            {
                transform.position -= Vector3.right * Time.deltaTime * movementSpeed;
            }
        }
    }
}

Пробовал:

if (transform.position != originPos)

Но он продолжает двигаться без остановок влево.

Затем попытался:

if (Vector3.Distance (transform.position, originPos) <= 0)

Но тогда преобразование вообще не двигается.

Я хочу, чтобы преобразование вернулось в исходное положение, а затем остановилось в исходном положении.

1 Ответ

2 голосов
/ 15 марта 2020

Хотя для 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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...