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

Reto: Terminando nuestras animaciones

13/53
Recursos

En la clase anterior congelamos las animaciones de nuestro personaje cuando este saltaba, sin embargo, el desafío de esta clase es dividir la parte de la animación del salto para que se congele solo por un momento antes de que la caída al suelo del personaje. El resultado será una animación para el inicio del salto, otra animación mientras el personaje se mantiene en el aire y finalmente la animación de la caída al suelo.

Aportes 20

Preguntas 0

Ordenar por:

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

Hola

Lo que hice fue

  1. Hacer tres nimaiones de salto: JumpUp los 3 primeros frames, JumpStill el frame 4 y JumpDown los 2 ultimos frames

  2. Los añadi al Player (el animator controller)

  3. Añadí un Parameter de tipo float llamado verticalForce.

  4. En la transición entre la Animación Run y JumpUp puse que isOnTheGround sea false, luego entre JumpUp y JumpStill puse que verticalForce greater 0.5 y entre JumpStill y JumpDown verticalForce less -0.5

  5. En el código se escribe la constante:

    private const string VERTICAL_FORCE = "verticalForce";

En el update se asgina

        animator.SetFloat(VERTICAL_FORCE, rigidBody.velocity.y);

Y en IsTouchingTheGround() se quita el pausar el animator

    bool IsTouchingTheGround()
    {
        if(Physics2D.Raycast(this.transform.position, Vector2.down,1.5f,groundMask))
        {
            return true;
        }
        else
        {
            return false;
        }
    }```

![](https://media.giphy.com/media/J4aarPbwCA3UE7kbHu/giphy.gif)

Yo primero cree una variable para saber si esta cayendo

const string STATE_FALLLING = "isFalling";

Luego para saber cuando caía le puse que cuando la posición en Y disminuyera

if (rigidBody.position.y < rigidBody.position.y + 0.01)
        {
            animator.SetBool(STATE_FALLLING, true);
        }

Corre en bucle por que tiene el LOOP TIME activado, solo es cuestion de desactivarlo.

Hola, aquí mi solución: solo cree dos animaciones, una para JumpUp y otra JumpDown sin loop y sin exit time, después las enlace como se puede ver a continuación:

Después declare la constante para la nueva condición de is Falling:

private const string STATE_FALLING = "isFalling";

También cree un método para comprobar si el personaje va hacia arriba o hacia abajo usando velocity.y:

bool IsFalling(){
        if(playerRigibody.velocity.y < 0){
            
            return true;
        }
        else{
            return false;
        }
    }

Y por último en el Update() agregué lo siguiente:

animator.SetBool(STATE_FALLING, IsFalling());

Aquí el resultado final:

Dividí la animación en dos, uno seria la acción de ir hacia arriba (jumping) y la otra la caída (falling), investigando encontré que con RigidBody podemos obtener la velocidad de movimiento en algún eje entonces:

  1. Primero genere un método para saber cuando empezaba a caer midiendo la velocidad en el eje y si era menor a 0.0 quería decir que estaba cayendo
    bool IsFalling()
    {
        if (rigidBody.velocity.y < 0.0f)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
  1. Generé el estatus isFalling en el animator e incluí las dos animaciones (jumping y falling)
  2. Las conecte haciendo transiciones donde de jumping cambiaba a falling si la variable “isFalling” era verdadera y de ahi regresaba a la animación run
  3. Finalmente genere la constante STATE_FALLING
const string STATE_FALLING = "isFalling";
  1. Añadí la inicialización en el método Start
animator.SetBool(STATE_FALLING, false);
  1. En el método Update se añade el boolean con el método “IsFalling()”
animator.SetBool(STATE_FALLING, IsFalling());

Y funciono y aprendí a detectar cuando esta cayendo que puede servir también cuando cae al vacio

simplemente le quite el loop a die y jump y alargue para que se note la animacion

En mi caso decidi acomodar las animaciones de esta manera.

Genial

En mi caso lo que hice fue, jugar con las propias herramientas de Unity e hice las animaciones sin tocar codigo, solo toqueteando con Animator.

Lo que yo hice:

  1. dividi la animacion en 3 de la parte de el inicio del salto, un frame para el estar en el aire y los ultimos dos de la caida
  2. los cambie en el animator del palyer run podia salir hacia el salto o hacia la caida y del player jump solo podia ir hacia el playerAir luego a la caida y de regreso a el player run
  3. Use la velocidad del RB para saber en que parte del salto estaba o si estaba saltando o solo cayendo y esto lo guarde en un parametro tipo float del animator
  4. el player jump ahora debia deejar de estr en el suelo y tener una velocidad positiva en y para iniciar el salto ya que si no tenia velocidad o era negativa este caeria. si esta estaba entre -0.5 y 0.5 siguiendo los consejos de abajo se mantenia en el frame del aire

Yo utilice blen animator para el ejercicio pero en cogido no se como se implemente

Solo estire los tiempos de la animación (en la ventana Animation o Ctrl+6) haciendo que concuerde en los tiempo en que esta brincando cuando esta suspendido en el aire y cuando va cayendo

Lo que hice fue que al saltar continuara la animación de correr y al descender la animación de saltar, le da una escencia más natural.

JumpLaunch, JumpFly y JumpLand

Usando un nuevo condicional de tipo Float para las animaciones se puede realizar el reto, y en el código se compara la velocidad en el eje Y para que haga las transiciones.

esta parte fue demasiado facil lo que yo hice fue programar mi codigo de esta manera cuando el personaje este en el piso se reproducira esta linea de codigo anim.Play (“Run”);
que es el de caminar o correr, despues agarra la parte final de la animation de saltar cuando cae que cuando este en el aire se reprodusca la animacion de saltar con el anim.Play(“Jump”); y se aga una transicion a la animacion final del salto y cuando vuelva a tocar el suelo se reproducira la animacion de corre

Lo resolví de una forma un poco más optima. En lugar de crear 3 animaciones, en las flechas del diagrama de animaciones, coloqué desactivado el “Has exit time” entre run y jump y al revés también, la animación de Jump le quité el loop. 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());

    }

Lo que hice solo fue desactivar el loop en la animación de salto y de muerte y les baje un poco la velocidad para que quede mejor. No toque nada del código.
PD: No ocupo las líneas de código que detienen la animación en el último frame.

La forma en la resolvi el reto fue:
-Cree 2 animaciones de saltar una cuando va hacia arriba y otra hacia abajo, le quite el modo loop a las dos.
-Cree una variable booleana que me indique cuando el player esta cayendo.
despues cree esta función:

 bool IsItGoingDown()
    {
        if (this.transform.position.y < Vector2.up.y)
        {
            return true;
        }else
        {
            return false;
        }
    }```

Después simplemente puse esta linea en el update:



animator.SetBool(IS_JUMPING_DOWN, IsItGoingDown());