UnityGameProjectsCode / InTheDarkGame / Player / Health.cs
Health.cs
Raw
using System.Collections.Generic;
using UnityEngine;

public class Health : MonoBehaviour
{
    public float maxHealth;
    private float currentHealth;
    public List<GameObject> bloodSplatters = new List<GameObject>();
    private List<GameObject> splatters = new List<GameObject>();
    public List<AudioClip> deathSounds = new List<AudioClip>();
    public List<AudioClip> hurtSounds = new List<AudioClip>();
    private float timeBetweenSplatters = 12;
    private float splatterTimer = 0;
    private int splatterIndex;
    private bool playerDead;
    private bool playingDeathAnim;
    private float deathAnimTime = 6.5f; //time of actual death animation
    private float deathTimeWaited = 0;
    private AudioSource aSource;
    public AudioSource hurtSound;
    private PlayerMove pMove;

    private float damageTaken;
    private float damageThreshold = -0.3f;
    private bool isRed;
    public float hurtFlashTime;
    private float hurtTimeWaited = 0.0f;

    private void Awake()
    {
        currentHealth = maxHealth;
        aSource = GetComponent<AudioSource>();
        pMove = GetComponent<PlayerMove>();
    }

    private void Start()
    {
        foreach (GameObject splatter in bloodSplatters)
            splatters.Add(Instantiate(splatter as GameObject, transform));

        for (int i = 0; i < bloodSplatters.Count; i++)
        {
            foreach (GameObject splatter in bloodSplatters)
                splatters.Add(Instantiate(splatter as GameObject, transform));
        }

        for (int i = 0; i < splatters.Count; i++)
            splatters[i].SetActive(false);
    }

    private void Update()
    {
        if (currentHealth >= maxHealth)
            currentHealth = maxHealth;

        if (currentHealth <= 0)
        {
            currentHealth = 0;
            OnDeath();
        }

        if (currentHealth < maxHealth)
        {
            splatterTimer += Time.deltaTime;

            if (splatterTimer >= timeBetweenSplatters)
            {
                splatters[splatterIndex].SetActive(true);
                splatters[splatterIndex].GetComponent<FadeInOrOut>().ResetFade();
                splatters[splatterIndex].transform.rotation = new Quaternion(transform.rotation.x, transform.rotation.y, transform.rotation.z + Random.Range(-50, 50), transform.rotation.w);
                splatters[splatterIndex].transform.position = transform.position;
                splatters[splatterIndex].transform.parent = transform.parent.parent;
                splatterTimer = 0.0f;

                if (splatterIndex == splatters.Count - 1)
                    splatterIndex = 0;
                else
                    splatterIndex++;
            }
        }

        if (isRed)
        {
            hurtTimeWaited += Time.deltaTime;

            if (hurtTimeWaited >= hurtFlashTime)
            {
                GetComponent<SpriteRenderer>().color = Color.white;
                isRed = false;
                hurtTimeWaited = 0.0f;
            }
        }

        if (playingDeathAnim)
        {
            deathTimeWaited += Time.deltaTime;

            if (deathTimeWaited >= deathAnimTime)
            {
                playerDead = true;
                playingDeathAnim = false;
            }

        }
    }

    public void PlayDeathClip(int index)
    {
        aSource.clip = deathSounds[index];
        aSource.Play();
    }

    public void ModifyCurrentHealth(float modifier)
    {
        currentHealth += modifier;
        damageTaken += modifier;

        if (damageTaken > damageThreshold && !playingDeathAnim)
        {
            if (!hurtSound.isPlaying)
            {
                hurtSound.clip = hurtSounds[Random.Range(0, hurtSounds.Count - 1)];
                hurtSound.Play();
                GetComponent<SpriteRenderer>().color = Color.red;
                isRed = true;
                damageTaken = 0;
            }
        }

        if (currentHealth <= maxHealth * 0.2f)
        {
            timeBetweenSplatters = 3;
            pMove.SetMovementSpeed(2.0f, 4.2f);
        }
        else if (currentHealth <= maxHealth * 0.4f)
        {
            timeBetweenSplatters = 5;
            pMove.SetMovementSpeed(2.2f, 4.4f);
        }
        else if (currentHealth <= maxHealth * 0.6f)
        {
            timeBetweenSplatters = 7;
            pMove.SetMovementSpeed(2.3f, 4.6f);
        }
        else if (currentHealth <= maxHealth * 0.8f)
        {
            timeBetweenSplatters = 10;
            pMove.SetMovementSpeed(2.4f, 4.8f);
        }
    }

    public float GetCurrentHealth()
    {
        return currentHealth;
    }

    public void OnDeath()
    {
        GetComponent<PlayerMove>().SetMovementState(true);
        GetComponent<LookAtMouse>().SetFollowingState(true);
        GetComponent<Animator>().Play("Player Death");
        playingDeathAnim = true;
    }

    public bool GetPlayerDeathState()
    {
        return playerDead;
    }
}