Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

Gato pixel art con 8bit Pintor

2018-07-28_09.44.47

Probando la app para Android 8bit Pintor, es bastante sencilla de utilizar, aunque le faltan muchas opciones como crear capas, fotogramas , herramientas de selección, sin embargo para crear imágenes rápidas de pixel art puede estar bien, ocupa poco y es fácil de manejar.

Realidad Virtual Unity abriendo y cerrando un cajón

En Realidad Virtual la interacción lo es todo, es curioso como Oculus provee de un SDK para empezar a desarrollar y que sin embargo traiga sólo ejemplos de agarrar y lanzar objetos y nada sobre elementos que desplazan , giran, mueven etc.
Así que hay que buscarse la vida, en este caso por ejemplo, con un trigger compruebo si la mano entra en la zona del cajón, después paso su velocidad al cajón, el cual tiene un rigybody con y,z frezeadas así como todas las rotaciones, finalmente con un Mathf.Clamp controlo las posiciones maximas y mínimas. El resultado es funcional, aunq me quedaría controlar si está en modo agarrar, es decir con el puño cerrado.

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 : Buenas practicas -> Etiquetas (Assests Labels)

A veces ponemos el foco en la creación del videojuego , y nuestra mayor preocupación es desarrollarlo rapido, sin embargo si vamos a trabajar con más personas en el proyecto , el caos que podemos ir acumulando hará que se pierda un tiempo precioso, que con algunas Buenas practicas se podria haber evitado.

Hoy voy a hablar de las Etiquetas, un sistema de búsqueda interno de Unity que suelen pasar desapercibidas pero que pueden ser muy interesante para estructurar bien y encontrar rápidamente lo que necesitemos.

1 ¿Qué son los Assets Labels?

Son etiquetas con las que podemos categorizar los elementos de nuestro videojuego y  facilitar su búsqueda.

2 ¿Cómo se etiqueta?

Simplemente tenemos que seleccionar un elemento en nuestro Project, en Inspector al final del todo encontraremos Assets Labels, pinchamos sobre el icono de etiqueta azul y asignamos una etiqueta a ese elemento.

3 ¿Cómo se crea una etiqueta nueva?

Esta opción esta algo “escondida”, ya que no hay ningún botón para crearla, lo que hay que hacer es pulsar sobre el icono de etiqueta, nos aparecerá un campo de busqueda, simplemente escribimos el nombre de nuestra etiqueta por ejemplo Setup y pulsamos intro, la nueva etiqueta aparecerá en la lista.

Podemos asignar más de una etiqueta a un elemento, repitiendo el proceso 2.

4 ¿Cómo se buscan elementos marcados con etiquetas?

Dentro de Project , vemos que hay un icono etiqueta, pinchamos sobre él , buscamos la etiqueta y nos aparecen todos los elementos que tienen esa etiqueta.

5 ¿Qué utilidad tiene el etiquetado?

Sirve para poder encontrar rápidamente los elementos de nuestro videojuego, independientemente de su tipo y de la carpeta donde se encuentren.

Por ejemplo podemos tener una etiqueta Setup con todos los prefabs básicos que necesitamos para construir un nivel, buscamos Setup con el proceso 4 y arrastramos todos esos elementos a nuestra jerarquia y tendríamos todos los elementos iniciales.

También nos sirve para trabajar en equipo, el jefe de proyecto etiqueta los elementos con una etiqueta llamada nivel1, el diseñador de nivel sabe que sólo puede utilizar los elementos marcados con nivel1 para construir su nivel.

¿Alguna vez has usado etiquetas en tu proyecto de Unity? Dejame un comentario con tu experiencia.

 

Unity: Evitar collisiones, que un GameObject no colisione consigo mismo

Muchas veces se nos va a presentar el caso , en el que un objeto que tiene un collider y un rigybody y que por lo tanto va a detectar colisiones, choca contra si mismo. Por ejemplo un misil que se dispara e interacciona con otro misil.
Suele un problema común que tiene dos soluciones:

