Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

unity

Realidad Virtual Desarrollando para Oculus con Unity

Este año profundizamos en Realidad Virtual con Unity, desarrollando tanto para Cardboard como para Oculus, una vez instalado el SDK de Oculus , podemos empezar a testear con las gafas, simplemente conectándolas y dándole al Play.
Hay que afinar mucho mas tanto los modelos como las texturas, así como las sombras , los objetos deben estar perfectamente colados, cualquier error es muchísimo mas evidente que en un videojuego normal.
Aun estamos experimentando con todas las posibilidades que la interacción y la inmersión que proporcionan las Oculus nos ofrecen, pero realmente es sumamente interesante.

Realidad Virtual en Unity

IMG_20180616_092841_522
Hasta ahora venía considerando la realidad virtual como la utilización de un simple periférico, es decir, pasar el control de la cámara a un dispositivo como por ejemplo el giroscopio del móvil, sin embargo este año hemos profundizado más en Realidad Virtual en clase, permitiendo realizar diferentes experiencias, una pasiva de terror, una visita virtual, y una montaña rusa, lo que es muy significativo es que la experiencia es muy diferente de verla en el ordenador a con las gafas puestas, la capacidad de nuestro cerebro para admitir la nueva realidad es extraordinaria , en unos segundos nos sumergimos en ese nuevo mundo virtual, y las sensaciones que nos provoca el movimiento y el vértigo son reales, creo q aún hay mucho que descubrir en realidad virtual y me parece muy interesante poder hacerlo de forma relativamente sencilla con Unity. La implementación para cardboard es fácil si uno sigue el esquema que Google ofrece con su cardboard SDK.

Blender fluids a Unity

Crear animaciones realistas de fluidos en Unity puede ser muy complicado, lo más común es que se utilice el Particle System para tratar de emular el comportamiento, pero queda lejos de la interacción con el entorno y la física aplicada a los fluidos.
Por eso podemos acudir a soluciones externas como es utilizar Blender y su sistema de fluidos.
Pros:
Podemos crear animaciones de fluidos complejas que intercacionan con el entorno, y que generan un mesh complejo.
Contras:
No podemos importar directamente el fluido resultante en Blender, tenemos que exportar el resultado de la simulación, podemos hacerlo como una secuencia de objs o como un alembic .
Aquí os dejo un video de una simulación creada en blender exportada alembic e importada en Unity.

Muy pronto creare un vídeo tutorial para explicar el proceso.

Cuchillo sangriento 3D

Me he creado una cuenta en Skechfab , para ir subiendo algunos modelos 3D y escenas de Unity, ya que se pueden subir scenes desde Unity a Skechfab de una forma fácil y rápida,  simplemente metiendo un unitypackage que se descarga desde la página de Skechfab.

 

La escena se puede bajar y ser usada para cualquier proyecto.

Y si os gusta podéis apoyarme en

https://www.patreon.com/unityhorror

Creando Horror en Unity

Unity horror knifeComienzo un nuevo proyecto personal, tras varios años como diseñador y profesor de videojuegos , quiero compartir mi conocimiento , técnicas , modelos y scripts con la gente.

Para ello he decidido centrarme en un tema en particular, los videojuegos de terror  , miedo, horror etc.

Me he creado un patreon con el que espero ir creando una comunidad de seguidores fiel y voy a actualizar mucho más mis redes sociales.

Si quieres apoyarme en este proyecto, que culminará en un videojuego de terror entra en :

https://www.patreon.com/unityhorror

Unity y Blender misma configuración.

Sin duda muchos desarrolladores de videojuegos utilizan blender para hacer sus videojuegos 3D, sin embargo la primera vez que pasamos de usar Unity a Blender puede ser un poco frustrante por el cambio en el manejo de los controles, por eso es interesante hacer un cambio en la configuración de Blender para que no tengamos que reaprender a movernos, sino que sea lo mas parecido a Unity.
Afortunadamente siempre hay algún desarrollador que piensa en los demás y lo comparte (Gracias niusounds por el aporte).
En este enlace podéis bajaros un archivo de configuración para Blender.
Como explican desde el propio github una vez descargado tendremos que:

  1. Ir a to File->User Preferences->Input->Import Key Configuration…
  2. Cargar el archivo descargado keyconfig.py
  3. Salvar las nuevas preferencias.
  4. Listo!

