Guardar todos los sprites de un atlas como png independientes (Solo Editor)

Este script permite convertir todos los sprites de un atlas o textura que hayan sido recortado con la herramienta de Unity en imágenes independientes png y almacenarlas en el disco duro, y poder usarlo fuera de Unity (Que fue el motivo real por el que lo cree).

Campus Party México 2017 Workshop Pacman

Aquí les dejo el proyecto completo hasta donde se llego en el workshop que impartí en el campus party méxico 2017.

La carpeta comprimida también incluye la diapositiva que se presento.

Proyecto Pacman

PARCHE: Hay un pequeño problema con los fantasmas que cuando tiene que usar los nodos del centro que teletransportan de un lado a otro, estos solo atraviesan todo el nivel, por lo que este código al inicio de “ActualizarLerp” en los fantasmas podría solucionarlo (Lo hice al aire, si alguien lo prueba y verifica se agradecería)

//Son casos especiales en nodos especiales que teletransprotan al fantasma 
if (Camino[IndexInResult] == new Vector3(35f, 0f, -2.3f)) //Es nodo de hasta la derecha especial?
 {
      transform.position = Camino[IndexInResult]; // 3 Es es nodo derecho
      IndexInResult++;
 }
 else if(Camino[IndexInResult] == new Vector3(-35f, 0f, -2.3f)) //Es el nodo de la izquierda
 {
       transform.position = Camino[IndexInResult]; //2 es nodo izquierdo
       IndexInResult++;
 }

 

Unity- Manejar los Tag y los Layers de manera facil en scripts

Los Tag y los Layers son muy usados en Unity, pero también muy factibles a que nos generen problemas. De manera básica los Tags permite comparar GameObject por tag para si tienes muchos tipos de enemigo, pero solo quieres saber si es enemigo y no de su tipo, solo puedo preguntar por su tag (Uso común en los Collision y Trigger) y los Layers funcionan para indicarle a la camara que GameObjects puede ver y cuales no, en las luces sobre que GameObject puede iluminar y cuales no y por ultimo en las físicas para hacer que por ejemplo las balas no puedan colisionar entre ellos (Matrix de colisión) o que un Raycast ignore ciertos objetos, entre sus principales usos.

Ambos presentan algunos problemas al trabajar con ellos dentro de un script:

  1. En caso de Tag podemos escribir “player” y este no va funcionar porque es con ‘P’ mayúscula y esto no hay manera hasta el ya probar si estamos en lo correcto o no.
  2. Si en un script comparamos con el Tag de “Pared” y pasa el tiempo y según nosotros no se utiliza y lo eliminamos de la lista de Tags, Unity no te notificara si hay un script que lo este utilizando o no, solo dejaran de hacer lo que esperamos estos scritps, en pocas palabras no sabemos si se utiliza o no en scripts un Tag.
  3. En Layers las operaciones o suelen ser ‘ 1 << NumeroLayer ‘  o ‘ 1 << LayerMask.NameToLayer (“MiLayer”) ‘ donde o no sabemos bien que numero es cada layer o en el caso dos, el mismo problema con los Tags no sabemos si esta bien escrito o en caso de eliminarlo no saber de manera inmediata si lo esta utilizando o no un script.

Una solución aparte de ser cuidadoso, es crear un script que tenga puras constantes con los nombres de los Tags y Layers para tenerlos en un lugar y actualizarlos de manera manual cualquier cambio. Entonces se puede generar un script que genere este script de manera automática con el fin que sea más rápido y estar 100% que se escribe de manera correcta.

Al final pongo el código del script que solo debes agregar a tu proyecto y debe estar dentro de una carpeta llamada ‘Editor’ y en ‘Edit / Generate Constants Classes’  y se auto generan los scripts. Con esto ya en cualquier script en vez de compara el Tag de “Player”, solo debes usar ‘ k.Tags.PLAYER’ el cual es un string constante, esto asegura que el string esta correctamente escrito y si se llegara eliminar el Tag al actualizar los archivos,  como los scripts hacen referencia a una variable, marcaría un error en todos los scripts que necesitan ese Tag y se aplica lo mismo con los Layers. De esta manera resolvemos los problemas mencionados anteriormente.

 

 

Seguridad: Ataques de unicode, IDN, phishing o páginas falsas

