Noticias

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

Ayuda Script c#!! Animación abrir/cerrar

Iniciado por cricricri_ina, Octubre 03, 2016, 01:36:17 PM

Tema anterior - Siguiente tema
Octubre 03, 2016, 01:36:17 PM Ultima modificación: Octubre 03, 2016, 06:39:05 PM por pioj
Buenos días a todos!
 
Desde hace unos días, que intentando hacer un script en c#, sin éxito ninguno, para programar lo siguiente:
 
- Cuando pulso la tecla 4 se reproduce la animación de abrir, si vuelvo a pulsar la tecla 4 y ya se ha reproducido la animación de abrir, reproduce la de cerrar. 
 
Este es mi script:
 

public class OpenandCloseCortinas : MonoBehaviour
{
    public Animation anim;
    public bool animopen;
    public bool animclose;
 
    // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animation>();
        anim["Open2"].wrapMode = WrapMode.Default;
        anim["Close2"].wrapMode = WrapMode.Default;
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey("4") && anim["Open2"].enabled == false)
        {
            anim["Open2"].enabled = true;
            anim.Play("Open2");
        }
        else if (Input.GetKey("4") && anim["Open2"].enabled == true)
        {
            {
                anim["Close2"].enabled = true;
                anim.Play("Close2");
            }
        }
    }
}

 
 
 
No consigo ver donde esta el fallo, ya que me reproduce la de abrir correctamente pero la parte de cerrar no me hace bien... Una guía o una ayuda me iria muy bien! Gracias!
 
pd_Aviso que no es mi fuerte esto de programar ya que soy novata en script!!
 
 

Octubre 03, 2016, 04:17:55 PM #1 Ultima modificación: Octubre 03, 2016, 06:39:44 PM por pioj
Has probado a en vez de :
 



   
        else if (Input.GetKey("4") && anim["Open2"].enabled == true)
              {
                  {
                      anim["Close2"].enabled = true;
                      anim.Play("Close2");
                  }
              }
   

[/quote]
 
quitar el else y hacer dos IF distintos? , prueba y me dices
 
 
 
 
 
 
 
 

Cita de: Kyrzo date=1475504275Has probado a en vez de :
   
   
       
   
   
        else if (Input.GetKey("4") && anim["Open2"].enabled == true)

              {

                  {

                      anim["Close2"].enabled = true;

                      anim.Play("Close2");

                  }
   
   
              }
   
   
       
   
   
      quitar el else y hacer dos IF distintos? , prueba y me dices
   
   
       
   
   
       
   
   
       
   
   
       
   


 
 
De antemano Kyrzo, muchas gracias por la ayuda. Acabo de probar lo que me dijiste. Si hago dos if distintos ni abre ni cierra es como si intentara hacer dos animaciones juntas y no hace ni una ni otra... :S

Octubre 03, 2016, 04:43:04 PM #3 Ultima modificación: Octubre 03, 2016, 06:40:15 PM por pioj
Y si haces un
 



   
      else if(Input.GetKey("4")){
      ...
      }
   

[/quote]
 
 
 
ya que la segunda condicion del && si no es arriba true es false por lo que se omitiria en el segundo paso

Cita de: Kyrzo date=1475505784Y si haces un else if(Input.GetKey("4")){
   
   
      -----
   
   
      }
   
   
       
   
   
      ya que la segunda condicion del && si no es arriba true es false por lo que se omitiria en el segundo paso
   


Tampoco :S... sigue sin hacerme nada como en el caso anterior... me estoy volviendo loca ya...

Podrias esperar que termine la animacion comprobando la longitud de la animacion mediante AnimationState, y al finalizar dicha animacion cambiar el estado (abierto, cerrado)

Buenas, el código tiene varios errores, te lo voy a corregir como me lo corregían a mi cuando estudiaba programación y después te doy una serie de indicaciones para tener en cuenta.
 
 
 

