Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Unity 2D
Gamedevelopment

Solución de Unity para golpear objetivos en movimiento

by
Difficulty:BeginnerLength:MediumLanguages:

Spanish (Español) translation by Luis Chiabrera (you can also view the original English article)

Final product image
What You'll Be Creating

Al desarrollar juegos que involucran un elemento de acción, a menudo necesitamos encontrar una forma de colisionar con un objetivo en movimiento. Tales escenarios se pueden llamar típicamente un problema de "golpear un objetivo en movimiento". Esto es particularmente prominente en juegos de defensa de torre o juegos de comando de misiles. Es posible que necesitemos crear una IA o un algoritmo que pueda descifrar el movimiento del enemigo y disparar contra él.

Veamos cómo podemos resolver este problema en particular, esta vez en Unity.

1. El juego del comando de misiles

Para este tutorial en particular, consideraremos un juego de comando de misiles. En el juego tenemos una torreta en el suelo que dispara misiles contra un asteroide entrante. No debemos permitir que el asteroide toque el suelo.

El juego está basado en el toque, donde debemos tocar para apuntar la torreta. Con asistencia humana, la mecánica del juego es bastante sencilla ya que la torre solo necesita apuntar y disparar. Pero imagine si la torreta necesita disparar automáticamente a los asteroides entrantes.

Los desafíos para la IA de auto-disparos

La torreta necesita descubrir cuántos asteroides se están acercando al suelo. Una vez que tenga un conjunto de todos los asteroides que se aproximan, entonces necesitaría hacer un análisis de amenaza para determinar a cuál apuntar. Un asteroide de movimiento lento es una amenaza menor que uno de movimiento rápido. Además, un asteroide que está más cerca del suelo también es una amenaza inminente.

Estos problemas se pueden resolver comparando la velocidad y la posición de los asteroides entrantes. Una vez que hemos determinado a cuál dirigirse, llegamos al problema más complicado. ¿Cuándo debería disparar la torreta? ¿En qué ángulo debería disparar? ¿Cuándo debería explotar el misil después de disparar? La tercera pregunta se vuelve relevante porque la explosión del misil también puede destruir el asteroide y también tiene un mayor radio de efecto.

Para simplificar el problema, la torreta puede decidir disparar de inmediato. Entonces solo necesitamos descubrir el ángulo de disparo y la distancia de detonación. Además, puede haber el caso donde el asteroide ya ha pasado el área donde podría ser golpeado, ¡lo que significa que no hay solución!

Debe descargar la fuente de Unity proporcionada junto con este tutorial para ver la solución en acción. Veremos cómo derivamos esa solución.

2. La solución

Vamos a hacer un pequeño repaso de nuestras matemáticas de secundaria para encontrar la solución. Es muy sencillo e implica resolver una ecuación cuadrática. Una ecuación cuadrática se ve como ax2 + bx + c = 0, donde x es la variable que se encuentra y se produce con la potencia más alta de 2.

Analizando el problema

Intentemos representar nuestro problema en forma diagramática.

diagram of the incoming asteroid and the predicted path of missile

La línea verde muestra el camino predicho que debe seguir el asteroide. Como se trata de un movimiento uniforme, el asteroide se mueve con velocidad constante. Nuestra torreta tendrá que girar y disparar el misil a lo largo del camino azul para colisionar con el asteroide en el futuro.

Para un movimiento uniforme, la distancia recorrida por un objeto es el producto del tiempo y la velocidad del objeto, es decir, D = T x V, donde D representa la distancia,T es el tiempo necesario para viajar D y V es la velocidad de viaje . Suponiendo que nuestro asteroide y los misiles definitivamente colisionen, podemos encontrar la distancia de la línea azul seguida por el misil en términos de tiempo t. Al mismo tiempo t, nuestro asteroide también alcanzará la misma posición.

Esencialmente, en el mismo tiempo t, el asteroide alcanzará la posición de colisión desde su posición actual, y el misil también alcanzará la misma posición de colisión en el mismo tiempo t. Entonces en el tiempo t, tanto el asteroide como el misil estarían a la misma distancia de la torreta ya que colisionarían entre sí.

Ingrese las matemáticas

Podemos igualar la distancia desde la torreta al asteroide y al misil en este tiempo futuro t para derivar nuestra ecuación cuadrática con la variable t. Considere dos puntos en un plano bidimensional con coordenadas (x1, y1) y (x2, y2). La distancia D entre ellos puede calcularse usando la ecuación siguiente.

Si denotamos la posición de la torreta como (Tx, Ty), la velocidad del misil como v y la posición de colisión desconocida como (X, Y), entonces la ecuación anterior puede reescribirse como:

donde t es el tiempo que tarda el misil en recorrer la distancia D. Igualando ambos, obtenemos nuestra primera ecuación para las incógnitas X e Y con otra t desconocida.

