Menu

24 – Tutorial Intermediário – Boss – Arlequim

E chegamos ao ultimo tutorial para a felicidade de alguns e tristeza de outros. Eu estive relendo os primeiros tutoriais básicos e esse aqui e percebi que o tutorial básico eu explica beeeem mais. Peço desculpa pela falta de explicação detalhada nesse, mas se eu fosse fazer como antes, já viram o tamanho do tutorial, né? E esses posts aqui dos inimigos também não estou detalhando tanto, porque ele é mais uma post voltando a mostrar diferentes formas de fazer um inimigo e não tem tanta coisa nova, é mais repetição de ações. Quando existe algo novo como o Physics2D.Raycast, Effector e essas coisinhas eu explico mais, porém quando é apenas a lógica em si, eu explico de forma a explorar menos, pois a lógica de cada fase e personagem será vocês que vão ter que pensar na do seus jogos, então essa parte do tutorial é mais para ajudar a vocês a desenvolverem um raciocínio lógico do que a própria programação por trás, ok? 😉

Agora sem choro, vamos ao que interessa. O Ultimo boss!


Vocês se lembram das imagens dos bosses do Stephen Challener disponibilizado pelo Balmer no site OpenGameArt?

http://opengameart.org/content/bosses-and-monsters-spritesheets-ars-notoria

Se você excluiu, trate de baixar de novo, pois vamos utilizar praticamente metade do que tem ai.

Começando pelo boss. Então abre o seu Unity e na pasta Resources/sprites/inimigos, crie uma pasta chamada arlequim e adicione os seguintes sprites do Stephen Challener com os seguintes nomes:

mage-1-85×94.png -> arlequim_forma1
mage-2-122×110.png -> arlequim_forma2
mage-3-87×110.png -> arlequim_forma3

Ééééé, meu caro. Nosso mago ele não vai se mover, ficando apenas parado com um único sprite, maaaaas ele terá 3 formas. Boss parado e com três formas, é ou não é digno de ser um último boss?

Os três sprites serão do tipo Multiple e no Sprite Editor corte os sprites em 4 colunas por 2 linhas:

Acabamos por aqui com os sprites? Nããããããão!

Vamos agora na pasta Resources/sprites/ataques e adicione os seguintes sprites com os seguintes nomes:

tentacles-25×90.png -> arlequim_ataque1
acid2-14×67.png -> arlequim_ataque2
shadow-80×70.png -> arlequim_ataque3

Você vai repetir o mesmo processo com esses 3 sprites de cortas como multiple só que sendo:

arlequim_ataque1 -> C: 8 (Colunas) | R: 3 (Linhas)
arlequim_ataque2 -> C: 8 (Colunas) | R: 3 (Linhas)
arlequim_ataque3 -> C: 4 (Colunas) | R: 5 (Linhas)

Bem, bem, bem! Agora que já temos todos os sprites que vamos precisar é hora de criar um objeto na aba Hierarchy chamado Arlequim. Nele adicione o Sprite Renderer para posicionar o objeto no final da fase e com um tamanho legal:

Agora iremos criar as suas animações! Como falei ele não terá ataque, mas ainda sim podemos criar a animação surgindo (Igual ao MagoAzul), morrendo (Igual ao Andromalius), as animações das suas formas e das suas transformações!

Então crie as seguintes animações e as salve na pasta Resources/animations/inimigos/arlequim:

escondido (Sem Loop Time)
surgindo (Sem Loop Time)
forma1
transformacao1 (Sem Loop Time)
forma2
transformacao2 (Sem Loop Time)
forma3
morrendo (Sem Loop Time)

Bem, bem, bem. Agora vamos dizer como é cada animação.

Animações:
escondido -> Sem nenhum sprite
surgindo -> Com 2 sprites do arlequim_forma1. No primeiro sprite vocês vão na opção Color do Sprite Renderer trocam o Channel Alpha para 0 e no ultimo sprite vocês trocam o Channel Alpha para 255.

