《皇室戰爭》中,多個 AI 碰撞、避讓、推人是怎麼做的?

我覺得沒用物理引擎,就是一些小的數學幾何運算做的,但反覆思考又有很多情況難做或不能很高效的做到。


碰撞避免問題

碰撞避免是局部演算法,需要和全局 尋路演算法結合,才能實現優雅效果。

最簡單碰撞避免,基於網格佔用,每個單位佔用一個網格,這樣就不會碰撞了,但是對於體型比較小的骷髏,網格要密集,比較耗費內存。大體型對象佔用網格多,例如巨人 計算消耗比較大。

紅警2,裡面有用這種方案。

之前做類似coc遊戲,也有用這種方案。

優點是和網格尋路結合比較自然。

基於steering, 皇室地形簡單,只在橋上放路點,尋路走直線即可。所有單位還是用網格管理,定期檢測附近網格里對象,計算一個附近對象合斥力,對單位速度進行修正, 這樣就能做出排斥效果, 這種實現,單位是有可能互相重疊的,通過斥力來修正,可以試試皇室骷髏圍巨人,看單位是否會重疊,以及位置自動修正。

更高級的碰撞避免演算法,速度矢量場之類的,實現複雜,數學好才能理解。可以看astarpathfinding 庫裡面有實現。

上面只是碰撞避免,皇室還有碰撞推走這個設定,這個得做些物理運算才行,摩擦力,運動速度,碰撞,推力,這些一個都不能少,用2d物理引擎做比較好。主要是物理運算要穩定,自己寫演算法很難搞穩定。


大致代碼如上,所有求距離的地方可以用平方距離來優化。具體還要自己加點參數細調一下,例如插值個值來平滑下作用力,防止人物抖動。上面的代碼同屏 50 人應該沒什麼問題,人數還多,可以通過減少調用次數來優化。


不需要精確物理運算。

cr的戰鬥邏輯是基於格子的。碰撞檢測也是基於此。

避讓:每次心跳每個人物行動後把所站的格子標記為不可走(障礙),下個人物以此做尋路,以此類推。下次心跳再反序遍歷,即可實現相互避讓。

推人:找到離放置的碰撞單位最近的格子(一般是兩矩形描點連線延伸,直到不碰撞),讓被碰撞單位插值移動到該格子上就可以了。


看了樓上的演算法 很有啟發加上了質量判定

還有關於避障Understanding Steering Behaviors: Collision Avoidance

這篇文章很有幫助

for(int i = 0; i &< uDataList.Count; i++)

{

UBaseData data_i = uDataList[i];

bool isfly_i = data_i.IsFly();//1 地面 2 飛行,可飛越障礙 3 建築移動方式(不移動) 4 野豬(未定)

for(int j = i + 1; j &< uDataList.Count; j++)

{

UBaseData data_j = uDataList[j];

bool isfly_j = data_j.IsFly();

if(isfly_i == isfly_j)

{

float dis = (data_i.Position - data_j.Position).magnitude;

float radius = data_i.BodyRadiu + data_j.BodyRadiu;

if(dis &< radius)

{

Vector3 steeringForce = (data_i.Position - data_j.Position).normalized / dis;

if(data_i.TDUnitData.Mass &> data_j.TDUnitData.Mass)

{

data_j.StreeringForce -= steeringForce;

}

else if(data_i.TDUnitData.Mass &< data_j.TDUnitData.Mass)

{

data_i.StreeringForce += steeringForce;

}

else

{

data_i.StreeringForce += steeringForce;

data_j.StreeringForce -= steeringForce;

}

}

}

}

}


之前給別人的遊戲寫過這樣一個演算法

差不多是

先對x,y分別排序

建立一個映射表

對排好序的列表求碰撞

這樣可以大幅度減少比較次數

在我的筆記本上單線程1w個單位碰撞不是問題


沒有避讓啊,都是物理引擎強制把別人推開的,沒看經常人物擠在一起卡卡卡卡的嗎,就是格子尋路+簡單的2d物理引擎circle處理碰撞,沒有避讓。


一看就不是走格子。不是真正寫代碼的,就別回答了。也沒仔細思考和觀察。都是胡說。


多個flow field疊加


沒寫過,按我的理解比較簡單,兩方碰撞的時候產生一個與碰撞方向相反的單次位移,考慮到重量因素,比較重的一方就不動,另外一方有此位移即可,不需要加入物理引擎。

不過我沒實現過,不喜勿噴

老闆給你的項目就這麼完成啊


推薦閱讀:

支持向量機SVM - 從入門到放棄
AlphaPerform將終結演藝圈?震驚,他們竟然是這麼說的……
向匯川學習,你的公司會更有力量
CS231n課程筆記翻譯:神經網路筆記3(上)
人工智慧取代法官是否更能維護公正?

TAG:人工智慧 | 遊戲設計 | 部落衝突:皇室戰爭ClashRoyale |