Noticias

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

Problemillas con animaciones y scripts

Iniciado por Rouless, Julio 23, 2015, 03:24:59 PM

Tema anterior - Siguiente tema
Muy buenas a todos.Os explico mi situación. Estoy haciendo un clon de mario bross (bueno no exactamente un clon pero en cuanto a mecanicas si) y que no consigo hacer que funcione el bloque que te da el power-up (hay que decir que programando acabo de empezar asique soy bastante noob).La manera en la que lo tengo montado es lo siguiente: 
   //Variables Publicas (visibles en el inspector)
public GameObject player;
public Collider2D player_c;

//Variables privadas
private Animator anim;
private PlayerLife lf;
private bool touch = true; //debido a problemas de reproduccion de animacion cuando se llama desde el evento
               //de frame, utilizamos una booleana desde update

//Inicializacion de las variables
void Start () {
   anim = gameObject.GetComponent<Animator> ();
   lf = player.GetComponent<PlayerLife> ();

}

void Update () {
   if (touch == true) {
      anim.SetBool ("bltouched",true);
      PlayerLife.estado = 2;
   }
}

//Al recibir colision
void OnCollisionEnter2D (Collision2D player_c) {
#if UNITY_EDITOR
   Debug.Log ("Caja tocada"); //comprobamos por consola que la colision se efectua
//   Debug.Log (bltouched);
#endif
   touch = true;
//      Invoke ("NormalizarBloque", 10);
//      PlayerLife.estado = 2;
}


void NormalizarBloque () {
   anim.SetBool ("blistouched", false);
}

}
Lo que tengo en comentarios es la antigua manera que utilizaba para reproducir la animacion, pero me dijeron que utilizando eventos de frame (en este caso oncollisionenter2d) reproducir animaciones suele llevar a errores por lo que lo puse en comentarios y utilize una booleana en update para hacerlo, pero aun así me da el mismo error:La fucking animacion no funciona. Me explico, la animacion empieza como a parpadear (la animacion es un cambio de color del sprite). Al principio pensaba que era porque la booleana bltouched volvia a false demasiado rapido pero despues de provarlo con un invoke con 10 segundos de retraso veo que pasa lo mismo. Luego intento hacerlo con solo un state y la animacion en play once y me sigue pasando el mismo error.  Este es uno de los problemas, pero esque luego tengo otro    // Update is called once per frame
void Update () {

   if (estado == 2) {
      //Estado con piruleta
   }

   if (estado == 1) {
      //Estado sin piruleta
   }

   if (estado == 0) {
      Application.LoadLevel ("GameOvah");
   }
}
Un script que llevaria el contador de vidas por asi decirlo (obviad el GameOvah xd)y luego otro codigo para lanzar la piruleta:

public GameObject piruleta;
public GameObject player;

public PlayerLife scr;

// Use this for initialization
void Start () {
   scr = gameObject.GetComponent<PlayerLife>();
}

 //Update is called once per frame
void Update () {
   if (PlayerLife.estado == 2 && Input.GetButtonDown ("Fire1")) {
      Instantiate (piruleta, transform.position, transform.rotation);
   }
}
}
Cual es el problema? Pues que incluso antes de tocar la box que me cambiaria el estado a 2, es decir que me daria la piruleta; puedo lanzar piruletas.
Por otro lado, cuando lanzo una piruleta, esta se instancia, avanza lo que parece ser una unidad (no he mirado exactamente cuanto) y luego desaparece así sin mas. Peeeero es que para colmo, cuando tiro una piruleta, tambien hace avanzar el player (la misma distancia que avanza la piruleta) hasta que la piruleta desaparece. Por si sirve de algo, el prefab de la piruleta lleva el siguiente script :

public Vector2 piru;
public Collider2D blrompible;

// Update is called once per frame
void FixedUpdate () {
transform.Translate (piru);
   }

void OnCollisionEnter2D (Collision2D blrompible) {
   Destroy (gameObject);
}
}
Con este script hago que la piruleta avance hacia la derecha y ademas que si se encuentra con un bloque rompible pues que se destruya (ahora que pienso, deberia ser con cualquier colision pero bueno ese no es el problema), ademas el prefab lleva una animacion de la piruleta girando. Espero haber sido lo más claro posible y que podais aportarme algo de ayuda que llevo desde ayer intentándolo y no hay manera. Un saludo y muchisimas gracias de antemano!!

