Hur man Skapar Artificiell Intelligens för en Fiende Slim | hyperPad Documentation

Loading...

Logo
DocumentationTutorialerHur man Skapar Artificiell Intelligens för en Fiende Slim

IMG_0139.TRIM.GIF

Obs: En färdig projektfil för denna handledning kan hittas i slutet av denna artikel.

Introduktion

I denna handledning kommer vi att skapa den artificiella intelligensen (AI) för en övertygande fiendelslim för ett plattformsspel. Vi kommer att täcka några mer avancerade funktioner och beteenden i hyperPad, så denna handledning förutsätter en viss grundläggande kunskap om hyperPad-redigeraren. Om du tror att du behöver bekanta dig mer med att skapa ett spel från grunden kan du först kolla in den Kompletta guiden - Skapa ett plattformsspel handledningen.

För att få slimen att se "intelligent" ut, borde den göra mer än att bara röra sig fram och tillbaka och den borde vara lite medveten om sin omgivning.

Det låter spännande! Men innan vi börjar, bör vi först beskriva hur fiendens slime ska bete sig:

  • I stället för att gå kommer slimen att hoppa vänster eller höger för att röra sig.
  • Slimen kommer att hoppa i riktning mot spelaren.
  • Om spelaren är för långt bort kommer slimen inte att röra sig (stillastående).
  • Slimen kommer att ta bort spelarens hälsa vid kontakt.
  • Slimen besegras om spelaren hoppar på den.

Nu när vi vet vad vi vill göra, låt oss börja!

Del 1: Projektinställningar

I denna handledning kommer vi att börja ett nytt projekt från grunden för att hålla det enkelt. Skapa ett nytt projekt och ställ in det på "Sidovy", du kan lämna de andra inställningarna som standardvärden.

När ditt nya projekt har skapats, gå till Asset Library och hämta "Platformer Starter Pack" av hyperPad i tillgångsaffären. (Det är gratis!)

a7JUWwiO.jpg

Photo_2019-06-26__1_15_13_PM.png

Nu när vi har några tillgångar att arbeta med, gå vidare och placera några markblock och skapa din värld. Om du inte redan är där, gå till Asset Library och tryck på "Nedladdningar", sedan "Platformer Starter Pack".

I bilden nedan har några markblock ("Gräsvärld"-mappen) placerats och en bakgrund ("Bakgrunder"-mappen) har ställts in.

Photo_2019-06-26__1_16_22_PM.png

Nu när vi har en fin scen att arbeta med, låt oss lägga till Spelaren och Slime-objekten. Gå till Tillgångs-Biblioteket och öppna din "Nedladdningar"-mapp, sedan "Platformer Starter Kit"-mappen om de inte redan är öppna.

Vi kommer att använda "Grön rymdmänniska" som spelare, så tryck på den gröna rymdmänniskans tillgång för att se alla dess animationscykler. Som standard vill vi att spelaren bara ska stå still, så tryck på "Stå"-animationen och placera den på scenen.

I samma mapp i Tillgångs-Biblioteket finns också en "Slime Pink" animerad karaktär. Perfekt för oss att använda som en slime-fiende! Tryck på slimetillgången och välj "Rör sig"-animationen och placera en slime på din scen med spelarkaraktären.

Photo_2019-06-26__1_17_03_PM.png

Så långt, så bra! Vi har nu vårt spelarobjekt och slimeobjekt, redo för användning. Men om vi skulle spela vårt projekt nu, skulle vi inte kunna interagera med spelet alls. Så vi måste skapa lite logik för att ge vårt spel liv.

Del 2: Spelarkontroller

Innan vi kan börja ge vår slime-fiende liv, bör vi först ha några spelarkontroller för den gröna rymdmänniskan.

Tryck på den gröna rymdmänniskan och ställ in dess fysikläge från Väg till Fysik, vilket kommer att låta spelaren röra sig fritt. Tryck sedan på "Beteenden"-knappen för att öppna beteenderedigeraren för vår spelarkaraktär så vi kan lägga till några kontroller.

IMG_0054.JPG

I beteendeneditoren för vår spelarkaraktär bör du redan se ett ensamt Spela Animation-beteende. Vi kan lämna det beteendet ensamt, men vi kan ge det några vänner.

