Introducción

1

Game Design del juego

2

La estructura y assets de un proyecto en Unity

3

Convirtiendo nuestros assets en Tiles

4

Tilemaps y creación del escenario

5

Bonus: FastForward de la creación del escenario, sorting layers y creación de colliders

6

Acá encontrarás los archivos de este curso

Personaje principal: Movimiento y Animaciones

7

El jugador y el movimiento

8

Creando nuestra primera animación

9

Creando el grafo de animaciones

10

Usando un árbol de animaciones

11

Mostrando la solución del desafío e implementando transición entre blended trees

12

Programando una cámara que siga al jugador

13

Corrección del bug gráfico

14

límites del escenario, rigid bodies

15

Ejercicio: diseño de interiores

Escenarios Avanzados

16

Transiciones entre escenas

17

Mantener Player y Camera entre escenas

18

Spawning Points: programando que el jugador y la cámara aparezcan en el lugar correcto al cambiar de escena

19

Agregando Identificadores a nuestros Spawning Points para controlar mejor el flujo de nuestro juego

Enemigos Avanzados

20

Creando nuestro enemigo

21

Programando las físicas y el patrullaje del enemigo

22

Generando movimiento completamente aleatorio

23

Programando el ataque del enemigo

24

Crear Manager de Health del Player

25

Crear armas

26

Programando el ataque del Player con arma

27

Mover la espada al caminar

28

Creando el ataque con espada

29

Ejecutando el ataque con un botón

30

Movimiento en diagonal

31

Optimizando nuestro player controller

32

Ataque mejorado

33

Uso de partículas

34

Añadir el daño del enemigo en batalla

35

Programando los contadores de vida del enemigo

36

Colocando más info de UI en pantalla

37

Script de la vida

Personaje principal avanzado

38

Añadir el daño del personaje (ejercicio)

39

Sistema de puntos de experiencia para nuestro personaje principal

40

Level Up!

41

Level Up! Defensa y Reto Final del Módulo: Stats de los enemigos

42

Creando un NPC

43

Limitar el movimiento de nuestro NPC

44

Creando una pantalla de diálogos para nuestro RPG

45

El diálogo del NPC

46

Múltiples líneas de diálogo

47

Parar el NPC durante el diálogo

48

Parar el personaje durante el diálogo

Quests

49

La estructura de una quest

50

Quest 1: Ir a un lugar

51

Quest 2: Encontrar un objeto

52

Quest 3: Matar enemigos

53

Revisión de bugs

54

Mantener la cámara dentro del escenario

55

El problema al cambiar de escena

Audio

56

Agregando SFX a nuestro videojuego

57

Agregando música a nuestro videojuego

58

Ajustar volúmen del audio de cada uno de los efectos de sonido

59

Creando un VolumeManager

60

Agregando economía a nuestro juego y cierre

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Movimiento en diagonal

30/60
Recursos

¿Cómo corregir el movimiento diagonal en videojuegos?

Al desarrollar un videojuego, es crucial garantizar que las mecánicas de movimiento sean coherentes y fluidas. Un problema común es cuando un personaje se mueve más rápido en diagonal que en horizontal o vertical, debido a cómo se combinan los vectores de movimiento. Veamos cómo podemos corregir este bug visual siguiendo una metodología sencilla y efectiva.

¿Por qué la diagonal hace que el personaje se mueva más rápido?

Cuando combinamos un movimiento horizontal con uno vertical, estamos sumando dos vectores, lo que da lugar a un movimiento diagonal. Según la geometría, esta diagonal es la hipotenusa de un triángulo rectángulo, lo que significa que su longitud es mayor que la de los lados del triángulo (representando los vectores horizontales y verticales). Por lo tanto, en los videojuegos, el personaje puede moverse más rápido de lo esperado. Para corregir esto, es necesario normalizar el vector de movimiento.

¿Cómo normalizar el movimiento en Unity?