forma1 ->Todos os sprites do arlequim_forma1
transformacao1 -> Bota 4 sprites do arlequim_forma1 e 4 do arlequim_forma2 intercalando:

forma2 -> Todos os sprites do arlequim_forma2
transformacao2 ->Intercala 4 sprites do arlequim_forma2 com o arlequim_forma3:

forma3 -> Todos os sprites do arlequim_forma3
morrendo -> dois sprites do arlequim_forma3. Sendo que o ultimo sprite você vai na opção color do Sprite Renderer e muda a cor para preto:

Agora desmarque a opção Record da aba Animation:

E adicione o Box Collider 2D ao seu personagem junto com o Rigidbody2D com a opção Is Kinematic e Sleeping Mode Never Start:

Voltando agora ao nosso Arlequim, vá agora a aba Animator e crie 3 parametros:

surgiu -> Trigger
morreu -> Trigger
forma -> Int

As nossas transições vão respeitar a seguinte forma:
Entry -> escondido
escondido -> surgindo (Condição: surgiu | Has Exit Time: Não | Transition Duration: 0)
surgindo -> forma1 (Condição: nada | Has Exit Time: Sim | Transition Duration: 0)
forma1 -> transformacao1 (Condição: forma greater 1 | Has Exit Time: Sim | Transition Duration: 0)

transformacao1 -> forma2 (Condição: nada | Has Exit Time: Sim | Transition Duration: 0)
forma2 -> transformacao2 (Condição: forma greater 2 | Has Exit Time: Sim | Transition Duration: 0)

transformacao2 -> forma3 (Condição: nada | Has Exit Time: Sim | Transition Duration: 0)
Any State -> morrendo (Condição: morreu | Has Exit Time: Sim | Transition Duration: 0)

No nosso script vamos ter guardado a forma atual do Boss em uma variável do tipo inteira, afinal além de definir a animação, será ela também que vai definir qual ataque será executado!

Basicamente a parte visual do nosso Boss já está toda pronta! Pode até tirar o sprite do Sprite Renderer e adicionar um ícone com uma corzinha a ele, para a gente ver na aba Inspector:

Bom, antes de fazer o script do Boss, precisamos preparar as magias não é mesmo? Então crie um novo objeto com o nome ArlequimAtaque1, adicione o Sprite Renderer com o sprite com o ultimo sprite do arlequim_ataque1 (arlequim_ataque1_20):

Aumente o ataque de forma que ele passe do personagem. Em seguida adicione o Box Collider 2D com a opção Is Trigger marcada:

Então, peça para criar uma animação desse objeto:

E a crie na pasta Resources/animations/ataques com o nome arlequim_ataque1 e sem Loop Time!

Aqui primeiramente você vai adicionar todos os 21 sprites do arlequim_ataque1.

Agora vamos a mágica. Com o Box Collider 2D estendido na aba Inspector, nós conseguimos ver o nosso Box Collider 2D, não é mesmo?

Caso ele não esteja estendida, a estenda para que você possa ver você possa ver o Collider. Agora a ideia aqui é ir no primeiro sprite e ajustar a altura do collider para 0:

E ir em um keyframe bem mais a frente, aumentando o tamanho do Box Collider 2D e ajustar ao tamanho do Sprite:

Até ele ir para uma posição que se padronize e então você possa deixar um valor fixo:

Basicamente eu usei 3 Keyframes da animação:

Keyframe1 -> Zerei o tamanho do Collider e coloquei a posição dele lá embaixo:

Keyframe8 -> Aumentei um pouco o tamanho do e subi um pouco a sua posição:

Keyframe14 -> É mais ou menos o keyframe em que o ataque para de crescer. Então aqui eu fiz o Collider pegar tudo:

Se quer saber se a evolução do seu Collider da posição zero a ultima da sua animação ficou legal, basta dá um play na animação e ficar de olho na aba Scene. Nosso script dessas magias basicamente vai verificar se o personagem tocou o Collider. Caso tenha tocado, irá causar dano, por isso que é importante a gente ajustar o Collider, vai que o jogador pule pela magia antes dela chegar ao topo, seria algo chato ele levar um dano se na animação o ataque não encostou, né?

Bom, primeira animação de ataque está pronta!

Antes da gente fazer o script desse ataque, bora repetir o processo com os outros dois ataques?

Então crie um objeto na aba Scene chamado ArlequimAtaque2, com o Sprite Renderer (arlequim_ataque2_7) e o Box Collider 2D (Opção Is Trigger marcada).

Essas imagens são muito pequenas o que estraga a qualidade quando a gente aumenta muito, mas por hora terá que ficar com essa mesmo.

O próximo passo é criar uma animação desse ataque, então vá na aba Animation com o ArlequimAtaque2 selecionado na aba Hierarchy e peça para criar uma nova animação em Resources/animations/ataques com o nome arlequim_ataque2 (Sem Loop Time) e ajuste o Box Collider 2D de forma que ele só alcance, aonde o sprite alcançar. Essa é bem simples, também só precisa de 4 keyframes:

Keyframe 1

Keyframe 7

Keyframe 16 – Repete os mesmos valores, pois assim quando for diminuir novamente o Box Collider 2D, ele só vai começar a diminuir depois desse keyframe

Para adicionar um novo key frame igual ao anterior, basta selecionar os componentes que você quer adicionar o keyframe (No nosso caso os dois primeiros) e depois clicar em Add Keyframe:

Ah é importante já deixar selecionado o local na timeline que você quer adicionar.

Keyframe 24 (Ultimo)

Segundo Ataque com animação e Collider pronto! Vamos para o terceiro e ultimo ataque do boss.

Criem o terceiro objeto com o nome ArlequimAtaque3, adicionem o Sprite Renderer (arlequim_ataque3_13) e o Box Collider 2D (Com a opção Is Trigger), em seguida ajuste o tamanho do ataque:

Em seguida, com o ArlequimAtaque3 seleciona na aba Hierarchy, vá na aba Animation e crie uma nova animação chamada arlequim_ataque3 dentro de Resources/animations/ataques (Sem Loop Time).

Agora na animação você coloca todos os sprites do arlequim_ataque3 e repete os 5 ultimos sprites (do 13 ao 17) umas 5 ou 6 vezes para que a animação dure mais tempo (E para não precisarmos criar uma outra animação do monstro surgindo e dele se movendo).

Minha animação ficou com esse total de frames:

Agora é só editar o collider. Aqui eu fiz da seguinte forma
Keyframe1

Keyframe 5 – Repito os mesmos valores

Keyframe 14

E pronto! A animação dos 3 ataques estão prontas. A partir daqui é criar o script dos 3 ataques e do Boss! O Script do Ataque 1 e 2 são iguais, é apenas um script que será destruído junto com a animação e se o player tocar, irá causar dano. Já o do terceiro ataque, essa sombrar perturbadora ai, ela irá seguir o player, então tem a questão de velocidade e direção para ser feita ainda.

O Script do Boss será baseado em sua forma. Na forma1 ele apenas usa a magia 1. Na forma 2 ele usa a magia 1 e 2. Na forma 3 ele usa a magia 1, 2 e 3. Tenso né? Mas bora ver esses scripts!

Primeiro vamos criar o script do ataque. Aqui podemos criar um único script para os 3 ataques. Esse script vai se chamar AtaqueArlequim e vocês podem cria-lo dentro da pasta scripts/inimigos. Então já sabemos como vai funcionar os nossos 3 ataques.

Primeiro vamos cuidar da movimentação. Para fazer a movimentação vamos criar as variáveis direita (bool), velocidade (float) e alvo (Transform):

Script: AtaqueArlequim.cs

using UnityEngine;
using System.Collections;

public class AtaqueArlequim : MonoBehaviour {

    public bool direita;            //Direção que o inimigo anda
    private Transform jogador;       //Quem o inimigo segue
    public float velocidade;        //A velocidade com a qual o ataque segue o inimigo
}

Bom, agora podemos iniciar os valores. No Método Awake vamos informar que o ataque pertence a layer Inimigos. E no método Start vamos recuperar o transform do jogador:

Script: AtaqueArlequim.cs

using UnityEngine;
using System.Collections;

public class AtaqueArlequim : MonoBehaviour {

    public bool direita;            //Direção que o inimigo anda
    private Transform jogador;       //Quem o inimigo segue
    public float velocidade;        //A velocidade com a qual o ataque segue o inimigo

    void Awake() {
        gameObject.layer = 11; //Número da Layer do inimigo
    }

	void Start () {
        jogador = GameObject.FindGameObjectWithTag("Player").transform;
	}
}

Bom, mas ainda tem duas configurações especificas que precisamos definir. A primeira é que o objeto com esse script seja destruído após a sua animação terminar. Então no método Awake, podemos recuperar o componente Animator e verificar o tempo da animação em si, para informar no método Destroy, para destruir esse objeto ao completar o tempo:

Script: AtaqueArlequim.cs

    void Awake() {
        gameObject.layer = 11; //Número da Layer do inimigo

        //Buscando tempo da animação
        var animator = GetComponent();
        var duracaoAnimacao = animator.GetCurrentAnimatorStateInfo(0).length;
        Destroy(this.gameObject, duracaoAnimacao);
    }

Bem, bem. Mas como eu disse são duas configurações. Caso tenham reparado na nossa animação. Elas têm uma posição exata no cenário para o objeto está em relação a sua altura. Como essas magias serão usadas apenas nessa scene, podemos já dizer nesse script qual é a altura que a animação deve estar, tirando esse trabalho do script do Arlequim, já que é algo exclusivo dos ataques.

Para isso, crie uma nova variável chamada posicaoY (float) e no método Awake informe que a posição em Y do objeto deve ser a informada.

Script: AtaqueArlequim.cs

using UnityEngine;
using System.Collections;

public class AtaqueArlequim : MonoBehaviour {

    public bool direita;            //Direção que o inimigo anda
    private Transform jogador;       //Quem o inimigo segue
    public float velocidade;        //A velocidade com a qual o ataque segue o inimigo
    public float posicaoY;          //Altura da animação

    void Awake() {
        gameObject.layer = 11; //Número da Layer do inimigo

        //Buscando tempo da animação
        var animator = GetComponent();
        var duracaoAnimacao = animator.GetCurrentAnimatorStateInfo(0).length;
        Destroy(this.gameObject, duracaoAnimacao);

        //Definindo a altura
        var posicao = transform.position;
        transform.position = new Vector3(posicao.x, posicaoY, posicao.z);
    }
...
}

Na movimentação o ataque pode inverter de direção, então já podemos adicionar aquele método que inverter o objeto trocando a sua escala para um valor negativo:

Script: AtaqueArlequim.cs

    void inverter() {
        float x = transform.localScale.x;
        x *= -1;
        transform.localScale = new Vector3(x, transform.localScale.y, transform.localScale.z);
    }

Pronto, agora já podemos fazer o movimento sem nos preocupar com os outros pontos. O movimento será realizado no método Update e apenas vai ocorrer se a velocidade for maior que zero, então já podemos dizer que a estrutura inicial do nosso método Update é:

Script: AtaqueArlequim.cs

	void Update () {
	    if (velocidade > 0) {

        }
	}

Beeem. Agora dentro do if temos que fazer aquele mesmo esquema do esqueleto. Saber se o personagem está a direita ou a esquerda do objeto. Como a gente faz isso? Subtraindo a posição do personagem e do objeto. Se a posição for negativa, está a esquerda, se for positivo está a direita:

