Menu

21 – Tutorial Intermediário – Boss – Golem

Vamos para o nosso terceiro boss, enquanto eu esforço aqui para pensar em formas diferentes de criar inimigos e ataques.

O Boss de hoje será um Golem que não se move, mas que seu ataque pode vir tanto de cima, quando da sua frente.
O sprite que vamos utilizar para o boss é o Golem disponibilizado pelo irmirx novamente no site OpenGameArt:

http://opengameart.org/content/golem-animations

Os nossos sprites vão ficar na pasta Resources/sprites/inimigos/golem

appear -> surgindo
attack -> atacando
die -> morrendo
idle-walk -> parado

18- Tutorial Fase 3 - Boss

Próximo passo qual é? Criar um objeto chamado Golem com o componente Sprite Renderer usando uma das imagens do Golem para podermos definir o seu tamanho e posição no cenário:

19- Tutorial Fase 3 - BossJá podemos para aproveitar e adicionar o Box Collider 2D e o Rigidbody2D com as mesmas alterações feitas no Vampiro (Sleeping Mode -> Never Sleep, para poder causar o dano mesmo com o inimigo parado e os Freeze para que o objeto não se mova).

20- Tutorial Fase 3 - Boss

Com isto, pronta é a hora de criarmos as animações. Então com o Golem selecionado na aba Hierarchy vamos a aba animation e criaremos as animações: escondido, surgindo, parado, atacando e morrendo, dentro da pasta Resources/animation/inimigos/golem:

21- Tutorial Fase 3 - Boss

Lembrando que as animações atacando, escondido, morrendo e surgindo não precisam do Loop Time:

22- Tutorial Fase 3 - Boss

A animação escondido não terá nenhum sprite.

A animação surgindo, terá os sprites da pasta surgindo e parado não tem mistério, é só arrastar as animações das pastas correspondentes.

Já as animações atacando e morrendo vão precisar de uns ajustes.

Selecione todos os sprites do ataque e mude o pivot para Custom com as posições X = 0.56 e Y = 0.47

23- Tutorial Fase 3 - Boss

Já nos sprites do inimigo morrendo, basta mudar o Pivot para Custom e trocar o Y para 0.35:

24- Tutorial Fase 3 - Boss

Pronto, já conseguimos alinhar e criar as animações. Agora é o momento de ir na aba Animator e criar os parâmetros do tipo Trigger: surgiu, morreu, atacou.

Nas transições iremos manter o mesmo padrão que vinhamos seguido até agora:

Entry -> escondido
escondido -> surgindo (Condição: surgiu | Has Exit Time: Não | Transition Duration: 0)
surgindo -> parado (Condição: nada | Has Exit Time: Sim | Transition Duration: 0)
parado -> atacando (Condição: atacou | Has Exit Time: Não | Transition Duration: 0)
atacando -> parado (Condição: nada | Has Exit Time: Sim | Transition Duration: 0.5 – a animação é tão rápida, que senão tiver isso, ela acaba antes de terminar todos os keyframe)
Any State -> morrendo (Condição: morreu | Has Exit Time: Não | Transition Duration: 0)

25- Tutorial Fase 3 - Boss

Com tudo isso pronto, já podemos remover o sprite que está no Sprite Renderer do Golem (Só cuidado para não estar com a opção Record lá na aba Animation marcada).

O próximo passo agora é baixar o sprite dessa pedra (Ou se achar uma mais bonita, também serve) disponibilizada por MystiqMiu no site OpenGameArt:

http://opengameart.org/content/basic-boulder

Salve essa pedra com o nome “pedra” como Sprite na pasta Resources/sprites/ataques/:

27- Tutorial Fase 3 - Boss

Agora dentro da aba Hierarchy, crie um novo objeto com o nome Pedra. Nele adicione o Sprite Renderer com essa pedra, e os componentes Circle Collider 2D e Rigidbody2D (Desta vez não marque o Freeze Rotation, afinal a ideia é que ela possa rodar):

28- Tutorial Fase 3 - Boss

Caso queira, já pode até dá play e ver sua pedra girando:

29- Tutorial Fase 3 - Boss

Se quiser dificultar ainda mais a vida do jogador (O que é uma boa), no Sprite Renderer, pode aplicar o material Sombra:

30- Tutorial Fase 3 - Boss

31- Tutorial Fase 3 - Boss

O que podemos por ainda mais é fazer essa pedra quicar, através dou Material Physics 2D, que vimos quando expliquei sobre o Effector. Para isso crie um nova pasta chamada “fisica”, dentro de Resources e nela crie um Physics2D Material com o nome pedra:

32- Tutorial Fase 3 - Boss

33- Tutorial Fase 3 - Boss

Lá você já pode aumentar o Bounciness para 0.2, para que ela quique ao cair no chão, só que não tanto (Quanto maior o valor, mais ela irá quicar).

Após isso, basta voltar ao Circle Collider 2D do nosso objeto Pedra e adicionar essa física:

34- Tutorial Fase 3 - Boss

Se quiser testar, é só levantar a sua pedra até um local alto e dá play:

35- Tutorial Fase 3 - Boss

Bom. Agora vamos criar um método para essas pedras causarem dano no inicio ao acerta-lo e se autodestruírem em um tempo X. Então crie um script (C#) chamado Pedra dentro da pasta scripts/inimigos.

No método Awake, iremos informar que a pedra pertence a Layer Inimigos, assim ela não vai ficar batendo uma pedra na outra ou nos Limites, já que não há interação entre as Layers Inimigo com Inimigo (Fizemos isso lá na opção Edit >> Project Settings >> Physcis2D , lembra?)

Script: Pedra.cs

using UnityEngine;
using System.Collections;

public class Pedra : MonoBehaviour {

	void Awake() {
        gameObject.layer = 11; //Layer Inimigos
    }
}

Bom, agora precisamos criar duas variáveis. Uma para definir em quanto tempo a pedra vai sumir e outra para definir o dano causado ao jogador:

Script: Pedra.cs

using UnityEngine;
using System.Collections;

public class Pedra : MonoBehaviour {

    public int dano;
    public float tempoAutoDestruicao;

	void Awake() {
        gameObject.layer = 11; //Layer Inimigos
    }
}

A variável que armazena o tempo para a pedra desaparece, já usamos dentro do método Awake:

Script: Pedra.cs

	void Awake() {
        gameObject.layer = 11; //Layer Inimigos
        Destroy(this.gameObject, tempoAutoDestruicao);
    }

Depois daqui é só Criar um método de Collider que verifique se tocou no player. Caso tenha tocado, então destrói a pedra e causa dano ao personagem:

Script: Pedra.cs

using UnityEngine;
using System.Collections;

public class Pedra : MonoBehaviour {

    public int dano;
    public float tempoAutoDestruicao;

	void Awake() {
        gameObject.layer = 11; //Layer Inimigos
        Destroy(this.gameObject, tempoAutoDestruicao);
    }

    void OnCollisionEnter2D (Collision2D colisor) {
        if (colisor.gameObject.tag.Equals("Player")) {
            var personagem = colisor.gameObject.GetComponent();
            personagem.recebeDano(dano);

            Destroy(this.gameObject); //Destroi a pedra
        }
    }
}

Com esse script pronto, basta aplicar no nosso objeto Pedra, informando o tempo para se auto destruir e o dano que causa ao acertar o player:

36- Tutorial Fase 3 - Boss

Feito isto, salve a Pedra como um prefab dentro de Resources/prefabs/inimigos:

37- Tutorial Fase 3 - Boss

Inclusive, pode remover aquele que está lá na Scene.

Agora vamos criar definitivamente o script do Boss para terminar esse post o/

Crie o script Golem dentro da pasta scripts/inimigos. Esse script também vai herdar inimigos, então sua estrutura base será:

Script: Golem.cs

using UnityEngine;
using System.Collections;
using System;

public class Golem : Inimigo {

    protected override void atacar() {
        
    }

    protected override void mover() {}
}

Vamos adicionar o método Awake com o total e vida do Boss (50):

Script: Golem.cs

    protected override void Awake() {
        base.Awake(); //Chama o Awake da classe Inimigo
        status = new Status(50, 0, 0); //HP = 50 | MP = 0 | Ataque = 0
    }

Muito bom, agora vamos precisar de 3 variaveis!

1 – uma Lista com posições de onde a pedra vai cair
2 – Uma variável que armazene de quanto em quanto tempo o boss vai atacar
3 – Uma variável que faça a contagem do tempo

Script: Golem.cs

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class Golem : Inimigo {

    public List pedras;
    public float duracaoAtaque;
    private float contagemAtaque;

    protected override void Awake() {
        base.Awake(); //Chama o Awake da classe Inimigo
        status = new Status(50, 0, 0); //HP = 50 | MP = 0 | Ataque = 0

        contagemAtaque = duracaoAtaque;
    }
...
}

Lembrando para usar List, temos que chamar o System.Collections.Generic no inicio do script. E a contagemAtaque já é iniciada no método Awake.

Agora no nosso método atacar, iremos fazer a contagem regressiva. Quando a contagem chegar a 0, então iremos criar um prefab da pedra para cada posição que definimos.

Script: Golem.cs

    protected override void atacar() {
        contagemAtaque -= Time.deltaTime;

        if (contagemAtaque <= 0) {
            var prefab = Resources.Load("prefabs/inimigos/Pedra");

            foreach (var posicao in pedras)
                Instantiate(prefab, posicao, Quaternion.identity);

            contagemAtaque = duracaoAtaque;
            animator.SetTrigger("atacou");
        }
    }

Vamos as explicação. Na contagemAtaque vamos reduzir o tempo até que esse tempo seja menor ou igual a 0. Até ai tudo normal.

Quando a contagem chegar ao limite, então buscamos o prefab da pedra através do método Resources.Load, certo?
Em seguida vem um foreach. Eu tenho a ligeira impressão que eu já expliquei aqui nesse tutorial o que é o foreach, mas eu não lembro em qual post, então caso eu não tenha explicado, o foreach é uma estrutura de repetição, que vai repetir de acordo com o número itens que tiver na lista.

A lista que estamos usando é a lista pedras (List pedras). Ou seja, se nela tiver 3 itens, o foreach vai repetir 3 vezes. Se tiver 10, então 10 vezes. O valor que é pego da lista é colocando dentro da variável posicao no nosso foreach.

Em outras palavras a estrutura foreach pega um item da lista por vez e lança dentro da variável:

foreach (var recuperaValorDaLista in lista)

Dentro do foreach, criamos os prefabs nas scene através do Instantiate, apontando a posição que definimos na Lista.

E a rotação é identificada automaticamente.

O foreach por só ter uma única linha não precisa das “{“ e “}”. Ou seja só o Instantiate é que está dentro do foreach. Caso tivéssemos mais de um conteúdo, precisaria por foreach (var posicao in pedras) { conteúdo }.

Então após o foreach, reiniciamos a contagem do ataque e fazemos a animação do ataque!

O script já poderia parar até por ai, mas acho que seria muito fácil não é? Os ataques só caindo de cima, bastava o personagem ficar embaixo da PlataformaOneWay. Então além dessas que caem, vamos criar uma nova pedra na mesma posição do Golem e que é empurrada em direção ao jogador:

var pedra = Instantiate(prefab, transform.position, Quaternion.identity) as GameObject;
            pedra.GetComponent().AddForce(-Vector3.right * 1000);

Cria uma pedra na mesma posição do Golem. E depois recuperamos o componente Rigidbody2D para aplicar uma força para a esquerda. Se você preferir pode transformar esse 1000 ai é uma variável para poder controlar ela pelo editor do Unity, senão deixa esse valor fixo.

Com isso o script do Golem fica sendo:

Script: Golem.cs

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class Golem : Inimigo {

    public List pedras;
    public float duracaoAtaque;
    private float contagemAtaque;

    protected override void Awake() {
        base.Awake(); //Chama o Awake da classe Inimigo
        status = new Status(50, 0, 0); //HP = 50 | MP = 0 | Ataque = 0

        contagemAtaque = duracaoAtaque;
    }

    protected override void atacar() {
        contagemAtaque -= Time.deltaTime;

        if (contagemAtaque <= 0) {
            var prefab = Resources.Load("prefabs/inimigos/Pedra");

            //Pedras que Caem
            foreach (var posicao in pedras)
                Instantiate(prefab, posicao, Quaternion.identity);

            //Pedra horizontal
            var pedra = Instantiate(prefab, transform.position, Quaternion.identity) as GameObject;
            pedra.GetComponent().AddForce(-Vector3.right * 1000);

            contagemAtaque = duracaoAtaque;
            animator.SetTrigger("atacou");
        }
    }

    protected override void mover() {}
}

Agora é só voltar ao Unity, adicionar o Script ao Golem, recuperar seu Animator, definir a distância para surgir, a duração do ataque e as posições de onde as pedras vão cair:

38- Tutorial Fase 3 - Boss

39- Tutorial Fase 3 - Boss

Define 10 posições, ou seja 10 pedras vão cair do teto. É bom mudar a altura (X) além da sua posição horizontal (X), pois assim elas caem em momentos diferentes.

Para finalizar, é só transformar o Golem em um Prefab e ir no agora script GCFaseCaverna no objeto GC e dizer quem é o Boss:

40- Tutorial Fase 3 - Boss

Agora volte a Scene main e teste seu jogo. Caso prefira, pode adicionar outras Tochas para iluminar o local da batalha:

41- Tutorial Fase 3 - Boss

E desta forma terminamos mais um boss. Espero que tenha gostado desse post e até a próxima!

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

No comments

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!