《皇室戰爭》中,多個 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 |