团结 - 一切都冻结了#34; yield返回new WaitForSeconds(); "

时间:2018-05-30 13:24:54

标签: unity3d freeze coroutine

确定!此场景中的所有代码都在一个脚本和一个管理器对象中。 所有这些都是大约700行。所以我不能把它放在这里。 我测试了不同的东西:

  • 1)从android切换平台到 pc / mac
  • 2)测试以前的版本 团结(2017年以前和当前 on是2018.1)

他们都没有解决问题。 然后我改变了我怀疑导致问题的部分代码。 (他们都没有解决方案)。 然后我开始把Debug.Log()放到任何地方。所以我发现了冻结的地方。

这是代码:

    IEnumerator ShowSigns(int Button1State, int EqualState, int Button2State)
    {

        Debug.Log("ShowSigns");
        if (Button1State == 1)
        {
            OperationOneCorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        else if (Button1State == 2)
        {
            OperationOneIncorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        if (EqualState == 1)
        {
            EqualCorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        else if (EqualState == 2)
        {
            EqualIncorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        if (Button2State == 1)
        {
            OperationTwoCorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }
        else if (Button2State == 2)
        {
            OperationTwoIncorrectSign.GetComponent<CanvasGroup>().alpha = 1;
        }

        Debug.Log("BeforeWaiting");
        yield return new WaitForSeconds(0.3f);

        Debug.Log("AfterWaiting");
        OperationOneCorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        OperationOneIncorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        EqualCorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        EqualIncorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        OperationTwoCorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        OperationTwoIncorrectSign.GetComponent<CanvasGroup>().alpha = 0;
        state = GameState.CreateNewProblem;

        Debug.Log("EndSigns");
    }

我发现它冻结了这个:

        yield return new WaitForSeconds(0.3f);

很奇怪!!!

这是游戏的图片。

enter image description here 游戏是一个简单的游戏,显示2个数学短语,玩家应该选择更大或相等。 逻辑是这样的:

  • 1)制作新短语并将游戏状态更改为&#34; ChooseAnswer&#34;
  • 2)玩家按下3个按钮中的一个并检查答案,得分和其他事情发生变化,ShowSigns协程将在0.3秒后开始和结束。正如您在协程状态结束时所看到的那样,改变为&#34; CreateNewProblem&#34;。
  • 3)在CreateNewProblem检测到的Update中,NewProblem()函数的代码调用用于制作新短语,并在该游戏状态结束时更改为&#34; ChooseAnswer&#34;。

这个逻辑一遍又一遍地重复,直到时间到零。 a&#34;步骤&#34;通过任何正确和错误的答案,变量增加和减少1。而变量level = steps / 10决定了短语的难度。

游戏在%98上正常工作点击按钮。但通常情况下,它会在第20步之后冻结.21,23,27,34 ......非常随机。但总是在20岁之后,有些时候不会冻结,直到时间结束。并且总是在收益率回归之前。完全在同一条线上。

我读了很多问题和答案,但没有一个是有帮助的。我没有while循环,没有while(true),只要我知道并检查我的代码没有无限循环,在StopAllCoroutines ......什么都没有。我坚持了2天。 谢谢你们所有人的帮助。

OH,and Here Is the code file

1 个答案:

答案 0 :(得分:1)

冻结的原因是使用Random.Range来控制问题中代码linked中的while循环。在不使用while循环的情况下获取随机数的一种方法是将它们生成List,然后删除您使用的每个。{1}}。这可以防止Random.Range冻结Unity。