Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

Cesta de pan, en Unreal Engine

Homenaje al cuadro del mismo nombre de Salvador Dali, creado con el motor de videojuegos Unreal Engine 5, los modelos 3D son de Quixel, me resulto muy curioso pensar en como Dali había realizado la composición, en su cuadro el pan esta dado la vuelta , a mi sin embargo me interesaba más mostrar la miga con sus agujeros

La magia de la composición esta en el fondo negro que hace que toda nuestra atención se centre en la cesta, es muy difícil recrear la iluminación exacta del cuadro puesto q la luz esta pintada y reinterpretada, al final opte por colocar las luces lo más parecido posible, colocando una luz trasera que aisla parte de la mesa, sin mas sentido que el artístico.

Detalle del cuadro “Cesta de pan” de Salvador Dali

Creando una bombilla en Unreal 5, encendido y apagado en c++

Unreal 5 y el sistema de iluminación en tiempo real Lumen, nos permiten tener materiales con emisión que no solo van a crear un halo suavizado , sino que realmente iluminan.

Para ello tendremos que crear un material con Emission, el que mejor resultado me ha dado es Surface, y convertirlo en parámetro quedando:

Ahora viene algo que al principio parece extraño pero que luego tiene toda su lógica, y es crear dinámicamente una copia del material , modificarlo y reasignarlo.

Es necesario crear una copia ya que si se pudiera, creo que Unreal no deja manipular el material directamente, estaríamos modificando las propiedades del material en todos los objetos que lo tuvieran, por lo que un cambio en el emissor cambiaria todos y normalmente lo que se busca es tener control sobre cada uno

  1. Obtener copia dinámica del material, para ello tenemos que fijarnos en que índice está, lo ideal es crear una variable para poder cambiarlo
 DynMaterial = UMaterialInstanceDynamic::Create(LampMesh->GetMaterial(indexOfMaterial), this);

Donde DynMaterial es UMaterialInstanceDynamic* DynMaterial;

2. Modificar los parámetros, aquí es muy importante que el nombre del parámetro y el que vamos a pasar coincidan, de nuevo crear una variable ParamEmissionName (FName ParamEmissionName = FName(TEXT(“EmissionIntesity”));) para el nombre

DynMaterial->SetScalarParameterValue(ParamEmissionName, 0.0f);

3. Por último reasignar la copia del material al elemento, sino se habrá creado la copia pero no tendrá dueño, LampMesh es mesh del objeto que contiene los materiales definido como UStaticMeshComponent* LampMesh;

 LampMesh->SetMaterial(indexOfMaterial, DynMaterial);

Crear un videojuego para móvil V con Unity: Construir nivel

Continuamos con la recreación de Duet para móviles Duet con Unity y C# En este vídeo trabajaremos:

-Creando un constructor para el nivel

– Instanciando GameObjects

– Uso de bucles para posicionar

– Uso de aleatorios

– Mejorando el constructor con un sistema codificado

Codificar la información es crear un código para relacionar datos, así podemos utilizar matrices bidimensionales para crear las piezas

Crear un videojuego para móvil II con Unity: Mecánicas de giro

En el segundo vídeo de la serie de recreación de un videojuego para moviles android con Unity veremos como crear mecánicas de giro, que serán la base de todo el juego.

El reto:

El jugador debe tener un reto al que enfrentarse, en este caso ponemos aprueba su velocidad y su capacidad de calculo para que las bolas no choquen con los objetos, frente a otros juegos de móvil donde desplazamos el elemento principal, aquí lo rotamos, al existir dos bolas complicamos el movimiento, ya que tendremos que movernos hacia la derecha y hacia la izquierda.

En este tipo de videojuegos minimalistas para móviles, es importante tener una mecánica clara, bien definida y sencilla de entender, la complejidad del juego vendrá de un factor externo al jugador: los niveles.

En este vídeo tutorial trabajaremos diferentes elementos base de Unity para la recreación de un videojuego para móvil android , tipo Duet:

– Colocación de los distintos elementos

– Diseño base usando solo recursos de Unity

– Diferenciar tiempo de juego de tiempo de edición

– Buenas practicas de programación [SerializeField]

– Mecánicas de giro

– Programación de el giro

Crear un videojuego para móvil I con Unity

He creado una serie de vídeos Unity Do el camino del videojuego donde veremos paso a paso , y explicando cada parte cómo crear un videojuego para móvil, concretamente para la plataforma android desde 0 y utilizando Unity y C#

En este vídeo recrearemos el videojuego para móviles Duet con Unity y C# :

-Cómo preparar un proyecto de Unity para exportarlo a Android

-Configuración del proyecto para Android

-Creando un GameManager

-Creación de los controles con Event Trigger

-Comunicación GameManager y Event Trigger

-Comprobación de los eventos por consola

Lo interesante de recrear un proyecto es ir desglosando cada paso, tratando de crear una buena arquitectura en el control del juego e ir aumentando su complejidad progresivamente, trataremos de utilizar las herramientas más adecuadas , por ejemplo utilizaremos un tipo de collection menos conocido como queue para gestionar los textos, o usaremos AudioMixer para el control de sonidos.

No te pierdas este y otros contenidos creados para enseñar a todo el que lo desee a diseñar y programar videojuegos y suscribirte al canal.

https://www.youtube.com/channel/UChMzt1jSTzii0hoY1ABHPpQ

Nace Unity Do , el camino del videojuego

Llevaba un tiempo pensando en crear un canal de youtube donde volcar mi conocimiento sobre programación y Unity, como docente de videojuegos, hay muchas cosas que me dejo en el tintero en las clases, por falta de tiempo.

Unity a sufrido constantes mejoras en los últimos años, algunas de las cuales se han vuelto muy interesantes pero demasiado especificas , por ejemplo el nuevo sistema para animación 2D, por eso en el canal Unity Do, puedo explorar los nuevos paquetes, las actualizaciones, assets y tambien hacer hincapie en la programación y el diseño de videojuegos.

¿Por qué es necesario crear un canal como Unity Do?

Como su nombre indica UnityDo es un guiño a las artes marciales, como Judo, Taekwondo , Karate Do.. en ese caso el do significa camino, una filosofia de entrenamiento y mejora continua, que es precisamente la quiero inculcar en el canal.

Por lo tanto Unity Do, es el camino de Unity, el camino del videojuego, y mi intención es conseguir fomentar la programación y el desarrollo de videojuegos en castellano, ya que hay muy buenos canales en ingles, pero creo que en español , que tambien les hay muy buenos, nos falta ser un poco mas desprendidos con el conocimiento e ir más alla de lo basico.

Como en cualquier otro proyecto que uno se embarca debe aspirar a lo máximo, mi reto es conseguir tener un dojo virtual, una comunidad de seguidores, que hayan pasado del blanco al negro, de apenas tener un concomiendo a ser capaces de crear grandes videojuegos.

Escenas de paisajes en Unity

Crear escenas de paisajes es una buena practica para entender como posicionar elementos, como crear una composición y como funcionan las luces en Unity, trabajando con un directional light y unas pocas luces mas para matizar es suficiente.

Un protocolo de trabajo, sin utilizar terrains, que serán explicados en otro articulo

Gran Capitán creado en Unity3d
Escena creada con Unity

1) Cambiamos el modo de Color Space a linnear en File-> Build Settings ->Player Settings ->Other Settings -> Linnear

2) Metemos un skybox de un cielo

3) El skybox nos dará una definción aproximada de la hora del día, amanecer, atardecer etc

4) Colocaremos la rotación del directional light basándonos en la hora aproximada del día, si es de noche podemos dar una luz azulada tenue

5) Importar las texturas y crear los materiales colocando sus mapas

6) Importar diferentes modelos para crear una composición general (Montañas, rocas, arboles

7) Colocar los objetos creando la composición, se puede importar una referencia y meterla en un plano, o usar Cinemachine >Storyboard

8) Creada la composición los gameobjects serán marcados como static

9) Los objetos complejos se aumenta su escala en el lightmap en el Mesh Renderer ->Lightmap Settings -> Scale Lightmap (Para que aparezca el objeto tiene q ser static)

10) Si queremos meter reflejos , creamos un Reflexion Probe , y lo colocamos en los objetos que tengan propiedades metalic , specular o roughness

11) Colocamos la cámara creando el cuadro de la composición

12) Bakeamos ->Lighting->Settings->Generate Lighting

13) Podemos meter como máximo un par de point light para crear ambientaciones

14) Corregimos iluminaciones y posiciones

15) Volvemos a Bakear

Resumen de métodos de List I

Voy ha hacer un resumen de los diferentes metodos de List<t> y su aplicación al mundo de los videojuegos con Csharp y Unity

En vez de poner cada uno de los diferentes métodos y traducirlo, voy a ponerlo como preguntas para que resulte más sencillo:

¿Qué es un List?

List<T> son como arrays vitaminados, una lista de objetos con propiedades y métodos propios pensada para realizar tareas habituales en los array pero mas rápidamente. List<T> significa genérico pueden ser de cualquier tipo

¿Cuando usar array y cuando List?

Los arrays son estructuras menos complejas, mas livianas y mas rápidas al ejecutarse que un List, en general diremos que si no se van a realizar tareas como añadir, eleminar o buscar probablemente con utilizar un array será suficiente, por otro lado cuando creamos una clase propia por ejemplo Carta, es cuando solemos utilizar List , quedando List<Carta>=new List<Carta>(); ya que nos permite hacer operaciones muy rapidamente con una pocas lineas de codigo.

Un #list puede no tener un número de elementos definido, funcionando como un papel en blanco, una lista de la compra, donde vamos añadiendo elementos, borrando, buscando.. Ejemplo con clase propia: List<Carta> Baraja

¿Como saber cuantos elementos tiene un List?

Dado el List Baraja, por ejemplo, con el método Count obtendremos el numero de elementos, asi Baraja.Count nos devolvería 40 en una baraja española

He visto que hay otro método llamado Capacity ¿Es lo mismo que Count?

No , Capacity se refiere a la reserva de memoria que hace para no tener que estar modificando el espacio reservado cada vez que se añade o elimina un elemento. Ambos pueden coincidir cuando tienes el mismo numero de elementos que la capacidad.

#Count vs #Capacity en List<T> un estadio tiene capacidad para 100000 (Capacity) pero solo hay 5000 espectadores (Count). Daremos una capacidad cuando ya sabemos el número de elementos que va albergar, reservando memoria.

List<T> puede modificar Capacity cuando el número de elementos la supera, “crece” para albergar los nuevos elementos. En una fiesta has reservado para 4 personas pero vienen 5 el restaurante te da otra mesa

¿Se puede ajustar Capacity al numero exacto de elementos que tiene el List?

Si, hay un metodo especifico para eso : TrimExcess () , el cual ajusta Capacity para que sea igual a Count.

Vas a dar una fiesta para 20 personas #capacity pero solo vienen 16 #count , con Sillas.TrimExcess () ajusta #capacity al #count para que no sobren sillas (más memoria de la necesaria)