但是这段代码立即将对象移动到最高位置
当我使用非常慢的速度(例如 0.0001f)时。
你根本就没有在等待。无论变量有多低, while 循环都会尽可能快地执行。您应该在协程函数中执行此操作,然后等待yield
关键词yield return null
.
IEnumerator LiftObj(GameObject Obj)
{
float origianlPos = Obj.transform.position.y;
while (Obj.transform.position.y < origianlPos + liftOffset)
{
Obj.transform.position += Vector3.up * 0.0001f;
float newPos = Obj.transform.position.y;
newPos = Mathf.Clamp(newPos, newPos, newPos + liftOffset);
Obj.transform.position += Vector3.up * 0.0001f;
yield return null;
}
Debug.Log("Done Moving Up!");
}
然后移动它:
StartCoroutine(LiftObj(myGameObject));
甚至不确定这是否会按预期工作,因为您失踪了Time.delta
所以动作可能不顺畅。如果您只想从一个位置移动到另一个加班位置,请使用下面的示例代码:
IEnumerator LiftObj(GameObject playerToMove, Vector3 toPoint, float byTime)
{
Vector3 fromPoint = playerToMove.transform.position;
float counter = 0;
while (counter < byTime)
{
counter += Time.deltaTime;
playerToMove.transform.position = Vector3.Lerp(fromPoint, toPoint, counter / byTime);
yield return null;
}
}
从当前移动myGameObject
位置到Vector3(0, 5, 0)
in 4
秒:
StartCoroutine(LiftObj(myGameObject, new Vector3(0, 5, 0), 4));