En la cuarta sesión del taller de creación de videojuegos con Unity configuramos el algunos obstáculos móviles, revisaremos elementos del gameplay y añadiremos unas nubes móviles para decorar el escenario. Además, nos adentraremos un poco más en la programación y edición de código.
A continuación os dejamos el vídeo que se ha estrenado hoy miércoles 13 de mayo.
Los dos scripts que utilizamos en el vídeo se muestran a continuación. También podéis hacer clic en los enlaces y descargarlos directamente.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObstaculoMovilVertical : MonoBehaviour
{
[SerializeField] float velocidad = 3; // Velocidad de desplazamiento
[SerializeField] float rangoY = 0.5f; // Rango de desplazamiento vertical.
private Vector3 PosicionInicial; // Vector tridimensional para guardar la posición inicial
[SerializeField] int Sentido = 1; // Sentido de desplazamiento. 1 = hacia arriba; -1 = hacia abajo
private float factorSentido; // Modifica la velocidad dependiendo del sentido
void Start()
{
PosicionInicial = transform.position; // Guardamos la posición inicial
}
// Update is called once per frame
void Update()
{
// Vamos hacia arriba o hacia abajo? –> Si va hacia abajo, se mueve un poco más rápido
if (Sentido == -1)
{
// Si queremos que se mueva más rápido hacia abajo
factorSentido = 1.2f;
}
else if (Sentido == 1)
{
// Se mueve hacia arriba
factorSentido = 1.0f;
}
// Calculamos la cantidad de desplazamiento. Depende del sentido, el el factor sentido y la velocidad.
float movimientoEnY = velocidad * Time.deltaTime * Sentido * factorSentido;
// Asignamos la nueva posición Y.
float nuevaY = transform.position.y + movimientoEnY;
// Comprobamos si hemos superamos el rango de desplazamiento
if (Mathf.Abs(nuevaY – PosicionInicial.y) > rangoY)
{
// Calculamos un nuevo desplazamiento en y, ajustándolo para llegar al límite de desplazamiento.
float DesplazamientoYlimite = (PosicionInicial.y + rangoY * Sentido) – transform.position.y;
transform.position += new Vector3(0f, DesplazamientoYlimite, 0f); // Nos desplazamos lo justo hasta llegar al desplazamiento de 0.5f respecto a la posición inicial.
Sentido *= -1; // Si lo superamos, cambiamos el sentido.
}
else
{
transform.position += new Vector3(0f, movimientoEnY, 0f); // Si no lo superamos, nos desplazamos.
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ScriptNubes : MonoBehaviour
{
// Definimos variables serializadas para asignar las propiedades de las nubes
[SerializeField] float velocidad = 1.0f; // Velocidad a la que se desplaza una nube
[SerializeField] float PosXmin = -7.0f; // Valor mínimo de la posición X de la nube
[SerializeField] float PosXrespawn = 96.0f; // Valor de la posición X en la que reaparece (hace respawn) la nube
[SerializeField] float RespawnYpos; // Valor de la posición Y en la que reaparece (hace respawn) la nube
private float RandomZ; // Posición z aleatoria
void Start()
{
// Modificamos la velocidad con un número aleatorio de -0.5 a +0.5. Si sale negativo, restamos; sinó, sumamos.
// Esto hará que cada nube, de forma individual pueda tener una velocidad de 0.5 a 1.5.
velocidad += Random.Range(-0.5f, 0.5f); // Equivale a velocidad = velocidad + Random.Range(-0.5f, 0.5f);
transform.localScale *= Random.Range(0.8f, 3.0f); // Cambiamos la escala local de la nube multiplicándola por un número entre 0.8 y 1.5
// Si multiplicamos por 0.8, cogiendo sólo el 80% de su tamaño original (o quitándole un 20%).
// Si el valor es superior a 1, estaremos aumentando el tamaño. Por ejemplo, si tenemos 1.3, lo aumentaremos en un 30%.
// Dar una posición z aleatoria entre -5 y 5
RandomZ = Random.Range(-5f, 5f);
transform.position += new Vector3(0f, 0f, RandomZ); // Añadimos la variación de Z nada más empezar
}
void Update()
{
transform.position -= Vector3.right * velocidad * Time.deltaTime; // Hacemos que la nube se mueva hacia la izquierda restando un vector horizontal
// El vector se multiplica por la velocidad de la nube y Time.deltaTime. Si cambiamos el – por un +, la nube se moverá hacia la derecha.
if (transform.position.x <= PosXmin) // Si la posición X de la nube es más pequeña que la posición mínima que hemos indicado…
{
RespawnearNube(); // Hacemos reaparecer la nube
}
}
// Función para hacer reaparecer la nube
private void RespawnearNube()
{
// Le cambiamos el tamaño y la velocidad cuando reaparece por la derecha
velocidad += Random.Range(-0.5f, 0.5f); // Cambiamos la velocidad.
// Si la nueva velocidad es menor que 0, le asignamos el valor 0.1 para que no se quede quieta.
if (velocidad < 0)
{
velocidad = 0.1f;
}
transform.localScale = new Vector3(1.0f, 1.0f, 1.0f); // Reiniciamos la escala local del objeto a 1.
transform.localScale *= Random.Range(0.8f, 3.0f); // Multiplicamos la escala local por un factor para aumentarla o reducirla.
RespawnYpos = Random.Range(2.4f, 18f); // Le damos un valor aleatorio entre 2.4 y 18 a la posición y en la que reaparecerá la nube
Vector3 nuevaPosicion = new Vector3(PosXrespawn, RespawnYpos); // Creamos un vector con la posición en la que reaparece la nube
transform.position = nuevaPosicion; // Cambiamos la posición de la nube a la nueva posición
}
}
¡Esperamos que os sea de ayuda! ¡Nos vemos en la próxima sesión!