Últimamente a empezado a crecer considerablemente los fraudes y infecciones de malware por páginas falsas (También conocido como ataques unicode, ataques de IDN o phising) por lo que en este articulo explicare de manera muy general y sencillo que son y como protegernos de este tipo de páginas.

¿Que es?

Este tipo de engaños consiste en usar letras básicamente iguales (pero para las máquinas no lo son) para tener una página web que su nombre puede parecer bastante similar a otra por ejemplo ‘wһатѕарр.com’ no es ‘whatsapp.com’ (Observa bien la primera ‘T’).  Cuando uno registra una página web se debe registrar con un nombre y este es único a nivel mundial, pero por motivos que existen varios idiomas en el planeta, una letra como en este caso la T para otras escrituras la letra T o inclusive una similar se es procesada como otra letra y esto permite generar registrar páginas web con nombres muy similares pero no lo son, otro ejemplo por ejemplo puede ser con ‘google’ donde se podría registrar una página que en vez de 0, fuera el numero cero (0) entonces tendría la página web ‘g00gle.com’ que un usuario no ingresaría esta página directamente, pero si podría mandar un correo electrónico o publicidad que indicara algo como visita ‘g00gle.com’ y al entrar infectar la máquina del visitante con un virus.

Existen muchas letras que se pueden usar para registrar páginas muy parecidas a populares y existen casos donde el navegador web puede interpretar una letra y mostrarla como si fuera otra como puede ser el caso de ‘https://www.аррӏе.com‘ que realmente es ‘https://www.xn--80ak6aa92e.com/’ pero el navegador lo mostrara como ‘apple’ aunque no lo sea, estos casos son más difíciles de distinguir.

¿Como protegernos?

Lo mejor es tener actualizado nuestros navegadores siempre a la ultima versión, donde por ejemplo la version 58 de Chrome arregla el problema de ‘apple.com’ donde ya muestra el texto original, pero en caso de firefox se tiene que activar de manera manual esto, donde tenemos que escribir como página ‘about:config‘ y en buscar ‘ponycode’ y la opción de ‘network.IDN_show_punycode’ debe estar activo en true, si se encuentra en falso, solo debemos dar doble clic.
Fuera de esto lo aconsejable es siempre observar a que enlaces nos quiere llevar links que recibimos y si se ve raro, no confiar en el sitio web, igual en todo caso puedes buscar el sitio web desde un buscador, estos siempre omiten este tipo de páginas por motivos obvios de seguridad.

Unity- Hacer que el ParticleSystem ignore la pausa o el timeScale

¿Como hacer que las partículas funcionen en pausa? o ¿Como hacer que un el particlesystem ignore la escala de tiempo? Este es una pregunta un poco recurrente entre mis alumnos y en algunos foros y la respuesta es bastante sencilla.

El Time.timeScale se encarga de manejar a la velocidad que se actualiza el mundo y por defecto es un valor de 1, si este se vuelve 0, las animaciones, físicas y partículas se congelan porque dependen de este. Pero existe una manera de que las partículas puedan ignorar la escala de tiempo y es simplemente forzar su actualización con un script que tenga el siguiente codigo:


//Referencia a las particulas
ParticleSystem parti;

private void Awake()
{
parti = GetComponent<ParticleSystem>();
}

void Update()
{
parti.Simulate(Time.unscaledDeltaTime, true, false);
}

Y poner el script en las partículas, este avanza porque usamos el unscaledDeltaTime que como su nombre lo indica no le afecta la escala de tiempo y usamos la función de las partículas que los sigue reproduciendo.

Unity – Nave al estilo hoverboard

Me encontré con este interesante tweet de KevKev https://twitter.com/Der_Kevin/status/846690600942489602

Así que hice una versión exageradamente sencilla de una nave (que es un cubo, pero imagen que es una nave bien bonita con partículas y todo) que flota al estilo hoverboard pero control estilo de vehículo volador. Aquí dejo un gif y el proyecto completo elaborado en Unity 5.6

Demo

Proyecto

Unity – Posicionamiento de pies a suelo con IK

Los IK de Unity es una herramienta que permite poder controlar a donde mira la cabeza o posicionar los pies o las manos a una posición o rotación y se mezcla con las animaciones, no explicare usar los IK pero aquí dejo la documentación oficial.

