最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

《超級(jí)馬里奧64》的AI技術(shù)分析

2022-04-21 17:33 作者:皮皮關(guān)做游戲  | 我要投稿

原文鏈接:https://www.gamedeveloper.com/blogs/analysing-the-ai-of-super-mario-64

作者:Tommy Thompson

譯者:網(wǎng)易·毛毛

校對(duì)/編輯/潤(rùn)色:皮皮關(guān)


《超級(jí)馬里奧64》是有史以來最重要、最受歡迎的電子游戲之一。在行業(yè)的關(guān)鍵階段,它確立了3D游戲的標(biāo)準(zhǔn)。它給N64以及其他競(jìng)爭(zhēng)平臺(tái)上的游戲帶來了深遠(yuǎn)影響。

但這是如何做到的?游蕩在Bob-Omb mountain、Whomp’s Fortress以及Tick Tock Clock(注:都是《超級(jí)馬里奧64》中的關(guān)卡)中的栗寶寶慢慢龜,它們腦子里都在想些啥有趣的事情呢?讓我們來了解一下。


打開引擎蓋

《超級(jí)馬里奧64》發(fā)售已經(jīng)超過25年了,它的AI可能很簡(jiǎn)單,但我們需要意識(shí)到這款游戲的意義。它是游戲開發(fā)歷史上的一個(gè)關(guān)鍵點(diǎn),是N64平臺(tái)最暢銷的游戲,標(biāo)志著游戲開發(fā)從此進(jìn)入 3D 時(shí)代。它對(duì) 3D 游戲的設(shè)計(jì)產(chǎn)生了巨大影響。雖然它不是第一款 3D 平臺(tái)跳躍游戲,也不是任天堂制作的第一款 3D 游戲,但《超級(jí)馬里奧 64》的遺產(chǎn)不容小覷。Tim Schaeffer和Michael John等設(shè)計(jì)師直言不諱地表示,它直接影響了他們的游戲,例如《腦航員》《小龍斯派羅》。雖然鏡頭控制等領(lǐng)域還有必要進(jìn)一步迭代,但視覺設(shè)計(jì)、角色動(dòng)畫、玩家移動(dòng)、關(guān)卡和任務(wù)構(gòu)建等方面為許多其他游戲直接建立了模板。

盡管當(dāng)時(shí)的AI無(wú)疑還處于初級(jí)階段,但任天堂構(gòu)建和設(shè)計(jì)《超級(jí)馬里奧64》中行為的方法,仍然非常值得分析。為此,我下載了 GitHub 上的 Mario 64 反編譯。該項(xiàng)目首次發(fā)布于2019年,是業(yè)余反編譯者社區(qū)的眾多作品之一,他們將ROM的原始二進(jìn)制文件逆向工程成可解析、易讀的C語(yǔ)言代碼。所以我所講述的并不是基于任天堂本身的原始源代碼,而是公開的、盡可能接近原始代碼的逆向工程代碼。


這種反編譯并不是為了竊取《馬里奧》游戲的資產(chǎn)素材或者移植到新的平臺(tái)。取而代之的是,它是一種幫速通愛好者們找到新漏洞的機(jī)制。對(duì)涉及這個(gè)項(xiàng)目的開發(fā)者來說,能夠拼湊出這個(gè)謎題的答案,哪怕一次只拼一個(gè)功能,都是很棒的回報(bào)。像這樣反編譯源代碼從來都不是一件容易的任務(wù),而我們還必須弄清楚他們?cè)?996年使用了哪些開發(fā)工具,這就讓事情變得更加困難。要反編譯這樣的游戲,需要了解是哪個(gè)版本的Silicon Graphics IDO編譯器生成的原始ROM文件。而測(cè)試它們需要模擬原始Silicon Graphics開發(fā)單元(SGI Visual Workstation)的系統(tǒng)行為,因?yàn)檫@就是開發(fā)者們?yōu)镹64開發(fā)游戲所用到的機(jī)器。這是一項(xiàng)真正的工程壯舉。如果您想了解有關(guān)這項(xiàng)工作的更多信息,包括反編譯《塞爾達(dá)傳說:時(shí)之笛》等作品的努力,可以看看這篇arstechnica 文章。

