Unity – Usando Lerp para mover un GameObject por unas vías o rieles.

Hace tiempo publique un tutorial de que es Lerp y como usarlo.

Pero ahora les traigo un ejemplo de como se puede utilizar para mover un GameObject a través de unas vías o rieles imaginarias usando varios GameObjects como puntos para generar un camino imaginario. En otras palabras, mover el GameObject y siga un camino formado por varios GameObjects.

En este codigo simplemente se tiene una variable publica velocidad para el movimiento y un arreglo de Trasnforms los cuales serviran para asignar entre que puntos deseamos movernos y en que orden. De aquí simplemente tenemos una variable IndexActual el cual ayuda movernos por el arreglo y de ahí como en el tutorial anterior usamos puntoA, puntoB, t para movernos en el Lerp y un factor para determinar la velocidad de t.
Aquí el código:

Resultado:

PathPaquete: Descargar

Unity – Update con intervalos entre cada llamada (cUpdate)

Update es la función por defecto de Unity que se llama de manera automatica en cada frame. Pero en situaciones necesitamos llevar acabo una acción, pero no necesariamente en cada frame, por un decir cada medio segundo (0.5). Gracias a Unity tenemos dos opciones, la primera es usar ‘InvokeRepeating‘, pero su limitante es que no podemos cambiar la frecuencia (Que primero sea cada medio segundo (0.5) y luego cada segundo (1)) sin necesidad de detenerlo y generar uno nuevo, para ellos podemos hacer una versión alternativa con los ‘Coroutines‘, el cual puede quedar así.

Esto es muy util cuando necesitamos por ejemplo verificar si algo ah llegado a su destino en muchos GameObjects.

Unity – Como perseguir a nuestro personaje automáticamente en la pestaña de escena

Cuando uno prueba sus juegos, en ciertos momentos necesitamos tener a la vista la pestaña de escena y la de juego al mismo tiempo visibles, pero cuando es de mover a nuestro personaje de lugar, se vuelve un poco difícil seguirlo en la pestaña de escena, bueno existe un pequeño pero gran truco para hacer que la pestaña de escena siempre siga a nuestro personaje o cualquier GameObject que necesitemos seguir.

Si seleccionamos un GameObject y presionamos ‘F‘ teniendo el mouse encima de la pestaña de escena, este se enfocara al GameObject seleccionado inclusive acercara la cámara, pero, pero presionamos dos veces ‘F‘, no solo se acercara, si no que lo mantendrá enfocado así, si estamos en modo de juego, no perdamos a nuestro personaje, inclusive podremos usar el scroll de mouse para acercar o alejar la camara de escena.

Algo así, pero directamente en la pestaña de escena:

Wizard of Legend

C++ – Libreria basica de detección de colision en 2D

Aquí les comparto una libreria (h y cpp) el cual solo determina si ciertas figuras estan o no entrando en colision entre ellas. Su uso simplemente es llamar una función como:


if(Physics::RectBall(box.x, box.y, box.w, box.h, circle.x, circle.y, circle.r))
{
  //HUBO COLISION
}

Donde solo se manda posicion ‘x’, ‘y’, ancho y alto del rectangulo y ‘x’, ‘y’ y radio de la esfera la función regresa true si estan impactando o false en caso contrario.

Aquí dejo un pequeño demo para windows con el cual pueden jugar un poco. Descargar

Demo detección de colisión

Demo detección de colisión

Las funciones que contiene esta pequeña libreria de detección de colision es:

  •  //Esferea con esfera
    bool BallBall(float _bx1, float _by1, float _br1, float _bx2, float _by2, float _br2);
  •  //Linea y Esfera
    bool BallLine(float _bx, float _by, int _br, float _lx1, float _ly1, float _lx2, float _ly2);
  •  //Rectangulo y esfera
    bool RectBall(float _rx, float _ry, float _rw, float _rh, float _bx, float _by, float _br);
  • //Rectangulo y rectangulo
    bool RectRect(float _rx1, float _ry1, float _rw1, float _rh1, float _rx2, float _ry2, float _rw2, float _rh2);
  • //Punto y triangulo Teoria barycentric
    bool PointTriangle(float _tx1, float _ty1, float _tx2, float _ty2, float _tx3, float _ty3, float _px, float _py);
  • //Punto y esfera
    bool PointBall(float _px, float _py, float _bx, float _by, float _br);
  • //Punto y rectangulo
    bool PointRect(float _px, float _py, float _rx, float _ry, float _rw, float _rh);
  • //Punto y punto
    bool PointPoint(float _x1, float _y1, float _x2, float _y2);
  • //Punto y Linea
    bool PointLine(float _px, float _py, float _lx1, float _ly1, float _lx2, float _ly2);
  • //Linea y Linea
    bool LineLine(float _x1, float _y1, float _x2, float _y2, float _x3, float _y3, float _x4, float _y4);

