Así que tengo un problema con IEnumerators con la llamada de retorno de rendimiento al final de la función de opciones. Luego, la función de conversación se configura para que produzca un retorno verdadero cuando el archivo de texto llega a una línea que debería finalizar la opción. Pero la función de opciones no continúa desde la llamada de conversación de devolución de rendimiento al final y simplemente se detiene aunque la función de conversación devuelve verdadero.
Ediciones:
Entonces, el problema es que la función de opciones no responde a la función de conversación que se establece en verdadero en la declaración de rendimiento al final de la función.
He usado puntos de interrupción para asegurarme de que las opciones no se llamen varias veces y que la función parlante alcance el retorno de rendimiento verdadero. Solo la función de opciones nunca continúa desde la declaración de rendimiento.
He incluido las dos funciones a continuación. Puedo agregar todo el script c# y el archivo de texto si es necesario.
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; } }Un enumerador no hace mucho hasta que es enumerado. Para que su yield return Option(...) funcione, el consumidor tendría que verificar el enumerador y: enumerarlo. Supongo que eso no está sucediendo. Quizás podría hacer eso en su enumerador externo, es decir,
foreach (var val in Option(text_file, line)) { yield return val; } (O lo mismo usando while (inner.MoveNext()) e inner.Current si insiste en IEnumerator en lugar de IEnumerable )
Como nota al margen: por lo general, debe preferir enumeradores tipificados genéricos, es decir, IEnumerator<T> para algunos T específicos.
Su problema es generar una llamada a una función coroutine como lo está haciendo aquí
yield return Talking(text_file, line); Es más o menos solo llamar a la rutina como una función regular. El comportamiento que creo que está buscando es ejecutar Talking como una rutina desde su rutina actual.
Para hacer eso tendrías que hacer:
yield return StartCoroutine(Talking(text_file, line));Lo cual ejecutará la función como su propia rutina y esperará a que termine antes de continuar.
(Esto es completamente específico de la forma en que Unity maneja las corrutinas de Unity y, por supuesto, no es cierto en general para c# IEnumerators)