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

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de C# para Videojuegos

Curso de C# para Videojuegos

Juan Gabriel Gomila

Juan Gabriel Gomila

Cambiar las animaciones según los estados

12/53
Recursos

Por ahora nuestro personaje tiene la animación de correr en todo momento, incluso cuando esta saltando. En esta clase vamos a sincronizar las animaciones de nuestro personaje con respecto a las modificaciones al estado del Animation Controller.

Para conseguir estos cambios de animación vamos a declarar las variables STATE_ALIVE y STATE_ON_THE_GROUND para actualizarlas desde el método Update cada vez que el método isTouchingTheGround nos indique que el personaje ha saltado o ha terminado de saltar. Cuando nuestro personaje NO esta en contacto con el suelo vamos a pausar la animación de correr, así podemos darle a los usuarios un mejor feedback de que el personaje esta saltando correctamente.

Aportes 20

Preguntas 6

Ordenar por:

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

Una manera mas sencilla de que la animacion no tengamos que desactivarla como tal y podamos ver nuestra animacion completa, es yendo al componente de la animacion de salto y desactivamos la opcion de loop, y listo, cuando saltemos el salto solo se reproducira una sola vez sin tener que tocar codigo.

La convención para escribir variables en mayúsculas separando las palabras con guión bajo se conoce como SCREAMING SNAKE CASE 😱 🐍:

El raycast roja no me sale en la pantalla Game, solo en Scene, por qué?

ACLARACIÓN. Acá no desactivamos la animación como tal, si no que desactivamos el componente Animator que tiene el GameObject que contiene el script. Que en este caso es el script PlayerController y el GameObject es Player.

Porque a mi no me sale igual de fluido?, se tarda como medio segundo en cambiar de animación.

ayudenme a saber si entendi bien:
en esta linea, funciona segun yo asi, el animator toma el atributo de falso o verdadero(animator.setbool), despues se le pasa como parametro que es lo que va a cambiar de estado(STATE_ON_THE_GROUND) el cual vale true y que asu vez esta agarradod e una animacion.

Entonces declarado en el update dice asi, oye animator, coloca verdadero o falso a la animacion que vale true llamada STATE_on_the_ground, pero dependiendo del resultado del metodo is on the ground

si algo asi o me estoy fumando algo??

animator.SetBool(STATE_ON_THE_GROUND, IsTouchingTheGound());

buenas que pasa, tengo un poblemita y es que me salen estos errores y aparte no realizan las animaciones cuando se deben de ejecutar, Muchas graciassss espero me puedan ayudar

Encontré una forma de pausar la animación de SALTAR en el último frame, primero deben bucar la animación llamada “Jump”, no deben elegir el controlador de la animación de saltar, sino la misma animación, luego darle click, en la parte de la derecha dice “Loop Time”, que está activada, la desactivan y ahora cuando salten, la animación no estará en bucle

mi personaje siempre se queda quieto y no pasa a otra animación, me podrían decir que hice mal?

Costó pero salio. Si no les llega a salir, como a mi, lo que les recomiendo que hagan es eliminar las flechas de la animación y ponerlas de nuevo. De esa manera elimine el “bug” del cambio de animación al saltar.

Por que cuando salta mi personaje, no se anima el “JUMP”, solo hace “RUN” mientras salta. Incluso use el docdigo del profe, y no me sale ninguna diferencia.

Genial

Me aparece un error en la consola y no sé que puede ser, seguí el codigo igual que el profesor y nada 😦

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

public class PlayerController : MonoBehaviour
{
//Variables del movimiento del personaje
public float jumpForce = 6f;
Rigidbody2D PlayerRigidBody;
Animator animator; //Variable animator de tipo “Animator”

const string STATE_ALIVE = "isAlive"; //Nombre de animación
const string STATE_ON_THE_GROUND = "isOnTheGround"; //Nombre de animación

public LayerMask groundMask;

void Awake()
{
    //Obtener el componente Rigidbody2D - Física del personaje
    PlayerRigidBody = GetComponent<Rigidbody2D>();
    //Obtener el componente Animator de Unity
    animator = GetComponent<Animator>();
}

// Start is called before the first frame update
void Start()
{
    animator.SetBool(STATE_ALIVE, true);
    animator.SetBool(STATE_ON_THE_GROUND, true);
}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0)) //Señala los botones con los que salta el personaje
    {
      Jump();
    }

    animator.SetBool(STATE_ON_THE_GROUND, IsTouchingTheGround());

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

