public void ReceiveDamage(int damageReceived, bool friendlyFire = false) { _hitpoints -= damageReceived; _damageShowTimeout = 0.0f; _showDamageBar = !friendlyFire; _damageIndicatorBar.Damage(damageReceived); // Excerpt from https://docs.unity3d.com/Manual/ExecutionOrder.html // // "FixedUpdate: FixedUpdate is often called more frequently than Update. // "It can be called multiple times per frame, if the frame rate is low and it may not be called between frames at // "all if the frame rate is high. All physics calculations and updates occur immediately after FixedUpdate." // // Collision handling is happening after FixedUpdate, which in turn can be called multiple times per frame. // Destroy only marks object for destroy, which will happen only in the next frame. // So to prevent entering the condition multiple times, we use a boolean flag. if (_hitpoints <= 0 && !_isDestroying) { _isDestroying = true; if (!friendlyFire) { if (this is EnemyWeak) { _app.Score += GlobalConstants.EnemyWeakScore; } if (this is EnemyMedium) { _app.Score += GlobalConstants.EnemyMediumScore; } if (this is EnemyHeavy) { _app.Score += GlobalConstants.EnemyHeavyScore; } _app.ScoreCount.text = _app.Score.ToString(); } var explosion = Instantiate(DeathAnimation, new Vector3(RigidbodyComponent.position.x, RigidbodyComponent.position.y, -1.0f), Quaternion.identity); var ps = explosion.GetComponent <ParticleSystem>().main; ParticleSystem.MinMaxGradient g = new ParticleSystem.MinMaxGradient(_originalColor); ps.startColor = g; Destroy(explosion, 2.0f); Destroy(_damageIndicatorBar.gameObject); Destroy(gameObject); } }