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

Crea una cuenta o inicia sesión

¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera

El jugador y el movimiento

7/60
Recursos

¿Cómo hacer que un personaje se desplace en Unity?

En el fascinante mundo de Unity, lograr que un personaje se mueva por el escenario es uno de los primeros pasos para dar vida a tu juego. Esto se consigue mediante la creación de un controlador, un tipo de script dedicado a manejar el comportamiento del personaje. A continuación, exploraremos los pasos y conceptos clave que te permitirán implementar esta funcionalidad de manera efectiva.

¿Qué es un controlador y cómo se crea?

El controlador es un script en Unity que gestiona los movimientos y acciones del personaje. En nuestro caso, queremos facilitar que el personaje se maneje con las flechas del teclado utilizando el Input Manager de Unity. Aquí están los pasos esenciales para configurar todo:

  1. Acceso a los Project Settings: dirígete a los ajustes de proyecto para configurar los ejes de movimiento. Unity predefine 18 ejes que pueden ser mapeados a diferentes dispositivos de entrada, como teclados o mandos de consola.

  2. Configurar el movimiento: los principales ejes para el control son el movimiento horizontal y vertical, mapeados a las flechas izquierda, derecha, arriba y abajo, y alternativamente a las teclas A, D, W y S. Recuerda que "Horizontal" y "Vertical" están definidos con mayúsculas.

  3. Crear el script PlayerController: navega a la carpeta de scripts y crea un nuevo script en C#. Debes nombrar este script como PlayerController sin espacios, y debes asociarlo al jugador arrastrándolo al GameObject correspondiente.

¿Cómo se programan las variables de movimiento?

La programación comienza con la declaración de las variables necesarias para gestionar el movimiento. Aquí se hace un desglose de las principales consideraciones:

  • Variable de velocidad: define una variable pública public float speed, que controla la velocidad del personaje. Este valor se puede editar directamente en Unity para ajustarlo sin necesidad de volver a modificar el código.

  • Constantes de movimiento: es una buena práctica definir las constantes de movimiento dentro del script para evitar errores comunes con mayúsculas/minúsculas. Declare:

    private const string Horizontal = "Horizontal"; private const string Vertical = "Vertical";

¿Cómo detectar el movimiento del usuario en cada frame?

El proceso de detectar el movimiento del usuario se realiza en el método Update, que se ejecuta en cada frame. Aquí, se implementa una lógica basada en una conocida ecuación de física:

  1. Verificación del movimiento: evalúa si el movimiento horizontal o vertical supera un umbral de 0,5 para asegurarse de captar un movimiento significativo y evitar interferencias menores del hardware.

  2. Implementación de la ecuación física: el espacio de movimiento se calcula como el producto de speed y time.deltaTime:

    if (Mathf.Abs(Input.GetAxisRaw(Horizontal)) > 0.5f) { transform.Translate(new Vector3(Input.GetAxisRaw(Horizontal), 0, 0) * speed * Time.deltaTime); }

    if (Mathf.Abs(Input.GetAxisRaw(Vertical)) > 0.5f) { transform.Translate(new Vector3(0, Input.GetAxisRaw(Vertical), 0) * speed * Time.deltaTime); }

El time.deltaTime facilita el cálculo de cuánto tiempo ha pasado desde el último frame, garantizando así un movimiento fluido y consistente.

¿Cómo probar y ajustar el movimiento en Unity?

Una vez terminado el script, es fundamental probar su funcionalidad dentro del editor de Unity. Al ingresar al modo Play, podrás verificar si el personaje responde a las flechas de dirección y ajustar la velocidad si es necesario:

  • Asegúrate de que el script esté debidamente vinculado al objeto del personaje.
  • Observa cómo se desplaza en el escenario, tanto en movimientos verticales como horizontales, y realiza ajustes según sea necesario.

A través de estos pasos, tu personaje ahora tendrá la capacidad de moverse por el escenario, permitiendo futuras mejoras, como la adición de animaciones o la implementación de límites de movimiento. ¡Sigue explorando y experimentando en Unity para pulir este control de personajes en tu juego de roguelike!

Aportes 18

Preguntas 3

Ordenar por:

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

Una 🍺 por el primer script 🍻

Hola Juan disculpa la molestia pero al programar el player controller en visual studio 2017 no me marca el comando mathf, que es lo que puedo hacer???

Resumen de la clase

El objetivo es mover al conejo por el escenario. Vamos a Edit > Project Settings > Input donde vemos los ejes Horizontal y Vertical que serán los controles del movimiento.

Nos creamos el script PlayerController y se lo asignamos al Player. Añadimos las variables Speed, a qué velocidad se moverá, y como buena práctica definimos las constantes horizontal y vertical.

En el Update comprobamos si el valor absoluto del eje Horizontal es superior a un valor, entonces usamos Translate para cambiar la posición del personaje, multiplicando horizontal, speed y el tiempo.

Hacemos lo mismo para el eje vertical. Ahora comprobamos que se mueve el personaje.

Chicos, el movimiento es mejor capturarlo y normalizarlo al momento de crear el vector2. Por que?
Porque la magnitud del vector siempre debe ser = 1.
Ej. Cuando apretamos a la derecha, la magnitud es 1 (x=1 , y=0)
Cuando apretamos arriba la magnitud es 1 (x=0, y=1).
Pero cuando apretamos en diagonal la magnitud se vuelve >1 (x=1, y=1) esto hace que el personaje vaya más rapido al ir en diagonal que al ir hacia los costados o hacia arriba.
Basicamente surge por Pitagoras, c2 = a2 + b2. Si reemplazamos a y b por 1. El resultado da 1,41 dando ese plus de velocidad

private void FixedUpdate()
    {
        isWalking = false;
        if (Mathf.Abs(_horizontalMovement) > 0.5f)
        {
            /*this.transform.Translate(new Vector3(_horizontalMovement * speed * Time.deltaTime, 0,0));*/
            Vector2 movement = new Vector2(_horizontalMovement, _rigidbody.velocity.y).normalized;
            _rigidbody.velocity = movement * speed * Time.deltaTime;
            isWalking = true;
            lastMovement = new Vector2(_horizontalMovement, 0);
        }
        if (Mathf.Abs(_verticalMovement) > 0.5f)
        {
            /* this.transform.Translate(new Vector3(0, _verticalMovement * speed * Time.deltaTime, 0));*/
            Vector2 movement = new Vector2(_rigidbody.velocity.x,_verticalMovement).normalized;
            _rigidbody.velocity = movement * speed * Time.deltaTime;
            isWalking = true;
            lastMovement = new Vector2(0, _verticalMovement);
        }

Por qué usamos transform.Translate y no rigid.velocity para poder desplazar nuestro personaje?

Excelente forma de poder agregar el movimiento al personaje.
Si han visto los anteriores cursos, hemos aprendido distintas maneras de lograr movimiento.
¡Excelente video!

Aqui comparto mi script de movimiento

[SerializeField] public float speed = 4.0f;

[SerializeField] const string hor = "Horizontal";
[SerializeField] const string ver = "Vertical";

[SerializeField] Vector2 dir;

void Start()
{
    
}

void FixedUpdate()
{
    Movement();
}

void Movement()
{
    if(Mathf.Abs(Input.GetAxisRaw(hor)) >= .5f)
    {
        dir.x = Input.GetAxisRaw(hor) * speed;
    }
    if (Mathf.Abs(Input.GetAxisRaw(ver)) >= .5f)
    {
        dir.y = Input.GetAxisRaw(ver) * speed;
    }

    transform.Translate(dir);
}

Acá dejo mi función Update:

void Update()
{
  float vectorX = 0;
  float vectorY = 0;

  if (Mathf.Abs(Input.GetAxisRaw(horizontal)) >= 0.5f) {
    vectorX = Input.GetAxisRaw(horizontal) * speed * Time.deltaTime;
  }

  if (Mathf.Abs(Input.GetAxisRaw(vertical)) >= 0.5f) {
    vectorY = Input.GetAxisRaw(vertical) * speed * Time.deltaTime;
  }

  this.transform.Translate(new Vector3(vectorX, vectorY, 0));
}

Aquí lo tienen completo

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

public class PlayerController : MonoBehaviour
{

    public float speed = 4.0f;

    private const string horizontal = "Horizontal";
    private const string vertical = "Vertical";

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // s = v*t;
        //Movimiento horizontal
        if(Mathf.Abs(Input.GetAxisRaw(horizontal))>0.5f){
            this.transform.Translate(new Vector3(Input.GetAxisRaw(horizontal)
            *speed*Time.deltaTime,0,0));
        }
        //Movimiento vertical
        if(Mathf.Abs(Input.GetAxisRaw(vertical))>0.5f){
            this.transform.Translate(new Vector3(0,Input.GetAxisRaw(vertical)
            *speed*Time.deltaTime,0));
        }
    }
}

https://github.com/platzi/rpgConUnity/tree/7a2149e5dee1372f6f142d6c49d3354d5894d87a
Este es el link de para descargar los scripts del profe y checar cada línea de código

Genial

Por que usamos Vector3 si no vamos a mover al personaje en el eje Z?

Encantado por esta increíble clase, me gusto el uso de funciones matemáticas como el valor absoluto, siempre es bueno darse su leída sobre matemáticas y física, te pueden ayudar un montón. 😄

este chico explca la funcion mathf con otro ejemplo
https://www.youtube.com/watch?v=mFOi6W7lohk

Muy útil Math.Abs, para poder darle seguridad al juego 😄

//Time.time->Regresa el tiempo transcurrido
        //Timer.deltaTime->La velocidad a la que corre el juego
///Mathf.Abs ->Obtiene el valor numerico sin signo, siendo siempre positivo ```

me encanta programar el movimiento del personaje

QUE EMOCIÓN DE VERDAD