1) Evitando la colisión a través de la matriz de físicas.
matriz_colisionSi vamos a Edit-> Proyect Settings Physics ya sea Physics o Physics2D dependiendo de si nuestro proyecto es 3D o 2D veremos al final una curiosa matriz, Layer Collision Matrix, esta formada por filas y columnas con los nombres de los Layers, si la intersección entre una fila y una columna esta marcada con un check, significa que al comparar dos elementos en colisión si tienen esos layer asociados habrá colisión y si no esta marcado no lo habrá.

Por lo tanto la solución para evitar que un objeto colisione consigo mismo es crear un nuevo Layer, seleccionando el objeto -> Layer->Add Layer tendremos que volver a dar a Layer y asignarle.
Si ahora vamos de nuevo a Edit-> Proyect Settings Physics veremos que el nuevo layer nos aparece en la matriz de colisión des chequeamos donde este su unión y listo.

matriz_colision2

2) Por código.
Tenemos un número limitado de Layers ya que son un int32, por lo que podria suceder que no quisieramos crear un nuevo layer para algun elemento. Afortunadamente Unity tiene tambien una solución para estos casos.
void OnCollisionEnter2D(Collision2D coll){

if (coll.gameObject.CompareTag ("Bola")) {
Physics2D.IgnoreCollision (coll.collider,gameObject.GetComponent());
}
}

En este caso Ignoramos la colisión al detectarla, con coll.collider accederíamos a uno de los elementos de la colisión y con gameObject.GetComponent() al elemento que tenga este script y que lleve asociado el BoxCollider2D
Espero que os haya sido útil ya que es un problema bastante común, si tenéis algún otro método , no dudéis en dejarme un comentario.

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

Unity: ¿Cómo se usan los LayerMask?

Cuando estamos usando Raycast ya sean 3D o 2D enseguida nos surge un problema común y es que ,para detectar un elemento con Raycast este tiene que tener Collider ¿como puedo hacer para que me detecte unos si y otros no?, sin tener que quitar dicho Collider, la solución son los LayerMask.
El problema es que el concepto es algo complicado por lo que he decidido crear este post tratando de explicarlo de mejor forma posible.
Primero hay que echarle un vistazo a los Layers, cualquier elemento en Unity puede estar colocado en un Layer y como vemos Unity se reserva para el 8 y nos deja los demás para nosotros, pero hay algo curioso, hay 32 layers posibles, ¿Por que exactamente 32? pues por que Unity untiliza un int 32 para controlar los layers, , es decir un numero con la forma 0000 0000 0000 0000 0000 0000 0000 0000 , donde cada bit representa si detecta o no, así el primero a la derecha corresponde al layer Default y el último seria nuestro layer 32.
¿Como creo un LayerMask para que detecte sólo un layer?
Primero creamos un LayerMask que es un int y asociamos 1 al bit que corresponde a ese Layer seria 1<< (Operador de desplazamiento a la izquierda) int del Layer
int mascara=1<<0;
O podemos recoger el indice del layer con LayerMask.NameToLayer(“Nombre del Layer”)

int mascara=1<<0;

Ahora la mascara será 0000 0000 0000 0000 0000 0000 0000 0001

Podemos visualizar el int con
print(System.Convert.ToString(mascara,2));
Segundo asociamos la mascara al Raycast, en este ejemplo usaremos un Raycasthit2D pero funciona igual para 3D

Ray2D rayo=new Ray2D(transform.position,Vector2.right); 
int mascara=1<<LayerMask.NameToLayer ("Default") ; 

El resultado: el Raycast sólo detecta los Collider que tengan Default

Muchas veces nos vamos a encontrar exactamente con el problema inverso, es decir, queremos que nuestro Raycast detecte todos los layers excepto uno, por ejemplo el del Player.
El camino a seguir seria muy parecido, creo la mascara , le digo que detecte solo a Player

int mascara=1<<LayerMask.NameToLayer ("Player")  ;

Y despues la invierto con ~ (Ascii 126) Información sobre el operador aqui

mascara=~mascara;

Ahora la mascara seria 1111 1111 1111 1111 1111 1110 1111 1111
Y el resto del código seria igual quedando