Julio 23, 2015, 06:08:41 PM #1 Ultima modificación: Julio 23, 2015, 06:08:57 PM por ftejada
A ver.... tengo unas dudas y no termino de entender cual es el problema para poder ayudarte..... de todos modos sin entender mucho te comento algoEn este codigo pones lo siguiente:
void Update () {
   if (touch == true) {
      anim.SetBool ("bltouched",true);
      PlayerLife.estado = 2;
   }
cuando en realidad creo que deberias hacer
void Update () {
   if (touch == true) {
      anim.SetBool ("bltouched",true);
      lf.estado = 2;                    
   }

Perdona que siga en otro mensaje pero es que no se que problema hay que no me dejaba seguir escribiendo en el mensaje anterior.... Como te decia debes tener en cuenta que la variable "lf" es la que digamos "contiene" el script PlayerLife.... que lo obtienes en la funcion start() con el GetComponent<> Despues en el siguiente codigo haces los if(estado ==...) pero los dos primeros no hacen nada..... ¿Eso es asi? En teoria si haces una comprobacion como un if() es para algo.... p
// Update is called once per frame
void Update () {

   if (estado == 2) {
      //Estado con piruleta
   }

   if (estado == 1) {
      //Estado sin piruleta
   }

   if (estado == 0) {
      Application.LoadLevel ("GameOvah");
   }
}
 Y en el codigo de "lanzar la piruleta" creo que vuelves a cometer el mismo error
// Use this for initialization
void Start () {
   scr = gameObject.GetComponent<PlayerLife>();
}

 //Update is called once per frame
void Update () {
   if (PlayerLife.estado == 2 && Input.GetButtonDown ("Fire1")) {
      Instantiate (piruleta, transform.position, transform.rotation);
   }
}
Obtienes el script PlayerLife y lo "almacenas en la variable src..... pero despues no trabajas con esa variable src.... que en realidad es la que contiene la referencia al script por decirlo de algun modo...Deberias de hacerlo asi
// Use this for initialization
void Start () {
   scr = gameObject.GetComponent<PlayerLife>();
}

 //Update is called once per frame
void Update () {
   if (src.estado == 2 && Input.GetButtonDown ("Fire1")) {
      Instantiate (piruleta, transform.position, transform.rotation);
   }
}
Cambia esas cosillas y si sigue dandote problemas lo miramos mas a fondo... Saludos.

Julio 23, 2015, 06:48:59 PM #2 Ultima modificación: Julio 23, 2015, 08:00:11 PM por Rouless
Ostias gracias no me habia fijado! :S A ver, intento explicar mejor el problema :$El caso es que tengo un bloque en plan los que sueltan las setas en Mario. Y lo tengo de la siguiente manera:Cuando se golpea el bloque, se desencadena una animación del bloque (cambia el color de éste) y cambia la variable estado del script PlayerLife.Una vez cambiada esta variable, tengo en otro script como condicion para poder disparar: apretar Fire1 y que la variable estado sea igual a 2.El problema?1- La animación empieza a reproducirse pero es como si se quedase estancada en el primer frame, se empieza a oscurecer y luego vuelve al color normal en bucle y super rapido, y no veo porque ocurre esto ya que he puesto que se reproduzca solo una vez la animacion, no la vuelvo a llamar nunca y aun asi se queda en bucle al principio de esta.2- Al parecer, o la variable estado se inicializa en 2, o el condicional que tengo para disparar [if botonfire1 apretado && estado = 2] no funciona, no sé donde está el error.Alomejor && equivale al operador logico "O" en ver de "Y".Gracias por tu atención! Espero que me haya explicado mejor jejeje  EDIT: Acabo de fijarme que cambiando PlayerLife por lf en uno de los scripts me salta este error:
Assets/Scripts/Bloques/BlPiruleta.cs(26,28): error CS0176: Static member `PlayerLife.estado' cannot be accessed with an instance reference, qualify it with a type name instead
  

Señores, problema solucionado. Era un error tan tonto como que en el controller tenia puesta una transicion desde anystate hacia la animacion cuando la booleana es verdadera..... errores de principiante :/Gracias igualmente ftejada!!Un saludo

Etiquetas: