說到狀態機的運用,遊戲中的AI是個最佳的例子。今天就先用簡易AI來呈現狀態的轉換,而假想的情境就是一個在畫面上隨意移動,碰到危險時會避開,而需要補充能量時則會找尋食物的模擬,就如同非常簡易版的The Sims。
這裡的模擬主要構成是食物、怪物和受狀態機影響的NPC角色,避開版權和複雜的設定過程,一樣用簡易的方塊進行呈現。而狀態機的設定雖然用多階層的概念可以簡化,然一方加了多個狀態機進,另一方面不確定是否可於Bolt中順利的運行。一開始還是先從簡,用單個State Graph(SG)來實驗。
狀態的呈現如一個個方塊,而方塊之的線也就轉換的機制,它和Flow Graph(FG)略有不同,FG是沒有條件會切換過去的,也就是當FG的方塊正常結束後,一定會順著這條線過去。而SG的方塊會依據其線裡給的判定決定是否轉換過去,若條件不符合,則狀態不會轉換。因此,在看SG的方塊後線時,只能想成它是有可能可以切過去但不一定會切過去。此外,在Bolt裡,一條線只有一個方 向,若二個狀態同時有互相轉換的可能性,則需要二條線,每一條上都有其各自的其判定。
每個狀態機會有一個起始的狀態,在Bolt中會被標註為緣色。而SG的狀態產生時,會準備好三個事件
這些觸發事件和FG裡的事件是一樣的,SG也直接包含了FG在裡面。也就是說FG裡的概念在這裡沒有多也沒有少,之前怎麼樣增加功能,這裡也完全相同。SG除了內部直接用FG,也可以額外產生FG後再由此SG進行連接。
NPC會於場景上隨意找點前進,簡化不必要的複雜度,在移動中不考慮障礙物,穿越是被允許的。且NPC身上會有一個感知用的簡易觸發器,用來偵測週遭的物件。如果觸及到危險物,則會選擇移動到它處,如果偵測到食物,則會記錄下來,並於狀態轉換時從已記錄的食物清單中選擇最近的物件,並移動過去。NPC在其生命週期裡會反覆的移動、避敵、尋找食物,直到它體力不支而倒地。
在三個狀態中,找尋食物和避開敵人都會先回到隨意移動的狀態後再決定要不要轉換。設計上其實可以從避開敵人的狀態直接轉換到找尋食物,但這樣的轉換會和回到隨意移動有太高的重覆性,反之亦然。但實際上,這樣的設計只是前期的考量點,有可能在製作中隨時調整。而SG提供的視覺化操作,可以讓調整不耗太多力的情況下進行。
狀態之間的轉換也是靠著事件,而這裡的事件
除了SG本身,產生了一個專門減少Energy的一個FG。每隔3秒會進行一次亂數扣Energy的工作。當它降到一個值後就會送出客製化事件。且這個FG同時也要兼顧到如果Energy被扣到負數時就不能再扣下去。
也因為Energy會到零或負數,所以又增加了一個狀態,反應Energy不夠時的呈現。
再額外產生一個FG,用來偵測附近是否有食物,若有食物則會記錄下來它的位置,而有多個食物的可能性因此將其記錄在清單中。
到此,基本的設定大約完成,不過實際移動的部份卻無法展開,一方面是它的複雜度已花去了不少時間,另一方面是有暫時無法解決的Bug存在。故SG及其相關的實驗就只先到這一段落。待日後解決這個問題後會將Git Repo上的專案進行更新。
今日測試用的專案放罝在Git Repo中的state-bolt目錄裡。可惜規劃的情境有些複雜,超過了有限的時間內可完成的部份。不過也練習了State Graph和更多的事件,之後對於不太熟的部份,會量力進行。