Para abordar este problema, debemos modificar nuestro código, asegurándonos de que la velocidad sea uniforme en todas las direcciones. A continuación, se describen los pasos a seguir:

  1. Comprobar el movimiento en dos direcciones:
  • En el método update del PlayerController, añadimos una comprobación adicional para ver si el personaje se mueve tanto en horizontal como en vertical.
  1. Crear variable currentSpeed:
  • Introducimos una variable privada currentSpeed para manejar la velocidad modificada del personaje.
  1. Normalizar la velocidad:
  • Si el personaje se mueve diagonalmente (en dos direcciones), ajustamos currentSpeed dividiendo la velocidad original por la raíz cuadrada de 2, utilizando mathf.sqrt(2).

  • En caso contrario, currentSpeed se iguala a la velocidad original.

    // Código de ejemplo en C# if (Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5 && Mathf.Abs(Input.GetAxisRaw("Vertical")) > 0.5) { currentSpeed = speed / Mathf.Sqrt(2); } else { currentSpeed = speed; }

  1. Aplicar currentSpeed al movimiento:
  • Cambiar todos los usos de la variable speed por currentSpeed para asegurar que influya adecuadamente en el movimiento del personaje.

¿Qué consideraciones tener con la animación en movimiento diagonal?

Además de ajustar la velocidad, debemos tener en cuenta cómo se presentan las animaciones al moverse en diagonal. Diferentes direcciones pueden requerir diferentes animaciones, lo cual es fundamental para mejorar la experiencia del usuario.

  • Cuando el personaje se mueve en diagonal, es posible que las animaciones requieran priorizar una dirección sobre otra para mantener la consistencia visual.

  • Podemos crear un sistema que decida por una dirección predominante al mirar en diagonal, facilitando la ejecución de las animaciones adecuadas.

¿Cómo configurar las animaciones en Unity?

Para el caso de un juego en 2D con movimiento en ocho direcciones, se pueden seguir estos pasos:

  1. Acceder al Animator y a los Blend Trees:
  • Dentro del Animator, ajustar las configuraciones para las animaciones de ataque o movimiento.
  1. Crear Motion Fields adicionales:
  • Añadir nuevos Motion Fields en las posiciones de coordenadas diagonales como (1,1), (1,-1), (-1,-1), (-1,1).
  1. Asignar animaciones prioritarias:
  • Por cada par de posiciones diagonales, asignar una animación ya existente que se corresponda con una de las direcciones principales (arriba, abajo, izquierda, derecha).

    // Ejemplo de pseudocódigo para configurar animaciones if (posicionDiagonal) { animacionAtaque = animacionPrincipalCorrespondiente; }

Con estos ajustes, conseguirás que las animaciones y el control del personaje sean mucho más fluidos y coherentes, lo que contribuye significativamente a una mejor experiencia de juego. Al integrar estas prácticas en tu flujo de trabajo de desarrollo, optimizarás el comportamiento y las animaciones del personaje, manteniéndolos consistentes en cada dirección. ¡Sigue aprendiendo y mejorando tus habilidades de desarrollo de videojuegos!

Aportes 5

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

a pesar que me lo sugiere vsc el if else que agregamos queda mejor con un operador binario:

currentSpeed = Mathf.Abs(Input.GetAxisRaw(horizontal)) && Mathf.Abs(Input.GetAxisRaw(vertical)) ? speed / Mathf.Sqrt(2) : speed

Mucho mejor si en el input tomamos la direccion vertical y horizontal y luego normalizamos el vector y ya, sin necesidad de sacar raiz ni sacar tantos if. Hago todo en 3 updates diferentes, pero pueden escribir todo en uno solo

void Update() {
        if (Input.GetMouseButton(0)) {
            attacking = true;
            walking = false;
            attackTimeCounter = attackTime;

            direction = Vector2.zero;
        }

        if (attacking) {
            attackTimeCounter -= Time.deltaTime;
            if (attackTimeCounter < 0) {
                attacking = false;
            }
        } else {
            direction.x = Input.GetAxisRaw(horizontal);
            direction.y = Input.GetAxisRaw(vertical);

            if (direction != Vector3.zero) {
                lastDirection = direction;
                walking = true;
            } else {
                walking = false;
            }
        }

    }

    void FixedUpdate() {
        rgbd.velocity = speed * direction.normalized;
    }

    private void LateUpdate() {
        anim.SetFloat(horizontal, direction.x);
        anim.SetFloat(vertical, direction.y);
        anim.SetFloat(lastHorizontal, lastDirection.x);
        anim.SetFloat(lastVertical, lastDirection.y);
        anim.SetBool(walkingState, walking);
        anim.SetBool(attackingState, attacking);
    }

Genial

Vamos a optimizar.😎

En mi caso guarde los ejes en variables llamadas x e y para que quede mas corto y use un operador ternario 😃

currentSpeed = Mathf.Abs(x) > .5f && Mathf.Abs(y) > .5f ? speed / Mathf.Sqrt(2) : speed;