【发布时间】:2021-09-27 06:58:16
【问题描述】:
我正在调用一个方法,该方法调用自身来爬过地形并创建区域。然而,当区域变大时,进程以堆栈溢出结束。通过强制代码屈服并花时间,它成功完成并爬取了我地图中的 3 个区域。然而,我使用的方法是产生每一帧,我不知道如何让它每 100 帧产生一次,导致它完成非常慢。这是我为提高可读性所做的伪代码:
public int timer = 0;
void Awake(){
StartCoroutine(crA);
}
public IEnumerator crA(){
//stuff
yield return StartCoroutine(crB());
//stuff that needs to happen only after crB finishes
}
public IEnumerator crB(){
timer = 0;
yield return StartCoroutine(crC());
}
public IEnumerator crC(){
//Crawiling code, crawls terrain to create a zone
if(x){ yield break;}
timer++;
//vv I WANTED IT TO YIELD ONLY IN HERE
if (timer ==100){
timer = 0;
yield return null;
}
//^^
yield return StartCoroutine(crC());
yield return StartCoroutine(crC());
yield return StartCoroutine(crC());
yield return StartCoroutine(crC());
yield return StartCoroutine(crC());
}
似乎 yield return startcoroutine 导致了产量,但我不知道改用什么。任何帮助将不胜感激。
【问题讨论】:
-
只要你调用
yield,它至少会产生一帧!那么如何避免它 -> 不使用yield而是使用不同的东西,例如Timer -
@derHugo 你能给我一个例子来说明我是怎么做到的吗?顺便说一句,我在这段代码中所做的是检查 3d 网格中的所有相邻单元格,西东北南上下,递归地,我不知道如果没有协程我该如何调整这个速度
-
另外,跳过
every 100 frames是什么意思.. 这不是协程的工作方式.. 协程每帧都会向前移动到下一个yield。如果你不yield它宁可在一帧内执行所有的事情,直到你yield某处。您的目标是在特定时间过后跳到下一帧吗? -
我认为拥有您的实际代码而不仅仅是伪代码会有所帮助;)
-
@derHugo 我想要的是每 100 次递归处理产生一次,因为没有它代码就会崩溃
标签: c# loops unity3d coroutine yield-return