Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已解决-协同程序在WebGL中的行为异常_C#_Unity3d_Webgl_Coroutine - Fatal编程技术网

C# 已解决-协同程序在WebGL中的行为异常

C# 已解决-协同程序在WebGL中的行为异常,c#,unity3d,webgl,coroutine,C#,Unity3d,Webgl,Coroutine,我在我的WebGL游戏中遇到了协同程序的奇怪行为。我希望在循环中生成灯光,在迭代之间具有不同的延迟。最好的方法是制作一个协同程序,我就是这么做的,它在编辑器中运行得非常完美。该问题仅出现在web浏览器中-看起来协同程序完全不同步,例如一个灯光显示时间过长,然后消失,两个灯光同时显示,即使它们应该按顺序生成。在这一点上,我完全没有想法,因为据说协同程序正在WebGL中工作。此外,浏览器控制台不会显示任何错误,并且时间间隔打印正确,但生成无法正常工作 我尝试过的事情: 设置协同程序的恒定时间 不移

我在我的WebGL游戏中遇到了协同程序的奇怪行为。我希望在循环中生成灯光,在迭代之间具有不同的延迟。最好的方法是制作一个协同程序,我就是这么做的,它在编辑器中运行得非常完美。该问题仅出现在web浏览器中-看起来协同程序完全不同步,例如一个灯光显示时间过长,然后消失,两个灯光同时显示,即使它们应该按顺序生成。在这一点上,我完全没有想法,因为据说协同程序正在WebGL中工作。此外,浏览器控制台不会显示任何错误,并且时间间隔打印正确,但生成无法正常工作

我尝试过的事情:
  • 设置协同程序的恒定时间
  • 不移除使用过的对象(移除对象时最常出现的描述的奇怪现象,但这似乎只是时间关系的问题-一盏灯亮,另一盏灯灭)
  • 使用WaitForSeconds和WaitForSecondRealTime
  • 设置不同的targetFrameRate
  • 允许WebGL应用程序使用更多资源
以上这些都没有帮助。

脚本中的我的工作流: 通过按下按钮,可以调用函数StartGame(调用发生在GameManager脚本中),在该函数中启动协同程序(这发生在spawnlight脚本中)。在协同程序中,从LightPrefable实例化并计算时间间隔的每个循环开始。 还要注意的是,代码可能不是最有效的,因为这是一个非常短而且据说很快的项目。

我可以提供一些视频证据,以便将问题可视化。
提前感谢您的帮助

代码 在GameManager中:

public void startClick()
{
    inGame = true;
    inGameUI.gameObject.SetActive(true);
    spawnLights.Invoke("StartGame", 1);
}
在灯光下:

IEnumerator DisplayCoroutine()
{
    foreach (var letter in sequence)
    {
        yield return new WaitForSecondsRealtime(intervalTime);
        letterCounter++;
        lightComponent = lightPrefab.GetComponent<Light>();
        lightComponent.color = coloursDict[letter];
        Instantiate(lightPrefab, GenerateSpawnPosition(), lightPrefab.transform.rotation);
        Debug.Log("Curent interval: " + intervalTime);
        intervalTime = calculateInterval(letterCounter);
    }
    gameManager.Invoke("ShowGameOver", 4);
}

private float calculateInterval(int nucNumber)
{
    return (Mathf.Pow(difficultyFactor, nucNumber)) * maxInterval + minInterval;
}

public void StartGame()
{
    GenerateSequence(gameManager.sequenceLength);
    StartCoroutine(DisplayCoroutine());
}
IEnumerator DisplayCoroutine()
{
foreach(var字母顺序)
{
返回新的WaitForSecondRealTime(间隔时间);
字母计数器++;
lightComponent=lightPrefable.GetComponent();
lightComponent.color=colorsdict[字母];
实例化(lightprefable,GenerateSpawnPosition(),lightprefable.transform.rotation);
Log(“当前间隔:+间隔时间”);
间隔时间=计算间隔(字母计数器);
}
gameManager.Invoke(“ShowGameOver”,4);
}
专用浮点计算区间(整数编号)
{
返回值(Mathf.Pow(困难系数,数值))*maxInterval+minInterval;
}
公共无效StartName()
{
GenerateSequence(gameManager.sequenceLength);
start例程(DisplayCoroutine());
}

考虑使用固定的时间间隔来缩小问题范围。我们在WebGL中使用协同程序,与编辑器或其他平台相比没有任何奇怪的问题。@RetiredInja我以前做过,但现在重复了。虽然它可能会稍微平滑一些,但仍然不能正常工作-灯光会消失一小段时间,然后在另一个灯光出现或消失时再次出现。如果让人困惑的话,我可以提供一些视频来形象化这一点。更改Unity的版本有所帮助-从2018.4.32f1到2019.4.9f1