正確配置后,經(jīng)過反編譯的源代碼可以為游戲最終版本編譯 每個(gè)區(qū)域(日本、美國(guó)和歐洲)的ROM文件。但為了創(chuàng)建一個(gè)完全可玩的游戲,您仍然需要原始游戲 ROM 的副本,因?yàn)樵擁?xiàng)目?jī)H包含社區(qū)編寫的源代碼。它不包含任何游戲內(nèi)資產(chǎn)。意味著你不能只編譯它:?jiǎn)眩螒虻拿赓M(fèi)版get。

對(duì)象和行為

有關(guān)《馬里奧64》的代碼是如何被拆解的,首先需要意識(shí)到:游戲世界中的幾乎每個(gè)元素,除了關(guān)卡幾何空間之外,都被視為一個(gè)對(duì)象。大多數(shù)游戲?qū)ο笠部梢愿郊右粋€(gè)行為。 ?

行為支持各種常見功能,例如在某個(gè)位置生成一個(gè)對(duì)象(例如金幣),讓某個(gè)對(duì)象因交互而下落,為游戲中對(duì)象之間的碰撞定制碰撞盒,當(dāng)提示出現(xiàn)時(shí)自動(dòng)把臉轉(zhuǎn)向鏡頭,當(dāng)對(duì)象被破壞時(shí)禁用渲染器等等。行為腳本并非 AI 角色獨(dú)有:移動(dòng)平臺(tái)、門、金幣、火球、沖擊波,甚至一些樹木和蝴蝶都被認(rèn)為是具有行為的,因?yàn)樗鼈兌家阅撤N形式對(duì)游戲世界做出反應(yīng)。

不過,所有帶有行為腳本的對(duì)象都有兩個(gè)主要函數(shù),begin()函數(shù)和update()函數(shù)。它們做了兩件非常具體的事情,begin() 負(fù)責(zé)配置游戲中剛生成的這個(gè)對(duì)象,而 update() 則處理游戲每幀或每個(gè)時(shí)隙的對(duì)象行為?!恶R里奧 64》通常以每秒 30 幀運(yùn)行,在某些最激烈的部分以大約 20 幀運(yùn)行。因此,begin() 僅在對(duì)象存在的第一幀被調(diào)用,而update() 在之后的每一幀都會(huì)被調(diào)用。如果你自己是一名游戲開發(fā)者,那么這一切對(duì)你來說都非常熟悉,因?yàn)?Unity 和 Unreal 之類的引擎具有類似的結(jié)構(gòu)。 ? ?

update()函數(shù)處理每個(gè)對(duì)象類型的常見行為命令執(zhí)行,沿 x 和 z 軸以及 y 軸(補(bǔ)償重力)的單位移動(dòng)。此外,它還會(huì)留意管理動(dòng)作計(jì)時(shí)器的所有邏輯,對(duì)象是否從一個(gè)動(dòng)作切換到另一個(gè)動(dòng)作,所有這些都是粗略實(shí)現(xiàn)的有限狀態(tài)機(jī),主要來自代碼中的條件分支。但最重要的是檢查馬里奧相對(duì)于它的位置——這實(shí)際上是每個(gè)對(duì)象所做的第一個(gè)計(jì)算。 ?


每個(gè)帶行為腳本的對(duì)象所進(jìn)行的前兩次計(jì)算都是計(jì)算出與馬里奧之間的距離,以及轉(zhuǎn)向和面朝馬里奧所需的角度。我們很快就能看到這些會(huì)被用于各種AI功能。但它也被廣泛用于游戲內(nèi)部對(duì)象的渲染?!冻?jí)馬里奧64》中的每個(gè)行為驅(qū)動(dòng)對(duì)象都是基于其與馬里奧的接近程度而決定是否渲染。每個(gè)對(duì)象都有自己的繪制距離參數(shù),每一幀它都會(huì)檢查馬里奧現(xiàn)在是否比繪制距離更遠(yuǎn),答案如果是肯定的,那這時(shí)它就會(huì)告訴該對(duì)象的渲染器禁用自己。有趣的是,我找不到證據(jù)表明,當(dāng)馬里奧離得太遠(yuǎn)時(shí)行為本身不會(huì)被執(zhí)行。

唯一的例外是在房間里?!恶R里奧》的關(guān)卡要么是開放空間,如Bob-Omb Battlefield,要么由多個(gè)房間組成。這方面的三個(gè)典型例子是Peach’s Castle,Big Boo’s haunted和Hazy Maze Cave。在這些情況下,只有當(dāng)馬里奧在同一個(gè)房間時(shí),該對(duì)象才會(huì)渲染。事實(shí)上,許多行為腳本也只有在馬里奧也處在同一個(gè)房間時(shí)才會(huì)被激活。

除了主要行為函數(shù)之外,一個(gè)對(duì)象還會(huì)攜帶一個(gè)特殊的指針,該指針會(huì)指向單獨(dú)的行為命令腳本。這些腳本是為游戲更定制化的元素而編寫的,并能執(zhí)行大部分的游戲交互和行為邏輯。游戲中有超過 500 個(gè)像這樣的機(jī)制,包括特定的NPC行為,觸發(fā)收集紅色硬幣,激活陷阱,甚至收集能量星結(jié)束關(guān)卡。

但除此之外,還有一些碰撞盒決定了馬里奧如何與物體之間互動(dòng)。如果你對(duì)碰撞盒的概念不太熟悉的話這里介紹一下:碰撞盒會(huì)告訴游戲邏輯“有兩個(gè)物體正在交互”,進(jìn)而可以讓游戲根據(jù)具體情景讓不同的事情發(fā)生。就像馬里奧殺死敵人,或者敵人傷害玩家一樣。有趣的是,《馬里奧 64》 中幾乎所有的敵人都擁有兩個(gè)碰撞盒,而且它們都是圓柱形的。一個(gè)是用于游戲內(nèi)碰撞和邏輯的標(biāo)準(zhǔn)對(duì)象碰撞盒,另一個(gè)則是傷害碰撞盒 ,僅適用于馬里奧會(huì)受到傷害的情況。大多數(shù)NPC都會(huì)使用傷害碰撞盒,它的高度和半徑都與標(biāo)準(zhǔn)碰撞盒不同。然而也有一些例外,特別是Koopa the Quick(跑得很快的那個(gè)慢慢龜),他沒有用上傷害碰撞盒,因?yàn)樗皇前涯銖纳磉呁崎_,而不是在碰撞時(shí)觸發(fā)傷害。

NPC設(shè)計(jì)

與主要行為腳本一樣,NPC 用到的單獨(dú)行為動(dòng)作腳本也有有自己的begin()和update()函數(shù)。這里我會(huì)介紹我在當(dāng)中發(fā)現(xiàn)的一些有趣的東西。 ? ?

如前所述,所有游戲?qū)ο笤阡秩緯r(shí)都會(huì)計(jì)算它們與馬里奧的距離和角度,但許多NPC也會(huì)將此作為其核心邏輯。玩過游戲的玩家可能會(huì)注意到這一點(diǎn),因?yàn)槔鯇殞毢吐敃?huì)對(duì)馬里奧的出現(xiàn)做出反應(yīng)。

但除此之外,很多角色還記錄了他們的“家”。這是游戲世界中的某個(gè)位置,相當(dāng)于它們存儲(chǔ)了一個(gè)關(guān)于它們出生的準(zhǔn)確位置(或附近)的引用。這是為了讓 NPC 大致知道當(dāng)關(guān)卡加載時(shí)它在游戲世界中的大致位置。

值得一提的是,《馬里奧64》中的NPC無(wú)法通過導(dǎo)航網(wǎng)格計(jì)算出在游戲世界中的移動(dòng)方式。因?yàn)槟?,我們現(xiàn)在普遍認(rèn)為游戲引擎中的導(dǎo)航網(wǎng)格直到 1999 年《雷神之錘3:競(jìng)技場(chǎng)》才開始存在。相反地,像栗寶寶和慢慢龜這樣的NPC會(huì)四處游蕩,在改變之前會(huì)走多遠(yuǎn)有固定的規(guī)則,并且通常會(huì)以固定的角度旋轉(zhuǎn)方向。你會(huì)注意到它們大部分時(shí)間都在地表運(yùn)動(dòng),另外《馬里奧64》的關(guān)卡中并未充斥著雜亂無(wú)章的物件,這意味著它們很難被障礙卡住。只有少數(shù)敵人能夠在平臺(tái)間移動(dòng),但這主要是由于跳躍時(shí)的撞大運(yùn),又或者它們本來就會(huì)到處飛,而不是代碼級(jí)別所發(fā)生的事情。


