群攻傷害指在一定范圍內同時對多游戲對象按距離衰減計算傷害。Unity對此有相關的接口,可以很方便的實現這個功能。
Collider[] Physics.OverlapSphere ( Vector3 position, float radius,int layerMask ) ;
Vector3 position:爆炸目標點
float radius:爆炸半徑
int layerMask:影響層(指的是對某一層進行爆炸計算)
rigidbody.AddExplosionForce(power, explosionPos, radius, 3.0F);//對剛體施加爆炸力,物理的視覺效果,具體我就不介紹了
這個函數的返回值是Collider[],意指獲取position為中心,radius為半徑,layerMask層中的碰撞體集合。獲取這個數組之后,就可以進行傷害計算了。
如果寫得比較正規一點,你需要兩個類,一個是生命體,一個是武器類。
武器類部分代碼(主要是武器屬性的聲明):
public class ObjectWeapon { private float range;//爆炸范圍 public float Range { get { return range; } set { range = value; } } private float power;//力量 public float Power { get { return power; } set { power = value; } } private float damage;//傷害值 public float Damage { get { return damage; } set { damage = value; } } private bool isAP;//是否穿甲 public bool IsAP { get { return isAP; } set { isAP = value; } } }
抽象生命體類
public interface Life { void Death(); void HPManager(float life);//生命數值計算 bool IsAP();// }
然后就是炸彈爆炸的函數了,如下:
public void Bomb(ObjectWeapon weapon,Vector3 point,int layer)//爆炸函數 { Collider[] others = Physics.OverlapSphere(point, weapon.Range,lay);//獲取所有碰撞體 Rigidbody other;//剛體,通過添加力實現爆炸的視覺效果 Life life;//生命體 for (int i = 0; i < others.Length; i++) { //others[i]. if ((other=others[i].GetComponent<Rigidbody>())) {//檢測剛體 other.AddExplosionForce(weapon.Power,point,weapon.Range,10);//這個函數會自動根據距離給剛體衰減的力 } if ((life = others[i].GetComponent<Life>()) != null && (!life.IsAP() || weapon.IsAP))//life.IsAP()意指生命體是否具有‘裝甲’,weapon.IsAP判斷武器是否‘穿甲’
{ //如果裝甲,則需要能夠穿甲的武器才能計算傷害,
//通過計算武器的殺傷范圍與物體和爆炸點的距離來計算傷害,實現距離衰減
life.HPManager(weapon.Damage * (1-Vector3.Distance(others[i].transform.position, point) / weapon.Range));//根據距離衰減判斷傷害值
//通過物體到爆炸點的距離與武器爆炸范圍的比值,實現衰減效果
}
}
}
代碼很簡單,主要是利用了碰撞檢測,剛體的力,還有距離判斷。
本文地址http://www.cnblogs.com/jqg-aliang/p/4605944.html