游戲策劃ai設(shè)計學(xué)習(xí)01----ai基礎(chǔ)
什么是ai
在文章初期首先給要討論到的ai做一下定性。
即什么是ai。ai即人工資能(Artificial Intelligence)在廣義上討論ai時有的人會認為所有機器表現(xiàn)出來的能被認為是智能的表現(xiàn)都是ai,但同時在討論智能的時候會涉及到很多復(fù)雜的問題,如意識,自我,思維等,也就是我們時常說機器人會不會有自己的意識,意識到自己是機器人等等。
游戲ai的應(yīng)用也是相對廣泛和靈活的,任何能夠以一種讓玩家認為是智能的方式實現(xiàn)的,讓玩家的游戲體驗更加具有沉浸性和挑戰(zhàn)性的內(nèi)容,我們都可以稱之為ai。其中有兩個要點①玩家認為是智能的;②目的是讓玩家的游戲體驗更有沉浸性和挑戰(zhàn)性
如游戲中的尋路,讓主角或者npc像真人一樣會朝著目標(biāo)找到合適的路線并進行移動,也可以被稱為是ai。根據(jù)玩家選項不同npc會進行不同的對話分支也可以算做ai的內(nèi)容
會涉及到哪些內(nèi)容
文章內(nèi)容為游戲策劃向內(nèi)容,所以不會涉及到具體的代碼實現(xiàn)。更多是一些ai基礎(chǔ)知識,常用的ai制作工具如行為樹、狀態(tài)機等,以及一些策劃向的游戲ai的方案
什么是ai(從運行流程理解)
很多人在游戲制作提到ai就會將其與行為樹、狀態(tài)機等劃等號,包括本文其實更多也是在介紹這兩者,但實際上他們并不是相等的,可以從多個視角來解析ai的表現(xiàn)和什么是ai這個問題
玩家視角:
從玩家視角來看,如上所述,任何能夠被玩家認為是智能的表現(xiàn)都可以被稱為是ai,怪物的行動,策略,npc會和玩家溝通,尋路等等,這些具體的行為會被玩家理解為ai
工具視角:
大多時候我們策劃制作ai就是編寫行為樹和狀態(tài)機等,所以會潛意識中將其劃傷等號
運行流程視角:
實際上ai的運行和我們?nèi)祟惖乃伎家粯樱ㄏ瘳F(xiàn)在很多ai技術(shù)都是想模擬人類的思考方式)在游戲的每一幀(游戲運行的最小時間單位,也可以是程序設(shè)定的時間間隔),npc都會對當(dāng)前要做什么進行規(guī)劃,即現(xiàn)在要去做什么,然后判斷這個事情能做成嗎,如果不能做成或者這件事情做完了,后續(xù)要做什么。
在這個流程中行為樹或狀態(tài)機等,就是在npc思考要干什么時把要做的事情告訴他,但顯然在這個流程中,我們是用行為樹,還是狀態(tài)機亦或是單獨寫腳本去告訴ai現(xiàn)在要干什么都是沒有區(qū)別的,這些都只是ai執(zhí)行流程中將數(shù)據(jù)錄入的方法之一罷了,并不會太影響整個ai的運行流程
在這個例子中只包括了規(guī)劃內(nèi)容,實際上ai還會包括具體執(zhí)行,比如每個具體的節(jié)點的執(zhí)行和一些執(zhí)行流程上的打斷情況。
但這里主要是想說明行為樹和狀態(tài)機等只是ai錄入數(shù)據(jù)的方法之一,并不等價于ai,實際上ai還可以有更多設(shè)計內(nèi)容和方向,行為樹和狀態(tài)機作為一種錄入數(shù)據(jù)的方法也可以應(yīng)用在很多非ai的內(nèi)容中
設(shè)計ai的目的
正如上文所說,游戲ai是為了提升玩家的游戲體驗,這一章節(jié)會列舉一些常見的能提升玩家體驗的ai設(shè)計方向,并不是ai設(shè)計的全部內(nèi)容,但是是筆者認為相對比較基礎(chǔ)的必要內(nèi)容
感知信息
這里說的感知信息主要有兩個方面:
①通過信息進行判斷,即ai可以通過一些信息做出基本的判斷。這不難理解,一個npc看到了前方出現(xiàn)了敵人那他就應(yīng)該開槍,這一行為的前提就是他能夠“看到”敵人
②以合理的方式獲得信息,如上所說ai的目的是以讓玩家認為智能的方式提升玩家的游戲體驗,如上一條,npc看到了玩家所以開槍是符合定義的,但如果npc有無限的視野能夠隨時隨地知道玩家的位置并且追過去擊殺玩家,顯然這樣的ai太過“智能”了,對玩家的游戲體驗也是毀滅性的
文章中會盡量通過一些具體游戲的案例方便大家閱讀理解。
第二點提到的過于智能的ai,如王者榮耀的人機ai(早年玩的時候是這樣不知道現(xiàn)在還是不是),當(dāng)玩家打龍時,ai就會直接前往龍坑抓玩家,這是很符合游戲規(guī)律的,但ai并不是“像正常玩家一樣獲取某些信息后判斷玩家可能在打龍,然后前往龍坑”而是只要玩家去了龍坑不管ai有沒有獲得相關(guān)的視野信息,ai都會前往龍坑
一致的反饋
這里提到的一致的反饋并不是絕對的,主要針對大部分ai情況。
玩家需要一定的規(guī)律來進行判斷和制定計劃,正如一開始的定義,ai的目的是為了提升玩家的游戲體驗,現(xiàn)實中人的行動可能是極難預(yù)測的,但如果游戲中的ai也設(shè)定成極難預(yù)測,就意味著游戲難度和可控性(甚至可能出現(xiàn)無法通關(guān)的情況)都會很差。
同時隨著現(xiàn)在ai發(fā)展,有的游戲已經(jīng)開始通過接入chatgpt等方式讓npc的對話不再時重復(fù)的,一定程度上和這里提到的一致的反饋有所沖突。但實際上盡管如此,在設(shè)計上還是會需要npc有一定的一致的反饋
一定的智力
這里同樣是為了提升玩家的體驗,如果ai過于智能如上所說能獲得一些超越玩家的信息,那游戲體驗將會很差,同樣的如果ai過于弱小,游戲體驗一樣會很差。
①過于弱小的AI,玩家無法從擊敗他獲得成就感
②同時AI不笨并不意味著他就很聰明,AI的智力不應(yīng)該體現(xiàn)在智力本身的強弱,而應(yīng)該體現(xiàn)在“可信”的范圍內(nèi)(可以簡單理解為符合玩家-正常人對其他人類行動的認知,合情合理)合理的犯錯給于玩家機會,玩家出現(xiàn)大的失誤時會抓住機會
常見的npc-ai制作方式(狀態(tài)機與行為樹)
這里只會介紹最基礎(chǔ)的行為樹和狀態(tài)機的入門級基礎(chǔ)內(nèi)容
目前以及很長一段時間,游戲的npc-ai都是用狀態(tài)機和行為樹的方式制作的,其目的和表現(xiàn)整體上無太大差別,都是讓npc或者怪物等游戲中的單位,能夠以一定規(guī)律行動,或者是在一定情況下改變自己的運動狀態(tài)(本來在巡邏,看到玩家進入戰(zhàn)斗狀態(tài),擊退玩家后回到巡邏狀態(tài))
狀態(tài)機
狀態(tài)機和行為樹的本質(zhì)目的都是更簡單更方便的實現(xiàn)ai的方式,所以并不是絕對的方式,在后面的內(nèi)容中也會提到這兩者之外的一些方式,但這兩者是目前最常見也是最基礎(chǔ)比較方便策劃理解的實現(xiàn)方式
什么是狀態(tài)機
我們提到的狀態(tài)機實際上指的是有限狀態(tài)機(finite state machine,F(xiàn)SM),其內(nèi)容為表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的模型。如果完全沒有相關(guān)知識不太理解狀態(tài)機的定義可以看下面這個例子
在我們玩超級馬里奧的時候,按下跳躍鍵角色就會騰空并擺出跳躍的動作直到落地,而當(dāng)我們按住前進鍵角色就會播放奔跑的動作并移動。
這個流程用狀態(tài)機來描述可以描述為:
①首先角色擁有三個狀態(tài)分別是站立不動(Idle),跳躍(Jump),奔跑(Run),這三個狀態(tài)都包括了一系列動作,如跳躍包括了躍起的動作,滯空的動作,落地的動作。而同時角色有著兩個輸入事件,跳躍鍵,和奔跑鍵
②角色一開始處于站立不動(Idle)的狀態(tài),當(dāng)玩家輸入跳躍鍵(事件)的時候,角色就進入到了跳躍(Jump)的狀態(tài),而當(dāng)角色落地(事件)時又回到了站立不動(Idle)的狀態(tài)
③同理,當(dāng)玩家按住奔跑鍵時(事件),角色就進入了奔跑(Run)狀態(tài),在奔跑(Run)狀態(tài)下松開奔跑鍵(事件),角色就恢復(fù)到了站立不動(Idle)的狀態(tài)
理解了狀態(tài)機的定義后就會發(fā)現(xiàn),用狀態(tài)機的“狀態(tài)-事件”去描述游戲中角色的動作會更加方便,我們可以將各個動作都視為一個黑盒先不用去考慮里面是什么動作只需要先考慮清楚角色有什么動作,這些動作狀態(tài)之間切換的條件是什么,就可以完成一個簡單的動作循環(huán)設(shè)計,然后再去設(shè)計具體的每個狀態(tài)機內(nèi)動作的序列是如何的
狀態(tài)機的特點可以總結(jié)為以下幾點
只有有限的狀態(tài)數(shù)量。對于馬里奧的例子來說:只有站立,跳躍,奔跑這幾個狀態(tài)。
狀態(tài)機某一時刻只能處于某一個狀態(tài)。對于我們的例子來說:我們的角色不能同時處于跳躍和站立狀態(tài)。實際上,也是為了阻止這種情況,我們才選擇使用有限狀態(tài)機。這一點其實也是很好理解的
會有一系列輸入或者叫事件被狀態(tài)機處理。對于我們的例子來說就是玩家按下或松開某個按鍵。
每個狀態(tài)可以支持一組轉(zhuǎn)換,每個轉(zhuǎn)換由輸入(或者叫事件)和目標(biāo)狀態(tài)定義。當(dāng)有一個當(dāng)前狀態(tài)所支持的的輸入(或者叫事件)到來,狀態(tài)機會從當(dāng)前狀態(tài)轉(zhuǎn)換到目標(biāo)狀態(tài)。對于我們的例子來說:當(dāng)英雄處于站立狀態(tài)時,玩家按下跳躍鍵,英雄會從站立狀態(tài)轉(zhuǎn)換到跳躍狀態(tài)。對于當(dāng)前狀態(tài)所沒有支持的轉(zhuǎn)換輸入到來,狀態(tài)機會直接忽略掉。
而在繪制狀態(tài)機的示意圖時,我們通常會用方框,箭頭,和箭頭標(biāo)注去描述狀態(tài)機,如下圖每一個方框代表一個狀態(tài),而箭頭的走向代表了狀態(tài)機之間可以進行的切換方向,而箭頭上的注釋則是切換條件。