但當(dāng)四處走動(dòng)時(shí),它們經(jīng)常注意兩件事。首先是:自己是否會(huì)與墻壁發(fā)生碰撞,如果答案是肯定的,則它們會(huì)轉(zhuǎn)身遠(yuǎn)離。但怎么知道所面對(duì)的是一面墻呢?有一些函數(shù)可以讓它們根據(jù)當(dāng)前的朝向解決碰撞問題,而且通常能保留一些回旋的空間。這同樣適用于它們看向馬里奧的時(shí)候。不是基于它們的確切朝向(因?yàn)槟翘_了),而是“在他們朝向的某個(gè)范圍內(nèi)物體是否在面前”。某些情況下(尤其是栗寶寶)會(huì)簡(jiǎn)單地對(duì)馬里奧在他們一定距離內(nèi)做出反應(yīng),而不管方向如何。

它們關(guān)注的第二個(gè)關(guān)鍵事實(shí)是:離家有多遠(yuǎn)。每個(gè) NPC 對(duì)允許離家多遠(yuǎn)有不同的規(guī)則,無(wú)論是離家的總距離(這是栗寶寶和慢慢龜用到的邏輯)還是到特定軸上的累計(jì)距離(炸彈兵用的這個(gè))。又或者像羞羞鬼這樣,判斷是否落在其原點(diǎn)的某個(gè)半徑內(nèi)(用 X 和 Z軸的 移動(dòng)來計(jì)算)。無(wú)論哪種情況,通用規(guī)則是他們會(huì)轉(zhuǎn)身,面向家,然后開始朝那個(gè)方向游蕩。但在某些情況下,特別是炸彈兵和Bully,他們只有在覺得安全的情況下才會(huì)回家,這取決于馬里奧目前是否在他們家附近。

就是這樣的邏輯封裝了大多數(shù)角色,不過與此同時(shí)它們也都有自己獨(dú)特的預(yù)警情況。如果總距離太遠(yuǎn),栗寶寶就會(huì)急轉(zhuǎn)遠(yuǎn)離墻壁并沖回家。而如果馬里奧離得太近,無(wú)論角度如何,它們都會(huì)開始追趕,閾值大概是500個(gè)距離單位,且追逐總是優(yōu)于跳躍。供參考:距離單位幾乎直接映射到現(xiàn)實(shí)世界中的厘米。馬里奧在游戲中的身高為 161 個(gè)單位,根據(jù)馬里奧wiki -他的設(shè)定身高也為 155 厘米。因此當(dāng)我們說栗寶寶在 500 單位以內(nèi)時(shí),差不多就是不到5米。


與此同時(shí),慢慢龜也有類似的邏輯,盡管他們會(huì)在 300 距離單位內(nèi)就會(huì)逃離馬里奧。慢慢龜邏輯中有趣的部分是,一旦你跳到它們背上,它們會(huì)失去外殼。通常他們會(huì)試圖跑回外殼中,但馬里奧此時(shí)往往離得很近,因此經(jīng)常會(huì)迫使他們逃跑。但是,如果殼足夠近,盡管此時(shí)馬里奧也很近,它還是會(huì)冒險(xiǎn)嘗試潛入殼中。

就像前面提到的,炸彈兵會(huì)根據(jù)他們離家的某個(gè)軸上移動(dòng)的距離進(jìn)行尋路。雖然坦率講他們很難在之后全身而退(炸彈兵經(jīng)常會(huì)自爆)。但與其他敵人(例如栗寶寶)不同的是,當(dāng)一個(gè)炸彈兵死亡時(shí),它會(huì)觸發(fā)代碼中的重生函數(shù),這將在馬里奧安全離開后,于上一個(gè)重生地創(chuàng)建一個(gè)全新的炸彈兵。

與此同時(shí),諸如“砰砰”(石板狀的敵人)這樣的其他敵人,會(huì)檢查它們離家的距離,并將其與預(yù)定義的巡航距離進(jìn)行比較,然后基于具體關(guān)卡進(jìn)行配置。絕大部分關(guān)卡中砰砰的巡航距離都相同,但Bowser in the Sky關(guān)卡是例外,在這一關(guān)中巡航距離要短得多。

出現(xiàn)在Tick Tock Clock關(guān)卡和Wet Dry World關(guān)卡中的 Heave-Ho(一種發(fā)條機(jī)器人外形的敵人)也用到了家的概念 以及馬里奧的位置,但方式略有不同:Heave Ho 在一開始就會(huì)記錄它的家的位置。一旦馬里奧進(jìn)入家的一定范圍內(nèi),它就會(huì)開始瞄準(zhǔn)馬里奧了。

現(xiàn)在我不能不提《馬里奧64》里的魚了!這種魚有兩種顏色:藍(lán)色和青色。對(duì)應(yīng)生成的魚群有兩種變體:20條魚的大魚群,和5條魚的小魚群。魚以不同的初始速度開始生成(添加了一點(diǎn)隨機(jī)噪聲),另外它們?cè)谒械母叨纫矔?huì)有所變化,這樣確保它們不會(huì)聚集在一起。

魚本身有一套非常簡(jiǎn)單的行為,它們會(huì)下潛和上浮,轉(zhuǎn)動(dòng)固定角度(加一些隨機(jī)噪聲),然后確保能返回。它們的高度通常被限制,以讓它們不能靠近水面,如果不慎靠得太近了則會(huì)被施加一個(gè)很強(qiáng)的負(fù)豎直速度。一個(gè)例外是Secret Aquarium關(guān),因?yàn)樵撽P(guān)卡不存在水面。

為確保它們不會(huì)離開原點(diǎn)太遠(yuǎn),魚只能在大約 700 個(gè)距離單位的固定范圍內(nèi)移動(dòng)。但魚群通常會(huì)在距馬里奧1500 到 2000 個(gè)距離單位的位置生成。因此,700 個(gè)單位意味著魚只在 7 米左右的范圍內(nèi)真正游動(dòng)。魚生成的位置距離馬里奧約 15-20 米。另外,所有的魚都會(huì)對(duì)在水中的馬里奧做出反應(yīng)。當(dāng)距離馬里奧不到 150 單位時(shí),它們會(huì)轉(zhuǎn)而指向遠(yuǎn)離馬里奧的方向,并且會(huì)開始加速。這一切都為游戲行業(yè)設(shè)立了未來許多年都會(huì)遵循的一種標(biāo)準(zhǔn)。

要了解更多有趣的事實(shí),一定要瞅瞅視頻中的“speed round”部分。

結(jié)語(yǔ)

考慮到這是油管系列中的第64集,所以安排《超級(jí)馬里奧64》是合理的。關(guān)于更多N64的分析,請(qǐng)參考我關(guān)于《007黃金眼》AI的文章。另外,如果你喜歡有關(guān)源代碼的片段,一定要看看我在《命令與征服》、《半條命》和《極度恐慌》中的AI。

想要學(xué)習(xí)更多游戲開發(fā)的知識(shí),歡迎大家了解了解皮皮關(guān)與網(wǎng)易聯(lián)合開發(fā)的游戲開發(fā)線上課程《網(wǎng)易游戲開發(fā)就業(yè)班(Unity)》。第二期招生火熱進(jìn)行中,戳下面鏈接便可了解課程詳情:https://ke.study.163.com/course/detail/100106669

無(wú)論是課程還是游戲開發(fā)的相關(guān)問題,快來咨詢我們網(wǎng)易云課堂游戲開發(fā)專屬助教老師——YOYO(快來拍一拍老師,一起學(xué)習(xí)吧!)


《超級(jí)馬里奧64》的AI技術(shù)分析的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
噶尔县| 庆城县| 汾西县| 乐都县| 廉江市| 义乌市| 墨脱县| 柞水县| 新巴尔虎右旗| 徐闻县| 威海市| 聂荣县| 磐石市| 日土县| 二连浩特市| 都匀市| 郯城县| 唐河县| 西平县| 海南省| 松溪县| 体育| 银川市| 旌德县| 崇礼县| 敦化市| 铜陵市| 青铜峡市| 皋兰县| 孟连| 礼泉县| 洪雅县| 衡阳县| 长汀县| 太白县| 大渡口区| 韶山市| 合川市| 望谟县| 恩施市| 宁海县|