Singletons (Instancia única)

El singleton (instancia única), es una clase que sólo contiene una instancia y tiene un punto de acceso de manera global a ella. Un Singleton se encarga de auto generar una instancia en caso que no exista una y su referencia es global.

Las utilidades de un singleton son bastantes, desde tener una clase que sirva de almacén de datos y cualquier otra clase pueda acceder a ella y sus funciones y variables de manera global. Por ejemplo si en tu juego solo habrá una cámara y tiene su clase o script que se encarga de controlarlo, se puede volver un singleton para que modificar la cámara bastaría con: CamaraClass.SetPos(NewPos) en caso de C# y CamaraClass::SetPos(NewPos) en caso de C++.

C++

En caso de C++, una manera de tener referencia global es declarar una variable hasta arriba de un archivo, pero esto se complica al manejar varias clases y si queremos tener una referencia de una variable, es mandarlo como parametro como referencia, pero en caso que una clase solo va existir uno, como el que controla la camara, la manera de declarar una clase singleton es tener los 2 archivos para una clase el header(.h) y el ‘Class Code’ (.cpp).

En el ‘Header’ al final del archivo y fuera de las llaves ‘{‘ y ‘}’ se declara un extern del tipo de la clase y como se llamara.


extern MICLASSE g_variable;

Y en el empiezo de ‘Class Code’ se declara:


MICLASSE g_varaible;

De esta manera en todos las clases que queremos hacer referencia a la clase, solo bastara agregar como include el header y al llamar g_variable este harán referencia exactamente a la misma clase con las mismas variables. Bastante útil como contenedor para variables compartidas en varias clases.

C# / Unity

En caso de Unity, una manera popular de tener referencia a un script es declarar una variable publica del tipo del script y en el editor asignar la referencia. Esto no es malo, es una buena manera , sencilla y segura. Pero cuando sabemos que solo puede existir un GameObject con ese script a la vez podemos volverlo un Singleton y no será necesario ni asignarlo por editor ni código, solo llamar el script. Una manera sencilla de volver un singleton un GameObject es:

Creamos un script que yo llame “MiCamara” y se la asignamos a la camara (En mi caso, simulare que mi juego, siempre solo existira una camara por escena).

public class MiCamara : MonoBehaviour
{
    public static MiCamara instancia;

    void Awake()
    {
        instancia = this;
    }

    public void Mover ()
    {
        transform.Translate (Vector3.forward, Space.World);
    }
}

Donde se tiene que declarar una varaible estatica del mismo tipo de la clase que quieres volver un singleton, en este caso ‘MiCamara’. Entonces al empezar la escena, el script se autoasignara en ‘instancia’. Por lo que si quisiera llamar la función ‘Mover’ desde otro script, solo bastara que se llame:


MiCamara.instancia.Mover ();

Bastará escribir el nombre de la clase, ‘instancia’ y sin tener referencia por variable publica en el script, el codigo sabra que con ‘MiCamara.instancia’ te refieres a la camara y en este caso, lograra mover la camara del juego.

Ahora una clase con puras variables publicas y estáticas y removiendo el “: MonoBehaviour” de la clase, todo su contenido sera accesible por todos los scripts y además de servir para compartir variables entre diversos scripts, al cambiar entre escenas sus valores no serán afectados, por lo que es una forma sencilla y optima para comunicar datos entre escenas. Incluso se le puede asignar GameObjects(Como Prefabs), Texture2D, etc.

public class Contenedor
{
    public static int vidas;
    public static bool EstaVivo;
    public static float VelocidadJuego;
}

Deja un comentario

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.