jairogarcíarincón

Nube simple


5.69K

Introducción

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.

Nube

  • 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.




Script

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 13 de Mayo de 2025

unity