//Called when health drops down to 0 IEnumerator OnDeath() { if (isDead) { yield break; } isDead = true; StartCoroutine(TiltColor()); GameObject sfxInstance = FindObjectsOfType <EffectPooler>() .First(pooler => pooler.effectType == deathSFX) .GetPooledObject(); sfxInstance.transform.position = transform.position; sfxInstance.SetActive(true); yield return(new WaitForSeconds(1f)); sfxInstance.SetActive(false); GameManager.Instance.OnMobKilled.Invoke(EnemyType.Tower); //Drop Timer Powerup ItemPooler itemPooler = FindObjectsOfType <ItemPooler>().ToList().First(pooler => pooler.itemType == ItemType.TimerAddOn); if (itemPooler != null) { var item = itemPooler.GetPooledObject(); item.transform.position = transform.position; item.SetActive(true); } gameObject.SetActive(false); }
//Apply explosion effect and cast ripple that deal damage to players inside the radisu IEnumerator CastExplosion() { //This time corresponds to the duration of the explosion animation yield return(new WaitForSeconds(.9f)); GameObject rippleEffect = FindObjectsOfType <EffectPooler>() .First(pooler => pooler.effectType == EffectType.Shockwave) .GetPooledObject(); rippleEffect.transform.position = transform.position; rippleEffect.SetActive(true); rippleEffect.GetComponent <DesactivateObject>().Desactivate(.45f); CinemachineShake.Instance.ShakeCamera(10, 0.25f); RaycastHit2D[] explosionHits = Physics2D.CircleCastAll(transform.position, enemySettings.explosionRadius, Vector2.up, enemySettings.explosionRadius, targetsMask); foreach (RaycastHit2D hit in explosionHits) { Health health = hit.transform.GetComponent <Health>(); if (health && health.IsAlive()) { MaterialModifier modifier = hit.transform.root.GetComponentInChildren <MaterialModifier>(); if (modifier) { modifier.SetTintColor(new Color(1, 0, 0, 1f)); } health.ChangeHealth(-enemySettings.explosionDamage); } } yield return(new WaitForSeconds(0.5f)); GameManager.Instance.OnMobKilled.Invoke(EnemyType.Slime); //Drop Health Potion ItemPooler itemPooler = FindObjectsOfType <ItemPooler>().ToList().First(pooler => pooler.itemType == ItemType.Health); if (Random.Range(0f, 1f) > 0.5f) { if (itemPooler != null) { var healthPotion = itemPooler.GetPooledObject(); healthPotion.transform.position = transform.position; healthPotion.SetActive(true); } } gameObject.SetActive(false); }