Descargar .h y .cpp

Unity – Bloquea GameObjects en el Editor con UnityLock

UnityLock es un plugin muy útil, ya que permite poder bloquear un GameObject, con bloquear nos referimos que no podremos cambiar el valor de ninguno de sus componentes como el Transform (Es decir, no poder mover, rotar o escalar el GameObject) e inclusive deshabilitar poder seleccionarlo desde la pestaña de ‘Scene’ los GameObjects que se encuentren bloqueados.

UnityLock en acción

Simplemente se debe agregar al proyecto y en “GameObject -> UnityLock” podremos bloquear o desbloquear los GameObjects o usar su atajo de teclado “Shift + Cntrl + L” o “Shift – Cntrl + U” y en “Window -> UnityLock” podremos activar o desactivar la posibilidad de seleccionar GameObject bloqueados desde la pestaña de ‘Scene’.

Ya es un plugin viejo (desde 2013), pero aun muy útil y lo completamente gratuito.

Unity – DebugX version 2.0

Debug es una clase de Unity el cual permite imprimir Logs en la consola, pero también cuenta con función de dibujar lineas solo visibles en el Editor para su Testear y probar diferente, por ejemplo visualizar hacia donde salen las balas, hacia donde mira un enemigo, etc. Todo para facilitar el desarrollo de nuestro contenido. DebugX es una clase que permite dibujar cuadrados y puntos de manera sencilla de uso completamente gratuito. Yo le hice unas pequeñas mejoras como poder indicar por cuanto tiempo deseamos sea visible lo que se dibujo y poder dibujar un circulo 2D y aquí su codigo y de uso libre.

Unity – Reglas basicas al usar Rigibody y colisionadores

Cuando uno empieza a trabajar en Unity, es típico encontrase en problemas que GameObject no colisionan entre ellos o no funciona como debería (y en proyectos grandes, notaremos que se alenté el juego). Por eso mismo dejo aquí unas reglas básicas al usar Rigibody y Colisionadores para evitar problemas y correcta funcionalidad.

  • Un GameObject con Colisionador pero SIN Rigibody se le considera estático. Esto quiere decir que si movemos un objeto con cierta frecuencia hay que agregarle el Rigibody, ya que para que las físicas funcione fluido, se tienen que calcular unos datos para que el impacto entre objetos de mejores resultados, y cuando un objeto no tiene Rigibody, algunos de estos valores son precalculados para un futuro impacto sea mayor rápido las físicas, pero si movemos con frecuencia un objeto sin Rigidoby, estos calculos se harán cada frame en que sea movido y volviéndose en contra la ventaja de precalcular valores. Por lo que si tienes que mover un GameObject con solo Colisionador, hazlo realmente solo cuando sea necesario.
  • Un GameObject con Rigibody siempre hay que moverlo usando el mismo Rigibody y no el Trasnform, solo usar el Transform para “Resetear” o iniciar un GameObject. De ahí usar Velocity, AddForce, AddTorque o MovePosition de las funciones de Rigibody al menos que este asignado como “Kinematic” podemos usar transform.
  • Todos los GameObject hijos con Colisionador donde el GameObject padre tiene Rigibody, estos colisionadores son parte del Rigibody del padre, si un hijo tiene otro Rigibody entonces ya es independiente y este dejara ser afectado por el Rigibody del padre. (Para que los hijos afecten a los padres, requiere uso de joins).
  • Los GameObject con Rigibody procura tenerlos en una escala lo más posible a 1/1.
  • Es mejor usar varios colisionadores primitivos ante los mesh o polygon collider.
  • Si usaras Raycast procura que solo sea con colisionadores primitivos.
  • OnCollisionStay no se llama si el Rigibody ya se encuentra en ‘sleep’ (Ya no se mueve ni rota).
  • No te alejes más 6,000 del origen para que los float no pierdan precision.

