/// <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();
        }
    }