84 lines
1.9 KiB
C#
84 lines
1.9 KiB
C#
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<Health>();
|
|
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<PlayerSensor>();
|
|
_sensor.PlayerEnter += HandlePlayerEnter;
|
|
_audio = GetComponent<AudioSource>();
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|