Noticias

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

[Ayuda] RunTimeAnimatorController

Iniciado por Null, Enero 24, 2017, 03:08:33 AM

Tema anterior - Siguiente tema
Hola, qué tal?
 
Tengo un problema con los animator controller, y es que tengo a un player (el cual es un sprite) que tiene que evolucionar, y para eso he creado varios animator controller y se los voy cambiando de la siguiente manera,

según los puntos que tiene para "evolucionar" :
 

private Animator _anim;
public RunTimeAnimatorController _stage2Controller;
public RunTimeAnimatorController _stage3Controller;
public RunTimeAnimatorController _stage4Controller;
private void Awake() {
  _anim = GetComponent<Animator>();
}
private void Update() {
  if (/* Puntos de evolución >= 10 */) {
    _anim.runtimeAnimatorController = _stage2Controller;
  }
  if (/* Puntos de evolución >= 20 */) {
    _anim.runtimeAnimatorController = _stage3Controller;
  }
  if (/* Puntos de evolución >= 30 */) {
    _anim.runtimeAnimatorController = _stage4Controller;
  }
}

 
Y bueno, al pasar al stage 2, evoluciona correctamente y las animaciones se reproducen bien...

Pero es a partir del stage 2 que al volver a evolucionar, lo hace bien, PERO sin reproducir las animaciones.
 
Ejemplo


Qué hago mal?

Gracias 

Enero 24, 2017, 03:57:24 AM #1 Ultima modificación: Enero 24, 2017, 03:59:13 AM por lightbug
Hola Null, se me hace que lo que esta mal son los if's fijate que cuando estas en stage 3 se cumple stage2 y stage3. Cuando estas en stage4 se cumple 2, 3 y 4, y asi... necesitas usar algo asi:
 

if(puntos <= valor_stage1 )
{
   stage1;                    
}else if(puntos <= valor_stage2)   //entre 1 y 2
{
stage2;
}else if(puntos <= valor_stage3){   //entre 2 y 3
stage3;
} else if(...)....

 
El problema creo que esta en que los cambias directamente, entonces cuando se da la condicion al salir de los if's el animator ya los cambio por otros(q cumplian stages viejos) y cuando se queda con el stage nuevo  se debe reiniciar el clip o algo asi supongo.

Buenas, por que no intentas con esto.
 
 
 

var stage = score / 1000; // Cada mil puntos stage incrementa.
switch(stage)
{
    case 0: break;
case 1: break;
case 2: break;
default: break;
}

 
de esta manera seguro no fallará.

Febrero 11, 2017, 01:07:15 AM #3 Ultima modificación: Febrero 11, 2017, 12:42:16 PM por pioj
Cita de: Null date=1485223713Hola, qué tal?
   
   
      Tengo un problema con los animator controller, y es que tengo a un player (el cual es un sprite) que tiene que evolucionar, y para eso he creado varios animator controller y se los voy cambiando de la siguiente manera,
      según los puntos que tiene para "evolucionar" :
   
   

private Animator _anim;
public RunTimeAnimatorController _stage2Controller;
public RunTimeAnimatorController _stage3Controller;
public RunTimeAnimatorController _stage4Controller;
private void Awake() {
  _anim = GetComponent<Animator>();
}
private void Update() {
  if (/* Puntos de evolución >= 10 */) {
    _anim.runtimeAnimatorController = _stage2Controller;
  }
  if (/* Puntos de evolución >= 20 */) {
    _anim.runtimeAnimatorController = _stage3Controller;
  }
  if (/* Puntos de evolución >= 30 */) {
    _anim.runtimeAnimatorController = _stage4Controller;
  }
}

   
      Y bueno, al pasar al stage 2, evoluciona correctamente y las animaciones se reproducen bien...
      Pero es a partir del stage 2 que al volver a evolucionar, lo hace bien, PERO sin reproducir las animaciones.
   
   
      Ejemplo
      Qué hago mal?
      Gracias 


Te hacia falta los limites
 

if (x > 10 && x < 20) {
    Accion 1;
} Else if (x > 20  && x < 30) {
    Accion 2;
}
private Animator _anim;
public RunTimeAnimatorController _stage2Controller;
public RunTimeAnimatorController _stage3Controller;
public RunTimeAnimatorController _stage4Controller;
private void Awake() {
    _anim = GetComponent < Animator > ();
}
private void Update() {
    if ( /* Puntos de evolución >= 10  && puntos de evolucion <20 */ ) {
        _anim.runtimeAnimatorController = _stage2Controller;
    }
    if ( /* Puntos de evolución >= 20 && puntos de evolucion <30 */ ) {
        _anim.runtimeAnimatorController = _stage3Controller;
    }
    if ( /* Puntos de evolución >= 30 && puntos de evolucion <40 */ ) {
        _anim.runtimeAnimatorController = _stage4Controller;
    }
}

 
 

Buenas.

Otra recomendación que yo te haría, es que uses variables de control para asignar el AnimatorController en un único frame.

Según tu código, al estar la condicional en el Update, está comprobando y asignando continuamente 60 veces por segundo...

Algo así, solo se cambiaría la animación una única vez en el frame adecuado y no necesitas comprobar limites superiores:
 

int puntosEvolucion = 0;
int nivelEvolucion = 0;
void Update()
{
    if (puntosEvolucion >= 10 && nivelEvolucion == 0)
    {
        nivelEvolucion = 1;
        _anim.runtimeAnimatorController = _stage2Controller;
    }
    if (puntosEvolucion >= 20 && nivelEvolucion == 1)
    {
        nivelEvolucion = 2;
        _anim.runtimeAnimatorController = _stage3Controller;
    }
.
.
.
}

 
Por rizar el rizo, podrías tener las animaciones en un Array (matriz, arreglo, lista...) y puedes asignarlos usando nivelEvolucion como indice y gestionar las animaciones desde el inspector, en vez de desde el cógido.
 
No sé si me explico bien...

Espero que te sirva.
 
Un saludo.

Cita de: Alejandro Navarro date=1486816070Buenas.

      Otra recomendación que yo te haría, es que uses variables de control para asignar el AnimatorController en un único frame.

      Según tu código, al estar la condicional en el Update, está comprobando y asignando continuamente 60 veces por segundo...

      Algo así, solo se cambiaría la animación una única vez en el frame adecuado y no necesitas comprobar limites superiores:
   
   

int puntosEvolucion = 0;
int nivelEvolucion = 0;
void Update()
{
    if (puntosEvolucion >= 10 && nivelEvolucion == 0)
    {
        nivelEvolucion = 1;
        _anim.runtimeAnimatorController = _stage2Controller;
    }
    if (puntosEvolucion >= 20 && nivelEvolucion == 1)
    {
        nivelEvolucion = 2;
        _anim.runtimeAnimatorController = _stage3Controller;
    }
.
.
.
}

   
      Por rizar el rizo, podrías tener las animaciones en un Array (matriz, arreglo, lista...) y puedes asignarlos usando nivelEvolucion como indice y gestionar las animaciones desde el inspector, en vez de desde el cógido.
   
   
      No sé si me explico bien...

      Espero que te sirva.
   
   
      Un saludo.
   


Ah muy buen punto, yo suelo usar un condicional dentro para esos casos, algo asi:
 

if(puntos <= valor_stage1 )
{  
  if(controller != C1)
     controller == C1;      
                       
}else if(puntos <= valor_stage2)
{
if(controller != C2)
     controller == C2;
}else if(...

 
 
 
 

Etiquetas: