Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

unity

Unity luces: Recreando Cesta de pan, de Salvador Dalí

Inspirado en el cuadro de Dalí, Cesta de pan, recreo la composición y las luces en Unity, utilizo un spot light para iluminación base y area lights para marcar zonas de brillo, finalmente subo el contraste con postprocesing.
Modelos usados :
Mesa:
https://sketchfab.com/models/e9ef3eadee9d4491b7c59fdbb19c30cd

Cesta de pan:
https://sketchfab.com/models/bb7e9cf4496f420c8d825d2e507f124b

Pan:
https://sketchfab.com/models/35c647c3231b4d7ba3dfdc1d0ba4d036

Unity script saber si un número es par o impar

Un script muy sencillo de c# que pongo de ejemplo para usar el operador % modulo , y comprobar su utilidad, el cual devuelve el resto de una división.
Ya que el resto de la división de un numero par entre dos es siempre 0
public int numero;
if(numero%2=0){
print(numero+" es par");
}else{
print(numero+" es impar");
}

Demo de ¿Donde está Lupo?


Se trata de un videojuego sencillo, basado en la realidad de tener un gato y no saber por dónde anda, así q la pregunta ¿Donde está Lupo? Surge cada día.
De este hecho cotidiano decidí darle una vuelta para crear un videojuego pensado para el aprendizaje de idiomas, ya que recuerdo que el tema de las localizaciones me daba quebraderos de cabeza en inglés.
Como últimamente he estado diseñando en pixel art, deci hacerlo con un estilo parecido a las aventuras gráficas tipo Lucas Arts.
El proyecto está en desarrollo, pero ya es funcional.
Si os interesa saber más sobre ¿Donde está Lupo? Dejarme un comentario.

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 : 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