jairogarcíarincón
18/02/2020
Contenidos
Para añadir ahora una nube que aparezca por la izquierda y cuando salga por la derecha se vuelva a recolocar en otra altura y vuelva a salir, duplica la escena Constelacion y llámala NubeSimple.
Si no lo habías añadido antes, arrastra el sprite nube.png dentro de Assets > Sprites y crea un nuevo material llamado nube de tipo Sprites > Default.
- Crea un nuevo 2D Object > Sprite y llámalo Nube.
- Selecciona Nube y, en la Inspector window, arrastra el sprite nube a la propiedad Sprite del componente Sprite Renderer.
- Arrastra el material nube a la propiedad Material del componente Sprite Renderer.
- En el componente Sprite Renderer, selecciona Fondo como Sorting Layer y 5 como Order in Layer.
- Crea un nuevo script llamado Nube dentro de Assets > Scripts y asócialo al objeto Nube.
- Ajusta la escala y coloca el objeto Nube a la izquierda pero fuera de la escena.
Ya tenemos la nube creada, vamos ahora a modificar el script Nube para conseguir que:
- Se mueva de izquierda a derecha a una determinada velocidad
- Cuando salga por la derecha, cambie de tamaño y de posición en y (altura) y vuelva a salir por la izquierda
Modifica el script Nube con el siguiente código y fíjate en los comentarios para entenderlo:
using UnityEngine;
public class Nube : MonoBehaviour {
[Range(0.5f, 1.5f)]
public float velocidad;
GameObject fondo;
float limiteJuego, posicionInicialX;
void Start () {
//Capturo el objeto del fondo y su límite en x
fondo = GameObject.Find("Fondo");
limiteJuego = fondo.GetComponent<SpriteRenderer>().bounds.extents.x;
//Capturo la posición inicial en x para cuando tenga que recolocar la nube
posicionInicialX = transform.position.x;
}
void Update () {
//Calculo el vector de movimiento en X en base a la velocidad y el deltaTime
Vector2 movimiento = new Vector2(Time.deltaTime * velocidad, 0);
//Muevo la nube con ese vector
transform.Translate(movimiento);
//Si la nube se sale completamente de la escena por la derecha, la recoloco a la izquierda
//con otra altura y otra escala (lo multiplico por 1.25 para asegurarme de que la nube ha salido completamente).
if (transform.position.x > limiteJuego * 1.25f)
{
//Escala aleatoria en x e y (z se queda fija)
transform.localScale = new Vector3(Random.Range(0.2f, 0.4f), Random.Range(0.2f, 0.4f), transform.localScale.z);
//Posición inicial en x y aleatoria en y
transform.position = new Vector2(posicionInicialX, Random.Range(0.5f, 1.5f));
}
}
}
Si ahora ajustas la velocidad de la nube, el resultado debería ser similar al del siguiente video:
Fondos en Unity
Ejercicios propuestos
- Modifica este ejemplo de modo que se instancien 3 nubes a distintas alturas, con diferentes velocidades y en diferentes momentos (como Prefab, no poniendo 3 nubes en la escena) y que cuando desaparezcan por la derecha se vayan recolocando de nuevo por la izquierda cambiando su escala y su posición en y (altura).
- Crea una variable pública que permita modificar la dirección del viento (izquierda o derecha) desde la Inspector window.
Publicado el 23 de Noviembre de 2024
unity