Script: AtaqueArlequim.cs

	void Update () {
	    if (velocidade > 0) {
            //Direção do jogador em relação ao objeto
            var direcaoJogador = jogador.position.x - transform.position.x;

            //Inverte a direção se necessário
            if (direcaoJogador > 0 && !direita) {
                direita = true;
                inverter();
            }
            if (direcaoJogador < 0 && direita) {
                direita = false;
                inverter();
            }
        }
	}

Por fim, agora precisamos apenas fazer o objeto se mover para a direção correta. Caso seja direita então será para o Vector3.right (1, 0, 0) e caso esteja a esquerda será o –Vector3.right (-1, 0, 0):

Script: AtaqueArlequim.cs

	void Update () {
	    if (velocidade > 0) {
            //Direção do jogador em relação ao objeto
            var direcaoJogador = jogador.position.x - transform.position.x;

            //Inverte a direção se necessário
            if (direcaoJogador > 0 && !direita) {
                direita = true;
                inverter();
            }
            if (direcaoJogador < 0 && direita) {
                direita = false;
                inverter();
            }

            //Move objeto
            var direcao = (direita ? Vector3.right : -Vector3.right);
            transform.Translate(direcao * velocidade * Time.deltaTime);
        }
	}

Agora vamos para o dano causado. Para isso vamos precisar criar uma nova variável do tipo int, para armazenar o dano. Sendo assim nossas variáveis serão:

Script: AtaqueArlequim.cs

    public bool direita;            //Direção que o inimigo anda
    private Transform jogador;       //Quem o inimigo segue
    public float velocidade;        //A velocidade com a qual o ataque segue o inimigo
    public float posicaoY;          //Altura da animação
    public int dano;                //Dano cuasado

E com isso só precisamos agora criar um método OnTriggerStay2D que cause dano ao personagem, caso ele esteja dentro do Box Collider 2D(Com a opção Is Trigger marcada):

Script: AtaqueArlequim.cs

    void OnTriggerStay2D(Collider2D colisor) {
        if (colisor.gameObject.tag.Equals("Player")) {
            var personagem = colisor.gameObject.GetComponent();
            personagem.recebeDano(dano);
        }
    }

E nosso script fica prontinho em folha! Agora é só voltar para o Unity e adicionar esse script aos 3 ataques. No caso do ArlequimAtaque1 e ArlequimAtaque2, que são ataques que não se movem, podem deixar a velocidade sendo 0. No dano vocês definem um valor que considerarem justos (Mas não tão alto, afinal esse boss será apelão com 3 ataques). Na parte da posicaoY, você já pode por o valor de Y que está atualmente, caso a sua animação já esteja em uma altura legal:

Bom, agora é só transformar os três ataques em prefab para então podermos ir para o nosso ultimo script, o script do Arlequim.

Bom, já podem remover esses 3 ataques da aba Hierarchy e irmos então criar um script chamado Arlequim na pasta scripts/inimigos. E sua estrutura base, vai herdar de Inimigo, então será:

Script: Arlequim.cs

using UnityEngine;
using System.Collections;
using System;

public class Arlequim : Inimigo {

    protected override void atacar() {

    }

    protected override void mover() { }
}

No método Awake vamos definir o seu status. Ele não terá ataque ou ponto de magia, mas seus pontos de vida serão beeeem generosos:

Script: Arlequim.cs

    protected override void Awake() {
        base.Awake();
        status = new Status(100, 0, 0); //HP = 100 | MP = 0 | Ataque = 0
    }

Esse personagem não terá movimentação como já falei, então podemos ir direto para o ataque. O boss pode até parecer difícil, mas não é. É apenas difícil de enfrenta-lo.

Nós vamos precisar inicialmente de uma variável chamada forma do tipo inteiro. Será ela que vai guardar a informação de em qual forma o boss está. E ela obviamente vai começar na forma 1:

Script: Arlequim.cs

private int forma = 1;          //A forma atual do Boss

