Hvordan lage kunstig intelligens for en fiende slime | hyperPad Documentation

Loading...

Logo
DocumentationTutoringHvordan lage kunstig intelligens for en fiende slime

IMG_0139.TRIM.GIF

Merk: En fullført prosjektfil for denne veiledningen kan bli funnet på slutten av denne artikkelen.

Introduksjon

I denne veiledningen skal vi lage den kunstige intelligensen (AI) for en overbevisende fiende slime til et plattformspill. Vi vil dekke noen mer avanserte funksjoner og atferd i hyperPad, så denne veiledningen forutsetter en viss grunnleggende kunnskap om hyperPad-redaktøren. Hvis du mener du trenger å bli mer kjent med det å lage et spill fra bunnen av, kan du sjekke ut Den fullstendige guiden - Opprette et plattformspill først.

For at slimen skal se "intelligent" ut, må den gjøre mer enn å bare bevege seg frem og tilbake, den må være litt klar over omgivelsene sine.

Spennende! Men før vi begynner, bør vi først detaljere hvordan fiende-slime skal oppføre seg:

  • I stedet for å gå, vil slimen hoppe til venstre eller høyre for å bevege seg.
  • Slimen vil hoppe i retning av spilleren.
  • Hvis spilleren er for langt unna, vil slimen ikke bevege seg (hvile).
  • Slimen vil ta liv fra spilleren ved kontakt.
  • Slimen er beseiret hvis spilleren hopper på toppen av den.

Nå som vi vet hva vi vil gjøre, la oss begynne!

Del 1: Prosjektoppsett

I denne veiledningen vil vi starte et nytt prosjekt fra bunnen av for å holde det enkelt. Lag et nytt prosjekt og sett det til "Side View", du kan la de andre innstillingene som standard.

Med ditt nye prosjekt opprettet, gå til Asset Library og hent "Platformer Starter Pack" fra hyperPad i asset-butikken. (Det er gratis!)

a7JUWwiO.jpg

Photo_2019-06-26__1_15_13_PM.png

Nå som vi har noen ressurser å jobbe med, gå videre og plasser noen bakkenivåblokker og lag verden din. Hvis du ikke allerede er der, gå til Asset Library og trykk på "Downloads", deretter "Platformer Starter Pack".

I bildet under har det blitt plassert noen bakkenivåblokker ("Grass World"-mappen) og en bakgrunn ("Bakgrunner"-mappen) har blitt satt.

Photo_2019-06-26__1_16_22_PM.png

Nå som vi har en fin scene å jobbe med, la oss legge til spiller- og slime-objektene. Gå til Asset Library og åpne "Downloads"-mappen, deretter "Platformer Starter Kit"-mappen hvis de ikke allerede er åpne.

Vi vil bruke "Green Spaceman" som spiller, så trykk på den grønne spaceman-ressursen for å se alle animasjons-syklene dens. Som standard ønsker vi at spilleren bare skal stå stille, så trykk på "Stand"-animajsonen og plasser den på scenen.

I samme mappe i Asset Library er det også en "Slime Pink" animert karakter. Perfekt for oss å bruke som en slime-fiende! Trykk på slime-ressursen og velg "Move"-animajsonen og plasser en slime på scenen sammen med spilleren.

Photo_2019-06-26__1_17_03_PM.png

Så langt, så bra! Vi har nå vårt spillerobjekt og slimeobjekt, klare til bruk. Men hvis vi skulle spille prosjektet vårt nå, ville vi ikke kunne interagere med spillet i det hele tatt. Så vi må lage noe logikk for å gi liv til spillet vårt.

Del 2: Spillerkontroller

Før vi kan jobbe med å gi vår slime-fiende liv, bør vi først ha noen spillerkontroller for den grønne spaceman.

Trykk på den grønne spaceman og sett fysikk-modusen fra Wall til Physical, som vil la spilleren bevege seg fritt. Deretter, trykk på "Behaviors"-knappen for å åpne oppføringsredigereren for spillskaren vår slik at vi kan legge til noen kontroller.

IMG_0054.JPG

I oppføringsredigereren for vår spillerkarakter, bør du allerede se en ensom Spill animasjon oppførsel. Vi kan la den oppførselen være alene, men vi kan gi den noen venner.

