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;
}

MipMaps en Unity

Este script es parte de Arj2D.

Los MipMaps de una textura es cuando Unity pre genera varias versiones de una imagen para cuando un Objeto que utilice esa imagen se encuentra escalado o alejado de la cámara (Solo en cámara perspectiva), para evitar que en cada cuadro sea calculado ese cambio de escala en la imagen y ahorrar tiempo en el procesamiento.

En proyectos 3D, si una textura se utilizara en un modelo 3D es bueno dejárselo, pero en caso de un proyecto 2D y sabemos que esa imagen no la escalaremos será mostrado con escala normal como el UI, podemos desactivárselo, ya que al dejarlo activado, este archivo pesara un 30% más.

Desactivar MipMaps por defecto o automáticamente.

Ahora, aquí les comparto un script que debe estar dentro de una carpeta llamada «Editor», el cual genera que automáticamente todas las nuevas imágenes que se agreguen al proyecto, tengan deshabilitado Mipmaps por defecto.

Manejar aspecto de pantalla para diferentes resoluciones

Este script es parte de Arj2D.

Cuando se trabaja para dispositivos móviles, es normal encontrarse con un pequeño problema y más si se trabaja en 2D es que al haber tantos aspectos de pantalla entre tanto dispositivo en el mercado, es fácil que si desarrollamos nuestro juego donde en una esquina esta un objeto por ejemplo el mostrador de puntaje, al pasarlo a otro dispositivo con una dimensión diferente (Más frecuente cuando es uno de menor dimensión) el puntaje ya no aparece en pantalla o caso contrario donde la resolución es mayor el puntaje, este aparece, pero ya no en la esquina.

Para solucionar este problema sin tener que ajustar todo el contenido de nuestra(s) escena(s), podemos agregar este script a cada camera del juego y poner la resolución original con la que fue desarrollado el juego y listo.

Este funciona de 2 maneras, una es forzar la cámara para que se ajuste a la pantalla simplemente llamando «this.GetComponent<Camera>().aspect = AspectoDeseado» la desventaja de este método es que puede distorsionar un poco el render si el aspecto difiere mucho, sin embargo es el más utilizado.

La otra manera es calcular la mayor cantidad espacio de la pantalla que se puede utilizar sin forzar la distorsión y solo dibujar en esa área, sin embargo la desventaja es que en algunos dispositivos puede quedar espacio en las orillas sin usarse. Nota mi script añade una segunda cámara al usar este modo para llenar de color negro esta parte, ya que si no se añade esta segunda cámara en algunos dispositivos llena faltante como se le de la gana al diapositivo y puede generar efectos curiosos.


private void Resize()
{
 //Aspect ratio
 float targetaspect = DesignAspectWidth / DesignAspectHeight;

 //check actual aspectratio
 float windowaspect = (float)Screen.width / (float)Screen.height;

 //check actual vs wish aspect
 float scaleheight = windowaspect / targetaspect;

 if (scaleheight &lt; 1.0f) //portrait
 {
  Rect rect = GetComponent().rect;

  rect.width = 1.0f;
  rect.height = scaleheight;
  rect.x = 0;
  rect.y = (1.0f - scaleheight) / 2.0f;

  GetComponent().rect = rect;
 }
 else //lanscape
 {
  float scalewidth = 1.0f / scaleheight;

  Rect rect = GetComponent().rect;

  rect.width = scalewidth;
  rect.height = 1.0f;
  rect.x = (1.0f - scalewidth) / 2.0f;
  rect.y = 0;

  GetComponent().rect = rect;
 }

 //Create background in black
 CreateBackGround();
}

private void CreateBackGround()
{
 Camera cam = new GameObject().AddComponent();
 cam.gameObject.isStatic = true;
 cam.depth = -10;
 cam.cullingMask = 0;
 cam.farClipPlane = 1f;
 cam.orthographic = true;
 cam.backgroundColor = Color.black;
 cam.gameObject.name = "BackGround_Camera";
}

DESCARGAR SCRIPT

Arj2D

Arj2D es un framework que estoy desarrollando que trae scripts para el Editor, GameObjects, librerías y singletons que ayudan a la elaboración de proyectos en Unity orientado a 2D. Algunos scripts son compatibles con proyectos 3D, pero en si el framework esta orientado al 2D. Ya que el framework esta en desarrollo y contiene varios scripts, iré publicando aquí en el blog partes de él y así como un poco más detallada de que hacen.

El Framework es de código abierto y gratuito, y se encuentra hospedado en GitHub para que siempre puedan tener acceso a la ultima versión. Arj2D.

Si tienes un proyecto que utilice una parte de el framework, pueden decirme y lo publicare aquí.

Juegos/Proyectos que usan Arj2D:

ShoeBox y Unity – (Generador de Atlas para Unity)

ShoeBox es un programa gratuito que permite unir varias imágenes para elaborar un Atlas (Una imagen grande con varias imágenes más pequeñas), el cual los Atlas son muy útiles en el momento de trabajar en videojuegos ya que sirve mucho en la optimizan (En otro post hablare de esto). Lo mejor de todo es que es completamente gratuito.