關(guān)于狀態(tài)機的具體更多類型的狀態(tài)機和一些實現(xiàn)細節(jié)可以看后面的參考內(nèi)容鏈接
行為樹
行為樹和狀態(tài)機用途基本一致,一般情況下項目組會根據(jù)實際情況挑選二者之一(具體實現(xiàn)和表現(xiàn)優(yōu)劣上會有一些差別)同時也有些可能會二者混用,都是可行的,但這里也是只會介紹行為樹的基礎(chǔ)入門內(nèi)容
什么是行為樹
我們在游戲中說的行為樹(Behavior Tree)其實是一種決策樹,與狀態(tài)機相同他們都是描述游戲中各種單位行為邏輯的模型,但他并不以狀態(tài)的概念去描述,如上所說其是以決策的結(jié)構(gòu)來描述各種行為的,更確切的說是決策當(dāng)前應(yīng)該進行哪種行為
行為樹繪制
行為樹比起狀態(tài)機可視化更強,如果是完全沒基礎(chǔ)的同學(xué),直接從繪制圖來了解會更加直接,如下圖是ue中的行為樹示意圖,行為樹顧名思義形狀如一棵樹一樣(也有的是從左到右的,圖示為從上到下的但道理都是一樣的),行為樹的節(jié)點根據(jù)位置可以分為兩大類
葉節(jié)點:葉子結(jié)點顧名思義一棵樹有著很多枝杈每個枝杈的末端就是葉子,同理葉葉節(jié)點就存在行為樹的每個分支的末端,如下圖中紫色的節(jié)點就都是葉節(jié)點
非葉節(jié)點:不是葉節(jié)點的節(jié)點就都是非葉節(jié)點

而之所以這樣分類也是根據(jù)行為樹的執(zhí)行邏輯來分的,行為樹會從上到下從左到右逐個去執(zhí)行節(jié)點內(nèi)容,而非葉節(jié)點都是判斷用的節(jié)點(決策)只有葉節(jié)點才是具體的動作,如上圖所示,只有葉節(jié)點是“move to”,“wait”等這些具體的命令,這就好比我們大腦思考一件事情經(jīng)過一系列判斷思考最終決定做某件事,只有最終的結(jié)果是具體的事情,而過程都是在進行邏輯判斷
所以從執(zhí)行上,也可以把行為樹節(jié)點分為任務(wù)節(jié)點(Task,即葉節(jié)點),復(fù)合節(jié)點(composite,即非葉節(jié)點)。在執(zhí)行上便是通過一系列復(fù)合節(jié)點進行邏輯判斷最終找到我們要做的那個任務(wù)(這里的分類并不完備但如果完全沒基礎(chǔ),此處先這樣認為即可方便了解)
行為樹執(zhí)行順序
行為樹基礎(chǔ)的執(zhí)行順序如上所述,從上到下從左到右逐個執(zhí)行(也有的示意圖是橫過來的道理是一樣的),同時行為樹是一個不斷循環(huán)的循環(huán)體,他會在自己的生命周期內(nèi)不斷循環(huán)執(zhí)行直到生命周期結(jié)束。
除了基礎(chǔ)的運行順序外行為樹還有執(zhí)行成功與否的判斷,即每個節(jié)點都會有一個返回值告知上一節(jié)點自己是成功了還是失敗了,結(jié)合到游戲具體中的邏輯就是,如果成功移動到目標(biāo)位置就開始待機??梢钥闯龊芏嘤螒虻倪壿嫸际呛颓爸脛幼魇欠癯晒ο嚓P(guān)的。
每個節(jié)點都會有一個自己的返回值,而復(fù)合節(jié)點雖然不具有具體的任務(wù)邏輯但其有著多個子節(jié)點,會根據(jù)子節(jié)點的返回值情況決定自己的返回值
行為樹通過基礎(chǔ)的運行順序+通過復(fù)合節(jié)點對每個節(jié)點的返回值判斷來進行行為順序的控制
復(fù)合節(jié)點
復(fù)合節(jié)點有的地方也會叫為控制節(jié)點等等,都是顧名思義的,控制節(jié)點即控制行為樹的運行順序。此處會介紹一些常用的復(fù)合節(jié)點
復(fù)合節(jié)點如上如所示,可能會跟著多個子節(jié)點,而復(fù)合節(jié)點則決定了這些后續(xù)的子節(jié)點以怎樣的順序運行
選擇節(jié)點(Selector)
選擇節(jié)點:按默認順序執(zhí)行所屬的子節(jié)點,若其中一個子節(jié)點返回成功則停止運行并且選擇節(jié)點返回成功,如果執(zhí)行完所有子節(jié)點都返回失敗,則選擇節(jié)點返回失敗
同樣顧名思義選擇節(jié)點→選擇一個子節(jié)點運行,當(dāng)有一個子節(jié)點成功運行之后其他節(jié)點就不需要運行了,運行圖示如下

在數(shù)學(xué)上的理解則是“或”||,多個子節(jié)點可以看為多個命題,命題之間是“或”的數(shù)學(xué)關(guān)系,則當(dāng)有一個命題為真時,整個命題就是真了,后續(xù)的命題就不需要看了,而當(dāng)所有命題都為假時,整個命題就為假
順序節(jié)點(Sequence)
順序節(jié)點:按默認順序執(zhí)行所屬的子節(jié)點,若其中一個子節(jié)點返回失敗則停止運行并且選擇節(jié)點返回失敗,如果執(zhí)行完所有子節(jié)點都返回成功,則選擇節(jié)點返回成功
同樣顧名思義順序節(jié)點→順序運行所屬節(jié)點,當(dāng)有一個子節(jié)點失敗,就不運行之后其他節(jié)點了,運行圖示如下

在數(shù)學(xué)上的理解則是“與”&&,多個子節(jié)點可以看為多個命題,命題之間是“與”的數(shù)學(xué)關(guān)系,則當(dāng)有一個命題為假時,整個命題就是假了,后續(xù)的命題就不需要看了,而當(dāng)所有命題都為真時,整個命題就為真
復(fù)合節(jié)點執(zhí)行邏輯小節(jié)
當(dāng)了解了復(fù)合節(jié)點后,對行為樹的運行應(yīng)該已經(jīng)大致理解了,這時候再看一開始的行為樹圖便能看出他的運行邏輯
首先從上到下是一個選擇節(jié)點,即接下來的執(zhí)行有一個是成功的就會結(jié)束運行,然后運行到下面是一個順序節(jié)點,分別順序執(zhí)行“移動到某個位置”然后“等待”(假設(shè)兩個行為都成功的話),然后順序節(jié)點返回成功,最上面的選擇節(jié)點有一個成功的子節(jié)點了,整個樹結(jié)束一次循環(huán),可以發(fā)現(xiàn)在這兩個task一直保持成功的狀態(tài)下是無法運行到后面其他狀態(tài)的
這時候我們假設(shè)上述兩個task中“move to”會因為各種原因失敗,而此時順序節(jié)點就會返回失敗,然后最上層的選擇節(jié)點就會運行到下一個子節(jié)點,也是一個選擇節(jié)點,然后繼續(xù)進行判斷。
這時候就體現(xiàn)出了行為樹的決策邏輯,策劃預(yù)設(shè)好了判斷的情況后,根據(jù)實際場上的情況變化(task返回不同值)從而做出了不同的行動
條件節(jié)點/判斷節(jié)點
在上文中對節(jié)點進行分類時曾提到,單純的任務(wù)節(jié)點+復(fù)合節(jié)點的描述是不完備的,這里開始會補充說明其他常用的節(jié)點。
首先是條件節(jié)點/判斷節(jié)點,意思為:判斷一個條件根據(jù)這個條件的真假決定后續(xù)進行哪個分支。這類節(jié)點會有不同的實現(xiàn)和繪制表現(xiàn)如上文提到的ue中并沒有用這兩個節(jié)點,而是直接通過增加黑板值判斷黑板值來進行條件判斷,我們這里為了方便統(tǒng)一了解還是把他們當(dāng)做單獨的兩個節(jié)點來講(道理都是一樣的)
如上所述條件節(jié)點/判斷節(jié)點的組合表達了一種邏輯:當(dāng)這個條件為真/假時執(zhí)行不同的分支。結(jié)合到游戲的具體邏輯便可以描述為,當(dāng)boss血量大于50%時進行戰(zhàn)斗狀態(tài)1,當(dāng)boss血量小于等于50%時進行戰(zhàn)斗狀態(tài)2,顯然我的這個表述中,條件節(jié)點就是“boss血量大于50%?”,而判斷節(jié)點會有兩個分支(有且僅有,一定要有兩個且只能有兩個)分別對應(yīng)條件判斷真和假的情況
而判斷節(jié)點自身的返回值則是后續(xù)節(jié)點的返回值和條件節(jié)點判斷的真假無關(guān)
注:當(dāng)條件節(jié)點獨立出來的時候,條件節(jié)點也會是一個葉節(jié)點,因為他不能繼續(xù)連接子節(jié)點
裝飾節(jié)點
裝飾節(jié)點指一些運行的限制條件和運行方式的限制節(jié)點,這里不做過多展開更多是根據(jù)項目實際情況進行拓展,這里只舉例集中情況
如
取反節(jié)點:顧名思義將節(jié)點的成果失敗結(jié)果取反,返回成功的變成返回失敗,返回失敗的變成返回成功
重復(fù)執(zhí)行節(jié)點:意味后續(xù)的子節(jié)點們會循環(huán)執(zhí)行指定次數(shù)(行為樹本身是個循環(huán)體,相當(dāng)于內(nèi)部加入一個指定循環(huán)次數(shù)的循環(huán)體)具體游戲應(yīng)用如:npc在四個定點間巡邏,循環(huán)五次后睡覺,睡醒后再進行巡邏
需要注意的是,很多設(shè)計中,如ue中的行為樹并不會有獨立的裝飾節(jié)點node,裝飾節(jié)點是裝飾-節(jié)點之用,所以是附加在節(jié)點上作為這個節(jié)點本身的判斷條件,如我在一個選擇節(jié)點上附加了執(zhí)行兩次的裝飾節(jié)點,這個時候這個節(jié)點的意義就變成了“執(zhí)行兩次的選擇節(jié)點”,最終還是一整個節(jié)點,而不是先運行了限制的裝飾節(jié)點然后再運行選擇節(jié)點。
所以在示意圖中也會把裝飾附加在節(jié)點中而不是一個單獨的節(jié)點
任務(wù)節(jié)點
任務(wù)節(jié)點在策劃層面并沒有太多內(nèi)容,因為更多是指定各類動作讓程序?qū)崿F(xiàn)即可,但這里會有一個和狀態(tài)機不太一樣的運行方式
狀態(tài)機執(zhí)行一個動作時會是一系列動作執(zhí)行并維持在狀態(tài)機內(nèi)部一直執(zhí)行直到出現(xiàn)可以讓他改變的事件,而行為樹并沒有這樣的小循環(huán)概念,就出現(xiàn)了另一個概念“阻塞”
意義在于舉個游戲?qū)嶋H例子:
①當(dāng)角色執(zhí)行說話這個動作,當(dāng)他開始說話這個動作,就完成這個節(jié)點執(zhí)行了,會進行后續(xù)移動了(開始說話然后移動,整體是邊說邊走)
②而另一種情況是需要等說話節(jié)點完成了,再進行移動(說完話再移動,整體是站在原地說完了再開始走)。
這兩者的區(qū)別就是“阻塞”,第一個描述中就是沒有進行阻塞,而第二個例子中則是說話節(jié)點進行了阻塞,即要等待到這個節(jié)點執(zhí)行完成才會有節(jié)點返回值,才會繼續(xù)進行接下來的節(jié)點流
行為樹設(shè)計基礎(chǔ)
行為樹信息傳遞
在游戲中ai會通過各種感知器官(sensors)獲得信息然后做出判斷和行動,但在實際上感知和行為樹之間還有數(shù)據(jù)存儲,整個結(jié)構(gòu)如下

如圖中所示,當(dāng)感知器官得到信息后會對數(shù)據(jù)庫/黑板值進行修改,而行為樹則是讀取數(shù)據(jù)庫/黑板值的數(shù)據(jù)進行判斷。所以在設(shè)計完整的行為樹系統(tǒng)的時候,還需要對會用到的數(shù)據(jù)和感知系統(tǒng)的對應(yīng)關(guān)系有基本的設(shè)計。
如假設(shè)制作一款潛行游戲,我們?yōu)榱伺袛嗤婕沂欠癯霈F(xiàn)在了ai的視野中,需要在數(shù)據(jù)庫中定義一個布爾變量假設(shè)叫做“看到玩家了嗎?”,這個值默認為“否”,要等到感知系統(tǒng)獲得了“是”的信息才會進行修改。然后就會來到感知系統(tǒng),何種情況下感知系統(tǒng)會將數(shù)據(jù)庫的這個布爾變量變?yōu)椤笆恰???梢允怯蒼pc做射線檢測碰到玩家即代表看到了。而行為樹中只需要設(shè)計判斷布爾變量并進行不同的行為即可。
我們也可以設(shè)計的更加復(fù)雜一些,在數(shù)據(jù)庫中增加一個名為“警戒度”的數(shù)值變量,當(dāng)感知系統(tǒng)的射線碰到玩家后不會修改布爾變量,而是不斷增加警戒度,當(dāng)警戒度達到100時,將布爾變量修改為“是”,而當(dāng)感知系統(tǒng)判斷丟失視野時,ai也不會將布爾變量改為否,而是警戒度不斷降低,直到警戒度到達50以下。行為樹中的內(nèi)容也需要對應(yīng)的變?yōu)榕袛嗖紶栔岛途渲?,如果需要在不同警戒值表現(xiàn)出不同的效果也可以增加判斷
以上主要是舉例一兩種比較簡單的設(shè)計來體現(xiàn)游戲設(shè)計和這里數(shù)據(jù)結(jié)構(gòu)設(shè)計的關(guān)聯(lián)性,在制作實際項目時會有更多系統(tǒng)和更多想法,自然也會有更復(fù)雜的設(shè)計。這里總結(jié)了一些在使用或者設(shè)計行為樹時需要注意的點。
數(shù)據(jù)定義
具體用到的數(shù)值變量如上所述其實是根據(jù)項目組需求而定,但也有一些比較通用的注意點
簡單
數(shù)值的定義最好是簡單的,如上例子中是或否的布爾變量,數(shù)值等,簡單的數(shù)值類型能讓策劃在后續(xù)進行行為樹設(shè)計時更近方便。
一致
在設(shè)計上保持一致,參數(shù)的命名使用等,這會讓其他人更容易接手快速理解,在后期整理拓展時也更加方便
分類
在簡單的同時也需要進行必要的分類,很多時候會用到字典類型,可以理解成有許多數(shù)據(jù)其實是跟具體的單位相關(guān)的,比如我需要記錄某一個特定的npc他的血量,這個時候就需要有一個字典名為這個npc,而這個字典下記錄著和這個npc相關(guān)的各類數(shù)據(jù)。不僅如此也可以將這個對象進一步抽象,在涉及戰(zhàn)斗或者對話中時我們的對象往往是抽象的,比如技能釋放者,擊中者,說話者,傾聽者,顯然這些單位都不會是某一個固定的單位,我們也可以為他們設(shè)計抽象的對象分類,一個名為speaker的字典,當(dāng)一段對話開始時存儲說話者的信息
行為樹與狀態(tài)機的選擇
在游戲制作中兩種循環(huán)體都是經(jīng)歷了大量驗證和使用的,這一部分將會簡單介紹兩者之間的部分差別以及取舍
狀態(tài)機如上所述也顧名思義,更加擅長對于“狀態(tài)”的描述,但也如上面展示的,他的示意圖更多展示了狀態(tài)之間的切換,對于策劃(大部分人)來說很難通過示意圖快速的了解這個ai的行為是怎樣的很難關(guān)聯(lián)想象
而行為樹則更加擅長對于動作序列的描述,正如上面所說先干什么再干什么,示意圖的流程也更加易讀,在了解了行為樹的基本運行原理后行為樹的示意圖可讀性是遠大于狀態(tài)機的。而行為樹在運行上會需要不斷地去遍歷各個節(jié)點直到找到自己要進行的節(jié)點,這在一些大型游戲中將是致命的,試想如果是一款割草游戲,場內(nèi)有幾千甚至上萬個單位都在每幀都進行著節(jié)點遍歷,那卡頓顯示是必然的結(jié)果
二者各有優(yōu)劣在實際項目中也存在二者混合使用,在適合的地方使用合適的技術(shù)。
除此之外,雖然本文都是以npc的個體ai作為例子舉例,但實際上行為樹和狀態(tài)機只是兩種用來進行ai方案的循環(huán)體,并不會僅僅局限在個體ai上,也可以用作群體ai,戰(zhàn)術(shù)ai等多單位ai設(shè)計上。甚至于可以不給npc分配具體的行為樹或狀態(tài)機,策劃設(shè)定好部分行為樹和狀態(tài)機,在游戲中通過預(yù)設(shè)的規(guī)則將行為樹/狀態(tài)機動態(tài)的分配給npc,實現(xiàn)更加真實的ai表現(xiàn)
參考內(nèi)容鏈接
什么是ai:《AI for Game Developers》 - ?David M. Bourg, Glenn Seeman
狀態(tài)機: