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 gire 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

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

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 21

Preguntas 11

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

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 馃槺 馃悕:

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.

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

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

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 鈥淛ump鈥, 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 鈥淟oop Time鈥, que est谩 activada, la desactivan y ahora cuando salten, la animaci贸n no estar谩 en bucle

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 鈥渂ug鈥 del cambio de animaci贸n al saltar.

Por que cuando salta mi personaje, no se anima el 鈥淛UMP鈥, solo hace 鈥淩UN鈥 mientras salta. Incluso use el docdigo del profe, y no me sale ninguna diferencia.

Genial

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

Porque cuando la animacion cambia a saltar mi personaje cambia de posicion, Alguien me puede ayudar ?

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 鈥淎nimator鈥

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

Para controlar la animaci贸n, en las flechas del diagrama de animaciones, coloqu茅 desactivado el 鈥淗as 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 鈥渋sAlive鈥 y 鈥渋sOnTheGround鈥 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);

鈥渘ame鈥 es el nombre del par谩metro que declaraste en el animator.
鈥渧alue鈥 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.