123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- using UnityEngine;
- using UnityEngine.Events;
- using System;
- namespace HQFPSWeapons
- {
- /// <summary>
- /// Will register damage events from outside and pass them to the parent entity.
- /// </summary>
- [RequireComponent(typeof(Collider))]
- [RequireComponent(typeof(Rigidbody))]
- public class Hitbox : MonoBehaviour, IDamageable
- {
- #region Internal
- [Serializable]
- public class DamageEvent : UnityEvent<HealthEventData>
- { }
- [Serializable]
- public class DamageEventSimple : UnityEvent<float>
- { }
- #endregion
- public Collider Collider { get { return m_Collider; } }
- [SerializeField]
- [Clamp(0f, Mathf.Infinity)]
- private float m_DamageMultiplier = 1f;
- [SerializeField]
- private SoundPlayer m_GroundImpactSound = null;
- [SerializeField]
- private DamageEvent m_OnDamageEvent = null;
- [SerializeField]
- private DamageEventSimple m_OnDamageEventSimple = null;
- private Collider m_Collider;
- private Rigidbody m_Rigidbody;
- private LivingEntity m_ParentEntity;
- private bool m_HitboxImpact;
- public void TakeDamage(HealthEventData damageData)
- {
- if(enabled)
- {
- m_OnDamageEvent.Invoke(damageData);
- m_OnDamageEventSimple.Invoke(damageData.Delta);
- if (m_ParentEntity != null)
- {
- if (m_ParentEntity.Health.Get() > 0f)
- {
- damageData.Delta *= m_DamageMultiplier;
- m_ParentEntity.ChangeHealth.Try(damageData);
- }
- if (m_ParentEntity.Health.Get() == 0f)
- m_Rigidbody.AddForceAtPosition(damageData.HitDirection * damageData.HitImpulse, damageData.HitPoint, ForceMode.Impulse);
- }
- }
- }
- public LivingEntity GetEntity()
- {
- return m_ParentEntity;
- }
- private void OnCollisionEnter(Collision collision)
- {
- if (collision.relativeVelocity.sqrMagnitude > 5f && !m_Rigidbody.isKinematic && !m_HitboxImpact)
- {
- m_GroundImpactSound.PlayAtPosition(ItemSelection.Method.RandomExcludeLast, transform.position, 1f);
- m_HitboxImpact = true;
- }
- }
- private void Awake()
- {
- m_ParentEntity = GetComponentInParent<LivingEntity>();
- m_Collider = GetComponent<Collider>();
- m_Rigidbody = GetComponent<Rigidbody>();
- m_ParentEntity.Respawn.AddListener(Respawn);
- }
- private void Respawn()
- {
- m_HitboxImpact = false;
- }
- }
- }
|