miepzerino
2023-12-16 1d74f3204692bb69aabf3c57fbdf4601a31a311f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Damageable : MonoBehaviour
{
#if (UNITY_EDITOR)
    // ONLY FOR DEBUG USE
    [SerializeField]
    private bool selfDamage = false;
#endif
    Animator animator;
 
    [SerializeField]
    private int _maxHealth = 100;
    [SerializeField]
    private int _health = 100;
    [SerializeField]
    private bool _isAlive = true;
    [SerializeField]
    private bool isInvincible = false;
    private float timeSinceHit = 0f;
    public float invincibilityTime = 0.25f;
 
    public AudioClip hitSound;
    public AudioClip healSound;
    public AudioClip deathSound;
 
    public int MaxHealth
    {
        get { return _maxHealth; }
        set { _maxHealth = value; }
    }
    public int Health
    {
        get { return _health; }
        set
        {
            if (value > MaxHealth)
            {
                _health = MaxHealth;
            }
            else
            {
                _health = value;
            }
            if (value <= 0)
            {
                IsAlive = false;
                if (deathSound != null)
                {
                    SoundManager.instance.PlaySoundAtPoint(gameObject, deathSound.name);
                }
            }
        }
    }
    public bool IsAlive
    {
        get { return _isAlive; }
        private set
        {
            _isAlive = value;
            animator.SetBool(AnimationStrings.isAlive, value);
        }
    }
 
    private void Awake()
    {
        //Health = MaxHealth;
        animator = GetComponent<Animator>();
    }
    private void Update()
    {
        if (isInvincible)
        {
            if (timeSinceHit > invincibilityTime)
            {
                isInvincible = false;
                timeSinceHit = 0;
            }
            else
            {
                timeSinceHit += Time.deltaTime;
            }
        }
#if (UNITY_EDITOR)
        if (selfDamage)
        {
            Hit(10);
        }
#endif
    }
 
    public void Hit(int damage)
    {
        if (IsAlive && !isInvincible)
        {
            int actualDamageAmount = Mathf.Min(damage, Health);
            Health -= actualDamageAmount;
            isInvincible = true;
 
            CharacterEvents.characterDamaged.Invoke(gameObject, actualDamageAmount);
            if (hitSound != null)
            {
                SoundManager.instance.PlaySoundAtPoint(gameObject, hitSound.name);
            }
        }
    }
 
    public bool Heal(int healAmount)
    {
        bool result = false;
        if (IsAlive && Health < MaxHealth)
        {
            int actualHealAmount = Mathf.Min(healAmount, MaxHealth - Health);
            Health += actualHealAmount;
 
            CharacterEvents.characterHealed.Invoke(gameObject, actualHealAmount);
 
            result = true;
            if (healSound != null)
            {
                SoundManager.instance.PlaySoundAtPoint(gameObject, healSound.name);
            }
 
        }
        return result;
    }
}