Files

84 lines
1.9 KiB
C#
Raw Permalink Normal View History

2025-05-13 05:19:58 +03:00
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);
}
}