//Función de salto del personaje
void Jump()
{
    if (IsTouchingTheGround())
    {
      PlayerRigidBody.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
    }
}

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

}

Hice una alternativa con animator.SetBool que vi investigando en internet y que no necesita que se cree una nueva variable en el código que referencie las del animator, pues automáticamente cambia ese parametro

void Update()
    {
        if (Physics2D.Raycast(this.transform.position, Vector2.down, 1.15f, groundMask))
        {
            animator.SetBool("isOnTheGround", true);
        }
        else
        {
            animator.SetBool("isOnTheGround", false);
        }
        if (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow))
        {
            Jump();
        }
        Debug.DrawRay(this.transform.position, Vector2.down * 1.15f, Color.red);
    }
    void Jump()
    {
        if (animator.GetBool("isOnTheGround"))
        {
            rigidBody.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
        }
    }

Excelente clase

nesecito ayuda mi personaje no realiza la animacion de run se mantiene en jump pero al saltar si conjela la animacion nose si cometi algun error en el codigo.

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

public class PlayerController : MonoBehaviour

{

    //Variables del movimiento del personaje
    public float jumpForce = 6f;
    private Rigidbody2D rigidBody;
    Animator animator; //hacer constancia de la animacion del personaje

    const string STATE_ALIVE = "isAlive";
    const string STATE_ON_THE_GROUND = "isOnTheGround";

    public LayerMask groundMask; //detectar objetos con los cuales se pueden colisionar

    void Awake()
    {
      rigidBody = GetComponent<Rigidbody2D>();
      animator = GetComponent<Animator>();
    }
    // Start is called before the first frame update
    void Start()
    {
      animator.SetBool(STATE_ALIVE, true); //COMO EMPEZARA LA ANIMACION DEL PERSONAJE
      animator.SetBool(STATE_ON_THE_GROUND, true);
    }

    // Update is called once per frame
    void Update() //se pregunta, si la tecla espacio o tecla del boton del mouse es apretada hara cierta accionm
    {
      if(Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0)) {
        Jump();
      }

      animator.SetBool(STATE_ON_THE_GROUND, IsTouchingTheGound());

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

    //Salto del personaje
    void Jump()
    {
      if(IsTouchingTheGound())
      {
      rigidBody.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
      }
    }

    //Nos indica si el personaje esta tocando el suelo
    bool IsTouchingTheGound() // el personaje esta o no en el suelo
    {
        if(Physics2D.Raycast(this.transform.position,
            Vector2.down,
            1.5f, groundMask))
        {
            //TODO: programas logica de contacto con el suelo
            animator.enabled = true;
            return true;
        }
        else
        {
            //todo: programa logoca de no contacto
            animator.enabled = false;
            return false;
        }
    }
}

Para controlar la animación, en las flechas del diagrama de animaciones, coloqué desactivado el “Has exit time” entre run y jump y al revés. Luego en código, en lugar de poner la línea de código con el animator lo puse en una función a parte con una negación de la siguiente forma

void FixedUpdate()
    {
        animator.SetBool(STATE_IS_ON_GROUND, !IsTouchingGround());

    }

Y queda bastante bien

Por si no quedó totalmente claro la forma de asignar valor a los parámetros, intentaré explicarlo con lo que sé:
El animator es el componente que controla las animaciones, los parámetros “isAlive” y “isOnTheGround” son parte de este, por lo que para modificarlos tienes que acceder a ellos a través del animator
El método SetBool tiene dos parámetros

public void SetBool(string name, bool value);

“name” es el nombre del parámetro que declaraste en el animator.
“value” es el valor que tendrá ese parámetro
lo mismo funciona para los métodos

public void SetString(string name, string value);
public void SetFloat(string name, float value);

Para más información, aquí te dejo el enlace de la documentación de unity, utilízada, a mí me ha ayudado un montón de veces, es bastante clara y te ofrece ejemplos

Otra manera para sostener la animacion de salto, es seleccionando has exit time en la transicion de salto walk, esto hace que se quede el personaje en el ultimo frame de la animacion de salto hasta que empieza a caminar de nuevo.