Cuarta sesión del taller de creación de videojuegos con Unity

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!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Pin It on Pinterest

×