Ray2D rayo=new Ray2D(transform.position,Vector2.right); 
int mascara=1<<LayerMask.NameToLayer ("Player ")  ;
mascara=~mascara;
RaycastHit2D hit =Physics2D.Raycast (rayo.origin, rayo.direction,200,mascara); 

Al principio los LayerMask pueden resultar algo confusos por lo que aconsejo hacer pruebas tirando un Raycast con dos elementos con Layers diferentes para comprobar su funcionamiento.

Unity: Crear Atlas

Desde la versión Unity 2017, el sistema de empaquetado de Sprites (Sprite Packer) se sustituye por Atlas (Sprite Atlas), la filosofía sigue siendo la misma crear una única textura con los componentes que necesitemosAtlas_preview , es decir un Sprite de Sprites, para mejorar la optimización y el número de Batches o llamadas de dibujo (call draws) que consumen rendimiento, la idea es que los elementos que vienen de un mismo Atlas sólo necesitan un batch para ser representados, si tenemos 20 elementos metidos en Atlas en vez de 20 batch tenemos sólo uno.

Sin embargo el Atlas, va más allá de crear una textura con los elementos, ya que creará internamente un Array con los sprites insertados, por lo cual hará falta código y ejecutar el sistema en tiempo de juego para poder visualizarlos.

Para crear un Sprite Atlas

  1. En el proyecto , botón derecho Create -> Sprite Atlas
  2. Podemos crear un Atlas desde, Una carpeta, un Sprite Sheet o desde un Sprite o grupo de sprites
  3. Es útil reunir todos los sprites de una carpeta y crear el atlas utilizando esa carpta
  4. Con el Atlas seleccionado arrastramos la carpeta a Objects for Packing
  5. La cantidad de elementos que puede almacenar el Atlas depende de su tamaño,si cambiamos Max Texture Size podremos tener Atlas más grandes.
  6. Pulsamos en Pack Preview y Unity generara el Atlas, reducirá al máximo los espacios vacíos.

Para usar un Sprite Atlas

  1. Debemos tener un Sprite Atlas creado
  2. Crearemos un script llamado Gestiona_Atlas
  3. Creamos un Objeto vacío llamado GestionAtlas y le añadiomos el script
  4. Como hijo del elemento metemos un Sprite , Boton derecho 2D -> Sprite
  5. A GestionAtlas le añadimos el siguiente script, debemos tener presente que para usar el Atlas necesitamos importar  UnityEngine.U2D y si queremos utilizar las funciones del List necesitamos  System.Linq;

public class Gestiona_Atlas : MonoBehaviour {
//Necesita la libreria using UnityEngine.U2D;
public SpriteAtlas m_atlas;

public SpriteRenderer m_redener;
public int id_sprite;
List<Sprite> sprite_list;
// Use this for initialization
void Start () {
//Vuelca los sprites del atlas a un list de sprites
Sprite[] sprite_array=new Sprite[m_atlas.spriteCount];
m_atlas.GetSprites (sprite_array);
//Vuelca un array en un List necesita la libreria using System.Linq;
sprite_list = sprite_array.ToList();
//Para usar el Atlas puedo utilizar el array volcado
m_redener.sprite = sprite_array [id_sprite];
//GetSprite devuelve el Sprite con ese nombre
m_redener.sprite = m_atlas.GetSprite(“Tumnas_10”);

}

// Update is called once per frame
void Update () {
//Podemos utilizar la lista para seleccionar un elemento
//m_redener.sprite = sprite_list [id_sprite];
//Recoger el último
//m_redener.sprite = sprite_list.Last ();
//Recoger el primero
//m_redener.sprite = sprite_list.First();
//………..
}
}

GDD (Game Desing Document)

El GDD (Game Desing Document) o Documento de Diseño de videojuego es lo que en producción audiovisual llamamos biblia del proyecto, y es que contrariamente a lo que pueda parecer los videojuegos se pueden vender sin tener que desarrollarlos, es decir, podemos buscar financiación en una fase inicial del proyecto para ello debemos ser capaces de sintetizar al máximo la idea de nuestro videojuego y poder crear un documento llamado GDD que nos sirva como carta de presentación del mismo.
Este documento permitirá hacerse una idea de las claves principales del videojuego como por ejemplo definir el público objetivo , el genero y la plataforma, ya que estas elecciones marcan las lineas de desarrollo del proyecto.

