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);
}
}
}