Dit is een uitgebreide en gedetailleerde gids voor het opzetten of debuggen van AI van eenheden in The Hand of Merlin, geschreven door de game-ontwerper Mat.
Introductie
In deze gids wil ik je helpen bij het maken van een AI, die ervoor kan zorgen dat een vijandelijke eenheid zijn vaardigheden op zichzelf kan gebruiken, tegen je krijgsbende.
Hoe werkt AI in The Hand of Merlin?
Onze programmeurs kozen ervoor om het Utility AI-paradigma te gebruiken. Dit betekent, in eenvoudige bewoordingen, dat voor elke vaardigheid die we onze AI laten overwegen, het zal proberen de "nuts" -waarde van zijn casting te rangschikken in elke tegel die het kan werpen, en dan alle opties vergelijkt, degene kiezend met de hoogste gebruikswaarde. Het is een geweldige manier om meerdere opties tegelijk te overwegen.
Specifiek in ons geval heeft elke "Eenheidsklasse" zijn eigen "Hersenen", waar we opties en de vragen die de AI stelt aan elke doeltegel zullen beschrijven.
Als dat nog niet duidelijk is, maak je geen zorgen, laten we stap voor stap gaan.
Eenheid Hersenen
Allereerst moeten we een Hersenen. Een geweldige manier om dit te doen is via de Menu maken (CTRL+N)en vervolgens selecteren Generiek -> (merlin) AI-hersenparameters.
Als alternatief, als je al een Unit Class-bestand hebt, kun je direct een nieuw Brain op dat bestand maken en het vervolgens afzonderlijk openen.
Hoe dan ook, het resultaat is een leeg Brain-bestand, zoals deze:
Zorg ervoor dat je die puppy opslaat (we gebruiken de map Content\Merlin\AI\UnitBrains).
Merk op dat er hier niet veel aan de hand is, omdat we nog de Ability-overwegingen moeten invullen, maar er is al iets dat een Eenheidsprioriteit. Ik grijp deze kans om uit te leggen wat Priority is.
Het is, nou ja, onze "Utility" -waarde voor elke actie. Tijdens een vijandelijke beurt, aangezien onze game Side Initiative gebruikt, worden alle mogelijke acties van alle mogelijke eenheden gerangschikt op de prioriteit die ze hebben, en ze zullen in die volgorde worden gespeeld, zolang er beschikbare vaardigheden zijn. Zoals we binnenkort zullen zien, zijn de overwegingen met betrekking tot Ability hier de belangrijkste factoren, maar als je ooit wilt dat een eenheid consequent als eerste of laatste speelt, wil je misschien spelen met de Eenheidsprioriteit, omdat dit de prioriteit/het nut zal vermenigvuldigen van alles wat dat specifieke brein berekent.
Voor een voorbeeld hoe dat werkt, nijlpaard heeft een prioriteit van 3, en de Tovenaar (Steunbandiet) heeft 0.5. Dit zorgt er meestal voor dat de Behemoth eerst speelt en de tovenaar na alle andere eenheden.
Overwegingssets
Laten we nu eens kijken naar de Overwegingen voor vaardigheden. Hier zou je er minstens één moeten hebben voor elke vaardigheid die de eenheid heeft, maar sommige vaardigheden (zoals Run!) kunnen meerdere items hebben.
Beschouw elke overwegingsset als een vraag die uw AI kan stellen. In het onderstaande voorbeeld: "Als ik Shoot ga gebruiken, hoe moet ik het dan gebruiken en is het belangrijker dan andere vaardigheden?"
Elke overweging heeft 4 eigenschappen:
- A label is alleen voor intern gebruik. Helpt u ze van ver te identificeren en zal van pas komen als we het hebben over foutopsporing. Het is als een naam voor die set.
- De Bekwaamheid is waar je de vaardigheid vermeldt waarmee dit verband houdt. Als de vaardigheid om welke reden dan ook niet is ingeschakeld (het apparaat heeft het niet, het is aan het afkoelen of er is meer AP voor nodig dan het apparaat momenteel heeft), wordt deze set niet geactiveerd.
- Je hebt een Prioriteit associëren met de vaardigheid, die wordt gemoduleerd door de Unit Priority en de ...
- Beslisser, wat de feitelijke berekening is die de AI met die mogelijkheid doet voor elke mogelijke tegel. Merk op hoe het eigenlijk een bestandstype op zichzelf is, dus het is een modulair stuk.
Beslissers en scorers
Gevonden in de Inhoud/Merlin/AI/Gedrag map, en altijd genoemd met het voorvoegsel `Behavior_`, dit zijn de bouwstenen van de AI. Technisch gezien kun je daartussen mixen en matchen, maar ik raad aan om je eigen beslissers te maken, vooral als je een specifiek gedragspatroon in gedachten hebt.
Elke beslisser is niets meer dan een combinatie van: Doelpuntenmakers, die de prioriteit van het vermogen nemen en het met een bepaalde waarde vermenigvuldigen. Op de afbeelding hierboven kun je zien dat de Gedrag_OverwatchDefensief beslisser, geassocieerd met Mandrake's Schot voorbereiden vermogen, heeft 3 scorers:
- Gate_NoOverwatchAlly, die de prioriteit op 0 zet als er een bondgenoot van Mandrake is die al een schot voorbereidt;
- Gate_CanHitRangedIedereen, die de prioriteit op 0 zet als de eenheid geen doel kan vinden om te raken (dwz het zal nooit overwatch gebruiken als er niemand binnen bereik is, waarschijnlijk liever gewoon naar boven lopen)
- Score_DefensieveRating, waardoor de prioriteit lager is als de huidige tegel een beetje te open ligt, waardoor de Mandrake de voorkeur geeft aan Prepare Shot alleen als hij achter dekking zit (we zullen zo praten meer over Defensieve rating, maak je geen zorgen).
Merk op hoe ze een specifieke naamgevingsconventie hebben. Al deze scorers, gevonden in Inhoud/Merlijn/AI/Overwegingen, hebben een van de drie achtervoegsels: Gates kan een prioriteit instellen op 0 of 1, bijna als een boolean. Score hebben de neiging om subtieler te zijn, variërend van 0 tot 1, en Bonus kan alleen 1+ waarden hebben, waardoor iets MEER waarschijnlijk wordt. Dit zijn echter slechts mijn persoonlijke conventies, en je kunt ze gerust noemen zoals je wilt.
Om wat dieper te duiken, laten we eens kijken hoe Gate_NoOverwatch bondgenoot werken:
Ten eerste is het van het type “Heeft statuseffect', wat een soort vraagcategorie is. We zullen alle vragen en hun basiseigenschappen in een oogwenk opsommen. We moeten de vraag dus nuanceren. "Wie" heeft een "welke" statuseffect. De "Wie" hier is de Eenheden van belang. Ik kan het instellen om naar allerlei soorten eenheden te zoeken, zoals die binnen een gebied, die met een specifieke gezondheidsratio, die met specifieke relaties, enz.
In dit geval zoeken we naar alle bondgenoten, dus we zetten Alle eenheden in de eenhedengroep, en we passen het relatiefilter toe, met de Vriend filter.
Welk statuseffect dan? We zouden een categorie kunnen gebruiken (positief/negatief/markering/verborgen), maar in dit geval wilde ik gewoon weten wie het statuseffect 'Overwatch.rsc' heeft. En daar ga je.
Dus de Antwoord op deze vraag zullen een aantal eenheden zijn die mijn bondgenoten zijn en die ook het vermelde statuseffect hebben. Dit wordt uitgezet als de X-waarde in de grafiekinvoer.
Om deze grafiek op een meer visuele manier te bekijken, raad ik aan op de grafiekknop te klikken, hier
Dat geeft je dit beeld hier:
Zoals gezegd is de X-as het “antwoord” op de vraag van de overweging. De Y-as is echter wat we beslissen om de te vermenigvuldigen Prioriteit een X-waarde gegeven. Als in het bovenstaande voorbeeld de X 0 is (er zijn geen bondgenoten met het Overwatch-statuseffect), dan vermenigvuldigen we de prioriteit met 1. Als er echter 1 of meer bondgenoten zijn met het statuseffect, vermenigvuldigen we de prioriteit met 0, de hele operatie annuleren - Mandrake zal niet gebruiken Schot voorbereiden.
Vandaar de naam - is a Schuif om te zien of er bondgenoten zijn met de Overwatch effect!
Alle scorers werken op dezelfde manier en geven u een X waarmee u kunt beslissen wat de Y moet zijn. Hier volgt een kort overzicht van alle soorten, zodat u weet waar u op moet letten. Trouwens, vragen die "Ja/nee" zijn, resulteren zoals verwacht in 1 voor ja, 0 voor nee.
Merk op dat Aanstootgevende beoordeling en Defensieve beoordeling worden voor het laatst bewaard, omdat ze een beetje speciaal zijn.
Poorttypes
- Eenheden tellen in Cast-gebied bij Target: "Als ik een vaardigheid op een specifieke tegel richt, welke eenheden zal het doelgebied van deze vaardigheid daar dan vinden?" Geweldig voor het controleren van de effectiviteit van AoE.
- Aantal interessante eenheden: “Hoeveel eenheden zijn er van dit type?” Een meer generieke manier om naar eenheden te zoeken. Misschien is uw gedrag anders als uw eenheid als laatste overeind staat?
- Raak Kans: "hoe waarschijnlijk is het dat een vermogen een specifiek doelwit raakt?". De meeste afstandseenheden vermijden schoten op doelen in dekking!
- AP-kosten om deze mogelijkheid te gebruiken: "wat kost deze vaardigheid als ik deze tegel target?" Handig als je vermogen AP kan afschalen, zoals Run.
- Min. Loopafstand vanaf doeltegel: "Vanaf de doeltegel, wat is de minimale afstand tot een eenheid van belang?" Dit is handig voor bewegingsvaardigheden, om andere eenheden op een redelijke afstand te houden. Cockatrices gebruiken dit bijvoorbeeld om dichtbij bondgenoten te komen.
- Min. Loopafstand tot doeltegel: "Vanaf hier sta ik, hoe ver is mijn doeltegel?" Dit werkt goed als uw apparaat de reisafstand wil minimaliseren/maximaliseren. Redcaps houden ervan om rond eenheden te lopen, en dit is wat je daarvoor gebruikt.
- Lucht afstand: Werkt precies zoals Walk Distance, maar houdt geen rekening met covers en andere bewegingsblokkers. Het is een rechte lijn en gebruikt diagonalen goed. Beter voor 'nabijheid'-controles, zoals Mandrake's voorkeur om eenheden in de buurt te schieten.
- Enkel doel X procent/bedrag: "Op deze doeltegel, als er een eenheid is, hoeveel pantser/gezondheid/leven heeft die dan?" Hier staat Life voor het toevoegen van zowel Health als Armor. Dit is een goede keuze als je vijanden de voorkeur geven aan gewonde doelen, of als ze pantserbrekende vaardigheden hebben, geven ze misschien de voorkeur aan hoger gepantserde vijanden! Percentage plaatst het in een verhouding van 0-1 en Bedrag geeft u de vaste waarde.
- Heeft statuseffect: “Hebben mijn interesse-eenheden een statuseffect?” We hebben het hier eerder over gehad, maar het werkt goed voor complexer gedrag als je verborgen statuseffecten gebruikt!
- Statuseffect Stapeltelling: "Hoeveel stapels van het statuseffect hebben ze?" We gebruiken deze niet, maar het zou goed werken voor sommige "rage"-achtige effecten, toch?
- Kan Caster vaardigheid activeren?: “Kan ik deze andere vaardigheid gebruiken?” Goed om te controleren of je vaardigheid niet meer afgekoeld is voordat je iets doet. Onze Rogue-bandiet controleert bijvoorbeeld of hun Shiv-vaardigheid is gewist voordat deze sluit.
- Draai type zwenkwiel: “Wat voor bocht is dit?” Hopelijk spreekt de X hier voor zich. Dit geeft je een ander resultaat als dit de beurt is waarin de eenheid werd onthuld, of als het een reactie is, zoals die is toegekend door Redcap's Watchful.
- Blackboard-query: "Welke informatie is er over het gebruik van vaardigheden?" hiermee kunt u opvragen welke mogelijkheden recentelijk zijn gebruikt. Helpt je bij het uitzoeken van combo's en soortgelijke acties!
- Caster-actiepunten: "hoeveel actiepunten heb ik?" Als je liever bepaalde acties doet bij een bepaald aantal actiepunten, dan is dit iets voor jou!
- Defensieve beoordeling: “Hoe veilig is de doeltegel?” Dit is een interessante. De AI probeert in te schatten hoe verdedigd een tegel is, rekening houdend met alle vijanden en hun bereik. Door deze overweging in verband te brengen met je bewegingsvermogen, worden vijanden voorzichtiger en geven ze de voorkeur aan dekkingen, afhankelijk van hoe je je grafiek instelt. En ja, de AI kan zelfs zien welke klasse elke vijand is, en het maakt hem niet uit om dekking te zoeken tegen Warriors!
- Aanstootgevende beoordeling: “Hoe goed heb ik een schot op mijn vijanden vanaf de doeltegel?” Hierdoor kan de eenheid rangschikken hoeveel vijanden het kan raken vanaf de doeltegel. Hogere X in tegels waar meerdere vijanden kunnen worden geraakt zonder dekking - voeg dit toe om beter flankerend gedrag te krijgen!
De combinatie van deze laatste twee kan wonderen doen voor de "persoonlijkheid" van je AI. Werk aan een goede grafiek om te balanceren tussen "defensief" en "offensief spel!
Let op: als jouw bewegingsvermogen bepaalt dat de huidige tegel de best mogelijke tegel is, zal de eenheid gewoon blijven zitten en een beurt doorgeven.
Debugging
Klein afscheidsbriefje om je te helpen bij het testen. Als je tijdens je tests met nieuwe vijanden aan het knoeien bent, is er een Console-opdracht die u wat informatie kan geven over het eindresultaat van uw vragen.
Om het te gebruiken, drukt u tijdens het uitvoeren van een simulatie op de tilde sleutel en type
hom_dbg_bEnableAIDebugging = 1
Dit zorgt ervoor dat wanneer de AI hun eerste beurt begint te overwegen, ze daadwerkelijk alle acties met> 0 eindprioriteit op het scherm afdrukken. Als u klaar bent, stelt u dezelfde variabele in op 0.
Hiermee kan ik zien dat hij Ooze Run, Gaze, Corrupt en Far Run had kunnen gebruiken, maar Gaze zal niet naar buiten komen door een aardverschuiving, ook opgemerkt door de rode gele lijn. Klik met de rechtermuisknop om het proces van elke actie te doorlopen en u zult zien hoe uw configuratie uiteindelijk werkte!
Daar ga je! Ga eropuit en maak plezier met het creëren van nieuwe hersens voor je eenheden!
Dat is alles wat we hiervoor vandaag delen De hand van Merlijn gids. Deze handleiding is oorspronkelijk gemaakt en geschreven door mibs. Als we deze handleiding niet kunnen bijwerken, kunt u de laatste update vinden door deze te volgen link.