El personaje y el controlador

1

Introducción: De la idea al desarrollo

2

Estructura de carpetas en Unity

3

Assets, Game Objects y Sprite Atlas

4

Animaciones desde un sprite map

5

Animation Controller y Transiciones

6

Plataformas y gravedad

7

Física en Unity

8

El script de control

9

Programando funciones en C# y Unity: Jump

10

Detectar el suelo con Raycast

11

Herramientas de debugging visual

12

Cambiar las animaciones según los estados

13

Reto: Terminando nuestras animaciones

14

Solución del reto

15

Hacer que el personaje camine

El manager del videojuego

16

Cómo funciona el Game Manager

17

El Singleton

18

El modo de juego

19

Input manager y juegos multiplataforma

20

Corrección del Bug del salto

21

La zona de muerte

22

Reiniciar la partida

23

Corrigiendo los bugs al reiniciar nuestro juego

Diseño procedural de niveles 2D

24

El diseño de niveles a mano

25

Configurando nuestros assets para el diseño procedural

26

Generación procedural de niveles

27

Creando la zona que eliminará bloques del nivel excedentes

28

Añadir un nuevo bloque de forma aleatoria

29

La cámara que sigue al jugador

30

Destrucción de bloques antiguos

31

Terminando de programar la destrucción de bloques antiguos

32

Solucionando el salto de la cámara al reiniciar el juego

HUD, menús y gameplay

33

El canvas en Unity

34

Uso de botones para crear un menú

35

La lógica de los menús

36

Ejercicio: Preparando el menú del juego

37

Programando el menú del juego

38

Los coleccionables del juego

39

Actualizar UI de coleccionables

40

Iniciando con pociones y maná

41

Pociones de vida y maná

42

Programando las barras de vida y maná

43

Calculando los puntajes con la distancia y el tiempo de juego

44

La lógica del maná

Enemigos y dificultad

45

Plataformas móviles

46

Iniciar movimiento de la plataforma con trigger

47

Enemigos móviles

48

Enemigos móviles: preparando nuestro enemigo para girar

49

Enemigos móviles: programando que fire al chocar

50

Arreglando el collider de nuestra roca

51

Programando la condición de muerte del personaje

52

Añadiendo música de fondo a nuestro videojuego

53

Añadiendo efectos de sonido y cierre del curso

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 31

Preguntas 15

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

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

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

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

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

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

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

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

Para no andar adivinando la distancia y que no importe el tamaño del player:

public float disRay = 0.1F;
CapsuleCollider2D collider;
return Physics2D.Raycast(this.transform.position, UnityEngine.Vector2.down, this.collider.size.y/2+disRay, groundMask);

No es nada complicado aprender los códigos que utiliza Unity, es divertido y fácil de manipular 😃.

Personalmente prefiero más OnCollisionEnter / OnCollisionEnter2D para estos casos, se me hace más fácil, rápido y precizo.

En la mayoría de tutoriales de juegos de plataformas que veía se usaba un GroundCheck en lugar de un Raycast

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 😦

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 .

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.

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