mythos中的ai是并發(fā)的棧式狀態(tài)機(jī):
拿wolf作為例子:
一。配置文件:
在ai目錄中的wolf.xml配置它所有的行為(包括每個行為發(fā)生機(jī)率,參數(shù),以及執(zhí)行函數(shù)):
其中執(zhí)行函數(shù)以及對應(yīng)skillid如下:
1.
<nBehaviorId>move - approach target</nBehaviorId>
<nSkillId>monster melee</nSkillId>
2.
<nBehaviorId>skill - do skill</nBehaviorId>
<nSkillId>monster melee</nSkillId>
3.
<nBehaviorId>skill - do skill</nBehaviorId>
<nSkillId>Fidget</nSkillId>
4.
<nBehaviorId>move - wander</nBehaviorId>
<nSkillId/>
二。ai更新:
SrvGameTick--》GameEventsProcess--》AI_Update()
在AI_Update中遍歷執(zhí)行該unit的所有行為(behavior) :
1. sBehaviorApproachTarget()
查找對應(yīng)的目標(biāo),發(fā)出朝它移動指令
1. sBehaviorDoSkill()
如果有目標(biāo)則執(zhí)行sSkillExecute進(jìn)行技能施放
2. ...類似功能處理
。。。
【說明】:
mythos的行為是并發(fā)的棧式,最大可以有5個棧, 用
int nIndex = tContext.pnStack[ tContext.nStackCurr ]這樣的結(jié)構(gòu)進(jìn)行處理,
通過pTable->pBehaviors[ nIndex ]得到對應(yīng)的行為處理函數(shù)進(jìn)行執(zhí)行處理。
a. 并發(fā):
每執(zhí)行完一個行為函數(shù)后 tContext.pnStack[ tContext.nStackCurr ]++; 這樣就換到unit的下一個行為函數(shù)再執(zhí)行。
b. 進(jìn)入棧(子函數(shù)):
tContext.nStackCurr為棧下標(biāo),初始tContext.nStackCurr=0,即為第0個棧,
可以設(shè)置tContext.nStackCurr++;并且tContext.pnStack[ tContext.nStackCurr ]=nBranchTo(要走的分支號)。這樣來
執(zhí)行分支函數(shù)。 當(dāng)分支函數(shù)完成時tContext.nStackCurr--再回來上一級。
另外有些行為函數(shù)是執(zhí)行一次的,執(zhí)行完了就會把它從列表中刪除。下次不會再遍歷到.