public Animation anim;
    public bool animopen;
    public bool animclose; // declaras variables que nunca usas
 
    // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animation>();
        anim["Open2"].wrapMode = WrapMode.Default;
        anim["Close2"].wrapMode = WrapMode.Default;
        animopen = true;    
    }
    // Update is called once per frame
    void Update()
    {
        //if (Input.GetKey("4") &&  ->Correccion: Si usas "GetKey" una pulsacion t la puede coger como varias
        //                          -> para esto usa mejor "GetKeyUp" que saltara cuando sueltes el boton
        //anim["Open2"].enabled == false) -> Correccion: "anim["Open2"].enabled" en cada vuelta del update lo
        //                                -> reinicia a false, te recomiendo que normalmente uses tu tus propias variables de bandera
        //                                -> es un bool de 2 bytes no es significativo para el rendimiento
        if (Input.GetKeyUp("4") && animopen == true)
        {
            //anim["Open2"].enabled = true; -> esta variable ademas la pones a true pero nunca mas la pones a false
            //                              -> por lo que por aqui solo entrara una vez
            animopen = false;
            anim.Play("Open2");
        }
        else if (Input.GetKeyUp("4") && animopen == false)
        {
            { // estos llaves no daran error al ponerla aqui pero no valen para nada
                //   anim["Close2"].enabled = true;
                animopen = true;
                anim.Play("Close2");
            }
        }
    }

 
Te pongo también la forma que lo hubiera hecho yo:
 

void Update()
    {
        if (Input.GetKeyUp("4") && !anim.isPlaying)        
        {
            if(animopen)            
                anim.Play("Up");
            else
                anim.Play("Down");
            animopen = !animopen;
        }
    }

 
 Ahora lo que me gustaría preguntarte, no te resultaría mas fácil haber utilizado el animator??
 
 

Octubre 04, 2016, 03:22:54 PM #7 Ultima modificación: Octubre 05, 2016, 10:09:07 AM por pioj
Cita de: esr date=1475531490 Ahora lo que me gustaría preguntarte, no te resultaría mas fácil haber utilizado el animator??
   
   
       
   


Pues seguramente si me hubiera resultado más fácil, lo único que aprendí a usar Unity con versiones muy antiguas, cuando estudié y ahora hacia bastante tiempo que no lo tocaba, estoy intentando ponerme al día con Unity por temas de trabajo ya que hasta ahora solo me dedicaba a modelar.
 
Muchas gracias por tus explicaciones, me fueron muy útiles realmente, ya que conseguí gracias a ello que funcionara :)!!
 
De todas pongo aquí como lo solucioné! Cualquier comentario para aprender y mejorar es útil! :D como hizo el esr!! 
 

public class OpenandCloseCortinas : MonoBehaviour
{
    public Animation anim;
    bool open = false;
   
    // Use this for initialization
    void Start()
    {
        anim = GetComponent<Animation>();
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown("4") && !open)
        {
            {
                anim.Play("Open2");
                open = true;
              
            }
            
        }
        else if(open == true && Input.GetKeyDown("4"))
            {
                open = false;
                anim.Play("Close2");
            }
        }
    }

 
 
 
Muchas gracias! Me fue muy útil todos los comentarios a la hora de solucionarlo! 
 
Saludos cordiales y agradecimientos ^^

Octubre 05, 2016, 04:22:29 PM #8 Ultima modificación: Octubre 05, 2016, 04:23:49 PM por kaito
Puedes utilizar una matriz tipo string con el nombre de las animaciones y una variable entera tipo int para alternar:
 

using UnityEngine;
using System.Collections;
public class OpenandCloseCortinas : MonoBehaviour
{
    public Animation anim;
    private string[] animacion = new string[2] { "Open2", "Close2" };
    private int contador = 0;
    void Update()
    {
        if (!anim.isPlaying)
        {
            if (Input.GetKey("4"))
            {
                anim.Play(animacion[contador % 2]);
                contador++;
            }
        }
    }
}

 
También sería aconsejable verificar que no se esta produciendo una animación, mediante anim.isPlaying.

Etiquetas: