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; } }