public virtual void Die(Collider2D hazard) { if (isDead || !canDie) { return; } isDead = true; // determine knockback direction Vector2 knockback = -(hazard.ClosestPoint(transform.position) - transform.position.xy()); if (knockback == Vector2.zero) { knockback = -rb2d.velocity; } if (knockback == Vector2.zero) { knockback = -transform.right; } knockback = knockback.normalized; sprite.color = deathColor; audioSource.PlayOneShot(deathSound); DOTween.Sequence() .Insert(0, transform.DOMove(transform.position + knockback.xyz(), 0.5f).SetEase(Ease.OutCubic)) .Insert(0, sprite.transform.DOShakePosition(0.5f, 1, 100, 90)) .InsertCallback(0.5f, () => { audioSource.PlayOneShot(explodeSound); }) .Insert(0.5f, sprite.transform.DOScale(Vector3.zero, 0.2f).SetEase(Ease.InBack)) .InsertCallback(0.6f, () => { Instantiate(deathParticles, transform.position, Quaternion.identity); }) .SetTarget(gameObject) .SetLink(gameObject) .SetUpdate(UpdateType.Fixed); OnDeath?.Invoke(this); }
private void OnEntityHit(Entity entity) { // do the damage entity.GetDamage(damage, sender, AttackType.Projectile); var charController = GetComponent <CharController>(); if (charController != null) { charController.OnAttackHit(charController, CharacterAttackType.Projectile, damage); } EventOnEntityHit?.Invoke(); // non static event OnProjectileHitEntity?.Invoke(entity); // static event if (entity is CharacterEntity || entity is VirusSpawner || entity.GetComponent <VirusController>() != null) { ObjectPooler.Instance.EnqueueGameObject("projectile", gameObject); } else { Freeze(); } }