Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: DavidTrenkat en Agosto 14, 2015, 02:55:15 AM

Título: Personaje corriendo por el suelo y por el techo
Publicado por: DavidTrenkat en Agosto 14, 2015, 02:55:15 AM
Buenas !Este es mi primer post asique se podrá ver en el código adjunto lo novato que soy XD. A ver ... estoy en proceso de hacer un juego de correr.La idea de los controles es la siguiente: 1. Click en para empezar a correr (a partir de aqui los siguientes clicks sirven para saltar)2. Doble click el personaje pasa del suelo al techo y sigue corriendo3. Doble click el personaje vuelve a pasar del techo al suelo y sigue corriendoHe conseguido  los dos primeros controles pero soy incapaz de conseguir el tercero. Dejo aqui lo que he conseguido a ver si alguien puede echarme un cable. He señalado en negrita la parte que más me lleva de cabeza... la de los saltos y el cambio entre suelo y techo. 
using UnityEngine;
using System.Collections;

public class Controlador : MonoBehaviour {

  public float fuerzaSalto=14f;

  public bool enSuelo = true;
  public Transform comprobadorSuelo;
  float comprobadorRadio = 0.07f;
  public LayerMask suelo;

  private bool dobleSalto = false;
  public float velocidad = 6.5f;
  public bool enTecho = false;

  private Animator animator;

  private bool corriendo = false;


  void Awake (){
  animator = GetComponent<Animator>();
  }
 
  // Use this for initialization
  void Start () {

  }

  void FixedUpdate () {

  if (corriendo) {
    GetComponent<Rigidbody2D>().velocity = new Vector2(velocidad, GetComponent<Rigidbody2D>().velocity.y);
  }
  animator.SetFloat("Speed", GetComponent<Rigidbody2D>().velocity.x);

  enSuelo = Physics2D.OverlapCircle (comprobadorSuelo.position, comprobadorRadio, suelo);
  animator.SetBool ("Ground", enSuelo);
  if (enSuelo) {
    dobleSalto = false;
  }
  }


  // Update is called once per frame
 void Update(){

  if (Input.GetMouseButtonDown (0)) {
    if (corriendo) {
    if(enSuelo || !dobleSalto){
      GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, fuerzaSalto);
      if (!dobleSalto && !enSuelo){
        dobleSalto = true;
        GetComponent<Rigidbody2D>().gravityScale = -2f;
        transform.Rotate(new Vector2(180,0));
        enTecho=true;
      }
      if (enTecho){
        if(enSuelo || !dobleSalto){
        GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, -fuerzaSalto);
        if (!dobleSalto && !enSuelo){ /*NO ENTRA EN ESTE IF*/
          dobleSalto = true;
          GetComponent<Rigidbody2D>().gravityScale = 2f;
          transform.Rotate(new Vector2(180,0));
          enTecho=false;
        }
        }
      }
    }
    } else {
    corriendo = true;
    NotificationCenter.DefaultCenter().PostNotification(this,"PersonajeEmpiezaACorrer");
    }
  }
  }
}
Un saludo y gracias !
Título: Personaje corriendo por el suelo y por el techo
Publicado por: iRobb en Agosto 14, 2015, 03:27:31 AM
Si no me equivoco mentalmente, es imposible que entre por los motivos en los comentarios.Deberías estructurarlo mejor, sino te va a ser muy dificil de mantener y entender en unas semanas.    void Update() {        if (Input.GetMouseButtonDown(0)) {
            if (corriendo) {
                if (enSuelo || !dobleSalto) {
                    // Para que se cumpla if3, debe cumplir, y que no entre en if1
                    // enSuelo = true
                    // dobleSalto = true
                    GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, fuerzaSalto);
                    // If1
                    // dobleSalto = false
                    // enSuelo = false
                    if (!dobleSalto && !enSuelo) {
                        dobleSalto = true;
                        GetComponent<Rigidbody2D>().gravityScale = -2f;
                        transform.Rotate(new Vector2(180, 0));
                        enTecho = true;                        // enTecho = true
                        // dobleSalto = true
                        // enSuelo = false
                        // Si entra aqui, el if3 no se activará por dobleSalto = true
                    }
                    // Si no entra en if1, que es la única manera de que entre en if3 (por dobleSalto = true), se debe cumplir =
                    // enSuelo = true
                    // dobleSalto = true
                    if (enTecho) {
                        // enTecho = true
                        if (enSuelo || !dobleSalto) {
                            // Entra por:
                            // enSuelo = true
                            GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, -fuerzaSalto);
                            // if3 imposible!
                            // dobleSalto = true
                            // enSuelo = true
                            if (!dobleSalto && !enSuelo) { /*NO ENTRA EN ESTE IF*/
                                dobleSalto = true;
                                GetComponent<Rigidbody2D>().gravityScale = 2f;
                                transform.Rotate(new Vector2(180, 0));
                                enTecho = false;
                            }
                        }
                    }
                }
            } else {
                corriendo = true;
                NotificationCenter.DefaultCenter().PostNotification(this, "PersonajeEmpiezaACorrer");
            }
        }
    }
Título: Personaje corriendo por el suelo y por el techo
Publicado por: DavidTrenkat en Agosto 14, 2015, 01:30:43 PM
Gracias por contestar ... Ya, mi código es un maldito caos, tengo muy pendiente aprender a hacer un codigo limpio y mas entendible, pero bueno poco a poco ... Empecé este año de lleno con la programación (Java sobretodo).Leyendo lo que has escrito y quedandome un poco más claro por donde tiraba la cosa he conseguido que baje del suelo, pero no con doble click. Es decir, no salta con un click en el techo y con doble click vuelve abajar, sino que con un click baja directamente.  
if (enTecho){
              if(enSuelo || !dobleSalto){
                GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, -fuerzaSalto);
                dobleSalto=false;
                enSuelo=false;
                if (dobleSalto==false && enSuelo==false){
                  dobleSalto = true;
                  GetComponent<Rigidbody2D>().gravityScale = 2f;
                  transform.Rotate(new Vector2(180,0));
                  enTecho=false;
                }
              }
}
 
Título: Personaje corriendo por el suelo y por el techo
Publicado por: iRobb en Agosto 14, 2015, 02:02:15 PM
Muy bien, me alegro. A ver que más puedes avanzar y vemos algo para divertirnos.
Título: Personaje corriendo por el suelo y por el techo
Publicado por: DavidTrenkat en Agosto 16, 2015, 05:15:20 PM
Lo conseguí ! jaja Muchas gracias