using UnityEngine; using System.Collections; using System.Linq; public enum ExplosiveState{ Idle, Countdown, Explode, Exploded } public class Explosive : MonoBehaviour { public float explosionRadius = 1.0f; public float explosionForce = 100; private PlayerSensor _sensor; public float detonateDistance = 1.0f; private AudioSource _audio; public GameObject[] createOnExplosion; public bool destroySelf = true; public float hitPoints = 100; public void Explode(){ var targets = Physics2D.OverlapCircleAll(transform.position, explosionRadius); targets = targets.Where(v => v.attachedRigidbody != null).ToArray(); var rb = targets.Select(v => v.attachedRigidbody).Distinct(); foreach(var t in rb){ var v = (Vector2)(t.transform.position - transform.position); var forceVector = v.normalized; float k = 1.0f - Mathf.Clamp01(v.magnitude / explosionRadius); float forceMagnitude = k * explosionForce; t.AddForce(forceVector * forceMagnitude); float resultP = k * hitPoints; var health= t.gameObject.GetComponent(); if(health != null){ Debug.Log("Apply damage: " + resultP); health.ApplyDamage(resultP); } } foreach(var g in createOnExplosion){ if(g != null){ var instance = Instantiate(g); instance.transform.position = transform.position; } } if(destroySelf){ Destroy(gameObject); } } void Start () { _sensor = GetComponentInChildren(); _sensor.PlayerEnter += HandlePlayerEnter; _audio = GetComponent(); } void HandlePlayerEnter (PlayerSensor sensor, GameObject player) { //Explode(); } void Update () { if(Input.GetKeyDown(KeyCode.R)){ Explode(); } } void OnDrawGizmosSelected(){ AdvancedGizmo.DrawCircle(transform.position, Vector3.forward, explosionRadius, Color.red, 36); AdvancedGizmo.DrawCircle(transform.position, Vector3.forward, detonateDistance, Color.blue, 36); } }