Under Interaksjon-delen, plasser en hvor som helst Joystick Controlled oppførsel samt en Jump with Button oppførsel. Med disse oppførslene er vår spiller nå klar til å bli kontrollert. Men, det mangler noen animasjoner.

Trykk på Joystick Controlled oppførsel og sett "Joystick Left Animation" til «Walk»-animasjonssyklusen i Green Spaceman-ressursen. Gjør det samme med "Joystick Right Animation"

Photo_2019-06-26__1_18_28_PM.png

Nå går vår spillerkarakter, men fortsatt animerer de ikke når de hopper.

Trykk på Jump with Button oppførselen og endre både "Falling Animation" og "Jumping Animation" til "Jump" animasjons-syklusen.

Photo_2019-06-26__1_18_56_PM.png

Hvis vi spiller spillet vårt nå, kan vi bevege oss og hoppe rundt! Neste kan vi jobbe med slime-fienden vår.

Photo_2019-06-26__1_19_50_PM.png

Del 3: Slimens Bevegelse

Som vi detaljert i introduksjonsdelen av denne veiledningen, ønsker vi at slimen skal hoppe mot spilleren. For å gjøre dette, må slimen vite hvor spilleren er i verden. Derfor bør vi legge til en Tag til spilleren, slik at atferden vår kan hente spillerkarakteren i hvilken som helst scene.

Trykk på spillerkarakteren, og velg Tags-fanen nederst i egenskapsvinduet. Skriv "Player" i tekstfeltet øverst i tag-menyen og trykk på legg til (+) knappen ved siden av det. Nå er spillerkarakteren vår merket med "Player"-taggen.

Photo_2019-06-26__1_23_06_PM.png

På samme måte som det vi gjorde med spillerkarakteren, trykk på slimen og still inn fysikk-modusen fra Wall til Physics. Deretter, trykk på oppførings-knappen for å åpne slimes oppføringsredigerer.

IMG_0058.JPG

I oppføringsredigereren, gå til Custom oppføringsseksjonen og slipp en Timer oppførsel inn i redigereren.

Trykk på Timer oppførselen og sett intervallet til 2 sekunder.

Photo_2019-06-26__4_21_59_PM.png

Dette vil være starten på logikken for slimes kunstige intelligens.

Ideen her er at hvert 2. sekund vil slimen "tenke" på hva den skal gjøre neste, for eksempel: Skal slimen hoppe? Hvis den velger å hoppe, hvilken retning skal den hoppe?

Nå, gå til Transform atferdsseksjonen og plasser en Get Position atferd. Trykk på den og sett målet til "Player" taggen vi opprettet tidligere ved å trykke på Tags-fanen nederst i egenskapene og velge "Player". Nå koble Timer til Get Position-oppførselen.

Photo_2019-06-26__4_22_22_PM.png

Nå vet vi hvor spilleren er i verden! For å avgjøre om spilleren er til venstre eller høyre for slimen, må vi også vite hvor slimen er i verden.

Dra en annen Get Position oppførsel inn i redaktøren. Som standard er oppførselen allerede rettet mot slimen, så vi trenger ikke å gjøre noe annet enn å koble den til logikkgrenen vår. Gå videre og koble Get Position for spilleren til Get Position for slimen.

Photo_2019-06-26__4_22_40_PM.png

Valgfritt: For å gjøre ting lettere å forstå, har jeg omdøpt mine Get Position-oppførslene for å indikere hva de sporer: "Get Position Player" og "Get Position Slime". Dette er valgfritt, men hvis du også vil endre oppførselens navn, kan du gjøre det ved å trykke på oppførselen og trykke på navnet øverst i egenskapsvinduet.

Så langt har vi det slik at hvert 2. sekund henter slimen posisjonen til spilleren og seg selv. Nå som vi har denne informasjonen, kan vi avgjøre om slimen skal hoppe til venstre eller høyre.

Under Logikk fanen, slipp og koble en If oppførsel. I egenskapene setter du den første verdien til den første Get Position's ("Player" tag) x-posisjon ved å dra oppførselen utgangsverdi inn i feltet i If-egenskapene. For den andre verdien setter du den til den andre Get Position's (slimen) x-posisjon. Til slutt setter du If oppførselen betingelsen til "Is Less Than" (<).

Merk: En objekts x-posisjon er verdien som representerer hvor objektet er i verden på sin x-akse. (Venstre og høyre)

IMG_0061.JPG

Så, hva betyr alt dette? If oppførselen vil sjekke om spillerens x-posisjon er mindre enn slimens x-posisjon. Hvis dette er sant, vil den utføre den neste tilkoblede oppførselen. Hva dette i hovedsak betyr, er at hvis spilleren er lengre til venstre enn slimen, så vil atferdsutførelsen fortsette.

Greit, vi har nå logikken satt opp slik at slimen kan hoppe til venstre, så la oss få slimen til å gjøre akkurat det!

Under Fysikk oppføringsseksjonen, slipp og koble en Apply Force oppførsel til If oppførselen. I egenskapene setter du Kraften til: x = -0.5, y = 1. Deretter setter du multiplikatoren til et stort nummer, 200 bør være tilstrekkelig.

Photo_2019-06-26__1_28_06_PM.png

Det vi har nå, er at hvis slimen oppdager at spilleren er lengre til venstre enn seg selv, vil den hoppe oppover (y = 1 × 200) og litt til venstre (x = -0.5 × 200).

Prøv det ut! Spill spillet og test for å sikre at alt fungerer. Det du bør se er at slimen hopper til venstre hvert 2. sekund, så lenge spilleren er til venstre for den. Hvis du flytter spilleren til høyre for slimen, bør den slutte å hoppe inntil du flytter til venstre for den igjen.

Photo_2019-06-26__1_28_50_PM.png

Merk: Hvis slimen din ikke beveger seg, gå gjennom de foregående trinnene for å forsikre deg om at du ikke har gått glipp av noe. Sørg for at atferdene er koblet riktig og at slimens fysikk-modus er satt til Physics (kan beveges) i stedet for Wall (kan ikke beveges). Også, snart vil vi løse problemet der slimen noen ganger snur seg på siden eller opp ned.

Fantastisk fremgang så langt! Hvis slimen din hopper rundt som forventet, er vi klare til å fortsette. La oss avslutte bevegelsene ved å tillate slimen å hoppe til høyre også.

Tilbake i slimes oppføringsredigerer, dupliser If oppførselen. Dra og fest den nye If oppførselen til høyre for den originale If oppførselen. Dette vil gjøre den til en "Else If" oppførsel.

Dupliser også Apply Force oppførselen, og koble den til den nye Else If oppførselen.

I Else Ifs egenskaper, endre betingelsen fra "Is Less Than" (<) til "Is Greater Than" (>). Dette vil ha motsatt effekt av den første If. Hvis den første If oppførselen ikke er sann, vil den da sjekke om Else If er sann i stedet. Dette betyr at hvis spilleren ikke er til venstre for slimen, vil den sjekke om spilleren er til høyre for slimen, og fortsette å utføre oppførslene som er koblet til Else If i stedet.

Du bør nå ha en atferdsgren som ser ut som noe slik:

Photo_2019-06-26__1_30_01_PM.png

I den andre Apply Force (under Else-If), endre egenskapene slik at kraften er x = 0.5, i stedet for x = -0.5. Nå, i stedet for å hoppe til venstre, vil slimen hoppe til høyre.

Photo_2019-06-26__1_30_05_PM.png

Spill prosjektet og prøv igjen! Nå bør du se slimen hoppe i hvilken som helst retning spilleren er. Utmerket!

En ting du kanskje har lagt merke til under prøving er at hvis du kolliderer med slimen, kan den noen ganger falle på siden eller gå opp ned. Vi vil at slimen skal holde seg oppreist, så la oss fikse det raskt.

Tilbake i slimes oppføringsredigerer, gå til Transform-oppføringsseksjonen og slipp en Lock Rotation oppførsel inn i redigereren. Ingen behov for å koble den til en annen oppførsel, vi vil at den skal låse rotasjonen så snart slimen er opprettet, så du kan la den være som den er. Når du har gjort det, prøv spillet igjen. Denne gangen bør du ha et vanskeligere tid med å prøve å velte slimen på siden.

Photo_2019-06-26__1_32_26_PM.png

Du har kanskje også lagt merke til at slimens animasjon spilles for raskt. Hvis dette skjer, trykk på Play Animation oppførselen i slimes oppføringsredigerer og endre bildene per sekund til et mye lavere tall. 6 bilder per sekund ser ganske bra ut.

Photo_2019-06-26__1_38_22_PM.png

Bra! Nå beveger slimen ikke bare seg pent rundt, men den ser også bra ut. For det meste er slemmens bevegelseslogikk fullført.

Imidlertid vil vi også at slimen skal hoppe bare hvis spilleren er i nærheten. Slik at hvis vi bygger en større verden, ikke vil slimer som er langt unna straks prøve å hoppe mot og angripe spilleren. I neste del vil vi se på å legge til en annen betingelse for å blokkere hopping-logikken hvis spilleren er for langt unna.

Del 4: Slimens Hvile

I denne delen vil vi implementere noen slime-atferder som vil få den til å hvile (det vil si, ikke bevege seg) når spilleren er for langt unna.

For å oppnå dette, må vi finne en måte å måle avstanden fra slimen til spilleren. Heldigvis er det atferd tilgjengelig for å gjøre nettopp det! La oss komme i gang.

Åpne slimes oppføringsredigerer og slipp en Calculate Distance oppførsel fra Logikk-seksjonen. I dens atferdsegenskaper er det første objektet allerede satt til slimen. For det andre objektet, gå til Tab-menyen og velg "Player"-taggen.

Photo_2019-06-26__1_48_54_PM.png

Denne oppførselen, når den kjøres, vil måle avstanden i meter fra slimen til spilleren. Ved å bruke den informasjonen kan vi se om spilleren er for langt unna ved å sjekke om det overskrider en viss avstand.

Plasser en annen If oppførsel fra Logikk-seksjonen og koble den under Calculate Distance oppførselen. I If oppførselens egenskaper setter du den første verdien til Calculate Distance's utgangsverdi. Sett betingelsen til "Is Less Than" og den andre verdien til 15.

Nå har vi en måte å sjekke om spilleren er for langt unna ved å se om avstanden mellom slimen og spilleren er mindre enn 15 (meter). Hvis den betingelsen er usann, er spilleren for langt unna og If oppførselen vil ikke utføre neste oppførsel.

IMG_0085.JPG

Nå som vi har vår nye betingelse klar til å bruke, koble fra Get Position (slime) og gammel If oppførsel fra den forrige delen av veiledningen og lag litt plass for vår nye betingelse. Du kan koble fra atferdene ved å trykke og holde forbindelsene mellom atferdene.

Med den nye avstands-betingelsen på plass, koble Get Position (slime) til Calculate Distance oppførselen og deretter koble den nye If oppførselen til den gamle If oppførselen. Du bør nå ha noe som dette:

Photo_2019-06-26__1_50_57_PM.png

Det begynner å se ganske komplisert ut nå, men ideen er relativt enkel. Nå har vi, før vi en gang sjekker hvilken retning slimen skal hoppe, først sjekket om avstanden mellom slimen og spilleren er mindre enn 15 (meter).

Hvis spilleren er nærmere enn 15 meter, vil det fortsette å sjekke hvilken retning vi skal hoppe, som vanlig. Hvis spilleren er lenger enn 15 meter unna, fortsetter vi ikke og logikken stopper der inntil slimen "tenker" igjen (2 sekunder senere).

Gi spillet et forsøk! Hvis du kommer for nært til slimen, bør den begynne å hoppe mot deg, men hvis du beveger deg for langt unna, bør den slutte å bevege seg og vente til du kommer nærmere den igjen.

Vår slime begynner å se ganske truende ut nå, men den mangler fortsatt en måte å skade spilleren på. I neste del av denne veiledningen vil vi gi spilleren en helsebar og implementere noe logikk for å påføre skade på spilleren.

Del 5: Angre på Spilleren

Som detaljert i introduksjonsdelen, vil vi implementere slimeangrep ved å la slimen skade spilleren når den berører spilleren. For å komme i gang med implementeringen av en måte for slimen å angripe spilleren, må vi først gi spilleren litt helse.

I hovedredigereren velger du Scene UI lag og lager et nytt objekt med Spesielle objekter-knappen. Trykk på "Health Bar" for å opprette en helsebar for spilleren vår.

IMG_0120.JPG

