Campo de visión tipo cono para el IA del enemigo

En algunos juegos como Commandos es necesario calcular el área de visión del enemigo. Ésta tiene un ángulo limitado de X grados hacia su punto de visión y forma de cono, lo que nos deja un espacio dentro de su área de visión donde no nos puede ver.

La teoría parece más fácil que la práctica y en un primer momento puedes pensar en crear un Collider pero no creo que sea la solución correcta. En Unity 2D no es complicado programarlo. Se puede resumir en que necesitamos la línea de vista frontal del enemigo y su distancia. Después, para calcular el ángulo entre el player y el enemy, necesitamos conocer una segunda línea entre estos dos. Con estas dos líneas podemos calcular el ángulo entre ellas y si entra dentro de nuestro ángulo mínimo calculamos la distancia hasta el enemigo. Finalmente, si todo está correcto, tenemos lo que buscábamos.

Sigue leyendo

Cambiar punto de pivote en un sprite múltiple

El cambio de pivote en un sprite múltiple es muy parecido al cambio de pivote en un sprite simple. Solo hay que abrir el “Sprite Editor” con nuestro sprite múltiple, seleccionar el sprite en el que queramos cambiar el pivote y, bien podremos hacerlo arrastrando el pivote con el puntero del ratón o mediante el cambio de los valores X e Y del panel del sprite.

Cambiar punto de pivote de un sprite

pivos_sprite_unityUna de las cosas que me ha vuelto loco hasta ahora es el pivote de un sprite. Vengo de Adobe Flash y sé que los movieclips (o prefabs que son los equivalentes en Unity) tienen pivote y todo gira en torno a él. Hasta ahora he tenido que crear un gameobject vacío y colocar el elemento que necesitaba acorde a su nueva posición local… un rollo.
Bien, este punto tan importante se puede cambiar desde el sprite mismo. Seleccionando el punto de pivote entre los expuestos o creando nuestro propio punto. Hay que saber que los valores X e Y oscilan entre 0 y 1. Siendo 0 el punto inferior izquierdo y 1 el superior derecho.

Prototipo Shooter 2D

Prototipo con Unity 2D de un juego mezcla Shooter 2D y plataformas.

Lo más destacado en este prototipo es:

  • Uso de RaycastHit2D para los disparos.
  • Uso de precisión aleatoria en los disparos.
  • Uso de Linerenderer entre dos puntos.
  • Función de recarga del arma.
  • Uso de variables tipo LayerMask.
  • Desactivación y cambio de cursor
  • Movimiento de plataformas entre dos puntos tipo transform

La idea es ver cómo actúa tanto raycast como linecast. En este ejemplo lo he utilizado para simular un disparo de arma y para comprobar que los enemigos tienen visión directa con el player principal, pero la gente lo suele utiliza también para saber si el personaje está en el suelo, está chocando con algún elemento, etc.

La precisión aleatoria es un elemento que da dificultad y un poco de realismo al juego. Muy fácil de implementar con un Random.Range(-precision,precision) que devuelve un valor comprendido entre la precisión del player.

El uso de linerender se hace necesario para verificar la dirección del disparo y con qué elemento colisiona.

La función de recarga del arma es un añadido que da también realismo al juego y un toque más de dificultad al tener que economizar las balas para no llegar cara el enemigo sin ellas.

El uso de variables tipo Layermask permite seleccionar las capas en las que quieres que actúe raycast. Muy útil para selecionar las capas donde se encuentran los enemigos, las paredes, el suelo, el player,… y dejar fuera las que no se necesiten.

Sigue leyendo

Mathf.Clamp ajustando un valor dentro de dos parámetros

Mathf.Clamp es una pequeña función que nos ayuda a ajustar un valor entre dos valores dados. Por ejemplo para ajustar la vida de un personaje entre 0 y 100.

Point and Click mediante walkpoints

Sistema de navegación Point and Click para aventuras gráficas mediante Walkpoints. Con Unity 2D y Javascript. La idea es crear un sistema de navegación fácilmente modificable, así el personaje se desplazaría al walkpoint más cercano de nuestro click en la pantalla.

La lógica es buscar todos los prefabs etiquetados con el label walkpoint y seleccionar el punto más cercano. De este modo nuestro spawn sabrá a qué punto debe dirigirse.

Sigue leyendo

Eliminar prefab permitiendo terminar el sonido

En un artículo anterior recomendé no poner el sonido dentro del prefab o GameObject (una bala por ejemplo), ya que podía iniciarse Destroy antes de finalizar el sonido y quedar cortado. Me equivoqué. La lógica dice (y que poco a poco voy aprendiendo soluciones mejores) que si lo ideal es hacer un prefab ¿porqué vamos a excluir su sonido?. La solución para que no quede cortado es asegurarse que Destroy se aplica una vez el sonido ha finalizado. Por eso se tienen que aplicar estos pasos:

  1. Hacer desaparecer el prefab visualmente.
  2. Eliminar su Collider para evitar otras colisiones
  3. Calcular el tiempo de reproducción del sonido y aplicar Destroy

Prototipo Recolector de Bitcoins

El prototipo es muy simple. Consiste en recolectar Bitcoins pulsando sobre ellas, sin que lleguen a caer en el vacío. La dificultad se incrementa a medida que vamos recolectando monedas.

Lo único que he aprendido en este ejercicio de Unity 2D es poder mantener variables entre carga de escenas. En este caso el score que mantiene tu máxima puntuación. Simplemente hay que añadir una variable de tipo static, así de simple.

Un par de cosas que he he podido solucionar pero pienso que hay alguna manera mejor para hacerlas es el intanciar un prefab de partículas al eliminar la moneda (para suavizar el Destroy) y cambiar la velocidad de repetición del InvokeRepeating. En el ejemplo siguiente cancelo con CancelInvoke y vuelvo a crearlo con InvokeRepeating ya con el tiempo modificado.

Sigue leyendo

Prototipo Flappy Bird Unity

Inicio la categoría de prototipos con el desarrollo rápido de un prototipo de Flappy Bird con Unity 2D.

Sigue leyendo