Ebben az oktató anyagban azt mutatom be hogy hogyan lehet egy AI scriptet irni, lépsről-lépésre.
Az FPS Creator számára AI scripteket FPI script nyelven tudunk írni amiknek a segítségével különböző parancsokat
adhatunk a karakter modelleknek. Például sétáljon lassan,sétáljon fegyverrel,
de lényegében bármilyen tárgynak bármilyen utasítást adhatunk
Nos, először gondolkodjunk el azon hogy egy mesterséges intelligánciának AI-nak mi is a szerepe.
Véleményem szerint egy jól kidolgozott mesterséges intelligencia alapvető feladata hogy:
- utasitsa az ellenséget hogy kijelölt útvonalat kövessen, esetleg véletlen szerűen változtasson is út vonalat ne csak egy irányba menjen.
- kezdje lőni a játékost ha meglátja
- ha a játékos túl közel kerül véletlen szerűen kezdjen tüzelni, hogy ne mindég egy adott távolság legyen az induló pont
- kövesse a játékost ha netalán az el akar szökni
- és próbáljon kitérni a játékos elől
Oxidative stress mutates DNA, order cialis online why not check here promotes atherosclerosis (blocking of arteries), and leads to chronic lung injury. Few problems affecting female libido: You may appalachianmagazine.com viagra generika be trying all kinds of treatments / medication to no avail! Doctors offer various cures for the condition change essentially starting with one individual then onto the next. Some of the companies are producing now that sildenafil discount with same effect. During Aortic Stenosis People suffering from chest pain http://appalachianmagazine.com/2017/02/28/tornado-watch-issued-for-central-and-southern-missouri-illinois-and-indiana/ buy levitra no prescription when all other tests are normal.
Nos, lássuk hogyan is lehet egy ilyen mesterséges intelligencia scriptet irni.
Első lépésként talán határozzuk meg hogy az ellenség kijelölt útvonalat kövessen, illetve változtassa is.
Ám először lássuk hogy milyen FPI script parancsokat alkalmazhatunk:
feltétel(condition):
WAYPOINTSTATE=X
Ezzel tesztelhetjük a karakter és útvonal viszonyát, például követi vagy sem, végére ért vagy sem..stb illetve utasíthatjuk is mit tegyen. Lássuk mi kerülhet az X helyére:
0:a karakter nem követ útvonalat
1:a karakter keresse meg a legközelebbi útvonalat ahonnan indulhat
2:a karakter kezdjen útvonalat követni
3:a karakter elérte az útvonalat és várjon hogy mit tegyen
4:a karakter elérte az útvonalat és az el ágazik több irányba várjon hogy mit tegyen
5:a karakter elérte az útvonal végét és ha nincs tovább utasításra vár hogy mit tegyen
999:a karakter ne kövesse tovább az útvonalat
Most lássuk milyen cselekményeket(action) alkalmazhatunk
WAYPOINTSTART
-arra utasitja a karaktert hogy találja meg a legközelebbi útvonalat(waypoint)
WAYPOINTSTOP
-arra utasitja a karaktert hogy ne kövesse tovább az útvonalat
WAYPOINTREVERSE
-arra utasitjuk a karaktert hogy forduljon vissza
WAYPOINTNEXT
-arra utasítjuk a karaktert hogy találja meg a következő útvonalat
WAYPOINTPREV
-arra utasitjuk a karaktert hogy térjen vissza az előző útvonalra
WAYPOINTRANDOM
-arra utasitjuk a karaktert hogy válasszon egy véletlen szerü útvonalat
Nos,fogjunk is hozzá elkészíteni az AI scriptünket
Első lépésként írjunk egy scriptet ami azt a parancsot tartalmazza hogy a karakter találja meg a legközelebbi útvonalat.
:WAYPOINTSTATE=0:WAYPOINTSTART
Ahogy láthatjuk az első feltételünk a :waypointstate=0 vagyis a karakter nem követ út vonalat, ez igaz és azt a parancsot adtuk hogy találja meg a legközelebbi útvonalat(:waypointstart).Ez eddig szép,viszont még be kell töltenünk a mozgás animációt is hogy a karater sétáljon, fusson-e..stb
Először is lássuk az FPS Creator mozgás animáció kulcsokat
feltétel(condidton)
ANIMATE=X
-az X helyére kell írni az animáció kulcsot.Lássuk a lehetőségeket
1 = nem csinál semmit
2 = lassan mozog(sétál)
3 = balra oldalazik
4 = jobbra oldalazik
5 = gyorsan mozog(fut)
6 = újra tölti a fegyvert
10 = mászik(felfele)
11 = előre esik
12 = előre ugrik
13 = fel kel elölről(ha előre esett,utána így kell felkelni)
14 = hátra esik
15 = hátra ugrik
16 = fel kel hátulról(ha hátra esett utána így kell felkelnie)
17 = balra esik
18 = balra ugrik
20 = jobbra esik
21 = jobbra ugrik
31 = guggolva,tétlenkedik
32 = guggolva lassan mozog(sétál)
33 = guggolva balra oldalazik
34 = guggolva jobbra oldalazik
35 = guggolva gyorsan mozog
36 = guggolva újra tölti a fegyvert
40 = szabadon tétlenkedik
41 = szabadon mozog
Ez eddigi kulcsokkal fegyver nélkül cselekszik a karakter, kivéve ha újra tölt.
A további kulcsok lényegében ugyan ezek az animációk, csak a fegyver a karakter kezében van miközben cselekszik
51 = fegyverrel nem csinál semmit
52 = fegyverrel lassan mozog
53 = fegyverrel balra oldalazik
54 = fegyverrel jobbra oldalazik
55 = fegyverrel gyorsan mozog
56 = fegyverrel újra tölt
57 = fegyverrel mászik
61 = fegyverrel előre esik
62 = fegyverrel előre ugrik
63 = fegyverrel fel kel előre
64 = fegyverrel hátra esik
65 = fegyverrel hátra ugrik
66 = fegyverrel fel kel hátra
67 = fegyverrel balra esik
68 = fegyverrel balra ugrik
70 = fegyverrel jobbra esik
71 = fegyverrel jobbra ugrik
81 = fegyverrel le guggol és nem csinál semmit
82 = fegyverrel le guggol és lassan mozog
83 = fegyverrel le guggol és balra fordul
84 = fegyverrel le guggol és jobbra fordul
85 = fegyverrel le guggol és gyorsan mozog
86 = fegyverrel le guggol és újra táraz
Hát akkor az eddig tanultak alapján bővítsük a scriptet a mozgás animációval:
:waypointstate=0:waypointstart,animate=52
Nos,mostmár a karakterünk szépen oda sétál az első útvonalhoz (waypointstart) sétálva(animate=52). De ha oda ért akkor mit csináljon?
Bővítsük a scriptet úgy hogy kezdje követni az útvonalat ha oda ért:
:waypointstate=0:waypointstart,animate=52
:waypointstate=3:waypointnext,animate=52
Ahogy láthatjuk a scriptünket kiegészítettük a második sorral amiben azt a parancsot adjuk a karakternek
hogy ha oda ért(:waypointstate=3), akkor kezdje követni az útvonalat (:waypointnext) és sétáljon(animate=52)
Mostmár a karakterünk oda megy a legközelebbi útvonalhoz és végig megy rajta. De ha a végére ért mit csináljon?
Bővítsük a scriptet úgy hogy ha az út végére ért forduljon vissza:
:waypointstate=0:waypointstart,animate=52
:waypointstate=3:waypointnext,animate=52
:waypointstate=5:waypointreverse,animate=52
Ahogy láthatjuk a harmadik sorral meg adtuk ha a karakterünk az út végére ér(:waypointstate=5) akkor forduljon vissza(:waypointreverse)
és sétáljon(animate=52)
Nos, ezzel lényegében készen is vagyunk, ám ez a script csak egy útvonalon mozgatja a karaktert oda-vissza.
De hogyan csináljuk meg hogy véletlen szerűen válasszon utat?
:waypointstate=0:waypointstart,animate=52
:waypointstate=3:waypointnext,animate=52
:waypointstate=4:waypointrandom,animate=52
:waypointstate=5:waypointreverse,animate=52
Ahogy láthatjuk a 2. és 3. sor közé be ékeltünk még egy sort.
A plusz sorral azt a parancsot adjuk a karakternek hogy ha el érte az út végét ami elágazik(waypointstate=4) akkor válasszon út irányt
véletlen szerüen(:waypointrandom) és sétáljon(animation=52).
Tehát akkor mit is csinál ez a script?
A karakter oda fog menni a leg közelebbi útvonalhoz és végig megy rajta. Ha a végére ért és el ágazik akkor véletlen szerüen választja ki hogy merre megy tovább.
Ha az út végén már nem lehet merre tovább menni, akkor vissza fog fordulni.
Viszont a játékost így nem támadja meg csak sétálgat.
Lássuk hogyan írjuk meg a scriptet hogy ha meg látja a játékost akkor támadja meg.
Először lássuk a scripthez szükséges parancsokat:
feltétel(condition)
PLRCANBESEEN
-ha látja a játékost
PLRCANNOTBESEEN
-ha nem látja a játékost
cselekmény(action)
ROTATETOPLR
-forduljon a játékos felé arccal
SHOOTPLR
-lőjön a játékosra
Most irjunk egy scriptet ami azt a parancsot adja a karakternek hogy ha meglátja a játékost akkor kezdje lőni
:state=0,plrcanbeseen:state=1
:state=1:rotatetoplr,waypointstop,animate=51,shootplr
Ahogy láthatjuk az első sor csak a feltételt tartalmazza,hogy ha a karakter látja a játékost(plrcanbeseen) akkor a program futtassa le a :state=1-el kezdőd sort
A második sor(:state=1) tartalmazza a cselekményt mi szerint a karakter forduljon arccal a játékos felé(rotatetoplr), ne kövesse tovább az útvonalat (waypointstop), sétáljon(animate=51) és lője a játékost(shootplr).
Tehát akkor mit is csinál ez a script? Ha a karakter meglátja a játékost, akkor nem követi tovább az útvonalat hanem a játékos felé fordul és lőni kezd.
Viszont még koránt sem vagyunk kész, ugyanis az ellenségnek nem csak lőni hanem követni is kell a játékost de azért a tisztes távolságot
tartsa meg.Lássuk ezt hogyan csináljuk.
Első lépésben ismerkedjünk meg a scripthez szükséges parancsokkal:
feltétel(condition)
PLRDISTWITHIN=X
-ha a játékos x-nél távolabb van
PLRDISTFURTHER=X
-ha a játékos X-nél közelebb van
cselekmény(action)
MOVEFORCE=X
-mozogjon X értéket előre
MOVEBACK=X
-mozogjon X értéket hátra
FOLLOWPLR
-kövesse a játékost
Nos,akkor írjunk egy scriptet ami azt a parancsot tartalmazza hogy a karakter tartsa a tisztes távolságot,ne kerüljön túl közel se túl távol
:state=0:state=1
:state=1:rotatetoplr
:state=1,plrdistfurther=500:moveforce=4,animate=55
:state=1,plrdistwithin=400:moveback=4,animate=55
Ahogy láthatjuk a script azt a parancsot adja a karakternek hogy forduljon a játékos felé(rotatetoplr) és ha 500 unit-nál távolabb van a játékos
(plrdistfurther=500) akkor mozogjon előre 4 unitot(moveforce=4) és mozogjon gyorsan(animate=55)
Ha viszont 400 unitnál közelebb kerül(plrdiswithin=400) akkor lépján vissza 4 unitot(moveback=4) és mozogjon gyorsan(animate=55)
Most már az ellenség mozog előre és hátra ha szükséges, de ha nem szükséges akkor hogyan álljon meg?
:state=0:state=1
:state=1:rotatetoplr
:state=1,plrdistfurther=500:movefore=4,animate=55
:state=1,plrdistwithin=400:moveback=4,animate=55
:state=1,plrdistwithin=500,plrdistfurther=400:animate=51
Ahogy láthatjuk alurra hozzá adtunk még egy sort ami azt az utasitást tartalmazza hogy ha a játékos 500 unitnál közelebb van(plrdistwithin=500) és 400 unitnál távolabb(plrdistfurther=400) akkor ne csináljon semmit(animate=51)
Az ellenség mostmár rohangál oda-vissza ha szükséges ha pedig nem szükséges akkor nyugton van.
Most bővítsük a scriptünket úgy hogy az ellenség kövesse is a játékost ha szükséges.
:state=0:state=1
:state=1:rotatetoplr
:state=1,plrdistfurther=500:movefore=4,animate=55
:state=1,plrdistwithin=400:moveback=4,animate=55
:state=1,plrdistwithin=500,plrdistfurther=400:animate=51
:state=1,plrcannotbeseen:state=2
:state=2:followplr
:state=2,plrcanbeseen:state=1
Ahogy láthatjuk a programhoz hozzá adtunk plusz 3 sort, ami a követekzőt tartalmazza.
Ha a karakter nem látja a játékost (plrcannotbeseen) akkor a program menjen a :state=2 sorra
és kövesse a játékost (followplr), ha viszont a karakter látja a játékost (plrcanbeseen) akkor lépjen vissza a :state=1 sorra.
Nos akkor mit is csinál pontosan ez a script?
Ha a karakter látja a játékost akkor tartsa a tisztes távolságot, ha viszont nem látja a játékost akkor kezdje követni és ha már megint látja akkor hadija abba a követést és tartsa a távolságot.
Nos mostmár a scriptünk lehetővé teszi hogy az ellenség tartsa a tisztes távolságot és kövesse a játékost.
Következő lépésben bővítsük a scriptet úgy hogy az ellenség csak akkor lőjön ha a játékos a fegyver ható sugarába kerül.
Első lépésként lássuk a szükséges parancsokat:
feltétel(condition)
PLRINGUNSIGHT=X
-ha a játékos a fegyver ható sugarában van
cselekmény(action)
USEWEAPON
-a karakter tüzeljen bármilyen fegyverrel ami nála van
Lássuk a scriptet
:state=0:state=1
:state=1:rotatetoplr
:state=1,plrdistfurther=500:movefore=4,animate=55
:state=1,plrdistwithin=400:moveback=4,animate=55
:state=1,plrdistwithin=500,plrdistfurther=400:animate=51
:state=1,plrcannotbeseen:state=2
:state=1,plringunsight=1:useweapon
:state=2:followplr
:state=2,plrcanbeseen:state=1
Ahogy láthatjuk egy új sorral bővítettük a scriptünket.
Ha a játékos a fegyver ható sugarába kerül(plringunsight=1) akkor a karakter tüzeljsn bármilyen fegyverrel ami nála van(:useweapon)
Mostmár a scriptünk gyakorlatilag működő képes. Az ellenség tartja a tisztes távolságot, követ és csak akkor lő ha ideális.
Viszont csak addig lő még van ólom a tárban.
Most lássuk hogyan is bővítsük a scriptet úgy hogy az ellenség tárazzon újra a megfelelő időben.
Első lépésben ismerkedjünk meg a szükséges parancsokkal.
feltétel(condition)
IFWEAPON=X
-ha a fegyver készen áll(1) vagy nem áll készen(0)
esemény(action)
RELOADWEAPON
-tárazzon újra
Nos, az újra töltéshez animációra is szükségünk van. Használhatjuk az 56-os animációt (animate=56).
De ha jobb,s zebb eredményt szeretnénk kapni akkor az animációt hívjuk be manuálisan.
Először is lássuk a manuális animáció híváshoz szükséges parancsokat
feltétel(condition)
FRAMEATEND=X
-animáció vége X
FRAMEATSTART=X
-animáció kezdete X
cselekmény(action)
SETFRAME=X
-az animáció sor első keretét játsza le
INCFRAME=X
-növekedjen az animáció sor X keretig
Lássuk hogyan is néz ki a script:
:state=0:state=1
:state=1:rotatetoplr
:state=1,plrdistfurther=500:movefore=4,animate=55
:state=1,plrdistwithin=400:moveback=4,animate=55
:state=1,plrdistwithin=500,plrdistfurther=400:animate=51
:state=1,plrcannotbeseen:state=2
:state=1,ifweapon=0:state=10,setframe=56
:state=1,plringunsight=1:useweapon
:state=2:followplr
:state=2,plrcanbeseen:state=1
:state=10:incframe=56
:state=10,frameatend=56:animate=51,reloadweapon,state=1
Ahogy láthatjuk 3 új sor került a scriptünkbe amik a követekző utasitást tartalmazzák:
Ha a fegyver nem áll készen,vagy is üres(ifweapon=1) akkor a program ugorjon a :state=10-el kezdődő sorra és töltse be az animáció első keretét(setframe=56)
Majd növekedjen az animáció sor 56-os keretig(incframe=56) és töltse be az animáció utolsó keretét(frameatend=56) majd ne csináljon semmit(animate=51) és töltse újra a fegyvert(reloadweapon) és a program térjen vissza a :state=1-el kezdődő sorra.
Nos, itt meg zavarhat minket hogy mindenhova 56-ot úrtunk.Első keret, utolsó keret…Ez azért van mert lényegében az 56-os animációt töltöttük be manuálisan.
Ezzel befolyásolva hogy mikor melyik részét játssza le az animációnak.
A karakterünk mostmár újratölti a fegyvert ha szükságes és közben újra töltő animációt játszik majd ha végzett vissza áll az alap helyzetre
Viszont azt is szeretnénk hogy az ellenség mozogjon folyamatosan hogy nehezebben lehessen el találni.
Először lássuk a szükséges parancsokat:
cselekmény(action)
STRAFE=X
-a karakter abba az irányba kezd oldalazni amit X értéknek be irunk.Ha negativ értéket irunk akkor balra fog mozdulni,ha pozitiv értéket irunk
akkor jobbra fogja kezdeni a ki térő manővert.
Ha például STRAFE értéknek 90-et írunk,akkor a karakter jobbra oldalazva fog kitérni.
CHOOSESTRAFE
-autómatikusan ki választja a mozgás irányát(balra, jobbra vagy egyenesen…)
RANDOM=X
-ha az x értéke 1 véletlen szerűen választja ki a mozgás irányát.
Nos, mindössze erre a 3 parancsra lesz szükségünk, ám a script írása közben arra is ügyelnünk kell hogy a karakter a kitérő manőver során játssza a megfelelő mozgás animációt. Mivel ezt autómatikusan nem fogja lejátszani, ezért erről is nekünk kell gondoskodnunk.Valamint az is fontos hogy a kitérés közben sem vegye le a szemét a játékosról és továbbra is löje a játékost kitérés közben is. Ha pedig ki fogyott a lőszerből akkor tárazzon újra kitérés közben is.
Lássuk hogyan is néz ki ez a gyakorlatban:
:state=0:state=1
:state=1:rotatetoplr
:state=1,plrdistfurther=500:movefore=4,animate=55
:state=1,plrdistwithin=400:moveback=4,animate=55
:state=1,plrdistwithin=500,plrdistfurther=400:animate=51,state=5
:state=1,plrcannotbeseen:state=2
:state=1,ifweapon=0:state=10,setframe=56
:state=1,plringunsight=1:useweapon
:state=2:followplr
:state=2,plrcanbeseen:state=1
:state=5,random=1:state=6,setframe=54
:state=5:state=7,setframe=53
:state=6:incframe=54,strafe=90,rotatetoplr
:state=6,ifweapon=0:state=10,setframe=56
:state=6,plringunsight=1:useweapon
:state=6,frameatend=54:state=1,animate=51
:state=7:incframe=53,strafe=-90,rotatetoplr
:state=7,ifweapon=0:state=10,setframe=56
:state=7,plringunsight=1:useweapon
:state=7,frameatend=53:state=1,animate=51
:state=10:incframe=56
:state=10,frameatend=56:animate=51,reloadweapon,state=1
Nos, ahogy láthatjuk első lépésben azt az utasítást adtuk a scriptünkben, hogyha az ellenség megfelelő távolságra van a játékostól és nem csinál semmit mozgás tekintetében akkor futtassa le a state=5-el kezdődő sorokat.Vagyis semmitevés helyett válasszon véletlenszerűen irányt hogy merre tér ki (:random=1) abban az esetben ha úgy döntött hogy jobbra tér ki, futassa le a state=6-al kezdődő sorokat és játssza a fegyverrel jobbra oldalazik animáció első keretét (setframe=54) majd játssza le a jobbra oldalazik animációt az utolsó keretig (incframe=54). Mind eközben mozogjon jobbra (strafe=90) és nézze a játékost (:rotatetoplr). Ha fegyver kifogyott (ifweapon=0) akkor futtassa le a state=10-el kezdőd sorokat és játssza le az újra tölt animáció első keretét (setframe=56) majd játssza le az újratöltés animációt az utolsó keretig (incframe=56). Ha az animáció végig ment (frameatend=56) akkor ne csináljon semmit (animate=51), majd töltse újra a fegyvert (reloadeweapon) és futtassa újra a state=1-el kezdődő sorokat. Továbbá ha látja a játékost (plringunsight=1) akkor lője a játékost (useweapon) és játssza az oldalazik jobbra animációt (frameatend=54) és futtassa le a state=1-el kezdődő sorokat és ne csináljon semmit (animate=51)
Ha viszont úgy döntött hogy balra tér ki akkor futassa le a state=7-el kezdődő sorokat. És innen kezdve lényegében ugyan az mint amikor balra tért ki, csak ez esetben jobbra állítjuk a dolgokat.
Tehát ebben a scritben azt az utasítást adtuk hogyha nem csinál semmit az ellenség, akkor kezdjen el kitérni és miközben kitér akkor is figyelje a játékost,lője és ha kifogyott a lőszer tárazzon újra.
És ezzek végeztünk is, lássuk a scriptünket egyben.
A scriptet lényegében 2 részre kell osztani
Main AI:
:waypointstate=0:waypointstart,animate=52
:waypointstate=3:waypointnext,animate=52
:waypointstate=4:waypointrandom,animate=52
:waypointstate=5:waypointreverse,animate=52
:state=0,plrcanbeseen:state=1
:state=1:rotatetoplr,waypointstop,animate=51,shootplr,state=2
Shoot AI
:state=0:state=1
:state=1:rotatetoplr
:state=1,plrdistfurther=500:movefore=4,animate=55
:state=1,plrdistwithin=400:moveback=4,animate=55
:state=1,plrdistwithin=500,plrdistfurther=400:animate=51,state=5
:state=1,plrcannotbeseen:state=2
:state=1,ifweapon=0:state=10,setframe=56
:state=1,plringunsight=1:useweapon
:state=2:followplr
:state=2,plrcanbeseen:state=1
:state=5,random=1:state=6,setframe=54
:state=5:state=7,setframe=53
:state=6:incframe=54,strafe=90,rotatetoplr
:state=6,ifweapon=0:state=10,setframe=56
:state=6,plringunsight=1:useweapon
:state=6,frameatend=54:state=1,animate=51
:state=7:incframe=53,strafe=-90,rotatetoplr
:state=7,ifweapon=0:state=10,setframe=56
:state=7,plringunsight=1:useweapon
:state=7,frameatend=53:state=1,animate=51
:state=10:incframe=56
:state=10,frameatend=56:animate=51,reloadweapon,state=1
A Main AI gondoskodik arról hogy a karakter menjen a legközelebbi waypointhoz és sétáljon rajta. Azt a scriptet a karakter beállításaiban a Main ponthoz kell adnunk mert az fut le először
A Shoot AI tartalmazza azt az utasítást hogyha meglátja az ellenséget akkor támadja meg, kövesse, próbáljon kitérni..stb. Ezt a scriptet a karakter beállításokban a Start ponthoz kell adni.
Ajánlott cikkek: