前些天做了一個怪物AI模塊,起初的設(shè)計是基于C++的驅(qū)動模式,只在必要的時候調(diào)用LUA腳本,諸如以下:
在AI模塊的Update(float dt)中根據(jù)AI的幾種可能性進(jìn)行相應(yīng)的更新,比如
1 void CAI::Update(float dt)
2 {
3 // 更新攻擊目標(biāo),沒有目標(biāo)尋找
4 UpdateTarget();
5 // 更新戰(zhàn)斗
6 UpdateCombat();
7 // 更新移動
8 UpdateMove();
9 }
在相應(yīng)的Update中去檢測有沒有狀況發(fā)生,比如在UpdateTarget()中,這個怪物發(fā)現(xiàn)一個玩家進(jìn)入了自己的地盤,要毆之,則發(fā)送一個事件給一個處理事件的函數(shù)ProcessEvent(int nEvent),這個事件可能會進(jìn)入一個狀態(tài)機(jī)然后在更改到一個進(jìn)入戰(zhàn)斗的狀態(tài),調(diào)用相應(yīng)的腳本函數(shù),在這個腳本函數(shù)里就去做自己想做的事。
但是這樣的Update并不好,思考了一下覺得還是要以AI狀態(tài)為基準(zhǔn)來Update比較適合和腳本交互。
1 void CAI::Update(float dt)
2 {
3 switch(m_nState)
4 {
5 case IDLE:
6 {
7 // 調(diào)用腳本,可能會調(diào)用尋找目標(biāo)的接口
8 }
9 break;
10 case COMBAT:
11 {
12 // 調(diào)用腳本,調(diào)用戰(zhàn)斗接口
13 }
14 break;
15 }
16 }
這樣就比較靈活了。腳本只是程序員用來解放勞動力的一種方式,做好功能接口讓更多非專業(yè)程序員也能定制游戲內(nèi)容,這是自己對于腳本的理解。但是沒有腳本交互經(jīng)驗,至于暴露給策劃的接口該有哪些,怎樣策劃用著舒服,自己還沒想好,如果在C++中,這些基本函數(shù)可以自己來做,直接把邏輯寫進(jìn)IDLE的case都可以,但用腳本方式進(jìn)入IDLE狀態(tài)后,腳本里肯定應(yīng)該有FindTarget()這樣的接口,那么這一句FindTarget()交給策劃去填上?我覺得還不如直接在C++代碼中補(bǔ)上一句來得實在,策劃肯定不會直接去在腳本接口里去if else,腳本的提供還真是傷腦筋,例如進(jìn)入戰(zhàn)斗狀態(tài)了,調(diào)用腳本里的戰(zhàn)斗接口,這個接口里又怎樣調(diào)用C++提供的接口,所有的戰(zhàn)斗過程都封裝成一個接口給策劃?那這個接口封裝的功能可能會很多很多,無疑是增加了工作量,并且策劃的使用也會有局限性。還是其中的邏輯仍然由程序員來編寫?該如何組織呢。另外每一幀的更新都回去調(diào)用腳本,這其中得消耗多少?