如何检查变换是否到达其自己的原始位置


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)

但是,转换根本没有移动。

我希望变换移回其原始位置,然后在原始位置停止。

尽管对于Vector3==!=运算符仅使用0.00001的近似精度,但您将每帧移动大约movementSpeed * 0.017个单位的距离(取决于您的movementSpeed(,您仍然不可能有帧的位置正好位于0.00001阈值内!


正如评论中所说,您应该使用Vector3.MoveTowards,它可以防止任何超出的情况

计算当前和目标指定的点之间的位置,移动不超过maxDistanceDelta指定的距离。

然后,为了确保您真正达到originPos,而不仅仅是0.00001阈值,我将结合Vector3.DistanceMathf.Approximately

或者,您也可以使用Vector3.Equals

如果给定的向量恰好等于此向量,则返回true。

由于浮点不准确,对于本质上(但不完全(相等的向量,这可能会返回false。使用==运算符测试两个向量是否近似相等。

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);
}
}
}
}

相关内容

最新更新