Unity3d WaitForEndOffFrame替换WaitForNewFrame

Unity3d WaitForEndOffFrame替换WaitForNewFrame,unity3d,Unity3d,为了给一个大系统留出一些时间来完成所有加载等工作,建议采用以下策略 因此,我的想法是确保我已经等待了足够长的时间,以便加载所有内容,然后执行我自己的命令。现在让我们称它为CMD() void Start() { StartCoroutine( TakeYourTime() ); } IEnumerator TakeYourTime() { yield return new WaitForNewFrame(); yield return new WaitForNewFrame

为了给一个大系统留出一些时间来完成所有加载等工作,建议采用以下策略

因此,我的想法是确保我已经等待了足够长的时间,以便加载所有内容,然后执行我自己的命令。现在让我们称它为
CMD()

void Start()
{
    StartCoroutine( TakeYourTime() );
}

IEnumerator TakeYourTime()
{
   yield return new WaitForNewFrame();
   yield return new WaitForNewFrame();
   yield return new WaitForNewFrame();
   yield return new WaitForNewFrame();

   CMD();
}
但当然,Unity3D无法识别
WaitForNewFrame()

在谷歌搜索之后,我意识到只有
WaitForEndOfFrame()
可用,所以我在上面替换了它,认为它可以实现同样的效果,但我的
CMD()
没有生效

因此,我想知道这个现有命令是否与最初建议的命令不一样,或者我等待的时间不够长?

如果
CMD()
也是一个IEnumerator函数,您必须对它执行另一个
start例程()
函数,否则它将无法工作。根据现有信息,这是我唯一能想到的解释为什么
CMD()
无法启动的问题

如果在此之后有其他逻辑需要等待
CMD()
完成,则可以
返回
start例程()
调用暂停
TakeYourTime()
直到
CMD()
完成

void Start()
{
    StartCoroutine( TakeYourTime() );
}

IEnumerator TakeYourTime()
{
    yield return new WaitForEndOfFrame();
    yield return new WaitForEndOfFrame();
    yield return new WaitForEndOfFrame();
    yield return new WaitForEndOfFrame();

    yield return StartCoroutine(CMD());

    //Do the rest.
}

IEnumerator CMD() 
{
    //Do whatever.
}
如果
CMD()
不是IEnumerator函数,那么我为这个错误的答案道歉。您可以使用
Debug.Log()
调用进一步排除故障,以确定应用程序卡住的位置。我会把它们放在
CMD()

不过,从你的评论来看,我建议你做点别的

你提到,当你等待的时间更长时,它就起作用了。这意味着你只是在等待一些事情的完成,方法的触发没有问题

您应该这样做:

IEnumerator TakeYourTime()
{
    while(!otherThingIsFinished()) 
    {
        yield return new WaitForEndOfFrame();
    }
    CMD();
}
otherThingIsFinished()
应该是一个调用,以检查您等待的东西是否完成了它正在做的任何事情。您可以调用一个公共方法,该方法检查完成后设置的一些私有布尔值

void Start()
{
    StartCoroutine( TakeYourTime() );
}

IEnumerator TakeYourTime()
{
    yield return new WaitForEndOfFrame();
    yield return new WaitForEndOfFrame();
    yield return new WaitForEndOfFrame();
    yield return new WaitForEndOfFrame();

    yield return StartCoroutine(CMD());

    //Do the rest.
}

IEnumerator CMD() 
{
    //Do whatever.
}
你也可以让其他人直接调用这个方法,尽管这也不是最好的选择。这完全取决于你到底想做什么

   yield return null; 
是使方法在下一帧返回并继续的命令

但这不是一个好的实践,因为您无法知道是否需要一个、两个或更多帧

您应该对程序的流程有某种控制。如果某些操作很长且分布在多个帧上,请提供对协同程序的回调:

void Awake()
{
    StartCoroutine(Loading(CMD));
}

private void CMD(){ //Other actions }

private IEnumerator Loading (Action action)
{
     // Many long action with yield
     if(action != null) { action(); } 
}

非常感谢。事实上,我从你答案的第一部分学到了一些新的东西,所以这很好
CMD()
不是一个
IEnumerator
,我通过谷歌搜索
Unity
WaitForNewFrame
都找不到任何东西,所以我猜这个特定的命令已经不存在了(不再存在),但无论如何,我使用了
返回新的WaitForSeconds(5)
,它可以工作。不存在为NewFrae而欢呼的人。这就是为什么你找不到关于它的任何信息,也就是为什么这个答案提供了错误的方向。永远不要出于任何原因使用WaitForEndOffFrame。我的意思是修复WaitForNewFrame部分,因为它不存在。我为我在这方面的错误道歉@Jtech:如果您只是在等待其他操作完成,最好在
TakeYourTime()
函数中签入一个值,这样您就可以在尝试执行其余命令之前确保该操作已完成。@Polantaris+all:非常感谢大家。问题解决了。为新框架欢呼是绝对错误的。千万不要以任何理由使用它。WaitForEndOfFrame是绝对错误的。千万不要以任何理由使用它。