Explosion.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace HQFPSWeapons
  5. {
  6. public class Explosion : MonoBehaviour
  7. {
  8. [SerializeField]
  9. private bool m_DetonateOnStart = false;
  10. [SerializeField]
  11. private float m_Force = 105f;
  12. [SerializeField]
  13. [Clamp(0f, 1000f)]
  14. private float m_Damage = 100f;
  15. [SerializeField]
  16. private float m_Radius = 15f;
  17. [SerializeField]
  18. [Range(0f, 10f)]
  19. private float m_Scale = 1f;
  20. public void Explode(LivingEntity detonator)
  21. {
  22. ShakeManager.ShakeEvent.Send(new ShakeEventData(transform.position, m_Radius, m_Scale, ShakeType.Explosion));
  23. var cols = Physics.OverlapSphere(transform.position, m_Radius);
  24. var rigidbodies = new List<Rigidbody>();
  25. foreach(var col in cols)
  26. {
  27. if(col.attachedRigidbody != null && !rigidbodies.Contains(col.attachedRigidbody))
  28. rigidbodies.Add(col.attachedRigidbody);
  29. var entity = col.GetComponent<LivingEntity>();
  30. if(entity != null)
  31. {
  32. float distToObject = (transform.position - col.transform.position).sqrMagnitude;
  33. float explosionRadiusSqr = m_Radius * m_Radius;
  34. float distanceFactor = 1f - Mathf.Clamp01(distToObject / explosionRadiusSqr);
  35. entity.ChangeHealth.Try(new HealthEventData(
  36. -m_Damage * distanceFactor,
  37. transform.position,
  38. (col.transform.position - transform.position).normalized,
  39. m_Force,
  40. Vector3.zero,
  41. null
  42. ));
  43. }
  44. foreach(var rb in rigidbodies)
  45. {
  46. var damageable = rb.GetComponent<IDamageable>();
  47. rb.AddExplosionForce((damageable == null || damageable.GetEntity() == null) ? m_Force : m_Force / Mathf.Max(1, damageable.GetEntity().Hitboxes.Length), transform.position, 2f, m_Radius, ForceMode.Impulse);
  48. }
  49. }
  50. }
  51. private IEnumerator Start()
  52. {
  53. yield return null;
  54. if(m_DetonateOnStart)
  55. Explode(null);
  56. }
  57. }
  58. }