我希望使用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 。
那为什么这么不准确以及如何让它正常工作?
答案 0 :(得分:1)
这个平滑度是协同程序在移动myObject之间等待的时间
您所犯的错误是假设一个协同程序在执行前等待完美时间。相反,它可能在超时完成后在下一个帧上执行。
假设您想要平滑运动,您希望移动对象每个帧(例如,在使用'yield return null'的Update或co-routine中)。
注意:每个帧可能需要不同的持续时间(考虑144fps vs 15fps),你可以在Time.deltaTime中发现它。 https://docs.unity3d.com/520/Documentation/ScriptReference/Time-deltaTime.html