Noticias

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

Necesito ayuda para encadenar saltos...

Iniciado por military_hacker, Febrero 05, 2017, 01:54:36 PM

Tema anterior - Siguiente tema
Febrero 05, 2017, 01:54:36 PM Ultima modificación: Febrero 06, 2017, 07:31:29 PM por pioj
Tengo un problema con raycaster, basicamente queria conseguir que el personaje principal, (un conejito), no pudiera saltar hasta que no tocara el suelo , para evitar algo parecido al juego flappy bird donde encadenabas saltos, pero nada, que no lo consigo, y le he dado mil vueltas y no sé que hacer, os dejo el codigo a ver si me podeis echar una mano
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerController:MonoBehaviour {
    
    public float jumpForce = 6.0f;
    public float runningspeed = 1.0f;
    private Rigidbody2D rigidBody;//para poder acceder al modulo de fisica del conejito
    public LayerMask groundLayerMask;
    public Animator animator;
    void awake () {
    }
    // Use this for initialization
    void Start () {
        rigidBody = GetComponent<Rigidbody2D> ();        
        animator.SetBool ("isAlive", true);
    }
    
    // Update is called once per frame
    void Update () {
        //el  es el boton izquierdo,buttondown es apretarlo hacia abajo
        if (Input.GetMouseButtonDown ()) {
            Jump ();
        } 
        animator.SetBool ("isGrounded", IsOnTheFloor ());
    }
    void FixedUpdate(){//se llama a este metodo, cada tiempo fijo, no a cada frame
        if (rigidBody.velocity.x <runningspeed){
            rigidBody.velocity = new Vector2 (runningspeed, rigidBody.velocity.y);
             
        }
    }
    void Jump() {
        if (IsOnTheFloor ()) {    
            //Se le aplica la fuerza a un cuerpo rigido, como es un salto, el vector 2(que es el Y, que va para arriba)y up xq es un salto,despues se usa el otro parametro forcemode2d para añadir impulso al salto    
            rigidBody.AddForce (Vector2.up * jumpForce, ForceMode2D.Impulse);    
        }
    }        
        
    //sirve para ver si el conejo toca el suelo, lo explico a continuación:
    //a la física 2D le pido que me lance un rayo(Raycast),Raycast tira un rayo a this.transform.position(Eso es la posición del conejo en ese momento)
    //hacia el suelo(Vector2.down) de longitud 1.0f y comprueba si toca el SUELO(groundLayerMask)
    bool IsOnTheFloor(){        
        if (Physics2D.Raycast(this.transform.position,Vector2.down,1.0f,groundLayerMask.value)){
            return true;            
        } else {
        return false;
        }
            }
     }

 
 

Te he movido el tema al foro apropiado, y he aclarado el título. Por favor, recuerda dejar bien claro siempre cuál es la razón de tu consulta en los foros.

Febrero 05, 2017, 03:50:51 PM #2 Ultima modificación: Febrero 05, 2017, 03:51:20 PM por francoe1
La detección del Raycast puede estar fallando, no recomiendo utilizar un "RayCast", deberias utilizar un Circle o Box, aunque es algo personal..
 
Para la detección del suelo podrias utilizar esto.
 

void OnTriggerEnter()
{
  IsGround=true;
}
void OnTriggerStay()
{
  IsGround=true;
}
void OnTriggerExit()
{
  IsGround=false;
}

 
Y podrias comprobar el Punto de colisión, para saber si se está produciendo en los lados, arriba o abajo del jugador.

Y recuerda que también puedes usar los CharacterController para mover personajes, que además tiene una función llamada isGrounded que comprueba automáticamente si el personaje está tocando el suelo.
 
Cualquier opción es igual de buena.

Un saludo.

Febrero 05, 2017, 07:15:50 PM #4 Ultima modificación: Febrero 06, 2017, 07:31:42 PM por pioj
Hola, comp dicen arriba te conviene usar charactercontrollers toda la vida, claro que estas en 2D jajaj y Unity no trae un controller por default, podrias creartelo vos pero es mas complicado. Pero si queres hacerlo con raycast (que para el caso de personajes prefiero el circleCast) tenes que asegurarte que el ray sale apenas del collider del player. En tu codigo tenes una longitud de 1, supongo que el origen (transform.position) esta en los pies, que esta bien, pero longitud de 1  puede llegar a ser demasiado o muy poco dependiendo de las unidades de tu personaje. Proba hacer un debug para visualizar bien el raycast, algo asi en el Update:
 

Debug.DrawRay(transform.position, Vector2.down);

 
asi podes ver si la longitud del ray es lo suficientemente corta.
 
  Otra cosa en la funcion del IsOnTheFloor, como lo tenes solo tenes que poner:
 

bool IsOnTheFloor(){    
return Physics2D.Raycast(this.transform.position,Vector2.down,1.0f,groundLayerMask.value)
}

 
Pero te conviene ponerlo asi ya que Physics2D no funcionan como Physics (en 3D) ya que retornan directamente el RaycastHit2D, entonces tenes que evaluar el collider que devuelve, si hay es porque hay suelo. Sobretodo para que a futuro puedas ver sobre que tipo de suelo estas.
 

bool IsOnTheFloor(){    
RaycastHit2D rhit = Physics2D.Raycast(this.transform.position,Vector2.down,1.0f,groundLayerMask.value);
   
if(rhit.collider)   //hay suelo
   return true;
else
   return false;            
}

 
 

Cita de: lightbug date=1486318550Hola, comp dicen arriba te conviene usar charactercontrollers toda la vida, claro que estas en 2D jajaj y Unity no trae un controller por default, podrias creartelo vos pero es mas complicado.
   


Jajaja!! No había leido que era para 2D... No, claro... entonces mejor con Raycast o colliders...
 
Perdón por la metedura de pata.

Cita de: Alejandro Navarro date=1486492072Jajaja!! No había leido que era para 2D... No, claro... entonces mejor con Raycast o colliders...
   
   
      Perdón por la metedura de pata.
   


Jaja me paso lo mismo, a la mitad de la respuesta mire por que muchas veces contesto de apurado que soy y decia RigidBody2D

Etiquetas: