Unity: Agua 2D con olas

Para el juego de Villa Sancho prototipe un agua para el mundo de la playa el cual tuviera olas, pudiera tener splash cuando objetos entraran y salieran del agua y distorsionara un poco detrás de el. El prototipo es la imagen de cabecera de este articulo.

Mesh

Todo lo que vemos en nuestro mundo de Unity es un mesh con una textura, entonces para crear el agua se genera un mesh de manera procedural, para eso primero hay que saber que un mesh tiene 3 datos importantes:

  1. Los mesh están  contienen unos puntos llamados vértices que definen las coordenadas de cada parte de los modelos en el mundo.
  2. Todos los mesh están formados por triángulos que solo pueden utilizar los vértices.
  3.  Cada poligono para determinar como van a utilizar las texturas con ayuda de los uv, que van de 0.0f a 1.0f, entonces por ejemplo si solo quieres mostrar la 1/4 de la imagen, solo pones uv(0.5f, 0.5f), cada vértice que usa el polígono debe tener indicado esta parte

A partir de esto basándome en código de tutplus hice la primera versión, la cual recomiendo leer. Esta base tenia 2 problemas. El primero es que sus UV no permitían trabajar con texturas que no fueran un solo color y limitara el uso de shaders; y tiene demasiados polígonos.

El problema de los polígonos surge porque para crear el agua, esta formado por cuadrados que son los que mueves para crear efecto de olas, pero en la versión de tutplus cada cuadro que uno junto al otro, aunque tengan su pared exactamente igual, son 2 paredes en la misma posición, así que busco todos cuadros que tienen paredes similares y hago que compartan el mismo con un MeshWeld.

Tutsplus tiene asignado los UV de cada poligono de 0.0f a 1.0f, es decir cada poligono dibuja toda la textura en el, así que solo es dividir 1.0f/cantidadPolignos(o cuadros), esto permite que la textura funcione mejor y podamos utilizar shaders.

El shader lo tenia guardado de hace mucho, así que no tengo la referencia de quien es 🙁

Es un prototipo, se podria mejorar, pero quise optimizar la versión de tutsplus que esta bastante bueno.

Unity: Inicializar un script automaticamente sin importar escena ni gameobject

En unity existe la posibilidad de llamar una función de un script automaticamente al iniciar el juego sin importar la escena y sin necesidad que el script se encuentre en un GameObject.

El auto ejecutar una función siempre al iniciar el juego es perfecto para inicializar y cargar objetos que siempre necesitamos y evitar el problema de necesidad de pasar siempre por una escena para que las demás escenas funcionen o instanciar un Prefab para asegurar que siempre exista en nuestro juego, esta es la utilidad principal que utilizo.


[RuntimeInitializeOnLoadMethod]

public static void OnLoad()

{

//CODIGO

}

Esta técnica lo utilizo en mi Framework 2D para auto inicializar el manejador de audio. AUDIOMANAGER  (Hasta al final del script)

Unity: Enviar Logs a un email desde un build.

Cuando uno trabaja en Unity es de muy mucha utilidad la consola donde se muestra errores o mensajes de Debug.Log y Print que ayudan averiguar que pasa, al crear un ejecutable para PC en la carpeta del juego genera un log donde podemos visualizar estos mensajes, pero en caso de moviles se complica poder visualizar estos mensajes.

Existen diversos opciones por Internet para visualizar estos mensajes en runtime, pero aveces se necesitamos respaldarlos o sería más cómodo visualizar desde nuestra computadora. Con este script puedes obtener los mensajes de Unity y poder enviarlos a un email.

Para esto Unity cuenta con ‘Application.logMessageReceived’ que permite recibir los mensajes de la consola y los almacenamos en un string. Después enviamos este mensaje a un php almacenado en un servidor y este se encargara de enviar a nuestro email. Existen diferentes maneras, pero deje lo más básico el script para que funcione y si alguien necesita adaptar, sea lo más sencillo posible.

Unity: Combinar 2 textures por código

Una pregunta frecuente por alumnos en la clase de Unity es como combinar 2 texturas / imagenes en una sola sin usar un shader.

Esto se logra creando una copia de la TexturaA y sobre esta copiamos los pixeles de TexturaB, con 2 for anidados y solo debemos verificar que si el pixel a copiar no es completamente transparente (color.a > 0.0f) pasamos a copiar el pixel, en caso contrario lo ignoramos.

Dejo aquí un link de descarga del projecto del gif: DESCARGAR

Unity – Simple-Controller-Input uso de control en Unity

Simple-Controller-Input es un script para Unity que permite trabajar con control de Xbox de una manera sencilla. Solo basta agregar el script “GameControllerInputs.cs” a tu proyecto y podemos utilizar el control como: if( controllerInput.DPad_Left ) { acción }.

Como empezar a utilizar:
  1. Remplazar el archivo “InputManager.asset” de la carpeta del proyecto.
  2. Agregar el script “GameControllerInputs.cs” al proyecto.

Ejemplo de uso:

1°- Creamos una variable del tipo GameControllerInputs y en el Start lo igualamos a GameControllerInputs.GetIstance();


private GameControllerInputs controllerInput;

void Start ()

{

controllerInput = GameControllerInputs.GetIstance();

}

2°- Con esto podremos preguntar como controllerInput.DPad_Left , RightDirectional_Horizontal, etc. En la parte inferior de la página de github viene todos los inputs disponibles.

El proyecto fue iniciado por andre-lima y actualmente me fue transferido el proyecto para darle mantenimiento, así que cualquier problema o duda aquí me encuentro 😊

Ir a Simple-Controller-Input

Unity – Como debugear en un build de manera sencilla

La consola de Unity es una gran utilidad que ayuda a encontrar y poder resolver problemas dentro de Unity de una manera sencilla ya que indica cual es el error, el script que lo ocasiono e incluso en que linea de código esta sucediendo el problema.

Este paquete de Unity permite tener la consola en cualquier ejecutable desde escritorio o movil solo agregando un pequeño prefab.

Consola en juego

El paquete le pertence a Yasirkula que es gratuito y de código abierto. Link de proyecto.

Unity – Generar Normalmap de textura en runtime

Script para obtener la textura de NormalMap de un Texture2D en runtime, el cual fue una pregunta de una alumna que se hizo interesante compartir su solución.

Nota: El proceso es algo lento, pero logra su cometido.

 

C++: Cargar y ejecutar Python (Scripting)

C++ es un lenguaje de programación muy poderoso, pero uno de sus ventajas es que una vez compilado, si necesitas hacer ciertos cambios se requiere de utilizar el código fuente,  por lo que si necesitamos que un usuario pueda hacer ciertos cambios sin darle el código fuente, podemos darle la oportunidad de generar scripting, en este articulo mencionare como cargar y ejecutar código de Python desde C++ y la comunicación en ambos sentidos. En videojuegos es una manera tradicional de permitir al usuario genere sus propios mods, entre otros usos.

Configuración básica:

  • Instalar Python (En este ejemplo yo utilize 3.6) de preferencia en “C:/Python36”.
  • Crear un proyecto de consola en C++.
  • Compilar el “hola mundo” para que genera la carpeta de .exe.
  • Copiar “python36_d.dll” donde esta el .exe.
  • Agregar al proyecto include de “C:\Python36\include” y Lib a  “C:\Python36\Lib”.

Leer más

IA básico de un vehículo

En este articulo hablare un poco de como crear una inteligencia artificial para un vehículo para que pueda recorrer por si mismo, para este ejemplo me base en el proyecto de como crear una nave al estilo hoverboard en Unity. Es una demostración sencilla de como puede crearse uno, puede mejorarse, pero la intención era hacerlo lo más sencillo y funcional.

La inteligencia artificial de este ejemplo lleva acabo 3 tareas: primero si debe acelerar o frenar, si debe ir girando a la derecha o izquierda y esta frente a una pared, determinar en que sentido es más posible poder continuar su camino.

1°- Determinar si debe acelerar o frenar: Para esto simplemente se lanza un raycast hacía adelante del vehículo a 7 unidades de Unity, si este no impacta en nada entonces aceleramos, si impacta con algo dejamos de avanzar (la nave estilo hoverboard cuenta con inercia), esto para dejar que pueda llevar acabo mejor una vuelta.

2°- Determinar para donde debe girar: En este proceso se lanza 2 raycast hacía adelante pero en diagonal igual de 7 unidades, entonces en el caso del lado derecho, si este impacta, entonces indicamos que debe girar hacía la izquierda (para alejarnos de la pared) y sin importar si impacto o no, se hace lo mismo hacia el lado izquierdo, done si impacta con lago giramos hacía la derecha, ocasionando que en el caso que ambos hayan indicado que deben girar se anulen y simplemente siga hacía el adelante el vehículo.

3°- Estar frente a un pared, determinar si a la derecha o izquierda es más posible continuar con el camino: Existe un caso especial que puede ser que el paso 1 y 2 no fueron suficiente y termine el vehículo a frente de una pared y se debe determinar hacía donde es más posible continuar con nuestro camino, es aquí que se lanza un raycast totalmente hacía la derecha y otro hacía la izquierda, y si uno de estos raycast no impacto en nada, entonces le indicamos al vehículo  que gire hacía esa dirección hasta que el paso 1 y 2 vuelvan a permitir que pueda continuar con su camino.

En el gif solo se ven por muy pocos frames.

Aquí les dejo el enlace para descargar el proyecto completo: DESCARGAR

Notas para atender mejor el ejemplo:

  • transform.TransformDirection(Vector3.forward) : Para poder lanzar un raycast hacía adelante del vehículo uso la función TransformDirection de transform que me convierte el Vector3.forward en otro vector3 pero con lo que representa hacía adelante del vehículo, y así para todos los sentidos.
  • LayerMask: Este tipo de variable ayuda hacer que el raycast ignore el mismo vehículo (esto para poner muchos vehículos 😉  ).
  • horizontal = (AfrenteDer == false) ? 0f : -1.0f;   Este es una manera de implicar un if, donde si la variable ‘AfrenteDer’ es igual a falso, entonces ‘horizontal’ es igual a 0.0f, en caso contrario (else), ‘horizontal’ va ser igual a -1.0f.

Unity – Detectar mientras se deja presionado botón en UI

El sistema de UI de Unity cuenta con botones pero tienen el pequeño problema que solo activan el evento de presionado y no mientras se mantenga presionado, por eso les comparto aquí un pequeño script que solo deben agregar a su proyecto y con esto agregar a cualquier botón que necesiten que llame una función mientras se encuentre presionado y agregar en su eventos que función llamara como ya funciona el sistema de eventos de Unity.

 

Como funciona:

Unity aparte de agregar eventos desde el inspector puedes recibirlos directamente por script usando el EventSystem y así poder detectar cuando es presionado y cuando se deja de presionar, y mientras se encuentre presionado, se llama la función que ah sido agregado como a una variable del tipo UnityEvent.