Siden den er plassert på Scene UI-laget, hvis vi velger å utvide verden vår og la skjermen følge spilleren, vil den holde seg på samme sted på skjermen.

Du kan plassere den hvor som helst du ønsker på skjermen. Jeg har plassert min i midten av skjermen nær bunnen.

Photo_2019-06-26__1_39_49_PM.png

Når du er ferdig med å finne et bra sted for helsebaren, kan vi begynne å legge til en måte å fjerne helse fra helsebaren. Gå tilbake til hovedlaget der slimen din er, og åpne oppføringsredigereren igjen.

I et fint tomt område i slime-atferdene, slipp ned en Kollidert oppførsel fra Objektseksjonen. I egenskapene setter du det andre objektet til "Player"-taggen.

Photo_2019-06-26__1_38_54_PM.png

Under den egendefinerte oppføringsseksjonen, slipp ned en Send melding oppførsel og koble den under Kolliderte oppførselen. I Send melding oppførselen, sett hendelsesnøkkelen til "player hit", og sett verdien til -10.

Husk: Hendelsesnøkler er skiftfølsomme! For enkelhetens skyld bruker denne veiledningen små bokstaver for hendelsesnøkler. Du kan velge å bruke store bokstaver hvis du ønsker, men vær sikker på å huske hvilke bokstaver som er store senere.

Photo_2019-06-26__1_41_06_PM.png

Nå har vi en måte å oppdage når spilleren skal ta skade. Når spilleren kolliderer med slimen, vil en melding for hendelsen "player hit" bli sendt med en verdi på -10. Vi vil bruke -10 for å fortelle helsebaren å "legge til" -10 helse, og siden verdien er negativ, vil det fjerne 10 helse.

Vi må fortsatt legge til den logikken til helsebaren, så la oss gjøre det nå. Gå ut av slimes oppføringsredigerer og i hovedredigereren trykker du på Scene UI-laget og deretter på helsebaren. Åpne oppføringsredigereren for helsebaren.

I helsebarens oppføringsredigerer, slipp ned en Mottak melding oppførsel fra den tilpassede seksjonen. I egenskapene setter du hendelsesnøkkelen til "player hit". (Husk at den er skiftfølsom!)

Photo_2019-06-26__1_40_12_PM.png

Denne oppførselen vil være vår lytter for meldingen "player hit" sendt hver gang spilleren treffer slimen. Når denne oppførselen oppdager en sendt melding for "player hit" hvor som helst i spillet, vil den utføre.

Nå, legg til en Legg til helsebar oppførsel under UI oppføringsseksjonen og koble den under Mottak melding oppførselen.

I Legg til helsebar-egenskapen, dra utgangsverdien fra Mottak melding til feltet "Verdi å legge til". Den verdien vil være -10 verdien vi satte tidligere i Send melding oppførselen på slimen. På denne måten, hvis vi velger å lage andre fiender som gjør forskjellige mengder skade, trenger vi bare å endre verdien på sendingen til hva annet vi ønsker, og helsebaren vil bruke den verdien i stedet!

Sørg for at "Hendelse når full" er av, og "Hendelse når tom" er på. Dette betyr at hvis helsebaren når null helse, vil den utføre neste oppførsel.

IMG_0080.JPG

Under Scene oppføringsseksjonen, slipp ned en Laste overlay oppførsel og koble den til Legg til helsebar oppførselen.

I Laste overlay-innstillingene, endre den valgte overlayen til "Game Over" overlayet som automatisk er laget for deg når du lager et nytt prosjekt.

Photo_2019-06-26__1_42_30_PM.png

Spill spillet og prøv det ut! Nå skal slimen forårsake at helsebaren din tapper hvert gang du kommer i kontakt med den. Når helsebaren når null, er det game over.

Photo_2019-06-26__1_42_58_PM.png

Kult! Nå har vi en måte å skade spilleren og gjøre spillet om til en tap.

Noe føles imidlertid litt off, vi gir ikke mye tilbakemelding til spilleren at de har blitt truffet bortsett fra å fjerne helse fra helsebaren.

Vi kan rette opp i dette ved å propelere spilleren og slimen bort fra hverandre, noe som gjør det veldig klart at de har vært i kontakt, samt skape muligheter for spilleren til å ta skade for raskt ved å kollidere med slimen raskt.

