Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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# Couroutine不允许我更改unity3d中的文本_C#_Unity3d_Text_Coroutine - Fatal编程技术网

C# Couroutine不允许我更改unity3d中的文本

C# Couroutine不允许我更改unity3d中的文本,c#,unity3d,text,coroutine,C#,Unity3d,Text,Coroutine,在这里,我试图打开一个菜单作为一个预置(它工作得非常好),然后用一个协同程序(什么不工作)每秒更新预置中的一个文本元素 public void openChestsMenu(游戏对象窗口){ GameObject chestsMenu=实例化(Resources.Load(“预置/接口/箱子菜单”))为GameObject; chestsMenu.transform.SetParent(GameObject.FindGameObjectWithTag(“Canvas”).transform,fa

在这里,我试图打开一个菜单作为一个预置(它工作得非常好),然后用一个协同程序(什么不工作)每秒更新预置中的一个文本元素

public void openChestsMenu(游戏对象窗口){
GameObject chestsMenu=实例化(Resources.Load(“预置/接口/箱子菜单”))为GameObject;
chestsMenu.transform.SetParent(GameObject.FindGameObjectWithTag(“Canvas”).transform,false);
更新测试菜单(窗口);
start例程(StartTimer(窗口));
}
私有void更新测试菜单(游戏对象窗口){
System.TimeSpan TimeSpan=GameManager.playerData.getTimeLeftForNewChest();
Text[]Text=window.GetComponentsInChildren();
text[0].text=GameManager.playerData.getChests(0.ToString()+“/4”;
text[1]。text=timeSpan.Hours+:“+timeSpan.Minutes+”:“+timeSpan.Seconds;
}   
IEnumerator StartTimer(游戏对象窗口){
isChestMenuActive=true;
System.TimeSpan TimeSpan;
Text[]timerText=window.GetComponentsInChildren();
while(正在进行中){
timeSpan=GameManager.playerData.getTimeLeftForNewChest();
更新测试菜单(窗口);
GameManager.log(timeSpan.Hours+”:“+timeSpan.Minutes+”:“+timeSpan.Seconds);
//timerText.text=timeSpan.Hours+“:”+timeSpan.Minutes+“:”+timeSpan.Seconds;
返回新的WaitForSeconds(1);
}
}
所有调用的函数都返回正确的值,当我打开菜单时,正确的值被正确加载,但从未更新。当我记录我试图更新的文本时,correctvalue每秒钟都会写入控制台,但预置中的文本不会更新


我尝试了很多不同的方法来解决这个问题,谁能告诉我错误在哪里

只是试过你说的,但仍然不起作用。慢慢地,我开始觉得团结有问题。不管我怎么尝试,我都不能从协同程序中更改文本!这没有任何意义。好吧,我刚才看到使用的referencei链接到了预置中的文本组件。但是它是否也应该改变预设的实际实例中的文本元素呢?我完全按照你说的做了。我为脚本中的文本声明了一个公共变量,上面的代码位于其中,并将refreference设置为预置中的text元素。它适用于预制件,但不影响其实例。当我尝试从编辑器实例化预置并将引用设置为实例化菜单时,当我从HIRACHY中删除菜单时,引用会自动删除。我应该用什么来设置公共变量呢?使用coroutine只是为了显示一个标志,并在“update”中用这个标志来更新文本。我认为代码中存在问题。您的
text
timerText
变量与使用WindowGameObject派生的变量相同。该值可能被覆盖。只是尝试了你所说的,但仍然不起作用。慢慢地,我开始觉得团结有问题。不管我怎么尝试,我都不能从协同程序中更改文本!这没有任何意义。好吧,我刚才看到使用的referencei链接到了预置中的文本组件。但是它是否也应该改变预设的实际实例中的文本元素呢?我完全按照你说的做了。我为脚本中的文本声明了一个公共变量,上面的代码位于其中,并将refreference设置为预置中的text元素。它适用于预制件,但不影响其实例。当我尝试从编辑器实例化预置并将引用设置为实例化菜单时,当我从HIRACHY中删除菜单时,引用会自动删除。我应该用什么来设置公共变量呢?使用coroutine只是为了显示一个标志,并在“update”中用这个标志来更新文本。我认为代码中存在问题。您的
text
timerText
变量与使用WindowGameObject派生的变量相同。该值可能会被覆盖。
public void openChestsMenu(GameObject window) {
    GameObject chestsMenu = Instantiate (Resources.Load ("Prefabs/Interfaces/Chests Menu")) as GameObject;
    chestsMenu.transform.SetParent (GameObject.FindGameObjectWithTag ("Canvas").transform, false);
    updateChestMenu (window);

    StartCoroutine (StartTimer (window));
}

private void updateChestMenu (GameObject window) {
    System.TimeSpan timeSpan = GameManager.playerData.getTimeLeftForNewChest ();

    Text[] texts = window.GetComponentsInChildren<Text> ();

    texts[0].text = GameManager.playerData.getChests(0).ToString() + "/4";
    texts [1].text = timeSpan.Hours + " : " + timeSpan.Minutes + " : " + timeSpan.Seconds;
}   

IEnumerator StartTimer(GameObject window) {
    isChestMenuActive = true;
    System.TimeSpan timeSpan;
    Text[] timerText = window.GetComponentsInChildren<Text> ();

    while (isChestMenuActive) {
        timeSpan = GameManager.playerData.getTimeLeftForNewChest ();
        updateChestMenu (window);
        GameManager.log (timeSpan.Hours + " : " + timeSpan.Minutes + " : " + timeSpan.Seconds);
        //timerText.text = timeSpan.Hours + " : " + timeSpan.Minutes + " : " + timeSpan.Seconds;

        yield return new WaitForSeconds (1);
    }
}