Unity 2D: No quedarse pegado a una plataforma

Un problema bastante común cuando creamos un videojuego de plataformas es que nuestro personaje parece quedarse pegado a una plataforma, y en vez de caer, se mantiene en el aire, sobre todo si además estamos dándole una fuerza o cambiando su velocidad en x.

salto_fallido
Hay varias soluciones para resolver este problema:
La primera es que nuestras plataformas estén compuestas por varios gameobjects con box collider2D o polygon Collider 2D si fuera necesario y tener un material físico asociado a los mismos con Friction 0 y Bounciness 0.
El proceso sería:

  1. Creo un Game Object vacio , GameObject -> Create empy , lo re nombro a plataforma1
  2. Coloco mis Sprites de plataforma como hijos de plataforma1
  3. Añado un box collider 2D a la plataforma pero dejo la punta y el final sin cubrir.
  4. collider_sin_todo
  5. Renombro los Game Object de los sprites a Desliza1 y Desliza2
  6. Añado un box collider a cada uno
  7. Los coloco en la posición delantera y trasera de la plataformaplataforma_tres_colliders
  8. Por lo tanto tendré 3 Box Collider en cada plataforma
  9. Creo un Material Fisico, dentro del proyecto , Boton derecho del raton -> Physics Material 2D, le doy Friction 0 y Bounciness 0. Lo llamo desliza
  10. A los box colliders 2D Desliza1 y Desliza2 les añado el material físico
  11. Listo ahora al tener una fricción de 0 el personaje cae.

La segunda solución es utilizar directamente un componente llamado Platform Effector, el cual hace que el personaje pueda atravesar las zonas que nosotros configuremos.

  1. Creo un Game Object vació , GameObject -> Create empy , lo re nombro a plataforma_linea
  2. Meto mi Sprite como hijo
  3. Añado un Box Collider 2D
  4. Creo un material fisico como el paso 9 anterior y lo añado al box collider
  5. Añado un Componente , desde Component-> Physics 2D-> Platform Effector
  6. En el componente marco la opcion Use Side Friction
  7. Listo

La tercera solución es la mas simple y responde a la siguiente pregunta, ¿Necesito detectar toda la plataforma o solo la linea superior?

  1. Creo un Game Object vació , GameObject -> Create empy , lo re nombro a plataforma_efecto
  2. Meto mi Sprite como hijo
  3. Añado un Edge Collider 2D
  4. Listo

La mejor solución dependerá del videojuego y del comportamiento del personaje que estemos buscando.

Unity : Rebote por script en 2D

Para poder crear un rebote, es decir, un cambio de dirección cuando un objeto golpea a otro mediante script en vez de utilizando un material físico , hay que entender previamente un concepto el vector normal.normal

¿Qué es un vector normal o la normal de una superficie?

Es un vector perpendicular al elemento. En videojuego nos va a servir para responder a una pregunta ¿Hacia donde mira el plano, superficie, collider? normales

El calculo de normales es algo que los programas de 3D necesitan para saber si un plano mira hacia adentro o hacia afuera, y gracias a ellas se puede representar la interacción con las luces y muchas otra propiedades.

En 2normal spriteD también existen las normales ya que no es lo mismo que un sprite mire hacia un lado que hacia otro.

 

Gracias a la normal podemos saber hacia donde mira y podemos utilizar una formula Unity Vector2.Reflect (direccion, normal); que nos permitirá calcular el vector de rebote.Vector rebotenormal sprite

 

 

 

 

Le pondremos el siguiente script al objeto a rebotar:

