繁体   English   中英

作为孩子,我如何将对象移回他的父位置?

[英]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 Parent 位于位置 0,0,0

NAVI 也在位置 0,0,0

NAVI 是 Navi Parent 的孩子,NAVI 也在位置 0,0,0

现在 NAVI 开始在 ThrowObject 方法中移动到目标,当 NAVI 到达目标时,一个新的协程开始,NAVI 正在移动回他的父级:

var naviParent = GameObject.Find("Navi Parent");

但是当 NAVI 到达 Navi Parent 时,他的位置不在 0,0,0 :您可以看到 NAVI 没有回到 Navi Parent(玩家手)但他回到靠近它的位置。

靠近玩家手 Navi Parent

现在 NAVI 位置是:X 0.002350773 Y 0.0007914092 Z 0.002649077

如果我自己将 NAVI 位置更改为 0,0,0,现在 NAVI 就在玩家手中,因为它应该是:

NAVI 应该是 0,0,0,但我改变了它

我希望当 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM