Menu

Tutorial de Unity 2D #8- Inimigo – Parte 1

Chegamos hoje ao tutorial de número 8, onde vamos criar os inimigos de nossa fase!

Como já havia falado com vocês antes, nossos tutoriais serão um pouco menores, então praticamente o que vou fazer é adicionar apenas dois tipos de inimigos no jogo, um no tutorial de hoje e outro na semana que vem.

Primeiro vamos importar para o nosso projeto os seguinte sprites para a pasta sprites:

O esqueleto (Que vamos fazer hoje) irá ficar andando pelo cenário e se nós encostarmos nele, ele irá nos atacar. Já o fantasma ficará parado e soltará um ataque (Bola de fogo azul), caso a gente chegue perto dele.

Bom, após ter importado a imagem para o projeto, vamos criar um novo objeto chamado Skeleton.

Agora na aba Project, corte o sprite_skeleton, clicando sobre ele e na aba Inspector selecione na opção Texture Type o valor Sprite (Ou Sprite 2D\uGUI dependendo da sua versão), em Sprite Mode troque o valor para Multiple e em seguida clique no Sprite Editor.

Ao aplicar em Slice automatic, o seu sprite ficará cortado da seguinte forma:

As imagens de cima serão a do inimigo andando e as de baixo, o inimigo atacando. Caso repare a segunda imagem de baixo está com a altura diferente das demais, então eu recomendo que você deixe todas com a mesma altura, do contrário quando for fazer a animação seu personagem vai ficar pulando, pois ele tentará sempre centralizar a imagem.

Então clique sobre ela e altere a sua altura (H) para ficar próximo aos demais.

Aplique a ação (Apply) e vamos voltar ao objeto Skeleton na aba Hierarchy. Vou ensina-los uma forma diferente de adicionar o Sprite. Caso opte que a imagem pertença ao próprio objeto, e não a outro conteúdo herdado do objeto, como fizemos anteriormente com os demais conteúdos, basta clicar sobre ele e na aba Inspector escolher Add Component >> Rendering >> Sprite Renderer.

Nas opções do Sprite Renderer, vá a opção Sprite e procure pela imagem do Skeleton, que acabamos de cortar.

O sprite do Skeleton já deve estar aparecendo no seu cenário.

“Carlos, se tem duas formas de fazer, qual é a melhor?” As duas formas estão certas para o nosso exemplo, pois cada personagem só tem um sprite, então tanto faz usar uma forma ou outra, mas caso o seu personagem fosse o Rayman que possui vários sprites separados, a forma que fizemos anteriormente seria a correta, pois cada parte de seu corpo teria uma animação separada.

Continuando nosso tutorial, no objeto Skeleton na aba Hierarchy e depois na aba Animation, adicionei os demais sprites do skeleton andando.

Ao fazer isso será pedido para salvar a animação. Se estiver seguindo o padrão que eu iniciei nesse projeto, crie uma pasta chamada skeleton dentro da pasta animations e salve a animação com o nome skeleton_andando! Pronto, a primeira animação está feita, porém ainda rápida, neste caso em Sample na aba Animations troque de 60 para 10 e depois clique no player ao lado para ver se a velocidade está boa.

Agora, criemos uma nova animação para o personagem atacando! Clique em skeleton_andando e depois [Create New Clip]

Dê o nome de skeleton_atacando e salve dentro da pasta animations\skeleton. Para esta animação utilize os 4 sprites de baixo do sprite_skeleton e altere o sample para 8.

Eu particularmente não quero que essa animação fique repetindo sem parar como ocorre quando o Skeleton está andando. Quero que ela execute e pare no ultimo sprite sem reiniciar a animação, pois esta só vai rodar uma vez por ataque. Então na aba Project, procure por essa animação na pasta animatins/skeleton e clique nela.

Agora na aba Inspector desmarque a opção Loop Time

Pronto, agora novamente clique no objeto Skeleton na aba Hierarchy e depois na aba Animator. Vai ter lá as nossas duas animações:

Nossa função agora será criar as transições, então para isso crie um parâmetro chamado “atacou” do tipo Trigger.

Agora na animação skeleton_andando clique com o botão direito e escolha Make Transition em direção ao skeleton_atacando.

Ao clicar sobre a seta que foi criada entre as animações, na aba Inspector procure pela opção Conditions e troque o valor para atacou.Nessa parte estamos dizendo que toda vez que eu chamar o parâmetro atacou e ele estiver na animação skeleton_andando, mudará para skeleton_atacando.

Agora precisamos criar o caminho de volta, então clique com o botão direito sobre o skeleton_atacando, escolha a posição Make Transition em direção a skeleton_andando.

Nesta, deixe a conditions como está. Ou seja, após 1 segundo, ele sairá da animação atual para a animação skeleton_andando.
Qual é a ideia aqui então? Por padrão nosso personagem está com a animação atacando. Quando ele encostar no Objeto com a tag Player, irá ativar parâmetro “atacou” que fará mudar para a animação skeleton_atacando e após 1 segundo (praticamente quando a animação de ataque acabar), ele volta para a animação andando.

De volta ao nosso Objeto Skeleton, na aba Inspector, vamos criar e adicionar uma tag chamada Inimigo:

Essa tag servirá para mais tarde a gente poder causar dano ou matar os objetos que tiverem a tag Inimigo.

Vamos adicionar um Rigidbody2D (Se lembrem do Fixed Angle) e um Circle Collider 2D.

Clique com o botão direito na pasta scripts e vá em Create >> C# Scripts. Dê o nome do Script de Skeleton, em seguida dois cliques para abrir o script no MonoDevelop.
Vamos declarar as seguintes propriedades:

	public float velocidade;
	public bool direcao;
	public float duracaoDirecao;

	private float tempoNaDirecao;
	private Animator animator; 

velocidade – indicará a velocidade do inimigo andando;
direcao – Indicará o sentido que ele está andando (Esquerda ou direita)
duracaoDirecao – O tempo que ele vai poder seguir na mesma direção
tempoNaDirecao – Tempo que já passou com ele andando nesta direção
animator – Poderá controlar as transições da aba Animator.

Tudo isso a gente já viu em tutoriais anteriores, então não vou entrar taaanto em detalhe, beleza?

No método Start, vamos adicionar a seguinte linha para nos dá permissão de mexer nas animações:

void Start () {
		animator = gameObject.transform.GetComponent ();
	}

Em Update, vamos fazer nosso inimigo andar:

	void Update () {

		if (direcao) {
			transform.eulerAngles = new Vector2(0, 0);
		} else {
			transform.eulerAngles = new Vector2(0, 180);
		}
		transform.Translate(Vector2.right * velocidade * Time.deltaTime);

		tempoNaDirecao += Time.deltaTime;
		if (tempoNaDirecao >= duracaoDirecao) {
			tempoNaDirecao = 0;
			direcao = !direcao;
		}
 	}

Nesta primeira parte informamos qual direação nosso inimigo vai andar (false = esquerda e true = direita).
if (direcao) {
      transform.eulerAngles = new Vector2(0, 0);
} else {
      transform.eulerAngles = new Vector2(0, 180);
}
transform.Translate(Vector2.right * velocidade * Time.deltaTime);

E na segunda parte verificamos quanto tempo ele está andando. Se esse tempo for maior ou igual ao que definimos que ele deve andar, então mudamos a direção e iniciamos a contagem do tempo do zero.

tempoNaDirecao += Time.deltaTime;
if (tempoNaDirecao >= duracaoDirecao) {
      tempoNaDirecao = 0;
      direcao = !direcao;
}

Para finalizar esse script, vamos criar o Collider para quando o inimigo encostar no player:

void OnCollisionEnter2D(Collision2D colisor) {
	if (colisor.gameObject.tag == "Player") {
		animator.SetTrigger("atacou");
		var player = colisor.gameObject.transform.GetComponent();

		player.PerdeVida(30);
		colisor.gameObject.transform.Translate(-Vector2.right);
	}
}

Caso o objeto que ele colidiu tiver a tag Player, então iremos ativar o Trigger (Tradução de Trigger é gatilho, então pensem como algo literal mesmo, ou seja, apertamos o botão e ele executa a ação) “atacou”, com isso a animação skeleton_atacando irá ser executada.

Depois recuperamos o Script de Player desse objeto para lhe causar 30 de dano! (Tutorial passado)

Por ultimo empurramos o nosso personagem para trás após levar o dano (Se quiser uma distancia maior, basta multiplicar –Vector2.right por outro valor).

Agora a única coisa que precisamos fazer é voltar ao Unity, aplicar o Script no Skeleton e setar os valores:

Com isto seu primeiro inimigo está pronto. Recomendo fazer um Prefab dele chamado Skeleton e o posicionar no local que desejar, dar play e se divertir!

Bom pessoal, por hoje é só. Como falei os tutoriais seriam mais curtinhos para ser tornarem semanais. O próximo inimigo, o Ghost, vou estar apresentando para vocês na semana que vem!

Qualquer dúvida, sugestão ou reclamação, já sabem! Deixem ai nos comentários!
Abraço o/

using UnityEngine;
using System.Collections;

public class Skeleton : MonoBehaviour {

	public float velocidade;
	public bool direcao;
	public float duracaoDirecao;

	private float tempoNaDirecao;
	private Animator animator; 

	// Use this for initialization
	void Start () {
		animator = gameObject.transform.GetComponent ();
	}
	
	// Update is called once per frame
	void Update () {

		if (direcao) {
			transform.eulerAngles = new Vector2(0, 0);
		} else {
			transform.eulerAngles = new Vector2(0, 180);
		}
		transform.Translate(Vector2.right * velocidade * Time.deltaTime);

		tempoNaDirecao += Time.deltaTime;
		if (tempoNaDirecao >= duracaoDirecao) {
			tempoNaDirecao = 0;
			direcao = !direcao;
		}
 	}

	void OnCollisionEnter2D(Collision2D colisor) {
		if (colisor.gameObject.tag == "Player") {

			animator.SetTrigger("atacou");

			var player = colisor.gameObject.transform.GetComponent();
			player.PerdeVida(30);

			colisor.gameObject.transform.Translate(-Vector2.right);

		}
	}
}

Parte 7 – Vida

Indice Unity 2D

Parte 9 – Inimigo Parte 2

Criador do Jogos Indie, amante de jogos, terror, música, anime e programação. Estudante de mestrado com foco em jogos na educação. Louco por Resident Evil e... sei lá, acho que é isso O.o

