網上關於碰撞的資料

星塵發表於2013-10-15

1.碰撞主要有三個函式,void OnCollisionStay,void OnCollisionEnter和OnCollisionExit,三個函式都是回撥函式,都有(collisionInfo : Collision)引數。
 
2.一般而言,子彈等物體要進行與Player的消除碰撞處理:
Physics.IgnoreCollision(clone.collider,this.collider);
 
3.指令碼附在子彈上時,collisionInfo物件由Collision類生成,則collisionInfo包含被碰撞物件資訊。另外:
①collisionInfo.collider就是子彈撞擊的物體的碰撞器,獲取被撞擊物體的名字則通過變數collisionInfo.collider.name(這不是代表碰撞器型別名,而且元件附加物體的物體名稱),經常用這個來判斷對不同碰撞物件的處理(子彈與物理世界則消失,子彈與敵人子彈則受力運動,子彈與敵人則消失扣血)。
②collisionInfo.transform可以獲得被撞擊物體的變換屬性。
③collisionInfo.contacts是ContactPoint[]陣列。一般只使用collisionInfo.contacts[0],代表碰撞接觸點。動態生成爆炸效果時常用,0號元素位置作為出生點位置,用以下結果作為出生旋轉值(使爆炸沿碰撞點表面法線方向,更為真實):
 
4.對於某些槍械,比如霰彈槍發射的子彈,有時需要做物體受子彈作用力被擊飛的效果(對於敵人除了擊飛有時還會伴有摔倒效果),這時首先可以用射線函式判斷是否擊中物體,並獲取子彈擊中點:
if (Physics.Raycast (originPosition, direction, hitInfo, distance)){.....}
//這一句是放在player身上的(在每次發射子彈時),個人覺得其實在某些場景物體或者敵人身上附加指令碼利用collisionInfo去獲取子彈碰撞情況下的撞擊點,然後針對性地做各種反應會好一點。不過可能受力方向比較難判斷,可以考慮在子彈指令碼Start()中儲存出生點,再依據碰撞點得到子彈運動方向,注意子彈有無重力都只考慮撞擊點y座標。
獲取到擊中點後即可對該點施加子彈衝擊力:(先判斷物體是否屬於剛體)
if (hit.rigidbody) hit.rigidbody.AddForceAtPosition(force * direction, hitInfo.point);
 
 
5.爆炸的區域性空間動力效果的實現。首先獲取在爆炸點的某個球體半徑範圍內的所有碰撞體:
Collider[] colliders = Physics.OverlapSphere( transform.position,explosionRadius );
此函式除了包含位置,半徑外還有預設引數遮罩層級(進行碰撞器篩選)。
接著對所有碰撞體施加力,unity內建了新增爆炸力函式:
foreach (Collider hit in colliders) {   if (!hit)   continue;  //防止碰撞體不存在?貌似多餘?
//防止碰撞體hit不存在rigidbody程式出錯,只對存在剛體屬性的碰撞體新增爆炸作用力。通過這個區別也可以設定一些不受爆炸影響的物體(比如terrain)。
if (hit.rigidbody) hit.rigidbody.AddExplosionForce(explosionPower, explosionPos,explosionRadius);
//此函式還含有第四個引數upwardsModifier(正數n代表虛擬爆炸點在物體中心的下方n米處),可適當設定以增加一個物體下方的虛擬爆炸力,炸飛效果更酷。引數要適當大,否則虛擬爆炸點在物體內部效果有點奇怪。
附註:AddExplosionForce也可以用於製作球形範圍內的引力,只要設定了負的作用力。
 
6.在5中的情況,如果除了有爆炸作用力還需要計算按距離衰減的爆炸殺傷力,首先需要計算每個物體離爆炸點最近的表面點座標:
 Vector3 closestPoint = hit.rigidbody.ClosestPointOnBounds(explosionPosition);
接著要計算表面點座標與爆炸中心距離:float distance = Vector3.Distance(closestPoint, explosionPos);
最後依照爆炸威力隨距離衰減的原則計算物體所受傷害佔爆炸總傷害的百分比:
float damage = (1.0F - Mathf.Clamp01(distance /  explosionRadius))*explosionDamage;

相關文章