[英]How can I make the object move back to his original position after he reached the target?
[英]How can I move the object back to his parent position as child?
IEnumerator ThrowObject(Transform objectToMove, Transform toPosition, float duration)
{
Vector3 originPos = objectToMove.position;
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
Vector3 currentPos = objectToMove.position;
float time = Vector3.Distance(currentPos, toPosition.position) / (duration - counter) * Time.deltaTime;
objectToMove.position = Vector3.MoveTowards(currentPos, toPosition.position, time);
yield return null;
}
var naviParent = GameObject.Find("Navi Parent");
StartCoroutine(ThrowBack(objectToMove, naviParent.transform.position , duration));
}
IEnumerator ThrowBack(Transform objectToMove,Vector3 originalPosition , float duration)
{
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
Vector3 currentPos = objectToMove.position;
float time = Vector3.Distance(currentPos, originalPosition) / (duration - counter) * Time.deltaTime;
objectToMove.position = Vector3.MoveTowards(currentPos, originalPosition, time);
//yield return null essentially means "return here every frame"
yield return null;
}
}
游戏开始时 NAVI 是 Navi Parent 的孩子。 导航父位置设置为 0,0,0
NAVI 也在位置 0,0,0
现在 NAVI 开始在 ThrowObject 方法中移动到目标,当 NAVI 到达目标时,一个新的协程开始,NAVI 正在移动回他的父级:
var naviParent = GameObject.Find("Navi Parent");
但是当 NAVI 到达 Navi Parent 时,他的位置不在 0,0,0 :您可以看到 NAVI 没有回到 Navi Parent(玩家手)但他回到靠近它的位置。
现在 NAVI 位置是:X 0.002350773 Y 0.0007914092 Z 0.002649077
如果我自己将 NAVI 位置更改为 0,0,0,现在 NAVI 就在玩家手中,因为它应该是:
我希望当 NAVI 在 ThrowBack 中移回时,他将以 0,0,0 结束,而不是我必须将其改回 0,0,0
如果我在第二个协程结束后最终更改 NAVI,它看起来像 navi 更改位置,如跳跃或更改位置粗鲁,我希望它在 while 循环中平滑地移动回 0,0,0。
我认为这是因为你的柜台。 有时计数器的值大于持续时间,这可能会影响计算。 也使用Vectore.Lerp更好。 检查一下,看看你的问题是否得到解决。
private IEnumerator ThrowObject(Transform objectToMove, Transform toPosition, float duration)
{
Vector3 originPos = objectToMove.position;
float counter = 0;
while (objectToMove.position != toPosition.position)
{
counter += Time.deltaTime;
if(counter > duration)
{
counter = duration;
}
objectToMove.position = Vector3.Lerp(originPos, toPosition.position, counter / duration);
yield return null;
}
var naviParent = GameObject.Find("Navi Parent");
StartCoroutine(ThrowBack(objectToMove, naviParent.transform.position, duration));
}
private IEnumerator ThrowBack(Transform objectToMove, Vector3 originalPosition, float duration)
{
Vector3 originPos = objectToMove.position;
float counter = 0;
while (objectToMove.position != originalPosition)
{
counter += Time.deltaTime;
if (counter > duration)
{
counter = duration;
}
objectToMove.position = Vector3.Lerp(originPos, originalPosition, counter / duration);
yield return null;
}
}
我怀疑你的问题是:
float time = Vector3.Distance(currentPos, originalPosition) / (duration - counter) * Time.deltaTime;
objectToMove.position = Vector3.MoveTowards(currentPos, originalPosition, time);
您正在评估每帧的currentPos
,然后减少time
,最终,由于还应用了deltaTime
,当它接近目的地time
,这个time
变得非常小。
MoveTowards
的第三个参数是maxDistanceDelta
,我认为这是您尝试使用time
的目的,尽管变量名称。 但是,它旨在作为最大速度限制器。
尝试用以下代码替换上面的两个代码:
objectToMove.position = Vector3.MoveTowards(currentPos, originalPosition, Speed * Time.deltaTime);
或者,至少,让time
不小于某个小的正值(例如, time = Mathf.Max(time, 0.001f)
)
我的假设是,无论距离多远,您都试图在设定的时间内将对象移回父对象。
如果我是对的,你应该使用的方法是这个。
float duration = 1f;
float time = 0f;
while (time < 1)
{
time += Time.deltaTime / duration;
object.localPosition = Vector3.Lerp(object.localPosition, targetPosition, time);
yield return null;
}
这将以设定的持续时间将对象移动到新位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.