团结 - 协同程序在时间上变得不准确,想要绕过

时间:2017-01-27 19:54:33

标签: c# unity3d transform coroutine

我希望使用coroutines随时间移动一个对象。我希望从 A 点到 B 指向 2秒。为此,我使用了以下代码:

IEnumerator _MoveObjectBySpeed()
{
    while (TheCoroutine_CanRun)
    {
        if(myObject.transform.position.y <= UpperBoundary.position.y)
        {
            myObject.transform.position = new Vector3(myObject.transform.position.x,
                myObject.transform.position.y + Step, myObject.transform.position.z);

        }
        yield return new WaitForSeconds(_smoothness);
    }
    TheCoroutine_CanRun = true;
    moveAlreadyStarted = false;
}

并且Step的计算方式与

类似
    private void CalculateSpeed()
{
    Step = _smoothness * allDistance / timeToReachTop;
}

其中allDistance是底部和顶部边界之间的距离。

_smoothness是修正值。问题是,更大我得到这个值,更准确从下到上的时间。请注意,这里的小值意味着更平滑的移动。这个平滑度是协同程序在移动myObject之间等待的时间。 时间测量如下:

    void FixedUpdate()
{
    DEBUG_TIMER();
}

#region DEBUG TIME

public float timer = 0.0f;
bool allowed = false;
public void DEBUG_TIMER()
{

    if (Input.GetButtonDown("Jump"))
    {
        StartTimer();
    }
    if (myObject.transform.position.y >= UpperBoundary.position.y)
    {
        StopTimer();
        Debug.Log(timer.ToString());
        //timer = 0.0f;
    }
    if (allowed)
    {
        timer += Time.fixedDeltaTime;
    }
}
void StartTimer()
{
    timer = 0;
    allowed = true;
}
void StopTimer()
{
    allowed = false;
}
#endregion

结果是:

当我希望对象在 1秒下到达顶部并将_smoothness设置为 0.01 时,myObject占用的时间为到达顶部 1.67 秒。当_smoothness 0.2s 时,实际到达顶部的时间 1.04s

那为什么这么不准确以及如何让它正常工作?

1 个答案:

答案 0 :(得分:1)

  

这个平滑度是协同程序在移动myObject之间等待的时间

您所犯的错误是假设一个协同程序在执行前等待完美时间。相反,它可能在超时完成后在下一个上执行。

假设您想要平滑运动,您希望移动对象每个帧(例如,在使用'yield return null'的Update或co-routine中)。

注意:每个帧可能需要不同的持续时间(考虑144fps vs 15fps),你可以在Time.deltaTime中发现它。 https://docs.unity3d.com/520/Documentation/ScriptReference/Time-deltaTime.html