如何在 IEnumerator 函数中移动对象两次
How can I move a object twice in a IEnumerator function
我想在特定时间将我的对象从一个地方移动到另一个地方,过一会儿我想将它移动到另一个地方。我可以在一个 IEnumerator 函数中完成吗?
这是我的代码,顺便说一句,这里的开始是启动触发器,它工作正常。
void Start()
{
StartCoroutine(Begin());
}
IEnumerator Begin()
{
while (!start)
{
yield return null;
}
StartCoroutine(goDown());
}
IEnumerator goDown()
{
yield return new WaitForSeconds(62);
while ( transform.position.x < -1.4f
|| transform.position.y > -1.3f
|| transform.position.z < 9.33f)
{
if(transform.position.x < -1.4f)
{
transform.position = new Vector3(transform.position.x + Time.deltaTime * 0.6f,
transform.position.y, transform.position.z);
}
if (transform.position.y > 1.3f)
{
transform.position = new Vector3(transform.position.x,
transform.position.y - Time.deltaTime * 0.6f,
transform.position.z);
}
if (transform.position.z < 9.33f)
{
transform.position = new Vector3(transform.position.x ,
transform.position.y,
transform.position.z + Time.deltaTime * 0.6f);
}
yield return null;
}
yield return new WaitForSeconds(25);
while (transform.position.x > -8.79f
|| transform.position.y < 1.67f
|| transform.position.z < 9.86f)
{
if (transform.position.x > -8.79f)
{
transform.position = new Vector3(transform.position.x - Time.deltaTime * 0.6f, transform.position.y, transform.position.z);
}
if (transform.position.y < 1.67f)
{
transform.position = new Vector3(transform.position.x, transform.position.y + Time.deltaTime * 0.6f, transform.position.z);
}
if (transform.position.z < 9.86f)
{
transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z - Time.deltaTime * 0.6f);
}
yield return null;
}
}
我做到了,对象只能移动到第一个位置,不能移动到下一个位置。不知道有什么问题?
这是因为你的 while 循环和你的 if 条件不匹配:
|| transform.position.y > -1.3f
不同于
if (transform.position.y > 1.3f)
所以你的协程卡在第一个循环中,因为转换的 y
卡在 -1.3 和 1.3 之间。
作为sidenode,您可以将转换的当前目标分配给一个变量并使用Vector3.MoveTowards
来避免这种copy-paste错误:
IEnumerator goDown()
{
yield return new WaitForSeconds(62);
Vector3 goal = new Vector3(-1.4f, -1.3f, 9.33f);
while (transform.position != goal)
{
transform.position = Vector3.MoveTowards(transform.position, goal,
1.03f * Time.deltaTime);
yield return null;
}
yield return new WaitForSeconds(25);
goal = new Vector3(-8.79f, 1.67f, 9.86f);
while (transform.position != goal)
{
transform.position = Vector3.MoveTowards(transform.position, goal,
1.03f * Time.deltaTime);
yield return null;
}
}
我想在特定时间将我的对象从一个地方移动到另一个地方,过一会儿我想将它移动到另一个地方。我可以在一个 IEnumerator 函数中完成吗?
这是我的代码,顺便说一句,这里的开始是启动触发器,它工作正常。
void Start()
{
StartCoroutine(Begin());
}
IEnumerator Begin()
{
while (!start)
{
yield return null;
}
StartCoroutine(goDown());
}
IEnumerator goDown()
{
yield return new WaitForSeconds(62);
while ( transform.position.x < -1.4f
|| transform.position.y > -1.3f
|| transform.position.z < 9.33f)
{
if(transform.position.x < -1.4f)
{
transform.position = new Vector3(transform.position.x + Time.deltaTime * 0.6f,
transform.position.y, transform.position.z);
}
if (transform.position.y > 1.3f)
{
transform.position = new Vector3(transform.position.x,
transform.position.y - Time.deltaTime * 0.6f,
transform.position.z);
}
if (transform.position.z < 9.33f)
{
transform.position = new Vector3(transform.position.x ,
transform.position.y,
transform.position.z + Time.deltaTime * 0.6f);
}
yield return null;
}
yield return new WaitForSeconds(25);
while (transform.position.x > -8.79f
|| transform.position.y < 1.67f
|| transform.position.z < 9.86f)
{
if (transform.position.x > -8.79f)
{
transform.position = new Vector3(transform.position.x - Time.deltaTime * 0.6f, transform.position.y, transform.position.z);
}
if (transform.position.y < 1.67f)
{
transform.position = new Vector3(transform.position.x, transform.position.y + Time.deltaTime * 0.6f, transform.position.z);
}
if (transform.position.z < 9.86f)
{
transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z - Time.deltaTime * 0.6f);
}
yield return null;
}
}
我做到了,对象只能移动到第一个位置,不能移动到下一个位置。不知道有什么问题?
这是因为你的 while 循环和你的 if 条件不匹配:
|| transform.position.y > -1.3f
不同于
if (transform.position.y > 1.3f)
所以你的协程卡在第一个循环中,因为转换的 y
卡在 -1.3 和 1.3 之间。
作为sidenode,您可以将转换的当前目标分配给一个变量并使用Vector3.MoveTowards
来避免这种copy-paste错误:
IEnumerator goDown()
{
yield return new WaitForSeconds(62);
Vector3 goal = new Vector3(-1.4f, -1.3f, 9.33f);
while (transform.position != goal)
{
transform.position = Vector3.MoveTowards(transform.position, goal,
1.03f * Time.deltaTime);
yield return null;
}
yield return new WaitForSeconds(25);
goal = new Vector3(-8.79f, 1.67f, 9.86f);
while (transform.position != goal)
{
transform.position = Vector3.MoveTowards(transform.position, goal,
1.03f * Time.deltaTime);
yield return null;
}
}