Unity – Siempre visible BoxCollider2D en el Editor

Aquí les comparto un código que permite siempre ver el BoxCollider2D en el editor de Unity, simplemente basta con agregarlo a cualquier GameObject que tenga un BoxCollider2D. La ventaja de este script, es que es compatible con la escala y rotación del GameObject.

Unity – Mover la vista de la pestaña ‘scene’ por código

La pestaña de ‘scene’ maneja su propia cámara independiente a lo que vemos en la pestaña de ‘game’, por lo que aquí les comparto un código que permite mover la “cámara” de la pestaña de ‘scene’ por código por el cual podremos hacer que se mueva junto con la cámara principal u otro objeto del juego, simplemente debemos agregar este script al objeto al que deseamos que persiga la pestaña de ‘scene’.

Nota: Este script esta diseñado para ser usado en 2D, pero adaptarlo en 3D no debe ser tanto problema y además que si tienes activado el script, este no te permitirá controlar con el mouse la pestaña de ‘scene’ en modo Play.

Unity – LoadScene modo single VS Additive y ventana de loading

Unity para poder cargar un nuevo nivel o escena (SceneManager.LoadScene apartir de Unity 5.3 y Application.LoadLevel anteriormente). El cual existen dos maneras de hacerlo básicamente, lo que hare será explicar con un poco más de detalle cómo funcionan internamente y así poder sacarle un mayor provecho:

  1. Modo Single (Normal): Este modo es el básico, el cual al ser llamado carga todo el contenido de la nueva escena, después Unity analiza que Assets seguirán siendo utilizados en la nueva escena que ya estaban cargados y de ahí elimina todos los GameObject de la vieja escena y libera de memoria todos aquellos Assets que ya no serán utilizados.
  2. Modo Additive: Este modo carga todo lo de la nueva Escena y no elimina ningun GameObject de la vieja escena y por lo tanto tampoco libera nada de los Assets.

Con esto a lo que quiero llegar es para su uso en la creación de una ventana de loading. Una práctica famosa y sencilla de generar una ventana de Loading, es tener una escena que solo contiene la imagen de “Loading” y cada vez que vayamos a cambiar de escena es llamar esta escena y desde aquí llamar la verdadera escena que nosotros necesitamos, así lograr siempre mostrar una ventana bonita de loading. Sencillo y fácil de implementar, pero tiene una desventaja hacerlo de esta manera. el 99% de los tutoriales y implementación de este tipo usan el modo Single para cargar las escenas, bueno daré un ejemplo de la desventaja:

El jugador está en el “Nivel 1” y lo pasa, llamamos la escena de Loading que solo contiene la imagen de ‘Loading’, Unity LIBERA de memoria todos los Assets que ya no son necesarios (Excepto de los GameObject que aun estén por “DontDestroyOnLoad”) y después llama cargar “Nivel 2” y tiene que cargar todos los Assets que usa este Nivel, el cual es muy probable que la mayoría son Assets que ya eran usados en el “Nivel 1”. Aquí el problema es que estaremos generando un Loading más grande de lo que realmente se necesitaría.

Como solucionar el problema:

Sabiendo cómo funciona el loading, realmente la clave está en que cuando del “Nivel 1” carguemos la escena de “Loading” lo hagamos usando el modo Additive, de esta manera solo agregara y mostrara la escena de Loading en pantalla, pero Unity no liberara ningun Asset  de memoria, entonces al cargar de manera Single al “Nivel 2”, Unity solo tendrá que cargar los Assets que hacen faltan y solo liberara la memoria de los Assets que de verdad ya no serán utilizados.

Resultado: Bueno, esto dependerá de las escenas, Assets y dispositivo, pero eh logrado reducir hasta un 70% del tiempo de “Loading”.