Rigidbody2D rb;
Vector2 direccion;
Vector2 reflejado_aux;
bool pega=false;
// Use this for initialization
void Start () {
rb = GetComponent<Rigidbody2D>  ();
//Damos una velocidad inicial
rb.velocity = new Vector2 (1, -1) * 10;
}
void FixedUpdate(){

//Almacenamos la velocidad que lleva antes de la colision
if (!pega) {
direccion = rb.velocity;
}

void OnCollisionEnter2D(Collision2D coll){
pega = true;
//coll.contacts nos devuelve una matriz con los contactos de la colision
Vector2 reflejado=Vector2.Reflect (direccion, coll.contacts [0].normal);
rb.velocity = reflejado;
}

void OnCollisionExit2D(Collision2D coll){
pega = false;
}

La bola debería llevar Circle Collider 2D y Rigibody2D.
El script esta pensado para que no se pierda velocidad tras la colisión lo que supone rebotes infinitos.

Unity: Métodos extendidos

Unity nos permite crear nuestro propios métodos extendidos, lo cual puede ser muy util para tareas repetitivas, cálculos comunes etc. La ventaja de un método extendido frente a una función es que no tendremos que hacer referencia a la clase de la función si no que lo añadiremos a la propiedad que se trate.

Como todo esto suena bastante abstracto pongo un ejemplo para entederlo mejor.

Queremos crear un metodo para colocar la posicion de un objeto en (0,0,0)

Para ello creariamos un script tal que

public static class ExtensionMethods
{
//Método extendido
public static void Resetea(this Transform trans){
trans.position = Vector3.zero;
}
}

Esta clase debe ser tipo static asi como sus funciones.

this en este caso funciona como un parámetro implícito, lo que le estamos diciendo es, quiero que llames a este método desde cualquier componente Transform, por lo que si queremos que fuera desde un Vector3 seria this Vector3 vector, un float , this float numero etc

Finalmente sólo hace falta llamar al metodo desde otro script simplemente con

transform.Resetea ();

En cuanto escribimos transform y pulsamos . nos saldrá la lista de métodos y aparecerá el nuestro.

Podemos crear métodos con varios parámetros y que devuelvan parámetros, lo único que hay que tener en cuenta, es que el primer parámetros siempre lleva this y hace referencia al tipo de objeto o tipo de variable.
En la clase de los metodos

public static float Multiplica(this float value, float multiplo)
{
return value * multiplo;
}

En cualquier clase

float numero = 5;
numero=numero.Multiplica (2);

Los ejemplos que he puesto son muy sencillos pero la extension de metodos se puede hacer todo lo compleja que queramos.
Como la clase que hemos creado no hereda de MonoBehaviour , algunas funciones no nos aparecen, por ejemplo Destroy, para poder llamarlas tendremos que utilizar la llamada MonoBehaviour quedando
public static void DestruyeSleep2D(this Rigidbody2D rb, GameObject game){

if (rb.IsSleeping()) {
MonoBehaviour.Destroy (game);
}
}

Generar Sprite Sheet a partir de un vídeo

El proceso para crear un Sprite Sheet desde un vídeo utilizando photoshop es el siguiente:

Primero deberiamos tener nuestro vídeo con un canal alfa para que sea transparente, tambien tenemos que tener presente que la duración del vídeo sea muy corta uno o dos segundos, sino tendremos un sprite sheet excesivamente grande.
En photoshop iriamos a Archivo -> Importar Cuadros de vídeo a capas , nos convertirá cada fotograma en una capa.
Podemos recortar la imagen siempre que nos sobre contenido, con la herramienta Recortar.
Después haremos como en mini tutorial http://www.jorgevallejo.es/2017/10/crear-un-sprite-sheet-desde-photoshop.html y exportaremos las capas a un archivo sprite sheet.
Seguramente nos quede un archivo demasiado grande, por lo que es preferible tener un número de filas y columnas suficiente como para no hacer el archivo demasiado largo, y podremos cambiar todo el tamaño del archivo desde Imagen -> Tamaño de la imagen.

Unity moviemiento con script: Path

En animación es muy interesante tener un path ,es decir, una linea que marca por donde va nuestro personaje, un ejemplo clásico es un pajaro volando, el ciclo del aleteo se repite mientras el pajaro se desplaza a lo largo de una línea.

path1

Me resulta curioso que una herramienta tan útil como la creación de este path no venga de forma nativa en Unity, pero afortunadamente el Editor nos permite crear nuestras propias herramientas e Internet esta lleno de personas con gran conocimiento que comparten sus herramientas.

En esta pagina podéis encontrar un unitypackage con varios scripts muy interesantes Beizer Spline que nos permite crear puntos y curvas . nuestro path por el que utilizando Spline Walker podremos recorrerlo y con Spline Decorator colocar objetos según el Path

 

Recursos: Daga y mano

Este año en el máster en Diseño y programación de videojuegos estamos usando Anima2D para crear las animaciones de los personajes como podemos ver en este pequeño vídeo

Seguiremos avanzado en la animación mezclando con elementos creados con programación
daga mano

Ayudas en el Inspector de Unity: Añadiendo atributos

En Unity podemos añadir ayudas al inspector cuando estamos utilizando un script para que nos recuerde que hace determinada variable, poner un rango para un número, hacer una caja de texto más grande etc.

Estas ayudas se llaman Atributos, la información que proporciona Unity sobre este tema puede encontrase aquí, aun que algunos no están muy bien explicados.

ATRIBUTOS:
[HelpURL ("http://www.jorgevallejo.es/2017/10/unity-atributos.html")]

¿Donde va?:
Antes de la declaración de la clase

¿Qué hace?
Permite generar un enlace desde el inspector a una URL, útil para generar ayudas internas.
Debermos pulsar sobre el botón interrogación del inspector

Ejemplo:
[HelpURL ("http://www.jorgevallejo.es/2017/10/unity-atributos.html")]
public class Menu_Inicio : MonoBehaviour {
}

[RequireComponent (typeof(Rigidbody))]
¿Donde va?:
Antes de la declaración de la clase

¿Qué hace?
Determina que el componente necesita otro y lo añade automáticamente cuando colocamos el script, de esta forma no olvidaremos un componente necesario.
Debemos hacer las referencias correspondientes para poder utilizarlo, es simplemente como si ubieramos añadido el componente manualmente.

Ejemplo:
[RequireComponent (typeof(Rigidbody))]
public class Menu_Inicio : MonoBehaviour {
Rigidbody rb;

void Start()
{
rb = GetComponent();
}
}

[Space(20)]
¿Donde va?:
Después de la declaración de la clase. Donde queremos que en el inspector haya un espacio.

¿Qué hace?
Permite crear un espacio entre bloques de variables.
Crea un espacio del tamaño indicado.

Ejemplo:
public class Menu_Inicio : MonoBehaviour {
[Space(120)]
public int fuerza;
}

[Header("Boton de cierre")]

¿Donde va?:
Después de la declaración de la clase. Donde queremos que en el inspector aparezca un texto.

¿Qué hace?
En el inspector nos aparecerá un label con el string que le pasemos al Header
Simplemente es informativo.

Ejemplo:
public class Menu_Inicio : MonoBehaviour {

....
[Header("Boton de cierre")]
}

[TextArea]
¿Donde va?:
Después de la declaración de la clase. Justo encima de la variable publica texto que queramos modificar.

¿Qué hace?
El texto aparecerá como un TextArea en un lugar de como InputField de una sola línea.
Útil para escribir textos desde el inspector.

Ejemplo:
public class Menu_Inicio : MonoBehaviour {
[TextArea]
public string texto="Aqui va un texto largo";
}

[Tooltip("¿Tiene botón de cerrar?")]
¿Donde va?:
Después de la declaración de la clase. Justo encima de la variable publica en la que se quiera que aparezca el tooltip o texto explicativo.

¿Qué hace?
Cuando mantengamos el cursor sobre la variable asignada, en el inspector nos aparecerá un tooltip explicativo.
Útil para variables complejas o cuando hay muchas parecidas.

Ejemplo:
public class Menu_Inicio : MonoBehaviour {
[Tooltip("¿Tiene botón de cerrar?")]
public bool tiene_cierra;
}

[Range(0.0F, 10.0F)]
¿Donde va?:
Después de la declaración de la clase. Justo encima de la variable publica.

¿Qué hace?
Aparezca un rango en forma de slider en lugar de un cajetin.
Valido para números enteros o decimales.

Ejemplo:
[Range(0.0F, 10.0F)]
public int fuerza;

[ExecuteInEditMode]
¿Donde va?:
Antes de la declaración de la clase.

¿Qué hace?
Permite ejecutar el script en modo edición, lo que puede ser extremadamente útil cuando el juego empiece a pesar y tarde en arrancar, muy útil también para hacer pruebas sin arrancar el juego.

Ejemplo:
[ExecuteInEditMode]
public class Menu_Inicio : MonoBehaviour {}

También podremos crear menus contextuales, es decir que aparezcan cuando pulsemos el botón derecho del ratón sobre una variable.
¿Qué necesita para funcionar?
Necesitaremos:
Declarar un [ContextMenuItem("Reset", "Borra")]
Declarar un [ContextMenu ("Borra texto")]
Tener una función asociada en este caso Borra

¿Donde va?:
Después de la declaración de la clase. En la variable que queramos que tenga el menu contextual.

¿Qué hace?
Aparecerá un menú contextual al pulsar el botón derecho del ratón, que contendrá minibotones asociados a funciones.
Útil para tareas repetitivas dentro del inspector como poner una variable a 0 , borrar un texto, etc

Ejemplo:
[ContextMenuItem("Reset", "Borra")]
[Multiline(8)]
public string texto_largo = "";
[ContextMenu ("Borra texto")]
void Borra() {
texto_largo = "";
}

Teoría de videojuegos: Esfuerzo – Recompensa

objeto legendario diablo III

Dentro del Máster en Desarrollo y Programación para Videojuegos impartido en iVisaulFormacion en Valladolid , no sólo enseño como utilizar Unity sino que poco a poco voy explicando Teoría de videojuegos , un fundamento teórico que sustenta la creación y el desarrollo de videojuegos como comenta en Jesse Schell en “The art of Game Desing” un desarrollador de juegos es como un arquitecto que tiene conocer todo sobre estructuras y materiales , pero no olvidar nunca que construye casas para personas, es decir, conocer al jugador , como piensa , como actúa , como siente es una parte fundamental del desarrollo de un videojuego.

Uno de los objetivos de todo buen videojuego es que el jugador se mantenga motivado, para lo cual es necesario recompensar su tiempo y esfuerzo, de hecho lo ideal es que el esfuerzo sea proporcional a la recompensa.

Esfuerzo mayor que recompensa:

Si hacemos que el jugador tenga que esforzarse mucho y la recompensa es pequeña se sentirá frustrado y posiblemente desista de la tarea, o una dificultad excesiva le lleve a dejar de intentarlo.

Recompensa mayor que esfuerzo:

Si la recompensa supera al esfuerzo, se percibe como inmerecida y además podría producirse un desequilibrio es por eso que normalmente los videojuegos ajustan los golpes de suerte mediante probabilidades, es decir, si por ejemplo cuando se acaba con un enemigo pudiéramos conseguir una espada con un bonus muy alto y pero no ha sido un gran esfuerzo en tiempo, estrategia, acumulación de experiencia etc desastibilizariamos el juego. Por eso normalmente se ajusta la consecución de objetos con probabilidades así, la probabilidad de conseguir un objeto bueno suele ser de un 10% y la de uno legendario un 0,1% aun que estas probabilidades no suelen ser fijas sino que pueden reajustarse en función del comportamiento del jugador, para que no se dedique asesinar a toda una raza con la esperanza de encontrar objetos legendarios o masacrar el ganado en busca de puntos de experiencia.

Esfuerzo proporcional a recompensa:

La situación ideal es en la que el esfuerzo y la recompensa van de la mano, así el jugador lo asume como algo justo y se mantiene motivado.

Tipos de recompensas:

Prácticamente cualquier cosa que consiga mantener motivado al jugador, haciéndole avanzar puede ser una recompensa por concretar:

  1. Recompensas materiales:

Son aquellas que son cuantificables y que poseen una escala de valor.

Puntos, Dinero, Joyas, Objetos de valor, Armas, Armaduras, Pergaminos.. en general cualquier objeto que haga que el jugador mejore o ayude a mejorar a su vez otro objeto volviéndolo más poderoso, objetos que le ayuden a avanzar tales como llaves, mapas, pases etc.

Puntos de experiencia, adquisición de unas habilidades, adquisición de compañeros, refuerzos etc.

Naves y objetos que le ayuden a moverse más rápido por el mundo.

Desbloquear zonas especiales que sólo se consiga acceder tras completar una misión.

Zonas de bonus o minijuegos.

Construcciones que le permitan avanzar en investigaciones, almacenar más objetos, construir mejores ejércitos etc.

Logros o medallas, son objetos inmateriales que se desbloquean al conseguir misiones parciales o que se dan para destacar alguna labor conseguida, por ejemplo conseguir 1000 monedas, a veces van a acompañados de recompensas materiales.

2. Recompensas Inmateriales:

Animaciones y minivideos, recompensar al jugador con una escena animada, pude ser suficientemente motivador.

Alcanzar un objetivo del personaje secundario, si hemos conseguido empatizar con un personaje secundario conseguir que alcance su objetivo puede ser una buena recompensa.

Alcanzar un objetivo del personaje principal, cumplir una venganza por ejemplo , castigando al malvado puede ser una buena recompensa.

Rangos: Aumentar el reconocimiento o prestigio dentro del propio juego, mediante los rangos donde pasemos de ser desconocidos a conocidos , famosos etc.

Poder: Ir aumentado nuestra influencia, empezamos como simples soldados y ahora tenemos todo un ejercito.

Y asi tendriamos un largo etc, ¿Se te ocurre alguna recompensa más? , deja tu comentario.

Proyecto III Finalizado In to the Hospital (Videojuego tipo Escape Room)

Escape Room con Unity3DEn el siguiente enlace podéis jugar a esta demo de Into the Hospital para PC, un juego en 3D desarrollado con Unity del tipo Escape Room , el proyecto  se realizó dentro del Máster en Desarrollo y Programación para Videojuegos impartido en iVisaulFormacion en Valladolid.

Escape Room es un tipo de videojuego donde tendremos que resolver puzzles y utilizar objetos para conseguir escapar. En este tipo de juegos la ambientación es una de sus principales bazas, ya que normalmente aparecemos sin más en una estancia y tendremos que salir utilizando nuestra inteligencia.
El objetivo del juego es precisamente salir con vida de cada una de las estancias para lo que habrá que encontrar objetos y resolver algunos acertijos.
Por el lado didáctico el videojuego se creó para aprovechar todo el potencial de los GUIs en Unity , es decir interfaces graficas, ya que en los juegos de tipo aventura grafica como es el caso, el uso de botones y de combinaciones con otros objetos o con ellos mismos es lo que forma parte de la mecánica del juego y aporta grandes horas de diversión probando combinaciones, alguna más logicas que otras, como me acuerdo del Monkey Island y su pollo de goma – polea .
Cada alumno creo su nivel que después se integro dentro del videojuego, hubo algunas dificultades , que hasta ese momento no se habían evaluado, y es que aprender a trabajar en común es uno de los objetivos del máster y algunos problemas solo pueden verse cuando se pone en común todo el proyecto. En previsión se habían creado algunos pequeños protocolos como que cada alumno nombrara la escena con un id único , al igual que algunos scripts, pero siempre surgen problemillas que una buena reunión previa podría haber solventado, sí las reuniones puede servir para algo.
Tras algunos arreglillos a mayores en sólo 5 días ya habían completado el sprint marcado , que comprendía una pequeña fase de testeo, por lo que podemos clasificar el juego como una versión Alpha , es decir, en la que aun quedaría por añadir detalles pero que es funcional y se puede utilizar para presentar al cliente o para ver como responde un seleccionado grupo de personas.

Recordad que podeis descargaros la demo del juego Into the Hospital
Por último como suele ocurrir en este tipo de juegos os dejo el walkthrough un video donde se explica como pasarse el juego.

Iluminación en Unity 3D

Iluminación en Unity3D Luces_Ciudad

Los alumnos del Máster en Desarrollo y Programación para Videojuegos impartido en iVisaulFormacion en Valladolid comenzaron a ver en profundidad las luces en Unity, ya habían visto previamente las Direcional lights ya que Unity coloca siempre una por defecto dentro de la escena.

La compresión de las luces tiene que ver con un sentido tanto técnico como artístico, por un lado saber que tipos de luces existen en Unity : Directional Light Spot Ligth, Point Light y Area Light y aprender su manejo requiere de poco tiempo, pues gracias al sistema de iluminación global en tiempo real de Unity se puede ver rápidamente como va quedando tanto las partes iluminadas como las zonas de sombra, sin embargo el sentido artístico de las luces , como utilizarlas correctamente es otro cantar, por lo que los alumnos aprendieron los rudimentos de iluminación en fotografía y algunas técnicas que siempre funcionan en el mundo de la iluminación para videojuegos como el uso de una iluminación general azul con pequeñas zonas naranjas.

Una muestra del trabajo de los alumnos en unas horas.

Proyecto III: Videojuego tipo Escape Room con Unity

 

El siguiente proyecto que se realizó Máster en Desarrollo y Programación para Videojuegos impartido en iVisaulFormacion en Valladolid, fue un videojuego y tipo Escape Room , en estos videojuegos el jugador tiene que tratar de conseguir salir de una sala, habitación, casa etc para ello deberá resolver una serie de puzzles, los cuales pueden ser puzzles normales combinaciones de elementos , encontrar pistas en escenario y realizar clics en zonas concretas. La historia suele ser confusa: apareceremos en una habitación sin entender muy bien porque estamos allí ni cómo salir.

Lo primero que hicimos fue realizar un estado del arte para ver cómo eran los videojuegos Escape  Room, así comprobamos que muchos videojuegos  de este tipo, no contaban con un entorno 3D sino que simplemente utilizaban imágenes, nosotros decidimos crear varios niveles en 3D, profundizando tanto en la inversión del jugador como en la ambientación del juego. 

Realizamos una primera reunión de póquer Scrum , para evaluar las tareas y determinar el tiempo que tendríamos para cada fase del proyecto.

Así marcamos un sprint de una semana para poder conseguir un videojuego tipo Escape Room en fase beta, creando un mínimo producto viable de tres niveles, suficiente para comprender la mecánica del juego y ver sus posibilidades.

Tras realizar el estado del arte, realizamos algunas tareas de prediseños del juego creando rápidamente mapas de los niveles, determinando los elementos de interactuación que serían seis botones creados en fase de diseño en vez de por codigo mediante Canvas más un botón generado a través de la combinación de otros dos.

En esta fase de prediseño los alumnos aportaron sus ideas al juego los cuales fueron fueron recogidas en un documento, así y en base a la limitación de tiempo marcada por el sprint determinamos realizar algunas de las ideas propuestas por los alumnos e integrarlas dentro del videojuego.

Fase de diseño: La mejor forma de trabajar fue dividir los niveles entre los alumnos de tal forma que cada alumno pudiera crear su propio nivel y después integrarlos todos en el videojuego, aprendiendo a trabajar en equipo.

Unity está especialmente pensado para poder dividir el trabajo entre varias personas , cada alumno pueda exportar un paquete  unitypackage , el cual al ser importado de nuevo en otro proyecto analiza los nuevos componentes, dos días antes de la finalización del sprint ya teníamos el juego integrado.

Se creo un menú integrado generado con un Canvas siempre visible donde irían apareciendo los diferentes objetos conseguidos, los cuales aparecerían como botones para interactuar con el escenario.

Los alumnos aprendieron a construir niveles y también empezamos a ver algo de texturas, contábamos con muy poco modelos por lo que era necesario poder modificar las texturas para dar sensaciones diferentes, Como comentaba en otro artículo videojuegos y memoria visual , debíamos ser conscientes de la monotonía visual que podría acarrear el uso de elementos repetidos ,sin embargo en este caso esa monotonía contribuye a crear un ambiente opresor que forma parte de la ambientación del juego.

Dentro de las mecánicas de control, los alumnos aprendieron a crear zonas calientes, esto es , zonas que cuando el jugador entra suceden eventos, gracias a los disparadores o trigger, programar estas zonas resulta bastante sencillo y aporta una gran flexibilidad respecto a las opciones de las que disponemos como diseñadores de videojuegos, ya que podemos controlar que sonidos se activaran en una determinada zona, poner una descripción etc.

Hasta aquí este primer articulo sobre la construcción del videojuego Escape Room, próximamente escribiré otro articulo sobre el desarrollo del juego, cualquier comentario o duda sobre la creación de este tipo de videojuegos estaré encantado de reponderlo.

Escape Room con Unity3D

Videojuegos y memoria visual

En el mundo de los videojuegos , al ser algo tan complejo, es decir , formado por muchos elementos muy diferentes como diseño, animación, programación, 3d etc a veces nos centramos más en la propia creación del videojuego que en un aspecto fundamental como es entender al jugador.

Es por eso que en las clases del master en iVisual Formación de Desarrollo y Programación de Videojuegos impartido en Valladolid, no solo nos centramos en aprender a manejar Unity sino en entender al jugador, lo cual requiere que nos pongamos en su lugar, que aprendamos que les gusta y que no a los jugadores, y también que vayamos un poco más allá y aprendamos algunas cosas sobre psicología aplicada al videojuego para comprender mejor la percepción, la concertación y la memoria humanas.

La memoria visual y su utilidad en los videojuegos

La memoria visual es nuestra capacidad para reconocer , procesar y almacenar imágenes, lo interesante de su aplicación al mundo del videojuego es descubrir sus limites , ya que según los estudios realizados sobre la misma, el máximo numero de imágenes que podemos procesar en el corto plazo es de 7.

7 diferencias memoria visual

De hecho basándonos en esta característica , hay toda una serie de videojuegos y pasatiempos, por ejemplo el pasatiempo de buscar las 7 diferencias, precisamente el numero máximo de nuestra capacidad de memoria visual , si alguna vez habéis jugado a este pasatiempo os daréis cuenta de que si tratéis de resolverlo viendo las dos imágenes a la vez es muy difícil, se necesita dividir las imágenes en zonas e ir comparando zona a zona, de esta forma reducimos el máximo numero de imágenes diferentes facilitando la posibilidad de encontrarlas, lo cual nos llevaría a la pregunta ¿por qué la ultima diferencia es siempre la mas difícil? En realidad es igual que las demás, lo único que ocurre es que creemos que ahora será mas facil encontrar esa diferencia que nos falta y volvemos a buscar visualizando todo el conjunto cuando lo que deberíamos hacer es seguir buscando por zonas.

Otro tipo de juegos que aprovechan el funcionamiento de la memoria visual son los llamados memory en los que hay un panel formado por 7 o 8 casillas de largo por otras tantas de ancho , donde además de recordar la imagen debemos recordar su posición, por lo que tenemos que poner a prueba al máximo nuestra memoria visual y espacial.

memoria visual Memory

Como vemos la simple aplicación del funcionamiento de las capacidades del jugador ya nos puede servir como base para crear juegos, y también podemos resolver algunas incógnitas de diseño , como por ejemplo saber cuantos elementos diferentes necesitamos para construir un escenario sin que sea excesivamente repetitivo, la respuesta parece clara con 7 elementos serian suficientes para conseguir que un escenario no se vea repetitivo.

Proyecto I: Calculadora con Unity

Aun que el máster que estoy impartiendo en iVisual Formación es Desarrollo y Programación de Videojuegos, para comprender bien el funcionamiento de los grafic user interface o GUI, es interesante empezar realizando una calculadora, ya que este proyecto nos permitirá tanto entender el funcionamiento de los GUI generados mediante código, como ir adentrándonos en el mundo de la programación de botones, el manejo de cambios en un Label y pequeñas funcionalidades. Por si fuera poco también comprender como funcionan los GUI styles y GUI skins con los que podremos cambiar rápidamente el diseño de nuestros botones, esta es una forma muy interesante de trabajar dividiendo la representación del contenido, una forma muy parecida a la de trabajar en HTML con los css , ya que con tan solo cambiar de GUI Skin podremos cambiar todo nuestro diseño.

Vimos rápidamente algunas cuestiones de diseño como hacer un pequeño estado del arte para saber que tipos de diseño imperan en el mundo de las calculadoras y preparar unos prediseños para no empezar el proyecto sin saber donde colocar los botones.

Aplicamos algunas metodologías agiles y lean startup para que fueran empapándose de esta filosofía y forma de trabajar, así hicimos una evaluación de las tareas que debíamos realizar para alcanzar un MPV es decir un Mínimo producto viable que en un nuestro caso seria una calculadora con las funcionalidades básicas pero que no diera ningún error.

calculadora unityHicimos una ronda de Poker Scrum, una forma divertida de contrastar opiniones sobre los tiempos de desarrollo, que además sirve para que los propios alumnos vayan tomando conciencia de lo importante que es saber dividir correctamente las tareas , asignarles un tiempo y poner plazos de realización.

Con esa definición de tiempos y tareas preparamos nuestro primer Sprint con el objetivo de desarrollar la calculadora con Unity.

Reserbamos una pequeña parte del tiempo a tesetear las calculadoras, para lo cual los alumnos intercambiaron sus proyectos detectando problemas que se les habían pasado por alto, como que ocurre cuando se pulsa primero el . y luego un numero etc

Finalmente conseguimos cerrar nuestro primer Sprint consiguiendo una calculadora en estado Alpha funcional pero mejorable, que podría servir para mantener una reunión con el cliente y que comentase mejoras.

Os dejo una fotografía de como quedaron las caluculadoras.