Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UniRx;
- using UnityEngine;
- public class Health : MonoBehaviour
- {
- [SerializeField] private int _maxHealth = 100;
- public GameObject Owner { get; set; }
- public int MaxHealth
- {
- get => _maxHealth;
- set => _maxHealth = value;
- }
- private int _currentHealth;
- public int CurrentHealth
- {
- get => _currentHealth;
- private set
- {
- _currentHealth = Mathf.Clamp(value, 0, MaxHealth);
- OnValueChanged.OnNext(Value);
- }
- }
- public float Value => _maxHealth != 0 ? (float) _currentHealth / _maxHealth : 0f;
- public bool IsEmpty => Value == 0f;
- public Subject<float> OnValueChanged { get; } = new Subject<float>();
- public Subject<Health> OnEmpty { get; } = new Subject<Health>();
- public Subject<GameObject> OnDamaged { get; } = new Subject<GameObject>();
- private void OnEnable()
- {
- ResetCurrentHealth();
- }
- public void TakeDamage(int damage, GameObject damageOwner = null)
- {
- CurrentHealth -= damage;
- OnDamaged.OnNext(damageOwner);
- if (CurrentHealth == 0)
- {
- OnEmpty.OnNext(this);
- }
- }
- public void ResetCurrentHealth()
- {
- CurrentHealth = MaxHealth;
- }
- [ContextMenu("Kill")]
- private void Kill()
- {
- TakeDamage(_maxHealth);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement