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