Hitbox.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using UnityEngine;
  2. using UnityEngine.Events;
  3. using System;
  4. namespace HQFPSWeapons
  5. {
  6. /// <summary>
  7. /// Will register damage events from outside and pass them to the parent entity.
  8. /// </summary>
  9. [RequireComponent(typeof(Collider))]
  10. [RequireComponent(typeof(Rigidbody))]
  11. public class Hitbox : MonoBehaviour, IDamageable
  12. {
  13. #region Internal
  14. [Serializable]
  15. public class DamageEvent : UnityEvent<HealthEventData>
  16. { }
  17. [Serializable]
  18. public class DamageEventSimple : UnityEvent<float>
  19. { }
  20. #endregion
  21. public Collider Collider { get { return m_Collider; } }
  22. [SerializeField]
  23. [Clamp(0f, Mathf.Infinity)]
  24. private float m_DamageMultiplier = 1f;
  25. [SerializeField]
  26. private SoundPlayer m_GroundImpactSound = null;
  27. [SerializeField]
  28. private DamageEvent m_OnDamageEvent = null;
  29. [SerializeField]
  30. private DamageEventSimple m_OnDamageEventSimple = null;
  31. private Collider m_Collider;
  32. private Rigidbody m_Rigidbody;
  33. private LivingEntity m_ParentEntity;
  34. private bool m_HitboxImpact;
  35. public void TakeDamage(HealthEventData damageData)
  36. {
  37. if(enabled)
  38. {
  39. m_OnDamageEvent.Invoke(damageData);
  40. m_OnDamageEventSimple.Invoke(damageData.Delta);
  41. if (m_ParentEntity != null)
  42. {
  43. if (m_ParentEntity.Health.Get() > 0f)
  44. {
  45. damageData.Delta *= m_DamageMultiplier;
  46. m_ParentEntity.ChangeHealth.Try(damageData);
  47. }
  48. if (m_ParentEntity.Health.Get() == 0f)
  49. m_Rigidbody.AddForceAtPosition(damageData.HitDirection * damageData.HitImpulse, damageData.HitPoint, ForceMode.Impulse);
  50. }
  51. }
  52. }
  53. public LivingEntity GetEntity()
  54. {
  55. return m_ParentEntity;
  56. }
  57. private void OnCollisionEnter(Collision collision)
  58. {
  59. if (collision.relativeVelocity.sqrMagnitude > 5f && !m_Rigidbody.isKinematic && !m_HitboxImpact)
  60. {
  61. m_GroundImpactSound.PlayAtPosition(ItemSelection.Method.RandomExcludeLast, transform.position, 1f);
  62. m_HitboxImpact = true;
  63. }
  64. }
  65. private void Awake()
  66. {
  67. m_ParentEntity = GetComponentInParent<LivingEntity>();
  68. m_Collider = GetComponent<Collider>();
  69. m_Rigidbody = GetComponent<Rigidbody>();
  70. m_ParentEntity.Respawn.AddListener(Respawn);
  71. }
  72. private void Respawn()
  73. {
  74. m_HitboxImpact = false;
  75. }
  76. }
  77. }