基于触发机制的脚本系统
文 / rooyeewu
1.問題
絕大多數(shù)游戲項目都會開發(fā)新手引導,劇情之類的功能。這類功能有兩個最大的特點:一是跳躍大,二是特殊化。一個完整的功能(如一段教學指引)需要在多個邏輯系統(tǒng)中跳轉(zhuǎn),并且具體形為的觸發(fā)條件千差萬別,需要很多特殊處理。這類功能實現(xiàn)對程序結(jié)構(gòu)的挑戰(zhàn)巨大,如果沒有統(tǒng)一規(guī)劃,很容易掉入Hard-Code的深淵。
2.腳本系統(tǒng)
解決這類問題的一個較好方法是抽象功能形為與觸發(fā)事件,形成離散的形為(Action)集與事件(Event)集,然后通過腳本的形式組織成一個個完整的功能。為了以最干凈的方式實現(xiàn)上述目的,我們只需要抽象兩個概念,即上面提到的:行為(Action)與事件(Event)。一個行為只需要配置兩個事件表達式:開始事件與結(jié)束事件即可明確指示其行為的執(zhí)行時機。
?
開始事件表達式必須存在,否則行為無法開始執(zhí)行;結(jié)束事件表達式可為空,取決于當前行為是否有“自結(jié)束”方式。另外,為了實現(xiàn)行為動作的組織,系統(tǒng)需要實現(xiàn)一個非常重要的事件:
EventActionEnd:ID[ 額外參數(shù)列表]
該事件在指定ID的行為結(jié)束后發(fā)出,這樣就可以利用此事件統(tǒng)一的組織觸發(fā)腳本,一個觸發(fā)腳本本質(zhì)上就是由上述表格中若干具有邏輯相關(guān)性的行組成的集合。
到此,我們就可以完整描述一個具體的行為動作的執(zhí)行過程:
?
3.應用
上述對Action的實現(xiàn)方式采用常用的“三段式”:Begin(), Update(), End()。這樣做的好處是Action的實現(xiàn)者可以實現(xiàn)三種形為方式:
1) 實現(xiàn)單幀的“瞬時行為”;
如瞬間給一個玩家加血可實現(xiàn)為一個瞬時行為。
2) 實現(xiàn)跨幀的“持續(xù)行為”;
如將怪物從A點移動到B點可實現(xiàn)為一個持續(xù)行為。
3) 實現(xiàn)接受用戶操作的“交互形為”。
如劇情中要求用于作出選擇可實現(xiàn)為一個交互形為。
這些形為方式特別適合新手引導或者劇情之類的功能需求。
另外事件的檢查不局限于單一事件,而是事件表達式,這樣方便組織邏輯結(jié)構(gòu)。下面抽象一些常用的執(zhí)行流程形式,再給出運用此腳本系統(tǒng)的表達方式:
1) 順序執(zhí)行
?
2) 分支執(zhí)行
?
上述分支很容易擴展成多分支,實現(xiàn)類似switch-case的執(zhí)行結(jié)構(gòu)。
3) 循環(huán)執(zhí)行
?
4) 邏輯判斷
?
如何應用到新手引導與劇情
可以理解為每段新手引導或劇情都是一個腳本,一個腳本就是上述表格的若干行。一個腳本在游戲系統(tǒng)中需要給定一個唯一標識,通過外圍游戲邏輯規(guī)則按需加載指定腳本處于WAITING-RUNNING狀態(tài)。這樣一段引導邏輯就進入游戲中,但它需要一定的事件去觸發(fā)。我們可以實現(xiàn)任意有意義的事件在游戲中的任何地方,如打開一個賣二手QQ平臺界面時拋出一個事件,關(guān)閉一個界面時拋出事件,點擊一個按鈕時拋出一個事件,拋出事件是隨心所欲的,只要有需要就可以。
典型地,拋出一個事件只需要在任意地方添加一行代碼,如:
noxssSystem.Instance.Trigger(EventClickUI, “uiName”);
這樣事件被異步的發(fā)送出去,拋出事件的執(zhí)行代價可忽略不計。如果玩家在當前游戲進程中沒有加載任何腳本,這個事件很快被丟棄;如果有腳本加載,此事件會嘗試去觸發(fā)腳本中行為的執(zhí)行。這樣可以做到新手引導對系統(tǒng)的最小化開銷。
4.小結(jié)
通過統(tǒng)一的觸發(fā)腳本系統(tǒng),可以完成任意的邏輯腳本開發(fā),包括新手引導,劇情,甚至客戶端AI等;同時減少某些“跳躍大,特殊化”功能需求對程序結(jié)構(gòu)的破壞,避免HardCode的產(chǎn)生;腳本形式統(tǒng)一簡單,可以通過excel形式編寫,也利于開發(fā)可視化編輯器。
總結(jié)
以上是生活随笔為你收集整理的基于触发机制的脚本系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏行业的人工智能设计:AI的设计和实施
- 下一篇: 【GDC 21】《对马岛之魂》战斗系统讲