Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Duda con JS

Iniciado por Eyemdy, Noviembre 07, 2017, 07:29:41 PM

Tema anterior - Siguiente tema
Hola tengo un problema con esta script
 

var mensaje : UI.Text;
var cuadro : GameObject;
var texto1 : String;
var player : GameObject;
var texto2 : String;
var letra : int;
var fin = ;
private var texto : String;
var playerSentado : GameObject;
 
function Start () {


Empezar();   

}
function Update () {


}
function Empezar (){
 if(fin == ){texto = texto1 +player.name + texto2;}
 if(fin == 1){texto = "Dialogo 2";}
//texto = texto1 +player.name + texto2;
StartCoroutine(dictado(texto));

 

}
function dictado (frase : String){

   
   mensaje.text ="";
   while ( letra < frase.length){
      mensaje.text += frase[letra];
      letra += 1;
      yield WaitForSeconds(0.2f);
   }
   while ( letra >= frase.length){

      yield WaitForSeconds(0.2f);
      mensaje.text = "";
      yield WaitForSeconds(1f);
      //cuadro.SetActive(false);
      
      player.SetActive(true);
      playerSentado.SetActive(false);
      texto = "";
      frase = "";
      letra = ;
      fin = 1;
      print(frase.Length);
      Empezar();
      
   }

}

 
Resulta que incluso poniendo todo a cero no me funciona cuando se ejecuta por segunda vez es decir la primera vez me hace letra a letra y cuando termina se ejecuta // while ( letra >= frase.length) // pero cuando vuelve a empezar otra vez en vez de ejecutar el primer while con la frase completa se vuelve loco y por ejemplo salen 2 letras y se borra luego otras dos y se borra y asi. supongo que el problema es que frase.length no se vuelve a cero por eso se vuelve loco.
 
como podria devolverla a cero? si esque es ese el problema que no lo se...

Noviembre 07, 2017, 10:04:59 PM #1 Ultima modificación: Noviembre 07, 2017, 10:07:58 PM por lightbug
Hola, no se si será lo que te pasa pero en el segundo while estás poniendo la frase = "", es decir su length es de 0 (igual que letra) por lo tanto se quedaria en el segundo while. Segundo punto, cuando poner simplemente Empezar() significa que se arranque una corrutina, es decir, arrancar una corrutina simplemente abre una más, pero la anterior sigue su curso, es decir ahora tenés dos corrutinas (en C# es así, no estoy seguro de JS). En C# por ej tenés que hacer "yield return StartCoruotine(....)" para que la primer corrutina espere a que termine la segunda, y así, (en tu caso abriría infinitas corrutinas).
 
En tu código no se porqué arrancas la misma corrutina recursivamente (es decir dentro de ella misma) y sumando que ambas estan a la vez, estancadas en el segundo while y todas modificando variables accesibles para ellas no me extrañaría que se comportara así como lo describís.
 
Probá hacer lo siguiente para ver si te hace lo mismo:  https://ghostbin.com/paste/oyf73
 
PD: se quedaría siempre en el dialogo dos, hay formas más prolijas de hacerlo, pero es más para ver si se te "vuelve loco" como antes

creo que simplemente tienes que detener la corrutina una vez haya completado el "dictado"... porque despues se ejecuta:
 

 while ( letra >= frase.length)

 
ahi esta el fallo ...es lo que dice @lightbug, esa corutina se queda en curso, y "abres" otra nueva ...
 
pon un stopCoroutine, o mejor, en vez de un "while"(mientras que esto sea >= que esto..... seguir haciendo estas cosas), pon un "if"(si esto es >=que esto.... hacer estas cosas (y luego se acaba la funcion)).
 

if ( letra >= frase.length)

 
porque el "while" ese se va ha quedar ejecutandose para siempre... :)

entonces si pusiera esto en el segundo while 
 

var mensaje : UI.Text;
var cuadro : GameObject;
var texto1 : String;
var player : GameObject;
var texto2 : String;
var letra : int;
var fin = 0;
private var texto : String;
var playerSentado : GameObject;
 
function Start () {


Empezar();   

}
function Update () {


}
function Empezar (){
 if(fin == 0){texto = texto1 +player.name + texto2;}
 if(fin == 1){texto = "Dialogo 2";}
//texto = texto1 +player.name + texto2;
StartCoroutine(dictado(texto));

 

}
function dictado (frase : String){

   
   mensaje.text ="";
   while ( letra < frase.length){
      mensaje.text += frase[letra];
      letra += 1;
      yield WaitForSeconds(0.2f);
   }
   while ( letra >= frase.length){

      yield WaitForSeconds(0.2f);
      mensaje.text = "";
      yield WaitForSeconds(1f);
      //cuadro.SetActive(false);
      
      player.SetActive(true);
      playerSentado.SetActive(false);
         
      "yield return StartCoruotine(....)"// ejemplo
         
      fin = 1;
      print(frase.Length);
      Empezar();
      
   }

}

 
 lo ejecutaria de nuevo desde el principio con un texto nuevo sin necesidad de declarar frase = 0 o lo que sea...

Cita de: Eyemdy date=1510236194entonces si pusiera esto en el segundo while 
   


Probaste el código que te pasé? te hace lo mismo que antes?

me salia error me decia 
 
 whose type could not be resolved because of a cycle. Explicitly declare the type of either one to break the cycle.
 
vale cambiare while por if yo creo que asi funcionara
 
gracias voy a probarlo ahora

Etiquetas: