淺談DOTA2中的碰撞體積

原文由我發於微博 @DotA中文Wiki(https://dota.huijiwiki.com),歡迎關注。
注:本文內容對7.24b版本生效,不排除後續更新導致本文內容過時/失效的情況發生
什麼是碰撞體積
在DOTA2世界中,凡是可以互動的物件都存在一個範圍,這個範圍被稱為碰撞體積。
一個典型的碰撞體積應用是卡兵。
在遊戲檔案中,碰撞體積沒有明確的數值,而是分為幾種(括號內為具體數值[1]):
- DOTA_HULL_SIZE_BUILDING (298)
- DOTA_HULL_SIZE_TOWER (144)
- DOTA_HULL_SIZE_BARRACKS (144)
- DOTA_HULL_SIZE_FILLER (96)
- DOTA_HULL_SIZE_HUGE (80)
- DOTA_HULL_SIZE_HERO (24)
- DOTA_HULL_SIZE_REGULAR (16)
- DOTA_HULL_SIZE_SIEGE (16)
- DOTA_HULL_SIZE_SMALL (8)
- DOTA_HULL_SIZE_SMALLEST (2)
不同單位的碰撞體積如下圖所示。




順便一提,狼人終極技能----變身的技能說明是錯誤的。變狼後碰撞體積沒有發生變化,仍然是8。
測試模式下,在控制檯中輸入dota_unit_show_collision_radius 1 可以將單位的碰撞體積以黃色表示出來,如圖。

需要特別注意的是,碰撞體積的大小與模型肥瘦、選中單位後的光圈大小沒有任何關係。

如圖所示,狼人的選擇光圈與其他人是相同的,但其碰撞體積顯然小於其他單位
碰撞體積的應用
那麼碰撞體積與天怒A杖大招有什麼關係呢?
前面說到,碰撞體積是用於技能互動的。對於大部分AOE技能來說,他們的互動機制是:
如果技能的作用面積與碰撞體積有交集(重疊的地方),則造成傷害。
我們知道,天怒A杖大是不會對一個已經收到大招影響的單位再次放大的,那麼這個判定也是靠碰撞體積是否重疊來判定的嗎?
事實證明,不是。事實上,這個判定採用的是座標判定:如果目標單位的座標在一個神祕之耀的作用範圍外,那麼系統就有可能選擇這個目標,對其座標位置施放額外的一次大招。
簡單總結一下:
1.受傷與否是碰撞體積判定,面積重疊就受傷;
2.是否施放二次大招是座標判定。
根據這兩點,不難找到其中的“漏洞”:
如果我放大的位置距離敵方英雄的距離大於神祕之耀的作用範圍,但離得又不是太遠,大招的範圍和敵方英雄的碰撞體積又有重疊,不就可以讓他受到2次傷害了嗎?!

採用上述方式對單一敵方英雄施放A杖大招,可以看到確實造成了2次傷害

作為對比,圖中大招施放的位置稍微靠近了敵方英雄一點,可以看到只造成了1次傷害

除此之外,一些可以製造地形的技能(如溝壑、冰片)也會用到碰撞體積的知識來解釋問題。
首先認識一下溝壑的碰撞體積。
如圖,可以看到溝壑實際上是由一塊一塊小的碰撞體積組成的,而不是由一個整體組成的。

飾品不會影響溝壑的組成
圖為瑪爾斯矛的碰撞體積。

圖為矛穿到英雄後矛和英雄的碰撞體積相互關係。

直觀的看到了溝壑的碰撞體積組成後,我們可以瞄準碰撞體積間的縫隙,向縫隙處扔矛。根據我的測試,只要站位角度合適且瞄準了位置,是可以做到100%穿過溝壑的。

瞄著縫扔矛
舉一反一,巨牙海民的冰片也是可以穿過去的,如圖。

需要注意的是,顯示碰撞體積的命令只能在開啟作弊時使用,因此匹配中無法使用。
參考
^遊戲檔案中並沒有明確寫出碰撞體積的具體數值,括號內的數值為根據歷史經驗、英文版dota2 wiki、liquipedia wiki整理而來,可能會與實際情況存在一定出入 https://dota.huijiwiki.com/p/7583
作者:韓鬆
專欄地址:https://zhuanlan.zhihu.com/p/110771437
相關文章
- 淺談JavaScript中的thisJavaScript
- 讓子彈再飛一會:遊戲中關於碰撞體積的趣聞遊戲
- 淺談微積分以及泰勒展開
- 淺談軟體工程中的程式碼評審軟體工程
- 淺談react 中的 this 指向React
- 淺談Java中的HashmapJavaHashMap
- 淺談java中的反射Java反射
- 淺談React中的diffReact
- 淺談Golang中select的用法Golang
- 淺談JavaScript中的繼承JavaScript繼承
- 淺談python中的xpath用法Python
- 淺談jQuery中的工具方法jQuery
- 淺談Kotlin中的函式Kotlin函式
- 淺談CSS中的Position(定位)CSS
- 淺談Rowid中的行號
- 淺談Android中LifecycleAndroid
- 淺談軟體開發中的防禦式程式設計程式設計
- 淺談 js 中的 this 指向問題JS
- 淺談Swift中的函式式Swift函式
- 淺談java中的併發控制Java
- 淺談Java中的內部類Java
- 淺談Javascript中的作用域鏈JavaScript
- 淺談 Swift 中的屬性(PropertySwift
- 淺談Java中的淺拷貝和深拷貝Java
- 淺談Java記憶體模型Java記憶體模型
- Babel知識體系淺談Babel
- 淺談node.js中的stream(流)Node.js
- 淺談JavaScript中的apply、call和bindJavaScriptAPP
- 淺談Node中module的實現原理
- MySQL中int、char、varchar的效能淺談MySql
- 淺談 PHP 中異常類的使用PHP
- 淺談我對python中的monkey patchPython
- 淺談js中的正規表示式JS
- 淺談SQL Server中的快照問題SQLServer
- 淺談Gson和fastjson使用中的坑ASTJSON
- 淺談深度學習中的機率深度學習
- 淺談JS中物件的淺複製和深複製JS物件
- 淺談js的記憶體與閉包JS記憶體