Under Interaktion-avsnittet, placera ner varsomhelst ett Joystick Kontrollerad-beteende samt ett Hoppa med Knapp-beteende. Med dessa beteenden är vår spelare nu redo att kontrolleras. Men, det saknar lite animation.

Tryck på Joystick Kontrollerad-beteendet och ställ in "Joystick Vänster Animation" till "Gå"-animationscykeln i den Gröna rymdmänniskans tillgång. Gör samma sak med "Joystick Höger Animation".

Photo_2019-06-26__1_18_28_PM.png

Nu går vår spelarkaraktär, men den animerar fortfarande inte när de hoppar.

Tryck på Hoppa med Knapp-beteendet och ändra både "Falling Animation" och "Jumping Animation" till "Hoppa"-animationscykeln.

Photo_2019-06-26__1_18_56_PM.png

Om vi spelar vårt spel nu kan vi röra oss och hoppa runt! Nästa kan vi börja arbeta med vår slime-fiende.

Photo_2019-06-26__1_19_50_PM.png

Del 3: Slimens Rörelse

Som vi beskrev i introduktionsavsnittet av denna handledning, vill vi att vår slime ska hoppa mot spelaren. För att göra detta behöver vår slime veta var spelaren är i världen. På grund av detta bör vi lägga till en Tagg till vår spelarkaraktär, så att våra beteenden kan hämta vår spelarkaraktär i varje scen.

Tryck på spelarkaraktären och välj fliken Taggar längst ner i egenskapsvyn. Skriv "Spelare" i textrutan längst upp i taggmenyn och tryck på lägg till (+) knappen bredvid den. Nu har vår spelarkaraktär taggats med "Spelare"-taggen.

Photo_2019-06-26__1_23_06_PM.png

På samma sätt som vi gjorde med spelarkaraktären, tryck på slimet och ställ in dess fysikläge från Väg till Fysik. Tryck sedan på Beteenden-knappen för att öppna slimens beteendeditor.

IMG_0058.JPG

I betehandledaren, gå till Eget-beteendeavsnittet och lägg ner ett Timer-beteende i redigeraren.

Tryck på Timer-beteendet och ställ in dess intervall till 2 sekunder.

Photo_2019-06-26__4_21_59_PM.png

Detta kommer att vara början på vår logik för vår slimens artificiella intelligens.

Idén här är att varje 2 sekunder kommer vår slime att "tänka" på vad den ska göra härnäst, såsom: Bör slime hoppa? Om det väljer att hoppa, vilken riktning ska den hoppa?

Nästa, gå till Transform beteendeavsnittet och placera ner ett Hämta Position-beteende. Tryck på det och ställ in dess mål på den "Spelare"-tagg vi skapade tidigare genom att trycka på fliken Taggar längst ner i egenskapsvyn och välja "Spelare". Anslut nu Timer-beteendet till Hämta Position-beteendet.

Photo_2019-06-26__4_22_22_PM.png

Nu vet vi var vår spelare är i världen! För att avgöra om spelaren är till vänster eller höger om slimen, behöver vi också veta var slimen är i världen.

Dra ytterligare ett Hämta Position-beteende in i redigeraren. Som standard riktar sig beteendet redan mot vår slime, så vi behöver inte göra något annat än att ansluta det till vår logikgren. Gå vidare och koppla Hämta Position för spelaren till Hämta Position för slimen.

Photo_2019-06-26__4_22_40_PM.png

Valfritt: För att göra det lättare att förstå har jag döpt mina Hämta Position-beteenden för att tydligt ange vad de spårar: "Hämta Position Spelare" och "Hämta Position Slime". Detta är valfritt, men om du också vill ändra beteendets namn kan du så göra genom att trycka på beteendet och trycka på dess namn längst upp i egenskapsvyn.

Så långt har vi att varje 2 sekunder, hämtar slimen spelarens position och sin egen. Nu när vi har den informationen kan vi avgöra om slimen ska hoppa vänster eller höger.

Under Logik-fliken, lägg ner och anslut ett If-beteende. I dess egenskaper, ställ in det första värdet till den första Hämta Positions ("Spelare"-taggen) x-position genom att dra beteendets utdata till fältet i If-egenskaperna. För det andra värdet, ställ det till den andra Hämta Positions (slime) x-position. Sist, ställ in If-beteendets villkor till "Är Mindre Än" (<).

Obs: En objekts x-position är det värde som representerar var objektet är i världen på sin x-axel. (Vänster och höger)

IMG_0061.JPG

Så, vad betyder allt detta? If-beteendet kontrollerar om spelarens x-position är mindre än slimens x-position. Om ovanstående villkor är sant kommer det att utföra det nästa anslutna beteendet. Vad detta i grunden betyder, är att om spelaren är längre till vänster än slimen, så fortsätter utförandet av beteendet.

Bra, nu har vi logiken inställd för att få slimen att hoppa vänster, så låt oss få slimen att göra just det!

Under Fysik-beteendeavsnittet, lägg ner och anslut ett Tillämpa Kraft-beteende till If-beteendet. I dess egenskaper, ställ in Kraften till: x = -0,5, y = 1. Ställ sedan multiplikatorn till ett stort nummer, 200 borde fungera.

Photo_2019-06-26__1_28_06_PM.png

Vad vi har nu är att om slimen upptäcker att spelaren är längre till vänster än den själv, kommer den hoppa uppåt (y = 1 × 200) och lite till vänster (x = -0,5 × 200).

Försök nu! Spela spelet och testa för att se till att allt fungerar. Vad du borde se är att slimen hoppar till vänster varannan 2 sekunder, så länge som spelaren är till vänster om den. Om du flyttar spelaren till höger om slimen, bör den sluta hoppa tills du flyttar till vänster om den igen.

Photo_2019-06-26__1_28_50_PM.png

Obs: Om din slime inte rör sig, gå igenom de föregående stegen för att säkerställa att du inte missade något. Se till att beteendena är korrekt kopplade och att din slime fysikläge är inställd på Fysik (rörlig) istället för Väg (ej rörlig). Dessutom kommer vi snart att åtgärda problemet där slimen ibland kan vända sig på sidan eller upp och ner.

Bra framsteg hittills! Om din slime hoppar runt som förväntat, så är vi redo att fortsätta. Låt oss avsluta dess rörelsebeteenden genom att tillåta slimen att hoppa till höger också.

Tillbaka i slimens beteendeditor, duplicera If-beteendet. Dra och fäst det nya If-beteendet till höger om det ursprungliga If-beteendet. Detta kommer att göra det till ett "Else If"-beteende.

Duplicera Tillämpa Kraft-beteendet också och anslut det till det nya Else If-beteendet.

I Else If:s egenskaper, förändra villkoret från "Är Mindre Än" (<) till "Är Större Än" (>). Detta kommer att ha motsatt effekt av det första If. Om det första If-beteendet inte är sant, kommer det att kontrollera om Else If är sant istället. Det betyder att om spelaren inte är till vänster om slimen, kommer den att kontrollera om spelaren är till höger om slimen, och fortsätta utföra beteenden som är kopplade till Else If istället.

Du borde nu ha en beteendegren som ser ut ungefär så här:

Photo_2019-06-26__1_30_01_PM.png

I det andra Tillämpa Kraft (under Else-If), ändra dess egenskaper så att dess kraft är x = 0,5, istället för x = -0,5. Nu, istället för att hoppa till vänster, kommer slimen att hoppa till höger.

Photo_2019-06-26__1_30_05_PM.png

Spela projektet och ge det ett nytt försök! Nu borde du se slimen hoppa i vilken riktning spelaren är. Utmärkt!

En sak du kanske har märkt under testning är att om du krockar med slimen kan den ibland falla på sidan eller vända sig upp och ner. Vi vill att slimen ska förbli upprätt, så låt oss fixa det snabbt.

Tillbaka i slimens beteendeditor, gå till Transform-beteendeavsnittet och lägg ner ett Lås Rotation-beteende i redigeraren. Ingen anledning att koppla det till ett annat beteende, vi vill att det ska låsa sin rotation så snart slimen skapas så du kan lämna det som det är. När du har gjort det, pröva spelet igen. Denna gång ska du ha en tuffare tid att försöka fälla slimen på sidan.

Photo_2019-06-26__1_32_26_PM.png

Du kanske också har märkt att slimens animation spelas för snabbt. Om detta händer, tryck på Spela Animation-beteendet i slimens beteendeditor och ändra Ramar Per Sekund till ett mycket mindre nummer. 6 ramar per sekund ser ganska bra ut.

