*
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user