Singletons

Hola!

Hoy os presento algo mas básico y mas sencillo:

Muchos de vosotros, programadores de Unity , os habréis dado cuenta que generalmente en muchos juegos tenéis un script (o varios!) del tipo “Manager” o “Controller” los cuales ellos solos se encargan del juego, o de parte del juego…

Por ejemplo, el típico “GameManager.cs” o “WorldController.cs”. Ejemplos en juegos mas avanzados pueden ser: “WorldController” + “MouseController” + “UIController”.

De estas clases generalmente solo tenemos una instancia de la misma (EL manager) en nuestra escena.No solo eso, si no que SOLO queremos uno (mas, podría incurrir, tal vez, en error). Ademas, generalmente, esta instancia está adjunta como componente a un objeto vacío en la escena.

Por otro lado, si habéis trabajado en Unity con distintos scripts como componentes en distintos Objetos, os habréis percatado que se puede hacer algo tedioso hacer referencia a esos scripts en código.

Crear singletons es una tactica que erradica la dificultad de acceder a una instancia de un “Manager” o “Controller” eliminando parte del tedio de referenciar a scripts y objetos. Notese que solo vale para aquellas clases de las cuales SOLO queramos tener una instancia en todo momento

Un singleton es una referencia estática en la clase que hace referencia a una instancia existente.

Estatica

Nota: los mas novatos en programación tal vez no sepan que significa “estático”. Se trata de un método, variable o incluso una clase entera que no se instancia, es decir, si la clase estuviera como componente no podríamos acceder a sus miembros estáticos de manera normal, si no llamando a la clase en sí en lugar de la instancia:

un ejemplo gráfico:Estatico.JPG

Dicho lo anterior, podemos hacer el truco de almacenar la referencia a la única instancia de nuestro manager de manera estática. Esto es un singleton:

static2.JPG

 

notese que la referencia es estática y que el tipo es el mismo que su clase (PrototypeController). También notese el nombre y que es privada. ¿Como accedemos a ella entonces? Le creamos una propiedad pública. ¿Que es una propiedad? es lo mismo que una variable, pero podemos personalizar que es lo que se hace cuando se le asigna (set) o cuando se la lee (get).

Propiedad

Para crear una propiedad se hace igual que una variable, pero ponemos {} al final y definimos get y set dentro. Get y set pueden no ser definidos(get; set;), en cuyo caso se crea una variable interna por ejemplo:

static3.JPGEn el caso de la imagen anterior s_singleton y singleton estarían desvinculados. Podemos hacer que uno dependa del otro y que s_singleton sea la variable interna de singleton. De hecho debemos hacer esto para no crear un bucle e incurrir en error!

Para definir un get y set personalizado debemos sustituir el “;” por “{}” con código dentro. Ademas, get debe tener un “return” y set puede usar una variable especial llamada value que representa el nuevo valor.

static4.JPG

Notese como se usa s_singleton en lugar de singleton dentro de singleton, nunca singleton, siempre s_singleton. (un poco lioso? :D)

¿Como se “llama” a get y set? aquí algunos ejemplos:

singletoncall

Por ultimo vamos a crear la funcionalidad por la que lo llamamos “singleton”!.

Singleton

Si suponemos que nuestra única instancia de nuestro “Manager” o “Controller” esta amarrada como componente a un objeto vacío de nuestro escena, quiere decir que lo podemos buscar! ¿no? pues observad el siguiente código:

static4.JPG

 

Si al leer singleton no hay singleton, lo buscamos!. Si sigue sin haberlo, soltamos error!. Salvo que hagáis algo raro ese error no debería salir… nunca! y si queréis podéis aplicar alguna técnica de tratamiento de errores.

¿Y todo esto para que?

singletonfinal2

Ya dije que era una cosa sencilla!

Pero con esto hemos sacado 3 cosas buenas.

  1. Es mas fácil de llamar a los Controllers y/o Managers, EVERYWHERE!. Os ahorra dolores de cabeza.
  2. Os acostumbráis a trabajar con Propiedades (para ello me he parado en ellas!) gets y sets everywhere!
  3. Hay mas tipos de singletons! Podéis tener un singleton como un GameObject en una escena (físicamente) y con “DontDestroyOnLoad()” podéis hacer no solo que el objeto no sea borrado al cambiar de escena, si no que si ya existe al cargarla no hayan dos iguales incluyendo esto en el “Awake()”:Dontdestroyonload.JPG

Por ultimo y para terminar os dejo algo aun mas avanzado para GameObjects que no se destruyen al cambiar de escena y que tienen un singleton:

SingletonInstance.JPG

Luego solo tenéis que hacer que vuestra clase herede de “Singleton<TUCLASE>” y yasta todo hecho!.

ProfileSingleton.JPG

Esto es todo!

Muchas gracias! si os a gustado seguidme en Twitter! o ponedme en vuestro feed de blogs!

Y también tengo un canal de Gaming en Youtube!

Cualquier duda, dejadme un comentario!

Hasta la próxima!

Advertisements

One thought on “Singletons

  1. Pingback: Delegados, Eventos y Acciones | Mecze Entertainment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s