Noticias

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

Personaje corriendo por el suelo y por el techo

Iniciado por DavidTrenkat, Agosto 14, 2015, 02:55:15 AM

Tema anterior - Siguiente tema
Agosto 14, 2015, 02:55:15 AM Ultima modificación: Agosto 14, 2015, 02:59:56 AM por DavidTrenkat
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 !

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");
            }
        }
    }

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;
                }
              }
}
 

Muy bien, me alegro. A ver que más puedes avanzar y vemos algo para divertirnos.


Etiquetas: