Crea una cuenta o inicia sesión

¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera

Curso de C# para Videojuegos

Curso de C# para Videojuegos

Juan Gabriel Gomila

Juan Gabriel Gomila

Detectar el suelo con Raycast

10/53
Recursos

Para solucionar el problema de la clase anterior y evitar que nuestro personaje salte hasta el infinito podemos permitirle saltar a nuestro personaje solo si esta a menos de cierta distancia del suelo, además podemos cambiar la función Input.GetKey por Input.GetKeyDown para ejecutar esta función solo cuando hundimos las tecla, no mientras las mantenemos pulsadas.

Aportes 27

Preguntas 13

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Para poder ver el raycast, use el drawcast desde el centro del personaje y asi damr una idea para el salto
usne este comando en en metodo update

Debug.DrawRay(this.transform.position, Vector2.down * 1.5f, Color.green);

una vez que den play, pasen a la vista de editor, veran una linea verde desde el centro del personaje

Simplificación de código

bool IsTouchingTheGround(){
        return Physics2D.Raycast(this.transform.position,
							Vector2.down,
							2.0f,
							groundMask);
    }

Resumen de la clase. Physics2D el método RayCast tiene los siguientes parámetros:
Origen : el punto de donde se origina el rayo 2d (ejemplo this.transform.position)
Dirección: Un vector que representa la dirección
Distancia : la distancia máxima en la que se lanza el rayo
LayerMask: es un filtro que detectan los colliders en ciertas capas

Notas de clase;
public LayerMask groundMask: es para saber quien es el suelo.
**LayerMask **es la capa que se encargara de tener un registro de quien forma parte del suelo, quien es toqueteable a nivel suelo.
**transform **es para indicar posicion, rotacion y escala.
**Physics **es para invocar el motor de fisicas
Raycast: trazar un rayo invisible

Alguien podria ayudarme por favor, coloque el codigo como esta explicado pero nunca salta. Es como si nunca tocara el suelo, no importa cuanto mueva la 20f nunca me arroja un true.

if (Physics2D.Raycast(this.transform.position,
Vector2.down,
20f,
groundMask))
{
//programar lógica de contacto con el suelo
return true;
}
else
{
//programar lógica de no contacto
return false;
}

Hola! La verdad supongo que esto ya esta previsto para aprender un nuevo conocimiento, pero una simple forma de resolver este “bug” seria establecer el “GetKey” En “GetKeyDown” Al hacer eso el personaje solo tendria 1 impulso al tocar space

Un corto análisis del tema de GetKey y GetKeyDown:

  • Al usar GetKey sí se nos va “volando” el personaje si se mantiene presionado Space; una solución inicial aparente es usar GetKeyDown (sin hacer aún lo del Layer) no obstante,
  • Si se usa GetKeydown sin usar la solución del Layer, se está la complicación de que al saltar, si estando en el aire a cualquier altura, se sigue presionando Space o el mouse, nuestro personaje sigue saltando; por eso se requiere combinar GetKeyDown y la técnica del Layer con Raycast

Debug.DrawRay(this.transform.position, Vector2.down * 1.5f, Color.red);
}

No vi cuando escribió esto… Alguien sabe por que aun así funciono en el video? en mi caso me marcaba un error y no me dejaba iniciar.

mi personaje no salta que hice mal??

Hola, estaba probando el Raycast con las otras plataformas que estan de prefab, y note en mi caso que cuando el personaje cae en el centro de la plataforma no existe problema, pero cuando colindan digamos en las orillas esto ya no me lo detecta del todo.
¿Alguien sabe que pasa y como se podria arreglar?

Caso raycast

para calcular que tanto le tienes que poner al RayCast lo que puedes hacer es medir cuantos pixeles tiene tu personaje y dividirlo entre los pixeles por unidad de la imagen que aparecen cuando le haces clic al sprite y luego dividirlo entre dos el resultado es cuanto mide de la mitad al final luego puedes aumentarle unos cuantos decimales para que no pase ningún error

Hoola. Tengo una duda. Cuando quiero abrir Visual Studio, me sale un error que dice unsupported command, y el error es muy largo. Luego, cuando logro abrir, no reconoce las funciones de unity. Alguna solucion? Gracias, y muy bueno el curso (^0^)

En mi unity, desde el minuto 04:10, me permite seleccionar varios prefabs, pero no me abre la ventana del inspector, tengo que hacerlo uno por uno a ue se debe?

mi juego tiene un lag , a veces al saltar salta mucho mas de lo normal , es decir de cada 4 saltos 1 es desproporcional .

porque usamos el raycast para detectar el piso envés de un
onCollisionEnter2d como en el videojuego del curso anterior ?

Hola saludos a todos de momento salta, pero en consola aparece esto, saben que puede ser, dejo enlace; gracias

http://prntscr.com/mz1d3n

listo quedo configurado el Raycast para el salto.
![](

Uff cada vez más interesante.

Comparto algunos de mis apuntes en el código:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControl : MonoBehaviour
{
    // Variables del movimiento del personaje
    public float jumpForce = 6f;

    Rigidbody2D rigidBody;

    public LayerMask groundMask;

    void Awake()
    {
        rigidBody = GetComponent<Rigidbody2D>();
    }
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {   //Indica con qué teclas salta el personaje
        if(Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0))
        {
            Jump();
        }
    }

    //Indica de qué manera salta el personaje
    void Jump ()
    {
        if (IsTouchingTheGround())
        {
            rigidBody.AddForce(Vector2.up*jumpForce, ForceMode2D.Impulse);
        }
    }

    //Nos idica si está o no tocando el suelo
    bool IsTouchingTheGround()
    {
        if(Physics2D.Raycast(this.transform.position,
                            Vector2.down,
                            2.0f,
                            groundMask))
         //Programar lógica de contacto con el suelo
        {
            return true;
        }
        //Programar lógica de no contacto con el suelo
        else
            {
                return false;
            }
        
    }
}

En C# si pones antes de cada método 3 vences el /// te crear de manera automática la estructura de comentarios para métodos.

    /// <summary>
    /// Nos indica si el personaje esta o no tocando el suelo 
    /// </summary>
    /// <returns></returns>
    bool IsTouchingTheGround()
    {
        if (Physics2D.Raycast(this.transform.position, Vector2.down, 2.0f, groundMask))
            return true;//contacto con el suelo
        else
            return false;//no hay contacto con el suelo
    }```

Excelente

Hola, tuve un problema y es que simplemente no saltaba pero fue porque en lugar de Physics2D.Raycast había colocado Physics.Raycast. Cuidado con esas cositas

Genial

Hay varias formas para hacer ese detector de suelo. Una es con un raycast hacia abajo; otra OverlapCircle y un booleano; y finalmente la mas simple, un trigger que se detecte al collider del suelo.

Creo que mi raycast no esta funcionando, lo que pasa es que puedo dar saltos infinitos, no se supone que si el personaje esta a más de cierta distancia entonces deberia ser falsa la función de IsTouchingTheGround y por tanto no debería saltar ?
<using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    //Variables del movimiento del personaje
    public float jumpForce = 6f;
    Rigidbody2D rigidBody;//Creamos var tipo Rigidbody2D
    public LayerMask groundMask;
    // Start is called before the first frame update
    private void Awake()
    {
      rigidBody = GetComponent<Rigidbody2D>();//La variable RigidBody sabe a cual rigidBody referirse :v
    }
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
      if(Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0))//0=izquierdo 1=derecho 2=ruedita
      {
        Jump();
      }
    }
    void Jump()
    {
       if(IsTouchingTheGround())
       {
         rigidBody.AddForce(Vector2.up*jumpForce,ForceMode2D.Impulse );//Modo Force = constante. Modo Impulse = impulso...
       }
    }
    bool IsTouchingTheGround()
    {
       if(Physics2D.Raycast(this.transform.position, Vector2.down,0.2f,groundMask));//0.2f=20cm
       {
         //TODO: programar logica de contacto con el suelo
         return true;
       }
      return false;
    }
}
>

Me aparece un error como este en la consola: Copying assembly from ‘Temp/Assembly-CSharp.dll’ to ‘Library/ScriptAssemblies/Assembly-CSharp.dll’ failed.
No me deja cambiar nada del codigo ayudaaa plis 😦