Com crear Intel·ligència Artificial per a un Slime Enemic

Nota: Al final d'aquest article podeu trobar un fitxer de projecte complet per a aquest tutorial.
Introducció
En aquest tutorial, crearem la intel·ligència artificial (IA) per a un slime enemic convincente per a un joc de plataforma. Cobriré algunes característiques i comportaments més avançats a hyperPad, així que aquest tutorial assumeix alguns coneixements bàsics sobre l'editor hyperPad. Si creieu que necessiteu familiaritzar-vos més amb la creació d'un joc des de zero, podeu consultar el Guia Completa - Creació d'un Joc de Plataforma primer.
Per fer que el slime sembli "intel·ligent", hauria de fer més que simplement moure's amunt i avall, i hauria d'estar una mica conscient del seu entorn.
Sonen emocionants! Però abans de començar, hem de detallar com hauria de comportar-se el slime enemic:
- En comptes de caminar, el slime saltarà a l'esquerra o a la dreta per moure's.
- El slime saltarà en direcció al jugador.
- Si el jugador està massa lluny, el slime no es mourà (està idle).
- El slime restarà salut al jugador en contacte.
- El slime és derrotat si el jugador salta a sobre d'ell.
Ara que sabem què volem fer, comencem!
Part 1: Configuració del Projecte
En aquest tutorial, començarem un nou projecte des de zero per mantenir les coses simples. Crea un nou projecte i configura-lo com a "Vista Lateral", pots deixar les altres configuracions amb els seus valors predeterminats.
Amb el teu nou projecte creat, ves a la Biblioteca d'Actius i agafa el "Paquet Inicial de Plataforma" de hyperPad a la botiga d'actius. (És gratuït!)
Ara que tenim alguns actius amb els quals treballar, col·loca alguns blocs de terra i crea el teu món. Si encara no hi ets, ves a la Biblioteca d'Actius i toca "Descàrregues", després "Paquet Inicial de Plataforma".
En la imatge a continuació, s'han col·locat alguns blocs de terra (carpeta "Món d'Herba") i s'ha establert un fons (carpeta "Fons").
Ara que tenim una bonica escena amb la qual treballar, afegim els objectes Jugador i Slime. Ves a la Biblioteca d'Actius i obre la teva carpeta "Descàrregues", després la carpeta "Paquet Inicial de Plataforma" si encara no està oberta.
Utilitzarem el "Spaceman Verd" com a jugador, així que toca l'actiu spaceman verd per veure tots els seus cicles d'animació. De manera predeterminada, volem que el jugador simplement estigui dret, així que toca l'animació "Estar Dret" i col·loca-la a l'escena.
En la mateixa carpeta de la Biblioteca d'Actius, també hi ha un personatge animat "Slime Rosa". Perfecte per utilitzar-lo com a enemic slime! Toca l'actiu slime i tria l'animació "Moure" i col·loca un slime a la teva escena amb el teu personatge jugador.
Fins ara, tot va bé! Ara tenim el nostre objecte jugador i objecte slime, llestos per utilitzar. Però, si jugàssim el nostre projecte ara, no podríem interactuar amb el joc en absolut. Per tant, haurem de crear una estructura per donar vida al nostre joc.
Part 2: Controls del Jugador
Abans de poder treballar per donar vida al nostre enemic slime, primer hauríem de tenir alguns controls del jugador per al spaceman verd.
Toca el spaceman verd i configura el seu mode de física de "Mur" a "Físic", la qual cosa permetrà al jugador moure's lliurement. A continuació, toca el botó "Comportaments" per obrir l'editor de Comportaments per al nostre personatge jugador per poder afegir alguns controls.
En l'editor de comportament per al nostre personatge jugador, ja hauries de veure un solitari Juga Animació comportament. Podem deixar aquest comportament sol, però li podem donar alguns amics.
Baix de la secció Interacció, col·loca en qualsevol lloc un Controlador de Joystick comportament així com un Saltar amb Botó comportament. Amb aquests comportaments, el nostre jugador està ara llest per controlar. Però, li falta animació.
Toca el comportament Controlador de Joystick i configura l'"Animació de Joystick Esquerra" al ciclo de "Caminar" en l'actiu Spaceman Verd. Fes el mateix amb "Animació de Joystick Dreta".
Ara el nostre personatge jugador camina, però encara no anima quan salta.
Toca el comportament Saltar amb Botó i canvia tant la "Animació de Caiguda" com la "Animació de Salt" al ciclo de "Salt".
Si juguem el nostre joc ara, podem moure'ns i saltar! A continuació, podem treballar en el nostre enemic slime.
Part 3: Moviment del Slime
Tal com hem detallat en la secció d'introducció d'aquest tutorial, volem que el nostre slime salti cap al jugador. Per fer-ho, el nostre slime necessita saber on es troba el jugador en el món. Per això, hauríem d'afegir un Etiqueta al nostre personatge jugador, així les nostres accions poden recuperar el nostre personatge jugador a qualsevol escena.
Toca el personatge jugador i selecciona la pestanya Etiquetes a la part inferior de la vista de propietats. Escriu "Jugador" al camp de text a la part superior del menú de etiquetes i prem el botó d'afegir (+) al seu costat. Ara el nostre personatge jugador està etiquetat amb l'etiqueta "Jugador".
De manera similar al que vam fer amb el personatge jugador, toca el slime i canvia el seu mode de física de Mur a Física. A continuació, toca el botó Comportaments per obrir l'editor de comportaments del slime.
En l'editor de comportaments, ves a la secció de comportaments Personalitzat i col·loca un comportament Timer a l'editor.
Toca el comportament Timer i estableix el seu interval a 2 segons.
Aquest serà l'inici de la nostra lògica per a la intel·ligència artificial del slime.
La idea aquí és que cada 2 segons, el slime "pensarà" què ha de fer a continuació, com ara: Ha de saltar el slime? Si decideix saltar, en quina direcció hauria de saltar?
A continuació, ves a la secció de comportaments Transformar i col·loca un comportament Obtenir Posició. Toca'l i estableix el seu objectiu a l'etiqueta "Jugador" que vam crear anteriorment tocant la pestanya Etiquetes a la part inferior de la seva vista de propietats i seleccionant "Jugador". Ara connecta el Timer al comportament Obtener Posició.
Ara sabem on es troba el nostre jugador al món! Per determinar si el jugador està a l'esquerra o a la dreta del slime, també necessitem saber on és el slime al món, també.
Arrossega un altre comportament Obtenir Posició a l'editor. De manera predeterminada, el comportament ja està apuntant al nostre slime, així que no hem de fer res més que connectar-lo a la nostra branca de lògica. Connecta el Get Position per al jugador al Get Position per al slime.
Opcional: Per fer les coses més fàcils de comprendre, he renombrat els meus comportaments Obtenir Posició per indicar clarament què estan rastrejant: "Obtenir Posició Jugador" i "Obtenir Posició Slime". Això és opcional, però si tu també vols canviar els noms dels comportaments, pots fer-ho tocant el comportament i tocant el seu nom a la part superior de la vista de propietats.
Fins ara, el que tenim és que cada 2 segons, el slime recupera la posició del personatge jugador i del mateix. Ara que tenim aquesta informació, podem determinar si el slime haurà de saltar cap a l'esquerra o a la dreta.
Baix de la pestanya Lògica, col·loca i connecta un comportament Si. A les seves propietats, estableix el primer valor a la posició x del primer comportament Obtenir Posició (etiqueta "Jugador") arrossegant el valor de sortida del comportament al camp de propietats del Si. Per al segon valor, estableix-ho a la posició x del segon comportament Obtenir Posició (slime). Finalment, estableix la condició del comportament Si a "És Menor Que" (<).
Nota: La posició x d'un objecte és el valor que representa on es troba l'objecte en el món a l'eix x. (Esquerra i dreta).
Per tant, què significa tot això? El comportament Si comprovarà si la posició x del jugador és menor que la posició x del slime. Si això és cert, executarà el comportament connectat següent. Això significa essencialment que si el jugador es troba més a l'esquerra que el slime, l'execució del comportament continuarà.
D'acord, ara tenim l'estructura configurada perquè el slime salti a l'esquerra, així que fem que el slime faci exactament això!
Baix de la secció de comportaments Física, col·loca i connecta un comportament Aplicar Força al comportament Si. A les seves propietats, estableix la Força a: x = -0.5, y = 1. A continuació, estableix el multiplicador a un nombre considerable, 200 hauria de ser suficient.
El que tenim ara és que si el slime detecta que el jugador es troba més a l'esquerra que ell, saltarà cap amunt (y = 1 × 200) i una mica cap a l'esquerra (x = -0.5 × 200).
Prova-ho! Juga el joc i comprova que tot estigui funcionant. El que hauries de veure és el slime saltant cap a l'esquerra cada 2 segons, sempre que el jugador estigui a l'esquerra d'ell. Si mogues el jugador cap a la dreta del slime, hauria d'aturar-se de saltar fins que tornis a moure't cap a l'esquerra.
Nota: Si el teu slime no es mou, revisa els passos anteriors per assegurar-te que no has passat per alt res. Assegura't que els comportaments estiguin connectats correctament, i que el mode de física del teu slime estigui configurat a Física (movible) i no a Mur (no movible). També, aviat solucionarem el problema on el slime de vegades es gira de costat o cap per avall.
Gran progressa fins ara! Si el teu slime està saltant com s'esperava, llavors estem llestos per continuar. Acabem els seus comportaments de moviment permetent també que el slime salti cap a la dreta.
Torna a l'editor de comportament del slime, duplica el comportament Si. Arrossega i enganxa el nou comportament Si a la dreta del comportament Si original. Això el convertirà en un comportament "Si Altres".
Duplica també el comportament Aplicar Força i conecta-lo al nou comportament Si Altres.
A les propietats del comportament Si Altres, canvia la condició de "És Menor Que" (<) a "És Major Que" (>). Això tindrà l'efecte oposat del primer Si. Si el primer comportament Si no és cert, comprovarà si el Si Altres és cert. Això vol dir que si el jugador no es troba a l'esquerra del slime, comprobarà si el jugador està a la dreta del slime i continuarà executant els comportaments connectats al Si Altres.
Ara hauries de tenir una branca de comportament que es vegi així:
A la segona Aplicar Força (sota el Si Altres), canvia les seves propietats així que la seva força sigui x = 0.5, en comptes de x = -0.5. Ara, en comptes de saltar cap a l'esquerra, el slime saltarà cap a la dreta.
Juga el projecte i torna a provar-ho! Ara hauries de veure el slime saltant en la direcció en què es troba el jugador. Excel·lent!
Una cosa que podries haver notat mentre jugaves és que si xocaves amb el slime, de vegades pot caure de costat o girar-se cap per avall. Volem que el slime es mantingui dret, així que solucionem això ràpidament.
Torna a l'editor de comportament del slime, ves a la secció de comportaments Transformar i col·loca un comportament Bloquejar Rotació a l'editor. No cal que el connectis a un altre comportament, volem que bloquegi la seva rotació tan aviat com el slime es creï, així que pots deixar-ho com està. Un cop ho hagis fet, prova el joc de nou. Aquesta vegada hauries de tenir molta dificultat intentant fer caure el slime de costat.
Potser també has notat que l'animació del slime es reprodueix massa ràpidament. Si això està passant, toca el comportament Juga Animació a l'editor de comportament del slime i canvia els Fotogrames per Segon a un nombre molt més petit. 6 fotogrames per segon es veu força bé.
Genial! Ara el nostre slime no només es mou bé, sinó que també es veu genial. Per la major part, la lògica de moviment del nostre slime està completa.
Tanmateix, també volem que el slime només salti si el jugador està a prop. D'aquesta manera, si construïm un món més gran, els slimes llunyans no intentaran immediatament saltar cap a l'atac del jugador. A la pròxima part, mirarem d'afegir una altra condició per bloquejar la lògica de salt si el jugador està massa lluny.
Part 4: Slime Idling
En aquesta part, implementarem alguns comportaments del slime que el faran estar idle (és a dir, no moure's) quan el jugador està massa lluny.
Per aconseguir-ho, necessitem trobar una manera de mesurar la distància entre el nostre slime i el jugador. Conveniència, hi ha comportaments disponibles per fer exactament això! Anem a treballar-hi.
Obre l'editor de comportament del slime i baixa un comportament Calculeu Distància de la secció Lògica. Les propietats del comportament, el primer objecte ja està configurat a la nostra slime. Per al segon objecte, ves al menú Pestanyes i selecciona l'etiqueta "Jugador".
Aquest comportament, quan s'executa, calcularà la distància en metres del nostre slime al jugador. Utilitzant aquesta informació, podem veure si el jugador està massa lluny, comprovant si supera una certa distància.
Col·loca un altre comportament Si de la secció Lògica i connecta'l sota el comportament Calculeu Distància. A les propietats del comportament Si, estableix el primer valor al valor de sortida de Calculeu Distància. Estableix la condició a "És Menor Que" i el segon valor a 15.
Ara el que tenim és una manera de comprovar si el jugador està massa lluny veient si la distància entre el slime i el jugador és inferior a 15 (metres). Si aquesta condició és falsa, llavors el jugador està massa lluny i el comportament Si no s'executarà.
Ara que tenim la nostra nova condició llista per utilitzar, desconnecta l'Obtenir Posició (slime) i el comportament Si antic de la part anterior del tutorial i fes espai per a la nostra nova condició. Pots desconnectar comportaments tocant i mantenint les connexions entre comportaments.
Amb la nova condició de distància en el seu lloc, connecta l'Obtenir Posició (slime) al comportament Calculeu Distància i connecta el nou comportament Si al comportament Si antic. Ara hauries de tenir alguna cosa així:
Ja comença a semblar força complicat ara, però la idea és relativament senzilla. Ara el que tenim és que abans de revisar cap a quina direcció hauria de saltar el slime, primer comprovem si la distància entre el slime i el jugador és menor a 15 (metres).
Si el jugador està més a prop de 15 metres, continuarà i comprovarà en quina direcció hauríem de saltar, com de costum. Si el jugador està a més de 15 metres de distància, no continuem i la lògica acaba aquí fins a la propera vegada que el slime "pensi" de nou (d'aquí a 2 segons).
Dona un cop d'ull al joc! Si t'acostes massa al slime, hauria de començar a saltar cap a tu, però si et mous massa lluny hauria d'aturar-se i esperar fins que et tornis a aparèixer.
El nostre slime comença a semblar força amenaçador ara, però encara falta una manera de danyar el jugador. A la pròxima part d'aquest tutorial, donarem al jugador una barra de salut i implementarem una lògica per fer dany al jugador.
Part 5: Atacant al Jugador
Com s'ha detallat a la secció d'introducció, implementarem atacs de slime fent que el slime danyi al jugador quan aquest toqui el jugador. Per començar a implementar una manera perquè el slime atacés el jugador, primer necessitem donar una mica de salut al jugador.
En l'editor principal, selecciona la capa de UI escena i crea un nou objecte amb el botó Objectes Especials. Toca "Barra de Salut" per crear una barra de salut per al nostre jugador.
Com que està situada a la capa UI escena, si decidim expandir el nostre món i fer que la pantalla segueixi al jugador, es quedarà al mateix lloc a la pantalla.
Pots col·locar-la on vulguis a la pantalla. Jo l'he col·locada al centre de la pantalla a prop de la part inferior.
Quan hagi trobat una bona ubicació per a la teva barra de salut, podem començar a treballar a afegir una manera de treure salut de la barra de salut. Torna a la capa Principal on es troba el teu slime i torna a obrir el seu editor de comportament.
En un bon lloc buit als comportaments del slime, baixa un comportament Xoc que trobaràs a sota de la secció Objecte. A les seves propietats, estableix el segon objecte a l'etiqueta "Jugador".
Sota la secció de comportaments Personalitzats, baixa un comportament Transmitre Missatge i connecta'l sota el comportament Xoc. A les propietats del comportament transmetre missatge, estableix la Clau d'Esdeveniment a "jugador colpejat", i estableix el valor a -10.
Recorda: Les claus d'esdeveniments són sensibles a les majúscules! Per a la difusió, aquest tutorial utilitzarà minúscules per a les claus d'esdeveniments. Podeu optar per utilitzar majúscules si ho preferiu, però assegureu-vos de recordar quines lletres són majúscules per més tard.
Ara tenim una manera de detectar quan el jugador ha de treure salut. Quan el jugador col·lideixi amb el slime, es transmetrà un missatge de l'esdeveniment "jugador colpejat" amb un valor de -10. Farem servir el -10 per dir a la barra de salut que "afegisca" -10 salut, i com que el valor és negatiu ho eliminarà 10 punts de salut.
Encara necessitem afegir aquesta lògica a la barra de salut, així que anem a fer-ho ara. Surti de l'editor de comportament del slime i, a l'editor principal, toca la capa UI escena i després toca la barra de salut. Obre l'editor de comportament de la barra de salut.
En l'editor de comportament de la barra de salut, baixa un comportament Rebre Missatge de la secció Personalitzada. A les seves propietats, estableix la Clau d'Esdeveniment a "jugador colpejat". (Recorda que és sensible a les majúscules!)
Aquest comportament serà el nostre receptor per al missatge "jugador colpejat" enviat cada vegada que el jugador colpeja el slime. Quan aquest comportament detecta un missatge de difusió per "jugador colpejat" en qualsevol lloc del joc, s'executarà.
Ara, afegeix un comportament Afegir a la Barra de Salut sota la secció de comportament UI i connecta'l sota el comportament Rebre Missatge.
A les propietats "Afegir a la Barra de Salut", arrossega el valor de sortida de Rebre Missatge al camp "Valor a afegir". Aquest valor serà el -10 que vam establir anteriorment en el comportament Transmetre Missatge del slime. D'aquesta manera, si decidim fer que altres enemics causin danys diferents, tot el que hem de fer és canviar el valor a la difusió per quant vulguem i la barra de salut farà servir aquell valor en el seu lloc!
Assegura't que la "Esdeveniment al Complet" estigui apagat, i que "Esdeveniment buid" sigui encès. Això vol dir que si la barra de salut arriba a zero salut, s'executarà el següent comportament.
Baix de la secció de comportament Escena , baixa un comportament Cargar Overlay i connecta'l al comportament Afegir a la Barra de Salut.
A les configuracions de Cargar Overlay, canvia l'overlay seleccionat per a l'overlay "Game Over" que es crea automàticament per a tu quan crees un nou projecte.
Juga el joc i fes una prova! Ara, cada vegada que entris en contacte amb el slime, hauria de drenar la teva barra de salut. Quan la barra de salut arriba a zero, s'acaba el joc.
Genial! Ara tenim una manera de fer danys al jugador i fer que perdi el joc.
Alguna cosa se sent un poc estrany, però. No estem donant gaire informació al jugador que han estat colpejats a més de treure salut de la barra de salut.
Podem solucionar-ho propel·lin el jugador i el slime lluny l'un de l'altre, fent molt clar que han fet contacte, així com mantenint el jugador d'esdeveniments massa ràpidament colpejant el slime.
Ves a l'editor de comportament per al slime (potser has d' seleccionar primer la capa Principal), i baixa un comportament Propulsar Objecte sota la secció Física. Connecta-ho sota el comportament Transmetre Missatge dels anteriors i obre les seves propietats.
A les propietats, canvia el segon objecte a l'etiqueta "Jugador" obrint la pestanya Etiquetes i seleccionant "Jugador". Canvia el valor de Força a 200, el Multiplicador de l'Objecte A a 0.25 i el Multiplicador de l'Objecte B a 1.
Ara, quan el jugador col·lideixi amb el slime, empènyerà el jugador lluny del slime amb una força de 200 (1 × 200 força) i el slime serà empès lluny del jugador amb una força de 50 (0.25 × 200 força).
El nostre joc comença a semblar força bé ara! Només queda un problema, ara tenim un slime invencible i el nostre jugador no té forma de derrotar-lo. A la pròxima part, implementarem una manera perquè el nostre jugador lluiti de tornada.
Part 6: Derrotant el Slime
Per permetre que el nostre jugador atacés el slime saltant a sobre d'ell, haurem de canviar com estem manejant les col·lisions ignorànd el fons del jugador (els peus del jugador) al fer danys.
Obre l'editor de comportament del slime i toca el comportament Xoc que vam crear a la part anterior del tutorial. Desactiva l'opció "De Baix", la qual ignorarà les col·lisions si el slime col·lideix amb el fons de la caixa de col·lisió del jugador.
Ara, el nostre slime no ferirà el jugador si el jugador salta sobre ell. En comptes d'això, volem realitzar una lògica diferent quan això succeeix.
Amb l'esdeveniment Xoc seleccionat, duplica'l i inverteix totes les opcions en el nou comportament Xoc de manera que només s'activi l'esdeveniment "De Baix".
Això servirà com el punt d'entrada quan el jugador salta a sobre del slime.
A continuació, baixa i connecta un comportament Destruir Objecte de la secció amb comportaments d'Objecte. Hauria d'estar ja configurat per destruir el nostre objecte slime de forma predeterminada.
Ara, quan juguem al nostre joc, saltant a sobre del slime el destrueix. Però de nou, com ho va fer quan va fer colpir el slime abans, no se sent molt satisfactori.
Com vam fer a la part anterior del tutorial, afegim un altre Propulsar Objecte. Duplica el comportament anterior de Propulsar Objecte de la lògica de dany del jugador i connecta'l sota el comportament Destruir Objecte. Les seves propietats del comportament anterior de Propulsar Objecte es poden mantenir iguals.
Ara, quan juguem el joc, hi ha un bon rebombori satisfactori en saltar a sobre del slime.
Conclusió & Exercicis
I això és bàsicament tot! Hem revisat totes les caixes que vam fer a la secció d'introducció:
- En comptes de caminar, el slime saltarà a l'esquerra o a la dreta per moure's. Comprovada!
- El slime saltarà en la direcció del jugador. Comprovada!
- Si el jugador està massa lluny, el slime no es mourà (idle). Comprovada!
- El slime restarà salut al jugador en contacte. Comprovada!
- El slime és derrotat si el jugador salta a sobre d'ell. Comprovada!
Si has arribat fins aquí, ara hauràs de tenir un bon coneixement de com pots donar-li a els teus enemics una mica d'intel·ligència i fer que pensin i prenguin decisions per si mateixos. Ben fet!
Tanmateix, sempre hi ha moltes altres coses que es poden fer. Com a exercici, intentar fer les següents accions per compte propi:
- Reproduir una animació de "colpidor/mort" quan el slime es salta sobre el jugador.
- Reproduir una animació de "colpidor" del jugador quan el slime ataca el jugador.
- Afegeix una mica de aleatorietat a quina distància saltarà el slime cada vegada.
Un fitxer de projecte complet per a aquest tutorial es pot trobar aquí: Descarregar Projecte Tutorial