Sabemos que el asteroide también alcanza el mismo punto de colisión (X, Y) en el mismo tiempo t, y tenemos las siguientes ecuaciones usando las componentes horizontal y vertical del vector de velocidad del asteroide. Si la velocidad del asteroide se puede denotar por (Vx, Vy) y la posición actual como (Ax, Ay), entonces la X e Y desconocidas se pueden encontrar como se muestra a continuación.

Sustituir estos en la ecuación anterior nos da una ecuación cuadrática con una sola t desconocida.

Expandir y combinar términos similares:

Representar el poder de dos como ˆ2 y el símbolo de multiplicación como * puede haber hecho que lo anterior parezca jeroglíficos, pero esencialmente se reduce a la ecuación cuadrática final ax2 + bx + c = 0, donde x es la variable t, a es Vx2 + Vy2 - s2, b es 2 * (Vx * (Ax - Tx) + Vy * (Ay - Ty)), y c es (Ay - Ty) 2 + (Ax - Tx) 2. Usamos las ecuaciones a continuación en la derivación.

Resolviendo la ecuación cuadrática

Para resolver una ecuación cuadrática, necesitamos calcular el discriminante D usando la fórmula:

Si el discriminante es menor que 0, entonces no hay solución, si es 0, entonces hay una única solución, y si es un número positivo, entonces hay dos soluciones. Las soluciones se calculan utilizando las fórmulas que se dan a continuación.

Usando estas fórmulas, podemos encontrar valores para el tiempo futuro t cuando ocurra la colisión. Un valor negativo para t significa que hemos perdido la oportunidad de disparar. Las incógnitas X e Y se pueden encontrar sustituyendo el valor de t en sus respectivas ecuaciones.

Una vez que conocemos el punto de colisión, podemos rotar nuestra torreta para disparar el misil, que definitivamente golpearía al asteroide en movimiento después de t segundos.

3. Implementando en Unity

Para el proyecto de Unity de muestra, he utilizado la función de creación de sprites de la última versión de Unity para crear los activos de marcador de posición necesarios. Se puede acceder a esto con Crear> Sprites> como se muestra a continuación.

Implementing in Unity

Tenemos un script de juego llamado MissileCmdAI que está conectado a la cámara de escena. Tiene la referencia al sprite de la torreta, prefabricado de misiles y prefabricado de asteroides. Estoy usando SimplePool por quill18 para mantener los grupos de objetos para misiles y asteroides. Se puede encontrar en GitHub. Hay scripts de componentes para misiles y asteroides que están unidos a sus prefabricados y manejan su movimiento una vez que se liberan.

Los asteroides

Los asteroides se generan aleatoriamente a una altura fija pero en posición horizontal aleatoria y se arrojan en una posición horizontal aleatoria en el suelo con una velocidad aleatoria. La frecuencia de la aparición de los asteroides se controla con un AnimationCurve. El método SpawnAsteroid en el script MissileCmdAI se ve a continuación:

El método de Launch en la clase Asteroid se muestra a continuación.

Como se ve en el método Update, una vez que el asteroide ha recorrido la distancia predeterminada a tierra, deployDistance, volvería a su grupo de objetos. Esencialmente, esto significa que ha chocado con el suelo. Haría lo mismo en caso de colisión con el misil.

La orientación

Para que la orientación automática funcione, debemos llamar al método correspondiente con frecuencia para encontrar y apuntar al asteroide entrante. Esto se hace en el script MissileCmdAI en su método Start.

El método FindTarget recorre todos los asteroides presentes en la escena para encontrar los asteroides más cercanos y más rápidos. Una vez encontrado, llama al método AcquireTargetLock para aplicar nuestros cálculos.

AcquireTargetLock es donde sucede la magia cuando aplicamos nuestras habilidades de resolución de ecuación cuadrática para encontrar el momento de la colisión t.

Una vez que encontramos el punto de impacto, podemos calcular fácilmente la distancia que debe recorrer el misil para golpear el asteroide, que se transmite a través de la variable deployDist al método LockOn del misil. El misil usa este valor para regresar a su conjunto de objetos una vez que ha recorrido esta distancia de la misma manera que el asteroide. Antes de que esto suceda, definitivamente habría golpeado al asteroide, y los eventos de colisión se habrían activado.

Conclusión

Una vez que lo implementamos, el resultado parece casi mágico. Al reducir el valor de aiPollTime, podemos convertirlo en una torreta de IA invencible que derribaría cualquier asteroide a menos que la velocidad del asteroide se acerque o supere a la velocidad de misiles. La derivación que seguimos puede usarse para resolver una variedad de problemas similares que podrían representarse en forma de una ecuación cuadrática.

Me gustaría que experimentes más añadiendo el efecto de la gravedad al movimiento del asteroide y el misil. Esto cambiaría el movimiento al movimiento del proyectil, y las ecuaciones correspondientes cambiarían. Buena suerte.

Tenga en cuenta también que Unity tiene una economía activa. Hay muchos otros productos que lo ayudan a construir su proyecto. La naturaleza de la plataforma también la convierte en una excelente opción desde la cual puede mejorar sus habilidades. En cualquier caso, puede ver lo que tenemos disponible en Envato Marketplace.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.