Gå til oppføringsredigereren for slimen (du må kanskje velge hovedlaget først), og slipp ned en Propel objekt oppførsel under Fysikk-seksjonen. Kobbel det under Send melding oppførselen fra tidligere og åpne egenskapene.

I egenskapene, endre det andre objektet til "Player"-taggen ved å åpne Tags-fanen og velge "Player". Endre kraftverdien til 200, Objekt A multiplikator til 0.25, og Objekt B multiplikator å 1.

Photo_2019-06-26__1_45_59_PM.png

Så når spilleren kolliderer med slimen, vil det skyve spilleren bakover fra slimen med en kraft på 200 (1 × 200 kraft) og slimen vil bli dyttet bort fra spilleren med en kraft på 50 (0.25 × 200 kraft).

Spillet vårt begynner å føles ganske bra nå! Det eneste problemet nå er at vi har en usårbar slime og spilleren vår har ingen måte å utrydde den på. I neste del vil vi implementere en måte for spilleren å slå tilbake.

Del 6: Beseire Slimen

For å la spilleren angripe slimen ved å hoppe på toppen av den, må vi endre hvordan vi håndterer kollisjoner ved å la slimen ignorere bunnen av spilleren (føttene) når det gjelder skade.

Åpne oppføringsredigereren for slimen og trykk på Kolliderte oppførselen vi opprettet i forrige del av veiledningen. Deaktiver alternativet "On Bottom", som vil ignorere kollisjoner hvis slimen kolliderer med bunnen av spillerens kollisjonsboks.

Photo_2019-06-26__1_54_25_PM.png

Nå vil ikke slimen skade spilleren hvis spilleren hopper på den. I stedet ønsker vi å utføre en annen logikk når det skjer.

Med Kolliderte hendelsen valgt, dupliser det og reverser alle alternativene i den nye Kolliderte oppførselen slik at kun "On Bottom" hendelsen er aktivert.

Photo_2019-06-26__1_54_42_PM.png

Dette vil tjene som vår inngangspunkt når spilleren hopper på toppen av slimen.

Neste, slipp og koble en Ødelegg objekt oppførsel fra Objekt oppføringsseksjonen. Den skal allerede være satt til å ødelegge slime-objektet som standard.

Photo_2019-06-26__1_54_53_PM.png

Nå, når vi spiller spillet vårt, ødelegger det slimen når vi hopper på toppen av den. Men igjen, akkurat som det var med å bli truffet av slimen før, føles det ikke særlig tilfredsstillende.

Som vi gjorde i forrige del av veiledningen, la oss legge til en annen Propel Objekt. Dupliser den eldre Propel Objekt oppførselen fra spillerskade-logikken og koble den under Ødelegg Objekt oppførselen. Dens egenskaper fra den eldre Propel Objekt-oppførselen kan forbli den samme.

IMG_0121.JPG

Nå, når vi spiller spillet, er det en fin tilfredsstillende sprett når vi hopper på toppen av slimen.

IMG_0130.TRIM.GIF

Konklusjon & Øvelser

Og det er stort sett det! Vi har sjekket alle bokser fra introduksjonsdelen:

  • I stedet for å gå, vil slimen hoppe til venstre eller høyre for å bevege seg. Sjekk!
  • Slimen vil hoppe i retning av spilleren. Sjekk!
  • Hvis spilleren er for langt unna, vil slimen ikke bevege seg (hvile). Sjekk!
  • Slimen vil ta helsen til spilleren ved kontakt. Sjekk!
  • Slimen er beseiret hvis spilleren hopper på toppen av den. Sjekk!

Hvis du har kommet så langt, bør du nå ha en god forståelse av hvordan du kan gi fiendene dine noe intelligens, og få dem til å tenke og ta egne avgjørelser. Bra jobba!

Imidlertid er det alltid flere ting som kan gjøres. Som en øvelse, prøv å gjøre følgende på egenhånd:

  1. Spill en "hit/død" slime-animasjon når slimen blir hoppet på av spilleren.
  2. Spill en "hit" spilleranimasjon når slimen angriper spilleren.
  3. Legg til noe tilfeldighet i hvor langt slimen vil hoppe hver gang.

En fullført prosjektfil for denne veiledningen kan bli funnet her: Last ned veiledningsprosjekt