230 likes | 400 Views
Reima Halmetoja. Skriptikielten käyttö pelitekoälyssä. Esitelmän rakenne. Mitä on pelitekoäly? Johdatus skriptikieliin Pelitekoälyä skriptikielillä Skriptikielten etuja ja haittoja pelitekoälyn näkökulmasta. Mitä on pelitekoäly?. Mitä on pelitekoäly?.
E N D
Reima Halmetoja Skriptikielten käyttö pelitekoälyssä
Esitelmän rakenne Mitä on pelitekoäly? Johdatus skriptikieliin Pelitekoälyä skriptikielillä Skriptikielten etuja ja haittoja pelitekoälyn näkökulmasta
Mitä on pelitekoäly? Pelitekoälyssä tavoitellaan rationaaliselta vaikuttavaa toimintaa Pelitekoäly onnistuu tehtävässään, kun se luo pelaajalle vaikutelman siitä, että pelissä olevat tapahtumat tai hahmot toimivat järkevällä tavalla Vaihtoehtoisesti voidaan puhua esim. agenttien suunnittelusta tai käyttäytymisen mallintamisesta Yleensä ei pyritä imitoimaan ihmispelaajia, tosin tämä vaikutus voidaan joskus saada aikaan Käsite pelitekoäly on laaja ja sillä voidaan tarkoittaa mm. reitinetsintäalgoritmeja, epäpelaajahahmojen toiminnan määrittelemistä, mikrotason manageroinnin automatisoimista, jne.
Mitä on pelitekoäly? Pelitekoäly on riippuvainen asiayhteydestä Jokin tekoälyagentti voi olla erinomainen esimerkiksi Quake-pelin deathmatch-pelimoodissa... ...mutta sama tekoälyvastus voi epäonnistua eri genren peleissä tai samassakin pelissä, jos kenttien suunnittelu eroaa merkittävästi kontekstista, johon agentti on suunniteltu ja jossa sitä on testattu. Esimerkiksi Deep blue osaa shakkia, mutta sen on mahdotonta toimia missään muussa pelissä. Vertaa ihmisen älykkyyden muotoihin: matemaattinen äly, sosiaalinen äly, jne.
Mitä on pelitekoäly? Kovakoodattu tekoäly Pelin kirjoittamiseen käytetyllä ohjelmointikielellä kirjoitettu tekoäly Soveltuu hyvin prosessointiteholtaan vaativiin tai usein uudelleenkäytettäviin tekoälykomponentteihin Reitinetsintäalgoritmit (Dijkstra, A*, ...) Liikkumisalgoritmit (pakeneminen, seuraaminen, väistäminen) Koska tekoäly on kirjoitettu usein nopeasti ajettavalla ohjelmointikielellä, on sen suorittaminenkin verrattain tehokasta. Pääasiallinen toteutustapa vanhemmissa ja pienimuotoisimmissa peleissä
Mitä on pelitekoäly? Tehokkuusvaatimuksia Tavanomaisesti pelitekoälyyn on käytettävissä noin 20% prosessointitehosta Vertaa esimerkiksi grafiikkaan, johon käytetään usein yli 50% prosessointitehosta Ongelma kärjistynee erityisesti alustoilla, joissa teho on rajallinen Vanhemmat pc:t, konsolit, puhelimet
Johdatus skriptikieliin Skriptikieli on ohjelmointikieli, jonka tarkoituksena on yksinkertaistaa jonkin ongelman ratkaisua Esimerkiksi halutaan tarjota kenttien suunnittelijoille tai harrastelijoille ohjelmointikieli tekoälypelaajien luomiseen ilman, että itse pelin ohjelmakoodia tarvitsee muuttaa Skriptikielet toimivat yhdessä muun pelin ohjelmakoodin kanssa, joka on useimmiten kirjoitettu tehokkaammalla ohjelmointikielellä (c++, c, tms.) Useimmat peleissä käytettävät skriptikielet ovat tulkattavia kieliä, jossa kirjoitetusta skriptistä muodostetaan tavukoodia, jota puolestaan suoritetaan edelleen tulkin (interpreter, virtual machine tai scripting engine) avulla
Johdatus skriptikieliin Jotta skriptikielistä ohjelmaa voidaan ajaa, tulee skripti useimpien kielten osalta muuntaa tavukoodiksi Useimmissa kääntäjissä tämä koostuu kolmesta vaiheesta: Selaus eli leksikaalinen analyysi (tokenization) Muunnetaan skriptin merkkijonot tekstialkioiksi (tokens) Jäsentäminen eli syntaksianalyysi (parsing) Analysoidaan tekstialkoina oleva koodi, jotta voidaan selvittää ohjelman syntaktinen rakenne. Koodin generointi (code generation) Muodostetaan aiempien vaiheiden perusteella ohjelman tavukoodi, jota voidaan edelleen ajaa tulkin avulla
Pelitekoälyä skriptikielillä Esimerkki skriptikielen hyväksikäyttämisestä pelin tekoälyn toteuttamisessa mainitsemattomassa pelissä Eräässä pelin osassa sotilasryhmän tulee vallata huone tietyn ohjeistuksen mukaan
Pelitekoälyä skriptikielillä Valtaus toteutetaan neljällä erillisellä skriptillä Liiku sijaintiin oviaukon edustalla Heitä kranaatti ovesta sisään Liiku lähellä olevaan kulmaan huoneessa Suojaa oviaukon sisäpuoli Skriptejä koordinoidaan ylemmän tason skriptillä Ylemmän tason skriptin tulee selvittää kaksi lähintä nurkkaa, joka voidaan toteuttaa jollain muulla tekoälymenetelmällä tai kenttien sunnitteluvaiheessa Selvittämällä tarvittava tieto tällä tasolla mahdollistaa neljän aiemman skriptin uudelleenkäyttämisen myös muun muotoisissa huoneissa. Vajaiden ryhmien toimintaa ohjataan jollain muulla ylemmän tason skriptillä, joka koordinoi hahmojen toimintaa eri tavalla.
Pelitekoälyä skriptikielillä Yksinkertaisempaakin tekoälyagenttien toimintaa voidaan saada aikaan kirjoittamalla kullekin tehtävälle tai toiminnalle sopiva skripti, jonka suorittamista ohjataan jollain menetelmällä Menetelmä voi olla ylemmän tason skripti, jokin tapahtuma pelissä, tai niin sanottu triggeri, johon palaamme myöhemmin Esimerkissä saatiin aikaan suhteellisen monimutkaiselta vaikuttavaa toimintaa käyttämällä hyväksi joukkoa skriptejä, jotka jakavat ongelman joukoksi yksinkertaisempia toimintoja
Pelitekoälyä skriptikielillä Triggerijärjestelmä on yksinkertainen tapa saada pelin tekoälyagentit vuorovaikutukseen pelimaailman kanssa. Pidetään kirjaa pelimaailman tapahtumista, joiden kanssa tekoälyagentti voi olla vuorovaikutussuhteessa Pyritään minimoimaan prosessointi, jota käytetään näihin vuorovaikutuksiin
Pelitekoälyä skriptikielillä Triggeri on jokin agenttiin vaikuttava asia tai tapahtuma pelissä: Ampumisäänen kuuleminen Vähäinen elämäpisteiden määrä Hissin eteen saapuminen Esimerkki: Agentti näkee pelaajan ampuvan itseään kohti Agentti hakeutuu suojaan laatikon taakse Agentti heittää suojan takaa kranaatin pelaajaa päin Vertaa toiminnan aikaansaaminen joukolla triggereitä, jotka käynnistävät skriptejä vs. skriptien koordinointi tehtävää varten suunnitellulla ylemmän tason skriptillä
Pelitekoälyä skriptikielillä Tekoälyn kannalta triggereiden käyttäminen on yksinkertaista, koska siinä ei tapahdu päätöksentekoa: pikemminkin saadaan ärsykkeitä, joihin reagoidaan jollain määrätyllä tavalla. Samantyyppistä toimintaa voidaan toteuttaa myös muilla menetelmillä, kuten ns. ”polling”.
Etuja ja haittoja Tulkattavat skriptikielet ovat huomattavasti hitaampia, kuin konekieliset ohjelmat Esim. UnrealScript on arviolta 20 kertaa hitaampi kuin konekielinen ohjelma Toisaalta tulkattavaa skriptiä ei ole pakko ajaa jatkuvasti, eikä sitä ole pakko suorittaa loppuun yhdellä kertaa, jos prosessointiresurssit loppuvat Tärkeimmät osat peliä lienee syytä ohjelmoida nopeammalla ohjelmointikielellä Skriptien kirjoittamisessa on hyvä tähdätä kirjoittamaan skriptejä, joita ei juurikaan ajeta
Etuja ja haittoja Tehottomuutta voidaan auttaa toteuttamalla skriptitekoäly ns. milloin-vain-algorimina (anytime algorithm) Tällöin ajettaessa skriptiä voidaan pyytää tulos, vaikka ajaminen olisi edelleen kesken Usein välitulos voi riittää siihen, että ruudulla tuntuu tapahtuvan jotain järkevää Vertaa hieman väärään suuntaan liikkuva hahmo ja paikallaan seisova, tulevaisuudessa oikeaan suuntaan liikkuva hahmo – kumpi vaikuttaa älykkäämmältä? Soveltuu hyvin käytettäväksi tulkattavan skriptikielen kanssa, koska tulkkaaminen voidaan keskeyttää
Etuja ja haittoja Merkittävimpiä skriptikielten etuja on itse pelin ohjelmoinnin ja skriptien kirjoittamisen erottaminen toisistaan Usein tekoälytapahtumia, triggereitä, tms. saattaa kirjoittaa kentän suunnittelija, joka haluaa tekoälyhahmon toimivan älykkäältä vaikuttavalla tavalla jonkin pelikenttään lisätyn elementin kanssa Pelien ”modaaminen”, eli harrastelijoiden tekemät muunnokset peliin voivat lisätä pelin hyllyikää ja suosiota Käytännössä melkein kaikki suositut FPS-genren pelit tarjoavat jonkinlaista skriptaamiseen liittyvää muokkausmahdollisuutta.
Etuja ja haittoja Väliohjelmistojen ja skriptitekoälyn suhde on ongelmallinen Jos pyritään tekemään skriptikielisenä väliohjelmistona tekoälypakettia, sidotaan paketin käyttäjä kyseiseen skriptikieleen tai tuodaan jo valmiiksi riittävän monimutkaiseen peliprojektiin mahdollinen toinen skriptikieli Toisaalta pelin kehittäjä saattaa haluta mahdollisuuden laajentaa tekoälypakettia omilla skripteillä tai tarjota harrastelijoille mahdollisuuden samaan
Etuja ja haittoja Skriptikielen valinta voi olla vaikeaa Yleisesti käytetyt skriptikielet kuten Lua, TCL, jne. voivat tarjota jonkinlaisen ratkaisun, toisaalta ne eivät tällöin ole räätälöityjä juuri kyseiseen kehitteillä olevaan peliin Useat pelit ovat käyttäneet omaa skriptikieltään UnrealScript, Quake-C, BGScript, NWScript, jne. Skriptikielen toteuttaminen voi kuitenkin olla sudenkuoppa Huolehdittava kielen suunnittelusta, kääntäjästä, tulkista ja skriptikielen sitomisesta konekieliseen ohjelmaan Skriptikielelle tulevaisuudessa esitettävät vaatimukset voivat olla yllättäviä ja niihin voi olla vaikeaa varautua
Lopuksi... Pelitekoälyn tai sen osan toteuttaminen skriptikielellä on ohjelmiston arkkitehtuuriin liittyvä valinta Tekoälyssä käytetyt algoritmit ovat valinnasta riippumatta pääosin samoja Skriptikielen mukaan ottaminen tekoälyä toteutettaessa on erityisen järkevää vain jos sille on selvä tarve Halutaan esim. nimenomaan c++:aa taitamaton kenttäsuunnittelija toteuttamaan tekoälyä Pieniin peliprojekteihin skriptikielen sisällyttäminen voi olla huono ratkaisu Sama pätee esimerkiksi puhelimilla pelattaviin peleihin Vaikka tekoälyä toteutetaan skriptikielellä, ei kaikkia tekoälykomponentteja ole pakko toteuttaa skriptaamalla Reitinetsintä, ym. vaativa, joskin yleiskäyttöinen koodi mieluummin pelin pääasiallisella ohjelmointikielellä