Sistema de patrulla para NPC Enemigos (Provisorio)

Introducción

En este artícu­lo voy a mostrar una solu­ción para hac­er que los per­son­ajes no jugables (NPC) en Uni­ty patrullen por una ruta com­pues­ta por una serie de puntos.

Primero vamos a ver cómo agre­gar la solu­ción al pro­totipo de inteligen­cia arti­fi­cial para ene­mi­gos. Luego voy a explicar cómo fun­ciona este sis­tema de patrul­la en sí para poder adap­tar­lo a cualquier proyecto.

El títu­lo PROVISORIO se debe a que estoy pen­san­do en con­stru­ir una mejor ver­sión para la inteligen­cia arti­fi­cial de los NPC Ene­mi­gos. Cuan­do el nue­vo pro­totipo esté lis­to, esta solu­ción cam­biará para adaptarse.

MIRA ESTE DESCABELLADO EXPERIMENTO

Video 1: Fun­cionamien­to de la solución.

Instrucciones y Descargas

Paso 1: Descargar el prototipo de IA para NPC

En primer lugar descar­gar el pro­totipo de inteligen­cia arti­fi­cial para ene­mi­gos, en el video se expli­ca cómo funciona. 

Prototipo Inteligencia Artificial NPC Enemigo

Paso 2: Descargar el nuevo Script Enemigo

Luego descarg­amos el Nue­vo Script Ene­mi­go que incluye la fun­ción de patrullar.

Script NPC Enemigo que patrulla 

Script — Inteligen­cia arti­fi­cial NPC que patrulla

Paso 3: Agregar y configurar el nuevo Script en el Prototipo

Selec­cionamos uno de los ene­mi­gos en la jer­ar­quía y en el inspec­tor vamos a desac­ti­var el Script Ene­mi­go ante­ri­or y le asig­namos el nue­vo, como vemos en la figu­ra 1.

Fig. 1.a : Nue­vo Script Ene­mi­go apli­ca­do a uno de los pre­fab­ri­ca­dos del ene­mi­go den­tro del prototipo.

Los cam­pos se pueden a rel­lenar se pueden tomar del Script Ene­mi­go ante­ri­or, asig­nan­do man­ual­mente cada elemento.

Los nuevos cam­pos están bajo el títu­lo "Esta­do de Patrul­la" en negri­ta, en la figu­ra 1.

El Array Pun­tos de Ruta no es nece­sario asig­narlo, lo colo­qué ahí para saber que se habían encon­tra­do las ref­er­en­cias de los pun­tos de ruta.

Para definir una ruta para el ene­mi­go vamos a crear un emp­ty GameOb­ject que lla­maré "RutaDePatrulla1". En el inte­ri­or colo­caré más emp­ty GameOb­jects en los pun­tos pertenecientes a la ruta de patrul­la. En la figu­ra 1.b llamé a estos pun­tos "1" y "2", el nom­bre en sí no es impor­tante, pero el orden en el que están si lo es.

IMPORTANTE: ase­gu­rarse de que los pun­tos están al niv­el del suelo.

Una vez que la ruta está defini­da la asig­namos al cam­po "Ruta de Patrul­la" en el inspec­tor del nue­vo enemigo.

Fig. 1.b : Se usan Emp­ty GameOb­ject para definir la ruta del enemigo.
Fig. 1.c : Asi­gnación de la ruta de patrul­la al enemigo.

Conc­re­ta­mente lo que se hizo es agre­gar un nue­vo esta­do que se lla­ma "Patrul­lan­do" y que cuan­do está acti­va­do es porque el NPC comien­za a cam­i­nar del pun­to en el que está al sigu­iente punto. 

Al lle­gar se pone en esta­do de guardia por los segun­dos que indique­mos en la vari­able "tiem­poDe­GuardiaEn­Pun­to", luego pasará al esta­do de patrul­la nue­va­mente e irá al sigu­iente punto.

¿Cómo funciona la solución?

Aho­ra vamos a ver cómo fun­ciona el sis­tema de pun­tos de ruta. Si enten­demos esto podremos apli­car­lo a cualquier proyecto.

Campos

En primer lugar nece­si­ta­mos un GameOb­ject seri­al­iza­do que se lla­ma "rutaDe­Pa­trul­la". Aquí asignare­mos un GameOb­ject cuyos hijos serán todos los pun­tos que el ene­mi­go recorrerá.

Luego defin­i­mos un vec­tor de obje­tos Trans­form que lla­mamos "pun­tos­DeRuta", este no es nece­sario que aparez­ca en el inspec­tor, pero aún así le añadí Seri­al­ize­Field para saber si las ref­er­en­cias se habían encon­tra­do correctamente.

El entero "pun­toDeRutaIn­dex" es el que indi­ca el pun­to de la ruta de patrul­la­je al que el NPC debe ir.

Por últi­mo el float "tiem­poDe­GuardiaE­nUn­Pun­to" es el tiem­po que el NPC esper­ará en cada pun­to antes de pasar al siguiente.

En la figu­ra 2 vemos los cam­pos definidos.

Fig. 2: Cam­pos nece­sar­ios para la solu­ción del NPC Ene­mi­go que patrulla.

Métodos

El méto­do Obten­er­Pun­tos­DeRuta se uti­liza para encon­trar las ref­er­en­cias de todas las com­po­nentes Trans­form de los hijos del obje­to "rutaDe­Pa­trul­la". En la figu­ra 3 vemos este méto­do definido.

Artículo: ¿Qué es un método en programación?

Fig. 3: Méto­do Obten­er­Pun­tos­DeRuta perteneciente a la solución. 

El méto­do ante­ri­or hay que eje­cu­tar­lo al comen­zar la par­ti­da. En la figu­ra 4 mue­stro la eje­cu­ción del mis­mo en el méto­do Start del nue­vo Script Enemigo.

Fig. 4: Eje­cu­ción del méto­do Obten­er­Pun­tos­DeRuta perteneciente a la solución.

Cuan­do el ene­mi­go debe pasar de un pun­to al otro debe­mos incre­men­tar el índice (entero "pun­toDeRutaIn­dex") para pasar al sigu­iente pun­to. En el caso de que este­mos en el últi­mo pun­to del vec­tor debe­mos pasar al pun­to en la posi­ción 0, así que para eso se uti­liza el segun­do if definido en la figu­ra 5.

Fig. 5: Ejem­p­lo de cómo recor­rer el vec­tor de pun­tos de ruta.

Noten como en la figu­ra 4 tam­bién se le dice al agente que vaya hacia ese pun­to (con la eje­cu­ción de "Set­Des­ti­na­tion").

Elementos necesarios en la Jerarquía

Para la ruta diji­mos que nece­si­ta­mos un GameOb­ject cualquiera y que los pun­tos que definen la ruta de patrul­la­je serán los hijos de este GameObject.

Se pueden definir todos los pun­tos que se quier­an y el algo­rit­mo definido en el méto­do Obten­er­Pun­tos­DeRuta los encon­trará y se ajus­tará automáticamente.

Fig. 6: Ejem­p­lo de una ruta para el NPC Ene­mi­go.

Fig. 7: Asi­gnación de la ruta crea­da en la figu­ra 6 al NPC enemigo.

Extras

En el video 1 se veía en el Edi­tor unas líneas blan­cas que unían los pun­tos de la ruta de patrul­la­je como para mostrar el camino que el NPC sigue.

Esto se con­sigue con la eje­cu­ción den­tro de Update del méto­do "Dibu­jar­Ru­ta" que se ve en la figu­ra 8.

Fig. 8: Méto­do aux­il­iar para dibu­jar en el edi­tor el camino que seguirá el NPC enemigo.

guest
0 Comments
Inline Feedbacks
View all comments
YouTube
Scroll al inicio
Secured By miniOrange