41 comments

  1. Silva disse:

    MUITOO BOM!! tava dando f5 até atualizar o tutorial de hoje!! por favor continue!! virei fã!! sinto minhas ideias borbulharem kkkkkkk sou torcedor tbm do tutorial unity mobile. tô apanhando aqui pra fazer os touch de movimento!!

    abraço!!

  2. Bruno disse:

    Ja comecei a fazer os tutorias estou renderizando a primeira parte!! 🙂

  3. Bruno disse:

    Esta ai o primeiro video não ficou em 1080p porque eu esquecio de mudar a resolução mais esta bom a qualidade https://www.youtube.com/watch?v=JRqEoLTo2D0
    meu canal e novo o primeiro video não pode ter ficado como você esperado mais com o tempo tudo se melhora

  4. Mojo disse:

    Muito bom o tutorial, parabéns.

  5. Victor Hugo disse:

    Boa noite! Quero dizer que seus tutoriais são excelentes, estão me ajudando muito, e que acabou me dando um ânimo de criar um joguinho novamente rs. Estou tentando adiantar algumas coisas para depois polir assistindo seus tutoriais, mas algumas não estão dando muito certo como eu queria, mal posso esperar para assistir as próximas partes do tutorial para ver se me da uma luz. rs

    • Massa ^^

      E quanto as suas dúvidas podem falar, por aqui ou pelo parte de contato se quiser algo mais reservado. Dependendo do que for eu posso demorar, mas o importante é você não guardar dúvida o/

  6. Marcos Cruz disse:

    Fala carlos finalmente cheguei neste tutorial, e é muito foda ver o npc se movendo pra lá e pra cá socando chutando fazendo a porra toda, gostaria da sua ajuda pra pequeno impasse no qual estou passando:

    1° No cenario no qual estou criando eu fiz alguns morros com o box collider no top do mesmo, para o player possa ficar em cima, mas quando eu tento pular em baixo do mesmo eu não consigo, pra exemplificar, eu queria fazer igual ao do Mário: http://www.cubed3.com/review/195/1/super-mario-world-nintendo-snes.html segue o link é a 3° imagem.

    2°Quando o Player fica com menos de 30 de vida eu coloquei outro animação no qual o heroi fica todo machucado e cansado na condição Bool, onde ele tendo 30 de vido ou menos e permanecendo parado é TRUE, e se ele andar, pular ou cair é FALSE. O que eu gostiaria que voce me ajuda-se é: executar a animação corretamente ao heroi quando ele tiver 30 de vida ou menos, pôs a animação fica se repetindo por completo, mas eu queria apenas que os últimos 3 frame de 5 se repeti-se, onde estes 3 ultimos frame demostra ele cansado segue o link: http://spritedatabase.net/files/ds/2/Sprite/Kenshin.png

    é o sprite Lose do Kenshin

    • Opa, Marcos eu entendi a sua resposta. O primeiro ponto eu vou ter que fazer uns testes antes.

      O segundo eu sei como fazer, mas vou enviar tudo junto pode ser?

      Agora eu estou montando um seminário, mas até amanhã eu devo estar lhe dando a resposta

      • Marcos Cruz disse:

        opa Carlos voce é foda muito obrigado mesmo ! ! ! !

        • E aqui estão as suas respostas:

          1 – Subir em cima de plataforma. Neste caso existe esse metodo que eu estava testando aqui: Physics2D.IgnoreLayerCollision

          Ele faz com que a collision deixe de existir entre dois layers, quando uma condição for verdadeira ou seja:

          Physics2D.IgnoreLayerCollision(LayerMask.NameToLayer(“Default”), LayerMask.NameToLayer(“Piso”), rigidbody2D.velocity.y > 0);

          Aqui eu estou dizendo que todo conteúdo do layer Default deixará de colidir no Layer Piso, quando a velocidade do player subindo for maior que zero (Ou seja, esta pulando)

          Esse método ai, você coloca entro do Update ou cria um novo método chamado FixedUpdate dentro do Player e joga ele, deixando assim:

          void FixedUpdate() {
          Physics2D.IgnoreLayerCollision(LayerMask.NameToLayer(“Default”), LayerMask.NameToLayer(“Piso”), rigidbody2D.velocity.y > 0);
          }

          Se você testar, isso vai ver que todos os objetos e inimigos no seu cenário que andarem sobre o Piso, vão cair, por isso eu recomendo que crie um novo Layer só para o Player.

          Vou adicionar esse conteúdo aqui nesse post mais tarde (São 1:30 da manhã, estou morrendo de sono para por agora >.< ) ---------------- 2 - O segundo caso, que eu tinha pensado é que vai ter duas animações, uma com a primeira parte e a segunda que ficará repetindo. Algo do tipo: fracoAnimacaoInicial ----> (Exit Time = 0.5) fracoAnimacaoFinal

          Ou seja, as demais animações apontariam para a inicial e que só apontaria para a final. E a final é que apontaria para as demais.

          Conseguiu entender?

          Se ficar mais faço eu faço um exemplo e envio para o teu email. Ai tu envia o teu email pela area de contatos no link no topo do site, para não deixar aqui 😉

          Vou dormir agora, flw o///

  7. Antonio disse:

    Mais uma vez muito obrigado por esses tutoriais Carlos!!

    Estou com uma dificuldade que é a seguinte:

    -Quero que o meu player execute uma animação no momento em que sofre um ataque do inimigo (um sprite que mostre que ele se machucou);

    -Criei no amination um “new clip”, com o nome “player_sofreuAtaque” com essa animação;

    -Adicionei um parametro “sofreuAtaque” do tipo Trigger;

    -No animator, no player_andando, player_parado, player_saltanto coloquei transitions no sentido do player_sofreuAtaque com conditions “sofreuAtaque” e no sentido inverso com “exitTime 1.00”;

    -No script do player, adicionei o seguinte codigo:

    void OnCollisionEnter2D(Collision2D colisor) {

    if (colisor.gameObject.tag == “Inimigo”) {

    animator.SetTrigger(“atacado”); }}

    Porém nao esta funcionando, poderia-me dizer qual o erro que estou cometendo?

    Muito Obrigado!

    • E aê Antonio, tudo beleza?

      Então, se o seu parametro é sofreuAtaque, então no seu script tem ser sofreuAtaque também:

      if (colisor.gameObject.tag == “Inimigo”) {
      animator.SetTrigger(“sofreuAtaque”);
      }

      • Antonio disse:

        Tudo beleza!

        Sim, me enganei a escrever, eu coloquei animator.SetTrigger(“sofreuAtaque”);

        Porem nao acontece rigorosamente nada, eu coloco o jogo a rolar com a aba Animator aberta e ele nao passa para “player_sofreuAtaque” no momento da colisao;

        • Aparentemente está ok. Bota um Debug.Log(“Sofreu Ataque”) dentro do If, para verificar se ele está entrando ai. Pode ser que o inimigo está sem a tag ou você está usando trigger ao invés de collider.

          Se nada disso funcionar, manda para o meu e-mail [email protected] o projeto zipado que eu dou uma olhada 😉

  8. Olá, Carlos, gostaria de saber como faço para que no momento em que o inimigo executar o ataque, ele permaneça no mesmo lugar depois volte a se movimentar no sentido contrário.

  9. Opa Herbert, beleza?

    Então cara, o que você vai precisar é no momento do Collider, adicionar uma flag (Uma variavel dizendo: ataqueRealizado = true). Enquanto ela for verdadeira, desabilita o movimento do inimigo. Algo do tipo:

    if (!ataqueRealizado) {
    movimento();
    }

    E ao mesmo tempo fazer uma contagem do tempo da animação para depois liberar o movimento do inimigo no outro sentindo:

    if (!ataqueRealizado) {
    movimento(); //Considere aqui toda aquela parte do movimento, só copiar e colar.
    } else {
    tempoNaAnimacao += Time.deltaTime;
    if (tempoNaAnimacao >= duracaoAnimacao) {
    tempoNaAnimacao ////Zera a contatem da animação para o próximo ataque
    ataqueRealizado = false; ////Libera o movimento
    tempoNaDirecao = 0; ////Zera a contagem da direção
    direcao = !direcao; ///Muda a direção
    }
    }

  10. Obrigado, Carlos! Acho q vai funcionar 😉 (pelo menos até agora tah funfando ^^)

  11. Gustavo Hill disse:

    olá gostaria de saber como faço para o meu inimigo seguir o personagem, ou se há algum script que faça com que ele verifique de que lado o personagem vem para segui-lo ou algo assim. Alguem poderia por favor me dizer?

  12. Fiz tudo que está no tutorial e o esqueleto não ataca meu personagem. O que seja? Tentei de tudo e não funfa! =/

  13. Está errado na parte da colisão. Troque OnCollisionEnter2D por OnTriggerEnter2D pq vc chamou Trigger no Animator. Depois no Inspector do Skeleton vc clica em Is Trigger e deixa a Gravidade como sendo 0. =)

  14. GG disse:

    Vcs tem como fazer um tutorial mostrando como Mudar de cenário/Fase após destruir uma certa quantidade de inimigos.
    Tipo certou 100 inimigos o player passa para outro cenário/fase/scene, destrava uma nova arma, e aparece uma mensagem.

    • Na realidade não é tão difícil não. Quando você for para o tutorial intermediário vai ter algo relacionado a mudar de fase ao derrotar um boss.

      Para ser todos os inimigos do cenário, lá você usuária um contador para ver se acabaram todos os inimigos:

      if (FindGameObjectsWithTag(“Inimigo”).Lenght == 0)
      //Muda de fase

  15. Gabriel Moura disse:

    Cara como eu faço para o inimigo seguir o player?

  16. rafoso disse:

    Estou acompanhando o curso!! show de bola jogosindie!!!!

  17. Ranny Santos disse:

    Bom dia!!

    Cara sensacional o tutorial estou aprendendo muito com ele, ótimo trabalho.

    só estou com uma duvida:

    quando uso…

    colisor.gameObject.transform.Translate(-Vector2.right);

    para jogar meu player ir para o lado quando eh atacado , mas ele meio que da uma teleportada, tem como resolver isso??

    Ótimo trabalho, continuarei acompanhando e recomendando!!

    • Teletransportado O.o

      Então isso deve estar muito rápido.

      Faz isso oh:
      colisor.gameObject.transform.GetComponent<Rigidbody2D>().AddForce(-Vector2.right * 5);

      Deve funcionar bem melhor, afinal não se tratar de andar até um local e sim ser empurrado (aplicado um força)

  18. Ranny Santos disse:

    Deu certo, muito Obrigado!!

  19. Nylton CR disse:

    Olá boa noite, olha que conteúdo sucinto, muito bem elaborado, eu estou com um problema Unity 5.5 acredito que alguns parametros mudaram deste a publicação do tutorial, ocorre que a o ataque não é ativado, esta tudo certo, mas ele nao ativa >
    void OnCollisonEnter2D(Collision2D colisor) {
    if (colisor.gameObject.tag == “Player”){

    Anime.SetTrigger (“Atacando”);
    }

    alguém passou por isso ?

  20. Nylton CR disse:

    Consegui resolver :)…
    Gostaria de entender essa resposta>
    Então cara, o que você vai precisar é no momento do Collider, adicionar uma flag (Uma variavel dizendo: ataqueRealizado = true). Enquanto ela for verdadeira, desabilita o movimento do inimigo. Algo do tipo:
    if (!ataqueRealizado) {
    movimento();
    }
    E ao mesmo tempo fazer uma contagem do tempo da animação para depois liberar o movimento do inimigo no outro sentindo:
    if (!ataqueRealizado) {
    movimento(); //Considere aqui toda aquela parte do movimento, só copiar e colar.
    } else {
    tempoNaAnimacao += Time.deltaTime;
    if (tempoNaAnimacao >= duracaoAnimacao) {
    tempoNaAnimacao ////Zera a contatem da animação para o próximo ataque
    ataqueRealizado = false; ////Libera o movimento
    tempoNaDirecao = 0; ////Zera a contagem da direção
    direcao = !direcao; ///Muda a direção
    }
    }
    (para mim não ficou muito claro então não estou conseguindo implementar).

  21. Thiago disse:

    Em primeiro lugar, gostaria de parabenizar o Carlos, por estes tutoriais de excelente qualidade, compartilhando as informações e o que sabe sem qualquer egoísmo!

    Bom, mudando de assunto:

    Se alguém, assim como eu, ficou incomodado com o “tranco” que acontece quando nosso player é arremessado para trás após ser atacado pelo esqueleto e ainda resolvendo a questão do ataque do esqueleto de forma controlada, segue uma solução que implementei. Para mim o resultado ficou satisfatório:

    OBS.: Todos os passos abaixo devem ser realizados no Script Skeleton.

    1 – Criar as variáveis abaixo:

    private bool atacou;
    private float tempoAtaque;

    2 – Incluir só uma linha na função OnCollision:

    void OnCollisionEnter2D(Collision2D colisor)
    {
    if (colisor.gameObject.tag == “Player” && !atacou)
    {
    somAtaque.Play();
    animator.SetTrigger(“atacou”);

    atacou = true;

    //StartCoroutine(“delayDano”); // ver passo 4
    playerScript.PerdeVida(30);
    }
    }

    3 – Incluir a condição abaixo no Update:

    if (atacou) {
    tempoAtaque += Time.deltaTime;
    player.transform.Translate(-Vector2.right * (0.005f/tempoAtaque));

    if (tempoAtaque >= 1)
    {
    tempoAtaque = 0;
    atacou = false;
    }
    }

    4 – (Extra) Se quiser ainda criar um efeito de “dano” no player (fazendo o sprite piscar algumas vezes), basta retirar o comentário (//) da instrução StartCoroutine(“delayDano”), que está dentro da função OnCollision, e criar uma Coroutine, conforme abaixo:

    IEnumerator delayDano() {
    player.SetActive(false);
    yield return new WaitForSeconds(0.25f);
    player.SetActive(true);
    yield return new WaitForSeconds(0.25f);
    player.SetActive(false);
    yield return new WaitForSeconds(0.25f);
    player.SetActive(true);
    yield return new WaitForSeconds(0.25f);
    }

    Bom, isso é apenas uma ideia que implementei e gostei, podem modificá-la conforme o seu gosto.

    Espero que ajude! Bons Estudos =)

  22. Tiago Ardison disse:

    funciona no unity 5 ?

Deixe uma resposta

Parceiros

Steam Brasil LoboLimão Centro RPG Lab Indie
Mundo Gamer PodTerror

Anunciantes

Aglomerando - Agregador de conteúdo
Uêba - Os Melhores Links GeraLinks - Agregador de links Piadas Idiotas - São idiotas mas o faz rir Tedioso: Os melhores links LinkLog MeusLinks.com - Informação e conteúdo todos os dias para você! Agregador de Links - Madruga Links 4Blogs - Agregador de conteúdo Está no seu momento de descanso né? Entao clique aqui!