using UnityEngine; using System.Collections; using System.Collections.Generic; public class ExplosionForce : MonoBehaviour { public float force = 50; public float radius = 5; public float upliftModifer = 5; /// /// create an explosion force /// /// location of the explosion public void doExplosion(Vector3 position){ transform.localPosition = position; StartCoroutine(waitAndExplode()); } /// /// exerts an explosion force on all rigidbodies within the given radius /// /// private IEnumerator waitAndExplode(){ yield return new WaitForFixedUpdate(); Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position,radius); foreach(Collider2D coll in colliders){ if(coll.GetComponent()&&coll.name!="hero"){ //Roman Update //使其仅影响碎片 if(coll.gameObject.layer == LayerMask.NameToLayer("Fragment")) // AddExplosionForce(coll.GetComponent(), force, transform.position, radius, upliftModifer); } } } /// /// adds explosion force to given rigidbody /// /// rigidbody to add force to /// base force of explosion /// location of the explosion source /// radius of explosion effect /// factor of additional upward force private void AddExplosionForce(Rigidbody2D body, float explosionForce, Vector3 explosionPosition, float explosionRadius, float upliftModifier = 0) { var dir = (body.transform.position - explosionPosition); float wearoff = 1 - (dir.magnitude / explosionRadius); Vector3 baseForce = dir.normalized * explosionForce * wearoff; baseForce.z = 0; body.AddForce(baseForce); if (upliftModifer != 0) { float upliftWearoff = 1 - upliftModifier / explosionRadius; Vector3 upliftForce = Vector2.up * explosionForce * upliftWearoff; upliftForce.z = 0; body.AddForce(upliftForce); } } }