Photo_2019-06-26__1_38_22_PM.png

Bra! Nu rör sig vår slime inte bara runt snyggt, utan den ser bra ut också. För det mesta är vår slimens rörelselogik färdig.

Men vi vill också att slimen endast ska hoppa om spelaren är i närheten. På så sätt kommer slimes som är långt borta inte omedelbart att försöka hoppa mot och attackera spelaren om vi bygger en större värld. I nästa del kommer vi att se på att lägga till ett annat villkor för att blockera hoppologiken om spelaren är för långt borta.

Del 4: Slime Stillestånd

I denna del kommer vi att implementera några slimabeteenden som får den att stå stilla (det vill säga inte röra sig) när spelaren är för långt borta.

För att uppnå detta, behöver vi hitta ett sätt att mäta avståndet från vår slime till spelaren. Lyckligtvis finns det beteenden tillgängliga för att göra just det! Låt oss börja arbeta.

Öppna slimens beteendeditor och lägg ner ett Beräkna Avstånd-beteende från Logik-sektionen. I dess beteendeegenskaper är det första objektet redan inställt på vår slime. För det andra objektet, gå till flikmenyn och välj "Spelare"-taggen.

Photo_2019-06-26__1_48_54_PM.png

Detta beteende, när det utförs, kommer att beräkna avståndet i meter från vår slime till spelaren. Med hjälp av den informationen kan vi se om spelaren är för långt borta genom att kontrollera om det överstiger ett visst avstånd.

Lägg ner ett annat If-beteende från Logik-sektionen och koppla det under Beräkna Avstånd-beteendet. I If-beteendets egenskaper ställer du in det första värdet till Beräkna Avstånds utdata värde. Ställ in villkoret till "Är Mindre Än" och det andra värdet till 15.

Nu har vi en metod för att kontrollera om spelaren är för långt borta genom att se om avståndet mellan slimen och spelaren är mindre än 15 (meter). Om det villkoret är falskt, är spelaren för långt borta och If-beteendet kommer inte att utföra nästa beteende.

IMG_0085.JPG

Nu när vi har vårt nya villkor redo att använda, koppla bort Hämta Position (slime) och det gamla If-beteendet från föregående del av handledningen och skapa lite utrymme för vårt nya villkor. Du kan koppla bort beteenden genom att trycka och hålla på anslutningarna mellan beteenden.

Med det nya avståndsvillkoret på plats, koppla Hämta Position (slime) till Beräkna Avstånd-beteendet, koppla sedan det nya If-beteendet till det gamla If-beteendet. Du borde nu ha något som ser ut så här:

Photo_2019-06-26__1_50_57_PM.png

Det börjar se ganska komplicerat ut nu, men idén är relativt enkel. Nu har vi att innan vi ens kontrollerar i vilken riktning slimen ska hoppa, kontrollerar vi först om avståndet mellan slimen och spelaren är mindre än 15 (meter).

Om spelaren är närmare än 15 meter, då kommer den att fortsätta och kontrollera vilken riktning vi ska hoppa, som vanligt. Om spelaren är längre bort än 15 meter, fortsätter vi inte och logiken slutar där tills slimen "tänker" igen (2 sekunder senare).

Testa spelet! Om du kommer för nära slimen bör den börja hoppa mot dig, men om du rör dig för långt bort bör den sluta röra sig och vänta tills du kommer nära igen.

Vår slime börjar se ganska hotfull ut nu, men den saknar fortfarande ett sätt att skada spelaren. I nästa del av denna handledning kommer vi att ge spelaren en hälsobar och implementera lite logik för att orsaka skada på spelaren.

Del 5: Attackera Spelaren

Som beskrivs i introduktionsavsnittet, kommer vi att implementera slimeattacker genom att få slimen att skada spelaren när den rör vid spelaren. För att börja implementera ett sätt för slimen att attackera spelaren, måste vi först ge spelaren lite hälsa.

I huvudredigeraren, välj Scenens UI lager och skapa ett nytt objekt med Speciella Objekt-knappen. Tryck på "Hälsobar" för att skapa en hälsobar för vår spelare.

IMG_0120.JPG

Eftersom den är placerad på UI-lagret i scenen, om vi väljer att expandera vår värld och låta skärmen följa spelaren, kommer det att förbli på samma plats på skärmen.

Du kan placera den var som helst du tycker passar bäst på skärmen. Jag har placerat min på mitten av skärmen nära botten.

Photo_2019-06-26__1_39_49_PM.png

När du är klar med att hitta en bra plats för din hälsobar kan vi börja arbeta med att ta bort hälsa från hälsobaren. Gå tillbaka till huvudlagret där din slime är och öppna dess beteendeditor igen.

I en fin tom plats i din slimens beteenden, lägg ner ett Kolliderade-beteende som finns under Objektsektionen. I dess egenskaper, ställ in det andra objektet till "Spelare"-taggen.

Photo_2019-06-26__1_38_54_PM.png

Under det egna beteendeavsnittet, lägg ner ett Sänd Meddelande-beteende och koppla det under Kolliderade-beteendet. I Sänd Meddelande-beteendets egenskaper kan du ställa in Event Key till "spelar träff", och sätt värdet till -10.

Kom ihåg: Event nycklar är skiftlägeskänsliga! För enkelhetens skull kommer denna handledning att använda små bokstäver för event nycklar. Du kan välja att använda versaler om du föredrar det, men kom ihåg vilka bokstäver som är versaler senare.

Photo_2019-06-26__1_41_06_PM.png

Nu har vi ett sätt att upptäcka när spelaren ska ta skada. När spelaren kolliderar med slimen, kommer ett meddelande för händelsen "spelar träff" att sändas med värdet -10. Vi kommer att använda -10 för att få hälsobaren att "lägga till" -10 hälsa, och eftersom värdet är negativt kommer det att ta bort 10 hälsa.

Vi behöver fortfarande lägga till den logiken till hälsobaren, så låt oss göra det nu. Avsluta beteendeditoren för slimen och gå sedan till huvudredigeraren och tryck på Scenens UI-lager och sedan på hälsobaren. Öppna beteendeditoren för hälsobaren.

I hälsobars beteendeditor, lägg ner ett Ta emot Meddelande-beteende från Eget avsnittet. I dess egenskaper ställer du in Event Key till "spelar träff". (Kom ihåg att det är skiftlägeskänsligt!)

Photo_2019-06-26__1_40_12_PM.png

Detta beteende kommer att vara vår lyssnare för meddelandet "spelar träff" som sänds när någon spelar träffar slimen. När detta beteende upptäcker ett meddelande för "spelar träff" var som helst i spelet kommer det att utföras.

Nu, lägg till ett Lägg till Hälsobaren-beteende under UI-beteendeavsnittet och koppla det under Ta emot Meddelande-beteendet.

I Lägg till Hälsobaren-egenskaper, dra utdata värdet från Ta emot Meddelande till fältet "Värde att lägga till". Det värdet kommer att vara -10 värdet vi ställde in tidigare i Sänd Meddelande-beteendet på slimen. På så sätt, om vi väljer att göra andra fiender hantera olika mängder skada, behöver vi bara ändra värdet i sändningen till vad vi vill ha och hälsobaren kommer att använda det värdet istället!

Kontrollera att "Händelse Vid Full" är av, och "Händelse Vid Tom" är på. Detta innebär att om hälsobaren når noll hälsa kommer den att utföra nästa beteende.

IMG_0080.JPG

Under Scen-beteendeavsnittet, lägg ner ett Ladda Överlägg-beteende och koppla det till Lägg till Hälsobaren-beteendet.

I Ladda Överlägg-inställningarna, ändra den valda överläggningen till "Game Over"-överlägget som automatiskt skapas för dig när du gör ett nytt projekt.

Photo_2019-06-26__1_42_30_PM.png

Spela spelet och testa det! Nu, när du får kontakt med slimen, ska det avlossa din hälsobar. När hälsobaren når noll, är det game over.

Photo_2019-06-26__1_42_58_PM.png

Kul! Nu har vi ett sätt att orsaka skada på spelaren och förlora spelet.

Något känns lite avigt, dock. Vi ger inte mycket feedback till spelaren att de har blivit träffade förutom att ta bort hälsa från hälsobaren.

Vi kan fixa detta genom att propellera spelaren och slimen bort från varandra, vilket gör det väldigt tydligt att de har gjort kontakt, samt hålla spelaren från att ta skada för snabbt genom att krocka med slimen snabbt.