Demo

Se pueden utilizar los IK para posicionar el pie a la altura de la plataforma donde está tocando y también que tome la rotación de la plataforma. Entonces la lógica consiste en lanzar un RayCast desde la posición del pie hacia abajo y en donde impacte el Raycast, y posicionar el pie con IK en donde impacto el Raycast, esto es la teoría básicamente.

Ahora puntos importantes a considerar:

  • Al posicionar el pie en donde impacto el Raycast el pie estará dentro del suelo un poco porque los huesos del pie no están exactamente en la planta del pie (Imagínate si es una mujer con tacones), entonces tienes que sumarle un offset para compensar esta parte.
  • El Raycast tiene que ser lanzado desde donde se encuentra el pie y un poco más arriba. Esto se puede solucionar usando ‘GetIKPosition(AvatarIKGoal.RightFoot);’ del animator.
  • El Raycast es recomendable usar con LayerMask para evitar que termine colisionando con el mismo personaje.
  • Si el Raycast no impacto con nada, no asignamos una posición (Se deja según la animación indique).

Mi proyecto consiste en un script que solo es necesario poner en un personaje junto el Animator para que empiece a funcionar y una pequeña escena (el gif) para verlo en acción.

El proyecto lo tengo en GitHub: IKFoot_Floor-Unity

Unity – Guardar y cargar muchas variables de manera rápida y eficiente

Las funciones de PlayerPrefs de Unity permiten guardar y cargar int, float y string sin importar en que plataforma nos encontremos trabajando, pero su gran limitante es que están diseñados para almacenar una variable a la vez y guardar y cargar varias variables se puede convertir algo molesto de hacer.

Pero Unity cuenta con una librería de JsonUtility que permite convertir cualquier clase en un string en formato JSON, el cual es una mejor alternativa a los XML para transferir datos en un formato, el truco esta en declarar una clase que contenga todas las variables que te gustarían almacenar y a la clase solo agregarle [System.Serializable] para que pueda ser compatible con este formato, entonces aquí un código de como funcionaría esto:

Aquí la funcion JsonUtility.ToJson convierte los valores de nuestra clase a un Json y este al ser un simple string, podemos almacenarlo con el PlayerPrefs, ya el cargado de la información se lleva acabo igual con el PlayerPrefs y la función JsonUtility.FromJson se encarga de leer y sobre escribir nuestras variables con los datos almacenados.

Random normal vs Random Procedural

El uso de generación procedural cada vez empieza agarrar más fama y utilidad en la industria de los videojuegos para generación de contenidos y en este post hablare un poco sobre la diferencia de usar un típico random y un random enfoque procedural.

Si deseamos generar una secuencia de 5 números de manera aleatoria solo entre numero comprendidos entre 0 al 100 de manera normal, cada numero podría ser muy diferente a los otros, donde podríamos obtener como resultado algo como: 40, 13, 83, 50 y 55; donde cada numero generado no toma encuentra nada respecto a los resultados anteriores solo el rango inicial. Mientras si deseamos repetir el mismo ejercicio con un enfoque procedural, solo el primer numero lo generamos entre el rango de 0 al 100 y los siguientes sera entre un rango de -10 a 10 respecto el numero anterior, obtendremos números cercanos entre ellos, algo como: 45, 48, 54, 60 y 55.

Imagen con Random normal

Entonces un random procedural toma en cuenta el resultado anterior y es mayor controlado el posible resultado. Donde en números es aburrido pero más fácil de explicar esta parte, pero ahora  ¿Que sucede si lo aplicamos a generar una imagen?. Si deseamos generar una imagen aleatoria de 512 * 512 donde se genera un color diferente aleatorio cada pixel vertical de manera normal, donde simplemente cada pixel es un color posible de toda la gama de colores, obtendríamos básicamente una imagen lleno de colores

Random Procedural

Mientras si deseamos generar una imagen de manera procedural, necesitamos hacerlo de la siguiente manera, primero necesitamos de un color base, luego al generar un nuevo pixel tener un margen de que canto puede variar en cada capa de color (RGB) por ejemplo no puede variar entre cada pixel más del 0.06% en Rojo, 0.04% en Verde y 0.01% en Azul y no puede alejarse más del 0.05% en cada capa del color base (esto para no irnos a otro color), esto logrando mantenernos cercas, pero variar del color base, donde podríamos obtener el resultado de la imagen de la izquierda, donde obtendremos una imagen que no se aleja del cafe, esto podría ya ser utilizado para asignárselo a una mesa y si tenemos 3 mesas, cada uno tener un poco de diferencia pero no exactamente igual.

 

 