Como base para crear nuestro GDD podemos usar la siguiente guia

CONCEPTO

  • Título: El título del juego, debe ser un nombre que capte la atención del jugador y del lector del documento. A grandes rasgos, debe de incluir el concepto del juego.
  • Estudio/Diseñadores:  El nombre del estudio y/o del diseñador o diseñadores del documento.
  • Plataforma: Qué hardware se requiere para jugarlo. PC, Android ,IOS, Xbox 360, PS3, etc.
  • Idea general: Una sola frase que resume el videojuego
  • Sinopsis de Jugabilidad y Contenido: En uno o dos párrafos, describir la esencia de jugar el juego. Incluir un poco del contenido que tendrá, historia, personajes, objetivo, etc.
  • Género: En que genero se ubica el videojuego y cual son las características que lo definen.
  • Licencia: Describir si se poseen todos los derechos sobre el videojuego.
  • Mecánicas: Describir la jugabilidad y el control del juego. ¿Qué hace el jugador? ¿Qué usa para lograr sus objetivos?
  • Dinámicas: Que decisiones y estrategias puede crear el jugador en base a las mecánicas
  • Reglas: Que reglas gobernaran todo el videojuego, ¿Habrá excepciones?
  • Fases: División y estructura del videojuego
  • Referencias: ¿A que se parece tu videojuego?
  • Componente diferencial: Que le hace diferente.
  • Público objetivo: ¿A quién va dirigido el juego? Edad, sexo, tipología de jugador.

 

MECÁNICA DEL JUEGO: Esta sección esencialmente describe lo que el jugador puede hacer y cómo puede hacerlo. Describir las acciones del jugador.

  • Cámara: Describir el tipo de cámara que se utilizará. Es decir, qué perspectiva tiene el jugador ante lo que está viendo en el juego, si es 3D o 2D, vista isométrica, en primera persona, etc. Periféricos: ¿Qué periféricos utilizará el jugador para lograr los objetivos mencionados? Incluir todos los que apliquen: teclado, mouse, gamepad, micrófono, etc.
  • Controles: Describir los botones y teclas que invoquen las acciones mencionadas en la sección de Mecánica del Juego.
  • Guardar/Cargar: Describir cómo el jugador guarda su progreso de los objetivos logrados en el juego y cómo puede continuar los objetivos pendientes. De igual manera, describir los dispositivos de almacenamiento que se usarán o si el juego tiene un sistema de contraseñas.

INTERFACES:

Todos los menús y submenús que aparecen en el juego

  • Nombre de la Pantalla: El nombre de la pantalla, si es el Menú Principal o el H.U.D. (Heads-up Display).
  • Descripción de la Pantalla: ¿Para qué sirve esta interface?
  • Navegación: Como pasa de una pantalla a otra.
  • Imágenes de referencia de las interfaces

NIVELES: Los juegos comúnmente se dividen en niveles o en mapas secuenciales dentro de los cuales se debe cumplir con ciertos objetivos para progresar en el juego.

  • Título del Nivel: El nombre del nivel.
  • Tipología de nivel: Describir si es el primer nivel, un tutorial o un bonus, en otras palabras, ¿Cuándo el jugador  llega a este nivel? Descripción Una descripción detallada del nivel.
  • Objetivos: ¿Qué debe de hacer el jugador para terminar el nivel?
  • Enemigos: Listas de enemigos y principales caracteristicas
  • Items: Enumerar los objetos que el jugador o los enemigos pueden usar y que aparecen en este nivel.
  • PNJ (Personajes no jugadores): Los personajes que aparecen en el nivel.
  • Música y Efectos de Sonido: Describir la música de este nivel al igual que los efectos de sonido que contiene.

 