Gå till beteendeditoren för slimen (du kanske behöver välja huvudlagret först), och lägg ner ett Propel Objekt-beteende under Fysik-sektionen. Koppla det under Sänd Meddelande-beteendet från tidigare och öppna dess egenskaper.

I egenskaperna, ändra det andra objektet till "Spelare"-taggen genom att öppna flikmenyn och välja "Spelare". Ändra Kraftvärdet till 200, Objekt A Multiplikatorn till 0,25, och Objekt B Multiplikatorn till 1.

Photo_2019-06-26__1_45_59_PM.png

Nu, när spelaren kolliderar med slimen, kommer det att trycka spelaren bort från slimen med en kraft av 200 (1 × 200 kraft) och slimen kommer att tryckas bort från spelaren med en kraft av 50 (0,25 × 200 kraft).

Vårt spel börjar kännas ganska bra nu! Det enda problemet just nu är att vi har en osårbar slime och vår spelare har inget sätt att besegra den. I nästa del kommer vi att implementera ett sätt för vår spelare att slå tillbaka.

Del 6: Besegrade Slime

För att tillåta vår spelare att attackera slimen genom att hoppa på den, måste vi ändra hur vi hanterar kollisionen genom att låta slimen ignorera botten av spelaren (spelarens fötter) när den orsakar skada.

Öppna beteendeditoren för slimen och tryck på det Kolliderade-beteende vi skapade i den föregående delen av handledningen. Inaktivera alternativet "På Botten", vilket kommer att ignorera kollisioner om slimen kolliderar med botten av spelarens kollisionslåda.

Photo_2019-06-26__1_54_25_PM.png

Nu kommer vår slime inte att skada spelaren om spelaren hoppar på den. Istället vill vi utföra annan logik när det händer.

Med Kollidera-händelsen vald, duplicera den och vänd på alla alternativ i det nya Kollidera-beteendet så att endast "På Botten"-händelsen är aktiverad.

Photo_2019-06-26__1_54_42_PM.png

Detta kommer att fungera som vår ingångspunkt när spelaren hoppar på slimen.

Nästa, lägg ner och koppla en Förstöra Objekt-beteende från Objektbeteendet. Det borde redan vara inställt på att förstöra vårt slime-objekt per standard.

Photo_2019-06-26__1_54_53_PM.png

Nu, när vi spelar vårt spel, förstörs slimen när vi hoppar på den. Men återigen, precis som den gjorde med att bli träffad av slimen tidigare, känns det inte särskilt tillfredsställande.

Som vi gjorde i den föregående delen av denna handledning, låt oss lägga till ytterligare en Propel Objekt. Duplicera det äldre Propel Objekt-beteendet från spelarskade-logiken och koppla det under Förstöra Objekt-beteendet. Dess egenskaper från det äldre Propel Objekt-beteendet kan förbli densamma.

IMG_0121.JPG

Nu, när vi spelar spelet, finns det en fin tillfredsställande studsig effekt när vi hoppar på slimen.

IMG_0130.TRIM.GIF

Slutsats & Övningar

Och det är i princip allt! Vi har checkat av alla punkter som gjordes i introduktionsavsnittet:

  • I stället för att gå, kommer slimen att hoppa vänster eller höger för att röra sig. Koll!
  • Slimen kommer att hoppa i riktning mot spelaren. Koll!
  • Om spelaren är för långt borta, kommer slimen inte att röra sig (stillastående). Koll!
  • Slimen kommer att ta bort spelarens hälsa vid kontakt. Koll!
  • Slimen besegras om spelaren hoppar på den. Koll!

Om du kom så här långt, borde du nu ha en bra förståelse av hur du kan ge dina fiender lite intelligens och få dem att tänka och fatta beslut på egen hand. Bra jobbat!

Men det finns alltid fler saker som kan göras. Som en övning, försök att göra följande på egen hand:

  1. Spela en "träff/död" slime-animation när slimen får en träff från spelaren.
  2. Spela en "träff" animations av spelaren när slimen attackerar spelaren.
  3. Lägg till lite slumpmässighet till hur långt slimen hoppar varje gång.

En färdig projektfil för denna handledning kan hittas här: Ladda ner handledningsprojekt