En este ejemplo solo use un pixel diferente de manera horizontal, ya si realmente deseamos utilizarlo deberíamos aplicar el mismo principio pero iniciar desde el centro de la imagen y expandirnos de manera circular por la imagen para y si se agregan ciertas manchas de otro tono, tener resultados como el siguiente:

Madera Procedural

Los resultados ya empieza ser ahora si útiles para asignar como textura para madera y usando el mismo principio pero partiendo de azul podríamos crear nubes, del verde para pastos o arboles, etc.

Notas: Aquí pueden descargar un paquete con el código del ejercicio de las imágenes Descargar y la ultima imagen fue sacado de un proyecto desarrollado por dentedpixel que tiene ejemplos de generar texturas de manera procedural, en un futuro espero publicar mis versiones simplificadas y en español.

¿Cual es la mejor herramienta para animar 2D en Unity?

Existen varias herramientas que permiten la animación en 2D, el más tradicional y famoso es Flash. Ya en la actualidad existen muchos más como ToonBoom, Spline, Sprites, etc etc, los cuales están más orientados a ser usados para una animación en video principalmente. Aunque sean unas buenas herramientas, facilitan mucho el trabajo e inclusive permite hacer algunos efectos de manera muy sencilla, Unity no es compatible con ellos de manera oficial al menos que se exporten como un SpriteSheet o secuencia de imagenes, pero abrir directamente los archivos no se puede, pero en la Asset Store o en GitHub podemos encontrar importadores de estas herramientas y el santo milagro para usar animaciones en 2D en Unity. Quitando de por medio la posibilidad de usar solo SpriteSheets…

¿Cuál de los programas para animar, es la mejor para usar con Unity?

Esta es una pregunta que todo artista y más animadores 2D se podrán preguntar y su respuesta es un todos y ninguno a la vez, y explicare el porqué.

Para empezar, Unity tiene realmente 2 métodos de dibujar, a través de los MeshRender y SpriteRender, cualquier plugin externo lo que realmente hacen es adaptar su contenido para que funcione con uno o con el otro, de ahí no existe otra manera. Por lo que si al importar el archivo, si este no genera archivos que funcionen con el Animator o no puede visualizarse en la pestaña de animación de Unity, significa que no es una importación nativa, el plugin se encargara convertilo en tiempo real para volverlo compatible, es como escribir un documento en ingles pero se tuviera que escribir en español y usaras el traductor de Google para traducir (ahora, este proceso es llevado acabo en cada Frame).

¿Entonces, que tiene de malo que no sean nativos para Unity?

Primero que esto ocasionara que efectos como Shader, implementarlos en estos animaciones 2D, sea un trabajo muy difícil , ya que no está funcionando directamente con el sistema de Unity.

El segundo, implica que al cargar un GameObject que esté usando un sistema de animación externo, este tendrá que pre cargar y luego a medio ejecución generar un Mesh en la forma del sprite, el cual implica un proceso algo pesado y lento. Ocasionando otros 2 problemas (Esto varian por el plugin principalmente, pero todos me eh topado con estos problemas) son su tiempo de carga son grandes y el principal en una PC no necesitaras más de 50 GameObjects que estén en pantalla al mismo tiempo y estos bajaran drásticamente tus FPS y en móviles solo necesitaras entre 10 -20, mientras que usando de los métodos de animación de Unity, podrás tener hasta más de mil GameObjects al mismo tiempo y no estoy exagerando.

¿Entonces no es recomendable no usar programas para animar, al menos que exporte en SpiteSheet?

Si puedes usarlo, porque generalmente usan animaciones Cut Off y estos permiten tener mejor calidad de imagen en el proyecto. Entonces la recomendación seria usarlo en personajes principales o jefes y tener en cuenta que no son necesarios muchos para alentar una maquina. Todo lo demás usa SpriteSheet. Lo mejor sería aprende a animar 2D con el sistema de Unity que por obvias razones es el más optimo.