我想知道我应该如何转换到一个特定的点(不使用物理)。
目前,我让我的对象看目标位置:
transform.LookAt(m_TargetPos, UnityEngine.Vector3.up);然后我用一定的速度更新每个帧的位置:
transform.position += transform.forward * (m_Speed * Time.deltaTime);最后,我使用一个sqrMagnitude来知道转换是否到达了这个位置:
if ((transform.position - m_TargetPos).sqrMagnitude < 0.0025f) // 0.0025 = 0.05f * 0.05f
return true;我面临的问题是,有时实体超越目标位置,永远向前推进。
我应该如何编码条件,使它永远不会超出目标位置?
在此之前,非常感谢您。
发布于 2019-11-18 15:31:57
使用MoveTowards,避免过度使用:
计算当前和目标指定的点之间的位置,移动不超过maxDistanceDelta指定的距离。
transform.position = Vector3.MoveTowards(transform.position, m_TargetPos, m_Speed * Time.deltaTime);若要检查是否已达到此位置,只需使用==
if (transform.position == m_TargetPos)
return true;这具有1e-5的精度,因此它等于使用阈值为0.00001的Vector3.Distance
if(Vector3.Distance(transform.position, m_TargetPos) < 0.00001f)
return true;在这里,您可以定义一个更宽的阈值
if(Vector3.Distance(transform.position, m_TargetPos) < 0.0025f)
return true;或者是更精确的。
if(Vector3.Distance(transform.position, m_TargetPos) < 0.0000001f)
return true;取决于你的需要。
// TODO: either block concurrent routines with a bool flag
// TODO: or stop the running routine before starting a new one
StartCoroutine(MoveTo(targetPosition, speed));
...
private IEnumerator MoveTo(Vector3 targetPos, float speed)
{
var currentPos = transform.position;
var distance = Vector3.Distance(currentPos, targetPos);
// TODO: make sure speed is always > 0
var duration = distance / speed;
var timePassed = 0f;
while(timePassed < duration)
{
// always a factor between 0 and 1
var factor = timePassed / duration;
transform.position = Vector3.Lerp(currentPos, targetPos, factor);
// increase timePassed with Mathf.Min to avoid overshooting
timePassed += Math.Min(Time.deltaTime, duration - timePassed);
// "Pause" the routine here, render this frame and continue
// from here in the next frame
yield return null;
}
transform.position = targetPos;
// Something you want to do when moving is done
}https://stackoverflow.com/questions/58917580
复制相似问题