Una 🍺 por el primer script 🍻
Introducción
Game Design del juego
La estructura y assets de un proyecto en Unity
Convirtiendo nuestros assets en Tiles
Tilemaps y creación del escenario
Bonus: FastForward de la creación del escenario, sorting layers y creación de colliders
Acá encontrarás los archivos de este curso
Personaje principal: Movimiento y Animaciones
El jugador y el movimiento
Creando nuestra primera animación
Creando el grafo de animaciones
Usando un árbol de animaciones
Mostrando la solución del desafío e implementando transición entre blended trees
Programando una cámara que siga al jugador
Corrección del bug gráfico
límites del escenario, rigid bodies
Ejercicio: diseño de interiores
Escenarios Avanzados
Transiciones entre escenas
Mantener Player y Camera entre escenas
Spawning Points: programando que el jugador y la cámara aparezcan en el lugar correcto al cambiar de escena
Agregando Identificadores a nuestros Spawning Points para controlar mejor el flujo de nuestro juego
Enemigos Avanzados
Creando nuestro enemigo
Programando las físicas y el patrullaje del enemigo
Generando movimiento completamente aleatorio
Programando el ataque del enemigo
Crear Manager de Health del Player
Crear armas
Programando el ataque del Player con arma
Mover la espada al caminar
Creando el ataque con espada
Ejecutando el ataque con un botón
Movimiento en diagonal
Optimizando nuestro player controller
Ataque mejorado
Uso de partículas
Añadir el daño del enemigo en batalla
Programando los contadores de vida del enemigo
Colocando más info de UI en pantalla
Script de la vida
Personaje principal avanzado
Añadir el daño del personaje (ejercicio)
Sistema de puntos de experiencia para nuestro personaje principal
Level Up!
Level Up! Defensa y Reto Final del Módulo: Stats de los enemigos
Creando un NPC
Limitar el movimiento de nuestro NPC
Creando una pantalla de diálogos para nuestro RPG
El diálogo del NPC
Múltiples líneas de diálogo
Parar el NPC durante el diálogo
Parar el personaje durante el diálogo
Quests
La estructura de una quest
Quest 1: Ir a un lugar
Quest 2: Encontrar un objeto
Quest 3: Matar enemigos
Revisión de bugs
Mantener la cámara dentro del escenario
El problema al cambiar de escena
Audio
Agregando SFX a nuestro videojuego
Agregando música a nuestro videojuego
Ajustar volúmen del audio de cada uno de los efectos de sonido
Creando un VolumeManager
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
Juan Gabriel Gomila
Aportes 18
Preguntas 3
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?