Forstå styringsadferd Forfølgelse og unngå

Så langt har vi sett på søk, fly, ankomst og vandre styringsadferd. I denne opplæringen vil jeg dekke forfølgelse og unngå atferd, som gjør at karakterene dine følger eller unngår målet.

Merk: Selv om denne opplæringen er skrevet med AS3 og Flash, bør du kunne bruke de samme teknikkene og konseptene i nesten hvilket som helst spillutviklingsmiljø. Du må ha en grunnleggende forståelse av matematiske vektorer.


Hva er en etterfølgelse?

En forfølgelse er prosessen med å følge et mål med sikte på å ta imot. Det er viktig å merke seg at ordet "catch" gjør hele forskjellen her. Hvis noe bare følger et mål, er alt som må gjøres gjenta målets bevegelser, og som en konsekvens vil det være på sporet.

Når du forfølger noe, må forfølgeren følge målet, men det må også forutse hvor målet vil være i nær fremtid. Hvis du kan forutsi (eller anslå) hvor målet vil være innen de neste få sekunder, er det mulig å justere den nåværende banen for å unngå unødvendige ruter:


Forutsi fremtiden

Som beskrevet i de første veiledningene beregnes bevegelsen ved hjelp av Euler-integrasjon:

posisjon = posisjon + hastighet

Som en direkte konsekvens, hvis den nåværende karakterens posisjon og hastighet er kjent, er det mulig å forutsi hvor det vil være i det neste T spilloppdateringer. Forutsatt at tegnet beveger seg i en rett linje, og stillingen vi vil forutsi er tre oppdateringer fremover (T = 3), karakterens fremtidige posisjon vil være:

posisjon = posisjon + hastighet * T

Nøkkelen til en god prediksjon er riktig verdi for T. Hvis verdien er for høy, betyr det at etterfølgeren vil ende opp med å jakte på et spøkelse. Hvis T er for nær null betyr det at etterfølgeren egentlig ikke forfølger målet, men det følger bare det (ingen forutsigelse).

Hvis prediksjonen beregnes for hver spillramme, virker det selv om målet stadig endrer retning. Hver oppdatering genereres en ny "fremtidig posisjon" basert på tegnets nåværende hastighetsvektor (som også styrer bevegelsesretningen).


forfølger

Forfølgelsesadferdene fungerer ganske mye på samme måte som søker, den eneste forskjellen er at forfølgeren ikke vil søke målet selv, men sin posisjon i nær fremtid.

Forutsatt at hver karakter i spillet er representert av en klasse som heter Boid, Følgende pseudokode implementerer den grunnleggende ideen bak forfølgelsesadferansen:

 Offentlig funksjonstrening (t: Boid): Vector3D T: int = 3; futurePosition: Vector3D = t.position + t.velocity * T; retur søk (futurePosition); 

Etter strekningsberegningen må den legges til hastighetsvektoren som alle tidligere styringskrefter:

 offentlig funksjon oppdatering (): void styring = forfølgelse (mål) styring = trunkate (styring, maks_force) styring = styring / masshastighet = trunkate (hastighet + styring, maks_speed) posisjon = posisjon + hastighet

Figuren nedenfor illustrerer prosessen:

Forfølgeren (tegnet nederst) vil søke målets fremtidige posisjon, etter en bane som beskrives av oransje kurven. Det endelige resultatet vil være:


Forfølgelsesatferden bruker T = 30. Klikk på demoen for å vise kraftvektorer. Målet søker musen.


Forbedre Pursuit Nøyaktighet

Det er et problem når verdien av T er konstant: jaktenes nøyaktighet har en tendens til å være dårlig når målet er nært. Dette skyldes at når målet er nært, vil etterfølgeren fortsette å søke prediksjonen av målets posisjon, som er T rammer "bort".

Atferden ville aldri skje i en virkelig forfølgelse fordi etterfølgeren ville vite at den er nær nok til målet og bør slutte å forutsi sin posisjon.

Det er et enkelt triks som kan implementeres for å unngå det, og drastisk forbedre jaktenes nøyaktighet. Ideen er veldig enkel; i stedet for en konstant verdi for T, en dynamisk brukes:

 T = distanceBetweenTargetAndPursuer / MAX_VELOCITY

Den nye T beregnes basert på avstanden mellom de to tegnene og den maksimale hastigheten målet kan oppnå. I enkle ord den nye T midler "hvor mange oppdateringer målet må flytte fra sin nåværende posisjon til forfølgerposisjonen".

Jo lengre avstanden, jo høyere T vil være, så forfølgeren vil søke et poeng langt foran målet. Jo kortere avstanden, jo lavere T vil være, noe som betyr at det vil søke et punkt svært nær målet. Den nye koden for implementeringen er:

 Offentlig funksjonstrening (t: Boid): Vector3D varavstand: Vector3D = t.position - posisjon; var T: int = distance.length / MAX_VELOCITY; futurePosition: Vector3D = t.position + t.velocity * T; retur søk (futurePosition); 

Det endelige resultatet er:


Forfølgelsesadferdene bruker en dynamikk T. Klikk på demoen for å vise kraftvektorer. Målet søker musen.


unndra

Evade-oppførselen er motsatt av jakten. I stedet for å søke målets fremtidige posisjon, vil evnen til å flykte den posisjonen i evadeadferd:

Koden for evading er nesten identisk, bare den siste linjen endres:

 Offentlig funksjon unngås (t: Boid): Vector3D var avstand: Vector3D = t.position - posisjon; var updatesAhead: int = distance.length / MAX_VELOCITY; futurePosition: Vector3D = t.position + t.velocity * updatesAhead; return fly (fremtidig posisjon); 

Det endelige resultatet er følgende:


Ulovlig oppførsel. Klikk på demoen for å vise kraftvektorer. Målet søker musen.

Konklusjon

Denne opplæringen beskriver forfølgelsen og evadeatferdene, som er gode å simulere en rekke mønstre, for eksempel en gruppe dyr som prøver å flykte fra en jeger.

Jeg håper du har hatt disse tipsene så langt, og kan begynne å bruke alle disse oppføringene, kombinere dem for å skape enda bedre mønstre! Hold deg oppdatert ved å følge oss på Twitter, Facebook eller Google+.