物体即使以非常低的速度也会立即移动到新的位置
本文关键字:移动 位置 速度 非常低 | 更新日期: 2023-09-27 18:17:50
我想把一个对象慢慢地从他的原始位置移动到更高一点的位置,但这段代码立即将对象移动到最高的位置,即使我使用非常慢的速度,如0.0001f。我在另一个代码中调用LiftObj() 1次,我告诉它运行,直到它达到liftOffset。这段代码有什么问题?
void 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;
}
,但这段代码立即将对象移动到最高位置当我使用非常慢的速度,比如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;
}
}
在4
秒内从当前myGameObject
位置移动到Vector3(0, 5, 0)
:
StartCoroutine(LiftObj(myGameObject, new Vector3(0, 5, 0), 4));
你在错误的地方使用了while循环。
While循环在一帧内继续执行,只要语句为真。这意味着无论你的星等乘数有多低(0.001f),它都需要在同一帧中进行更多的迭代才能达到目标。
你应该检查每一帧对象是否已经到达目标,如果它还没有应用转换。