/// <summary> /// Metodo responsavel por verificar se é necessário explodir e executar a explosao /// </summary> public virtual void Explode(bool forceExplosion) { if (_armed && _timeToExplode < Time.time || forceExplosion) { // Toca o som de explosao // Apresenta particulas de explosao if (ExplosionParticlePrefab != null) { GameObject explosionParticle = GameObject.Instantiate(ExplosionParticlePrefab); explosionParticle.transform.position = transform.position; GameObject.Destroy(explosionParticle, 5f); } ApplicationModel.Instance.ShakeCamera(); // Verifica as colisoes int _hits = Physics.OverlapSphereNonAlloc(transform.position, ExplosionRadius, _colliders, AffectedLayer); if (_hits > 0) { for (int i = 0; i < _hits; i++) { // Recupera os componentes _affectedCharacter = _colliders[i].GetComponent<BaseEnemy>(); _affectedRigidBody = _colliders[i].attachedRigidbody; if (_affectedCharacter != null) { // Aplica dano se for personagem _affectedCharacter.ApplyDamage(ThrownByCharacter, ENUMERATORS.Combat.DamageType.Melee, ENUMERATORS.Player.PlayerClass.UNDEFINED ,ExplosionDamage); } if (_affectedRigidBody != null) { // Aplica a forca de explosao nos rigidbodys _affectedRigidBody.AddExplosionForce(ExplosionForce, transform.position + Vector3.up * ExplosionYOffSet, ExplosionRadius); _affectedRigidBody.AddForce(Vector3.up * ExplosionForce); } } } ReturnToPool(); } }