Interfaz del programa

Aquí les agrego la imagen del antes y después de utilizar este programa. Solo debemos arrastrar todas las imagenes que queremos que se unan en una mayor a «Sprite Sheet» de ShoeBox.

Mario_shoebox

De 44 imágenes, obtenemos solo una imagen, pero conservando sus tamaños.

ShoeBoxReading (Importador de ShoeBox a Unity)

Obtenemos una imagen más grande que tiene adentro de el todas las imágenes que forman las animaciones del personaje (Mario bros) en este caso y un archivo llamado «sprites.xml» el cual usaremos para poder importarlo en Unity.

Para esto necesitaremos de un script para Unity que yo eh elaborado, el cual podemos obtener de aquí Link. Y este script tenemos que pasarlo a Unity dentro de una carpeta llamada «Editor» (Si no tenemos, la creamos). Una vez agregado pasamos agregar los 2 archivos que nos genero ShoeBox que es la imagen Atlas de Mario Bros que tenemos que asignar como Sprite y el archivo «sprites.xml», ambos archivos podemos cambiarles el nombre. Dentro de Unity iremos a «Windows -> ShoeBoxReading -> Import» y nos mostrara una ventana que nos pedirá un Texture2D y un archivo, aquí asignaremos los 2 archivos que habremos pasado a Unity y indicamos donde queremos el pivote de los sprites y le damos en «Read»  y listo.

shoeboxreading

Listo ya tenemos nuestros sprites para poder trabajar en Unity y de manera optimizada. Ahora el archivo «sprites.xml» pueden eliminarlo (y en caso recuperarlo usar el siguiente script) o dejarlo ahí en el proyecto, al final al cabo al momento de compilar Unity ignorara este archivo y no afectara en el tamaño final de la compilación.

ShoeBoxMaked (Exportador de Unity a ShoeBox):

También eh elaborado un script que permite a partir de un Atlas, generar el archivo «sprite.xml» para poder recuperar las imágenes y separarlas con ayuda de ShoeBox. Esto en caso que hayamos eliminado el archivo «sprite.xml» y la opción de «Extract sprites»  de ShoeBox no haya dado resultado.

Para eso bajaremos el archivo ShoeBoxMaked y lo agregaremos a Unity en una carpeta llamada «Editor» y pasaremos a «Windows -> ShoeBoxReading -> ShoeBox Export» donde nos mostrara una ventana donde nos pedirá un Texture2D y aquí asignaremos el Atlas con sus sprites ya asignados de Unity y le damos en «Create» y nos genera un archivo «(Nombre del atlas).xml» en la misma carpeta donde se encuentra el Atlas que utilizamos, y ahora abrimos esta carpeta en el explorador y arrastramos estos dos archivos a la opción «Read Sprites» y obtendremos sprite como imagen separada, el proceso inverso de «SpriteSheet».

marios

Al dar en Save almacena cada sprite como imagen independiente en la misma carpeta donde se encuentran los 2 archivos que usamos.

Preguntas (FAQ):

  • ¿Porque no generas un archivo para descargar inmediatamente?
    • Uso GitHub para compartir proyectos de codigo abierto y de esta manera si hago un cambio es fácil siempre descarguen la versión más reciente. Si prefieres puedes ir a la raiz del proyecto LINK y de lado derecho le das en «Download ZIP» y solo importa la carpeta «Editor» a Unity.
  • Unity ya tiene su generador de Atlas, ¿porque usar ShoeBox?.
    • Bueno, estos scripts los genere cuando el generador de Atlas era exclusivo de la versión PRO, pero sigo usándolo para tener un mayor control del Atlas.

Gestor de proyectos recientes en Unity

Al abrir Unity, este nos muestra una lista de todos los proyectos con los que hemos trabajado dentro de Unity. Pero con el paso del tiempo se irán acumulando y no es necesario que siempre tengamos el acceso directo a todos los proyectos. Es por eso que eh desarrollado este software que permite visualizar todos los proyectos que están en la lista de Unity de proyectos recientemente abierto y podremos seleccionar y eliminar con un clic aquellos proyectos que ya no deseemos que aparezcan en la lista.

projectlistunitymaanger

Nota: Solo lo remueve de la lista de proyectos recientes en Unity, NO elimina el proyecto del disco duro. Así si deseamos reabrir un proyecto que no se encuentre en la lista, bastara con usar el abrir proyecto.

Descargar versión para Unity 5 

Descargar versión para Unity 4

Hola Mundo!

Hola a todos, bienvenidos a mi blog. Anteriormente tenia daba mantenimiento a mi ex blog Arjïerda, pero después de un tiempo decidí reabrir otro blog, que es este Arjierda Games. Aquí estará más enfocado a la programación y más que nada al desarrollo de videojuegos. Generalmente sera sobre C++, C# enfocado a Unity y por ahí que otro lenguaje de programación. Así como explicación de algunas teorías y consejos. Espero sea de su agrado y no olviden en comentar y compartir.

También publicare sobre herramientas que vaya desarrollando y el como usarlas.