As próximas variáveis são os prefabs dos ataques, duas variável para cada tipo de ataque informando o intervalo entre um ataque e outro e a contagem:
Script: Arlequim.cs

    private int forma = 1;          //A forma atual do Boss

    //Ataque 1
    public GameObject ataque1;
    public float intervaloAtaque1;
    private float contagemAtaque1;

    //Ataque 2
    public GameObject ataque2;
    public float intervaloAtaque2;
    private float contagemAtaque2;

    //Ataque 3
    public GameObject ataque3;
    public float intervaloAtaque3;
    private float contagemAtaque3;

Bem simples, né? Se você quiser pode buscar até o prefab via script com o Resources.Load como fizemos outras diversas vezes.

Bom, agora para cada ataque vamos fazer a contagem regressida do intervalo dos ataques e quando completar criaremos o prefab, PORÉM... o ataque2 só vai ser usado se a forma do inimigo for maior igual a 2. E o ataque3 só será chamado se o ataque for maior ou igual a 3:

Script: Arlequim.cs

    protected override void atacar() {
        //Ataque1
        contagemAtaque1 -= Time.deltaTime;
        if (contagemAtaque1 <= 0) {

            contagemAtaque1 = intervaloAtaque1;
        }

        //Ataque2
        if (forma >= 2) { 
            contagemAtaque2 -= Time.deltaTime;
            if (contagemAtaque2 <= 0) {

                contagemAtaque2 = intervaloAtaque2;
            }
        }

        //Ataque3
        if (forma >= 3) { 
            contagemAtaque3 -= Time.deltaTime;
            if (contagemAtaque3 <= 0) {

                contagemAtaque3 = intervaloAtaque3;
            }
        }
    }

Sem complicação alguma né? O script já faz a contagem por ataque e reiniciar. Agora só precisamos pedir para que ele crie os ataques. Tanto o ataque1 quanto o ataque2, eles vão pegar a posição do personagem e criar na mesma posição do personagem (Sacana? Sim, mas se lembrem que o personagem pode fugir desses ataques correndo, afinal o Collider deles mudam de acordo com a animação).

“Pow, Carlos, isso não vai lascar com a posição Y, não?”

Não, se lembra que no nosso script a gente já definiu para ele atualizar a altura? Isso já resolve esse problema.
Quanto ao terceiro ataque, o que se move, podemos criar ele na mesma posição do Arlequim, para que ele siga nosso personagem saindo de onde o Arlequim estiver:

Script: Arlequim.cs

    protected override void atacar() {
        //Ataque1
        contagemAtaque1 -= Time.deltaTime;
        if (contagemAtaque1 <= 0) {
            var personagem = GameObject.FindGameObjectWithTag("Player").transform;
            Instantiate(ataque1, personagem.position, Quaternion.identity);
            contagemAtaque1 = intervaloAtaque1;
        }

        //Ataque2
        if (forma >= 2) { 
            contagemAtaque2 -= Time.deltaTime;
            if (contagemAtaque2 <= 0) {
                var personagem = GameObject.FindGameObjectWithTag("Player").transform;
                Instantiate(ataque2, personagem.position, Quaternion.identity);
                contagemAtaque2 = intervaloAtaque2;
            }
        }

        //Ataque3
        if (forma >= 3) { 
            contagemAtaque3 -= Time.deltaTime;
            if (contagemAtaque3 <= 0) {
                Instantiate(ataque3, transform.position, Quaternion.identity);
                contagemAtaque3 = intervaloAtaque3;
            }
        }
    }

Super tranquilo, o script, né? Busca o objeto com a tag player e cria o ataque 1 e 2 na posição do personagem, e o ataque 3 apenas cria na mesma posição do boss.

Agora nosso script só precisa de uma coisa para acabar! A gente descobrir qual é a forma dele! O Boss vai mudar de forma de acordo com os seus pontos de vida, ou seja, qual local melhor para verificar isso do que no método recebeDano?

Nosso método recebe dano já é do tipo virtual por conta do boss MagoAzul, que se teletransportava quando recebia dano. Então a gente só precisar chamar esse método novamente aqui com a opção override para modifica-lo:

Script: Arlequim.cs

    public override void recebeDano(int dano) {
        base.recebeDano(dano);
    }

Aqui poderíamos apenas chegar e dizer que se a vida for menor que um valor fixo, vai ser de uma forma ou de outra e por ultimo passamos a informação para o animator:
Script: Arlequim.cs

    public override void recebeDano(int dano) {
        base.recebeDano(dano);

        if (status.getHP() <= 20) {
            forma = 3;
        } else if (status.getHP() <= 50) {
            forma = 2;
        } else 
            forma = 1;

        animator.SetInteger("forma", forma); //Muda a animação 
    }

Reparem 2 coisas:

1 – Antes do segundo if, estou usando um else. Ou seja, ele só vai entrar no segundo if, caso não tenha passado pelo primeiro if. Se não usarmos o if, ele sempre vai entra no segundo if, caso também entre no primeiro, alterando a informação da forma do inimigo.

vida = 10
If (vida <= 20) -> Entra
If (vida <= 50) -> Entra
----
vida = 10
If (vida <= 20) -> Entra
else If (vida <= 50) -> Ignora por já ter entrado no primeiro if
----
vida = 30
If (vida <= 20) -> Não Entra
else If (vida <= 50) -> Entra

2 – Eu começo do valor menor primeiro, pois se eu começasse do maior valor, ele sempre iria cair no primeiro if sem entrar no menor. Afinal, digamos que nosso inimigo está com 10 de vida. 10 é menor que 50 e 20, ou seja, colocamos o menor primeiro, para que ele sempre entre primeiro na condição de vida menor.

vida = 10
If (vida <= 50) -> Entra
else If (vida <= 20) -> Ignora

Entenderam?

Bom, isso é se a gente quiser valores fixos, mas e se a gente quiser porcentagens? Ai entra aquela aula de matemática. Se lembram da regrinha de 3? Vamos usar ele aqui:

Vida total = 100%
Vida atual = ?

Multiplica as duas linhas nas diagonais e teremos:

Vidal total * ? = Vida atual * 100%

Então jogamos o Vida total para o outro lado, que como é uma multiplicação, vai passar dividindo:

? = (Vida atual * 100%) / Vida total

Basicamente é isso o que a gente quer, então nunca reclame da aula de matemática dizendo que você nunca vai utilizar algo, pois você pode chegar a usar sim, como é a regra de 3, que acabamos de usar.

Agora só precisamos transformar isso em informações do nosso script:

? -> porcentagem que queremos
Vida atual -> status.getHP();
100% -> 100 (Valor em inteiro)
Vida total -> status.getHPMAX();

var porcentagem = (status.getHP() * 100) / status.getHPMax();

Então ajustando isso no nosso script, ficaria:

Script: Arlequim.cs

    public override void recebeDano(int dano) {
        base.recebeDano(dano);

        var porcentagem = (status.getHP() * 100) / status.getHPMax();

        if (porcentagem <= 20) { //Menos de 20%
            forma = 3;
        } else if (porcentagem <= 50) { //Menos de 50%
            forma = 2;
        } else 
            forma = 1;

        animator.SetInteger("forma", forma); //Muda a animação 
    }

E dessa forma finalizamos o script do boss. Basta agora voltar para o editor do Unity, adicionar o script ao nosso Arlequim e ajustar os valores.

Pronto. Salve o seu Arlequim como um prefab e na no GC mude o seu Boss para o Arlequim e teste o seu jogo o/

Esse boss para derrotar realmente dá um belo trabalho, mas você consegue. Caso você queira ao invés de voltar para a tela principal após derrotar o ultimo boss, ir para uma tela de créditos, basta uma scene com os créditos do jogo (um UI-Text mesmo com fundo preto) e criar um script para ser o GCFase que leve para essa fase quando o boss for derrotado!

Este tutorial foi algo realmente muito grande, passando do dobro do tutorial passado, mas sinceramente espero que vocês tenham gostado muito. O tutorial mesmo acaba aqui, mas caso queira ler o próximo post com a despedida do tutorial, terá um extra no final que talvez vocês gostem!

