IEnumerators 不从 yield 语句继续

IEnumerators not continue from yield statement

所以我遇到了 IEnumerators 的问题,在选项函数的末尾有 yield return Talking call。当文本文件到达应该结束该选项的行时,谈话功能随后被设置为 yield return true 。但是选项功能不会从结束时的 yield return talking call 继续,即使 talking 函数 return 为真,它也会停止。

编辑:

所以问题是选项函数没有响应在函数末尾的 yield 语句中设置为 true 的对话函数。

我已经使用断点来确保选项不会被多次调用,并且谈话功能达到 yield return true。只是选项函数永远不会从 yield 语句继续。

我已经包含了以下两个函数,如果需要,我可以添加整个 c# 脚本和文本文件。

    IEnumerator Talking(string[] text_file, int line)
    {
        while (line != text_file.Length)
        {
            if (text_file[line].Split(' ')[0] == "Keyword")
            {
                var key = text_file[line].Split(' ')[1];
                switch (key)
                {
                    case "Option":
                        yield return Option(text_file, line);
                        break;
                    case "End":
                        End();
                        yield break;
                    case "Code":
                        line++;
                        Code(text_file[line]);
                        break;
                    default:
                        print("Keyword " + key + " not reconsised");
                        break;
                }
            }
            else if (text_file[line] == "End_Option")
            {
                line++;
                yield return true;
            }
            output_Text.DisplayText(text_file[line]);
            while (!controller.click)
            {
                yield return null;
            }
            line++;
        }
    }

    IEnumerator Option(string[] text_file, int line)
    {
        yield return new WaitForEndOfFrame();
        var options = 2;
        int option_start = line;
        int option_1 = 0;
        int option_2 = 0;
        line++;
        var split = text_file[line].Split('|');
        output_Text.Display_Options(split[0], split[1]);
        while (!controller.click)
        {
            yield return null;
        }
        line++;
        while (options != 0)
        {
            while (text_file[line] != "End_Option")
            {
                option_1++;
                line++;
            }
            line++;
            options--;
            while (text_file[line] != "End_Option")
            {
                option_2++;
                line++;
            }
            line++;
            options--;
        }
        while (output_Text.choice == 0)
        {
            yield return null;
        }
        if (output_Text.choice == 1)
        {
            output_Text.choice = 0;
            line = option_start + 1;
        }
        if (output_Text.choice == 2)
        {
            output_Text.choice = 0;
            line = option_start + 2 + option_1;
        }
        yield return Talking(text_file, line);
        line = option_start + 3 + option_1 + option_2;
        yield return true;
    }
}

枚举器在被枚举之前不会做太多事情。为了使您的 yield return Option(...) 正常工作,消费者必须检查枚举器并​​:枚举它。我想这不会发生。您也许可以在外部枚举器中执行此操作,即

foreach (var val in Option(text_file, line))
{
    yield return val;
}

(如果您坚持 IEnumerator 而不是 IEnumerable,则使用 while (inner.MoveNext())inner.Current 相同)

附带说明:您通常应该更喜欢通用类型的枚举器,即 IEnumerator<T> 用于某些特定的 T.

您的问题是产生对协程函数的调用,就像您在此处所做的那样

yield return Talking(text_file, line);

难道more-or-less只是要把协程当成普通函数来调用。我认为您正在寻找的行为是 运行ning Talking 作为当前 运行ning 协程中的协程。

要做到这一点,您需要做:

yield return StartCoroutine(Talking(text_file, line));

这将 运行 该函数作为自己的协程并等待它完成后再继续。

(这完全特定于 unity 处理 unity-coroutines 的方式,当然对于 c# IEnumerators 通常不是这样)