PROGRESO DEL JUEGO: Enumerar de manera secuencial o por medio de un diagrama de flujo los eventos o niveles que el jugador debe de pasar para progresar en el juego. Existen juegos que tienen distintos modos de juego, en ese caso se requieren varias listas y/o diagramas.

PERSONAJES:  Los personajes principales y secundarios que aparecerán en el juego. Esta sección se puede omitir si el juego no tiene personajes.

  • Nombre del Personaje: El nombre del personaje.
  • Descripción: Describir detalladamente el personaje, si es humano o extraterrestre, su vestimenta, etc. Fotografía o dibujo conceptual del personaje.
  • Concepto: Describir la conducta y comportamiento, al igual que los motivos del personaje. Mencionar también si es el enemigo principal o el protagonista. El concepto también puede relatarse como una historia del personaje, detallando en las relaciones con otros personajes del juego.
  • Encuentro: ¿Cuándo aparece este personaje en el juego?
  • Armas: Armas del personaje.
  • Items: Los objetos del personaje.
  • Personaje No-Jugable: Si el personaje no es controlable por el jugador, describir su propósito para el juego y/o para el jugador.

ENEMIGOS: Los enemigos obstaculizan el progreso del jugador, pueden ser máquinas, otros personajes, monstruos, etc.

  • Nombre: El nombre del enemigo.
  • Descripción: Describir detalladamente el físico del enemigo así como también su comportamiento.
  • Encuentro: ¿Cuándo aparece este enemigo en el juego?
  • Imagen: Fotografía o dibujo conceptual del enemigo.
  • Habilidades: Listar las habilidades del enemigo.
  • Armas: Listar las armas del enemigo.
  • Items: Listar los objetos del enemigo.

IMÁGENES DE CONCEPTO: Todas las imágenes que muestren algún posible nivel, personaje, objeto, etc., deben ser incluidas en esta sección y deben estar enumeradas y con título.

MIEMBROS DEL EQUIPO: Información de las personas que trabajarán en el proyecto, breve curriculum.

DETALLES DE PRODUCCIÓN:

  • Fecha de Inicio: ¿Cuándo empieza la etapa de Producción del proyecto?
  • Fecha de Terminación: ¿Cuándo termina la etapa de Producción del proyecto?
  • Presupuesto: Una estimación aproximada del presupuesto del juego.

 

 

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 Anima2D protocolo creación de personaje

Los pasos a seguir para crear un personaje utilizando el plugin de Anima2D son:

  1. Descargarse Anim2D desde el assets store de Unity
  2. Importar el sprite sheet de nuestro personaje en Unity
  3. Dividir los sriptes en partes utilizando el sprite Editor
  4. Comprobar el Canal Alfa para verificar que no hay ruido
  5. Comprobar que los cortes no interfieren unos en partes de otros
  6. Nombrar cada parte, de forma que se identifique claramente las partes y el personaje por ejemplo “X_cabeza” ,”X_pie_i” etc
  7. En el inspector del proyecto seleccionar el Sprite padre , boton derecho Create -> Anima2D-> Sprite Mesh
  8. Creara todos los sprites recortados pero que seran Skined Mesh para ser asociados a los huesos
  9. Creamos un objeto vacio, que será el padre de todos los elementos
  10. Añadimos los Sprites creados por Anima2D al padre
  11. Importamos la figura patrón y colocamos los elementos según la figura patrón
  12. Creamos un nuevo Sorting Layer como nuestro personaje , ya que nos permitirá usar el Order in Layer para ese personaje
  13. Seleccionamos todos los sprites y seleccionamos nuestro Sorting Layer
  14. Colocamos los Order in Layer, debemos hacer pruebas para ver si los brazos, piernas etc pasan por delante.
  15. Dentro de GameObject principal creamos un objeto vacío Huesos
  16. Importante, antes de empezar a crear los huesos deberíamos comprobar como funcionaran los puntos de pivote, ya que una vez colocados no podremos moverlos y tendremos que borrarlos y hacerlos nuevos.
  17. Creamos los huesos como hijos de ese GameObject con Botón Derecho -> 2D Object -> Bone
  18. Lo renombramos a Cintura y colocamos en su posición con la herramienta mover
  19. Importante No modificar la escala de los huesos,se modifica la longitud con la propiedad Length
  20. Seleccionando Cintura , creamos un nuevo Bone que será hijo de la misma y re nombraremos a Tronco
  21. Continuamos creando la jerarquia de huesos podemos usar  Alt + Shift + B​ como atajo de teclado
  22. Salvamos
  23. Comprobamos que los huesos estan bien colocados
  24. Unión Hueso -> Sprite Mesh
  25. Selecionamos en la Jerarquia el Sprite Mesh, en Bones damos a + para añadir el hueso al que va unido
  26. Arrastramos el hueso al componente , podemos borrar los huesos que no le afecten si es necesario.
  27. Si tiene más de un hueso asociado lo arrastramos directamente a Set Bones
  28. Enlazamos todos los Sprite Mesh con sus diferentes huesos
  29. Salvamos
  30. Creación de área de influencia del hueso
  31. Selecionamos el Sprite Mesh y vamos a Window -> Anima2D -> Sprite Mesh Editor
  32. Deberemos Dar a Bind para que cree el area de influencia, aparecerá una ventana para controlar los “pesos” de los diferentes huesos, si marcamos Overlay veremos su area de influencia.
  33. Damos a Apply
  34. Dejaremos la ventana Sprite Mesh Editor abierta para repetir el proceso
  35. Si nos equivocamos al añadir un hueso, tenemos que seleccionar el Sprite Mesh de la jerarquía ir de nuevo a Sprite Mesh Editor y dar a Unbind
  36. Si un Sprite tiene varios huesos, necesitaremos mejorar su malla , para ello podemos ir a Sprite Mesh Editor-> Slice y aumentar el Tessellation para cree más puntos en la malla
  37. Comprobamos que tenemos todos los Sprites Mesh enlazados, sino lo tuviéramos veríamos un Warrning
  38. Controles
  39. Creamos un objeto vacío llamado Controles
  40. Con él seleccionado Boton derecho 2d Object -> Ik Limb , es para controlar 2 huesos que nos servira para brazos y piernas controlando el pie y la mano mediante giros.
  41. Importante Colocar el Gizmo en su posición correcta antes de enlazarlo con los huesos
  42. Lo colocaremos normalmente sobre el punto de pivote del tobillo o la muñeca.
  43. Le pasaremos el segundo hueso, pierna2d o anted
  44. El Gizmo cambiará de color a Azul, podemos aumentar o disminuir su tamaño, desde el panel Escena -> Gizmos ->3D icons
  45. Si queremos controlar un elemento con más de huesos, creamos un control Ik CCD
  46. Seleccionamos control Boton Derecho -> Object 2D-> IK CCD le pasamos el  último hueso
  47. Tendremos que aumentar el Num Bones según lo huesos que tengamos.
  48. Salvamos
  49. Animación
  50. Importaremos imagenes de referencia, unas líneas guia, suelo etc e imagenes del ciclo que queramos animar.
  51. Podemos crear poses de las animaciones que luego se pueden reuilizar
  52. Para ello , con el personaje principal selecionado , añadiremos el componente Pose Manger
  53. Damos a create new pose y guardamos la pose como base.assets en nuestra carpeta del personaje
  54. Creamos las poses que consideremos necesarias siguiendo este procedimiento
  55. Para animar , con el personaje principal seleccionado , vamos Window -> Animation
  56. Le damos a crear una primera animación que será parado o Idle
  57. Nos creará un Animator que gobernará las diferentes animaciones
  58. Si queremos que la animación coincida en con el principio -> buscamos la animación es decir, .anim y en el Inspector marcamos Loop Pose
  59. Cuando queramos crear una nueva animación, con el personaje seleccionado vamos a Window -> Animation y Pinchamos en el nombre de la última animación creada para sacar el botón Create new clip y crear una nueva animación.
  60. Para animar “al vuelo”, es decir, que los cambios que se realicen en los controles o los huesos generen un nuevo fotograma simplemente debemos marcar el botón rojo rec.