Acho que dessa vez não rola disser até a próxima, mas ainda sim posso dizer, qualquer dúvida deixem nos comentários!

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

11 comments

  1. Felipe disse:

    Carlos seu tutorial é maravilhoso, parabéns.

    Pode fazer um tutorial de como mostrar a damage pop up? É muito difícil?

    • Na realidade não é muito difícil não Felipe. Mas o site na realidade anda parado por um tempo :/

      Mas caso queira uma direção, o que você terá que fazer é:
      1 – Criar um prefab de um objeto com o componente Text Mesh(É igual ao Sprite Renderer, porém ele adiciona texto ao invés de imagem)
      2 – Configura o tamanho, fonte e cor do texto como achar melhor no próprio prefab
      3 – No objeto que tiver sofrendo o dano, instancia esse prefab na mesma posição do objeto que sofreu o dano.
      4 – Recupera o objeto instanciado e aplica o valor do dano no componente TextMesh no atribute text ^^

  2. Junior Klawa disse:

    Olá!, primeiramente parabéns pelo tutorial, me ajudou muito cara.
    Tenho uma dúvida (meio viajada) mas se eu quisesse que o dano no inimigo fosse dado clicando em cima (ou com o touch) da sprite dele? o procedimento é muito dificil? pensei em colocar um botão no inimigo mas nao deu muito certo, hahaha

    • Rapaz, acho que o que você quer é o OnMouseDown O.o

      Ele funciona igual ao OnTriggerEnter2D/OnCollisionEnter2D. A diferença é que não é chamado quando um collider toca no outro e sim quando o jogador clica no mouse sobre o collider do objeto. Então ficaria assim:

      void OnMouseDown() {
      //Sua ação aqui
      }

  3. Daniel disse:

    Bom dia, eu gostaria de saber qual o procedimento, caso eu queira adicionar mais fases… Parabéns excelente tutorial.

    • O procedimento não muda Daniel.

      Você tem que pensar no level designer da fase. A cria como fizemos em todas:
      Fase 1 – Cenário
      Fase 2 – Cenário
      Fase 3 – Cenário
      Fase 4 – Cenário

      Adiciona os monstros caso haja, igual fizemos no:
      Fase 1 – Monstro
      Fase 2 – Monstro
      Fase 3 – Monstro
      Fase 4 – Monstro

      Adiciona o Boss caso haja, igual fizemos no:
      Fase 1 – Boss
      Fase 2 – Boss
      Fase 3 – Boss
      Fase 4 – Boss

      E adiciona a fase no menu de selecionar fase, como fizemos no:
      08 – Escolhendo Fase – Data 08/02/2016

      E só lembrar de ao derrotar o boss, leva para a tela de selecionar fases, como fizemos com os outros bosses ^^

  4. thor war disse:

    Parabéns meu brother, bem que o próximo você poderia fazer um projeto com Final Fantasy Tatics, com inventario e o sistema de turn.

  5. Luiz disse:

    Olá Carlos, tudo bem?

    Cara estava procurando tutoriais da unity e os seus realmente acho que é o melhor que já vi.

    Gostaria de te pedir uma dica na verdade, estou procurando a um tempo algum site/blog ou mesmo um pdf que mostre as funções da unity, o que ela faz e como usar, parecido com o que você fez naquele post extra de programação do 1º tutorial, porém com mais coisas. Você tem algo do tipo para me indicar? Lógico que não quero todas porque sei que são muuuuuuuuuitas, mas pelo menos as mais usadas vamos dizer assim.

    • Então Luiz, se tem eu realmete não conheço :/

      Eu já pensei ao invés de fazer tutoriais completo, fazer vários pequenos para explicar diversas funcionalidades, mas terminei não fazendo.

      Mas você pode sempre procurar na própria documetação do Unity: Exemplo

      É basicamente dela que eu pego tudo que uso.

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!