Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Perda de vida ao criar o chefe

Boa tarde professor, estou na aula dois no tópico Modificando o Gerador e estou com um problema,que quando o chefe e gerado eu começo a perde vida do nada,antes disso meu código estava normal...se você puder me ajudar

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

public class GeradorBoss : MonoBehaviour {

    private float tempoParaProximaGeracao = 0;
    public float tempoEntreGeracoes = 60;
    public GameObject chefePrefab;
    private ControlaInterface scriptControlaInteface;
    public Transform[] PosicoesPossiveisDeGeracao;
    private Transform jogador;


    void Start () {

        tempoParaProximaGeracao = tempoEntreGeracoes;
        scriptControlaInteface = GameObject.FindObjectOfType(typeof(ControlaInterface)) as ControlaInterface;
        jogador = GameObject.FindWithTag("Jogador").transform;
    }

    // Update is called once per frame
    void Update () {

        if(Time.timeSinceLevelLoad > tempoParaProximaGeracao)
        {
            Vector3 posicaoDeCriacao = CalculaPosicaoMaisDistanteDoJogador();
            Instantiate(chefePrefab, posicaoDeCriacao, Quaternion.identity);
            scriptControlaInteface.AparecerTextoChefeCriado();
            tempoParaProximaGeracao = Time.timeSinceLevelLoad + tempoEntreGeracoes;
        }
    }

    Vector3 CalculaPosicaoMaisDistanteDoJogador()
    {
        Vector3 posicaoDeMaiorDistancia = Vector3.zero;
        float maiorDistancia = 0;

        foreach(Transform posicao in PosicoesPossiveisDeGeracao)
        {
            float distanciaEntreJogador = Vector3.Distance(posicao.position, jogador.position);
            if(distanciaEntreJogador > maiorDistancia)
            {
                maiorDistancia = distanciaEntreJogador;
                posicaoDeMaiorDistancia = posicao.position;
            }
        }

        return posicaoDeMaiorDistancia;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.UI;

public class ControlaChefe : MonoBehaviour, IMatavel {

    private Transform jogador;
    private NavMeshAgent agente;
    private Status statusChefe;
    private AnimacaoPersonagem animacaoChefe;
    private MovimentoPersonagem movimentoChefe;
    public GameObject KitMedicoPrefab;
    public Slider sliderVidaChefe;
    public Image ImageSlider;
    public Color CorDaVidaMaxima, CorDaVidaMinima;

    void Start () {

        jogador = GameObject.FindWithTag("Jogador").transform;
        agente = GetComponent<NavMeshAgent>();
        statusChefe = GetComponent<Status>();
        agente.speed = statusChefe.Velocidade;
        animacaoChefe = GetComponent<AnimacaoPersonagem>();
        movimentoChefe = GetComponent<MovimentoPersonagem>();
        sliderVidaChefe.maxValue = statusChefe.Vida;
        AtualizarInterface();

    }

    private void Update()
    {
        agente.SetDestination(jogador.position);
        animacaoChefe.Movimentar(agente.velocity.magnitude);

        if(agente.hasPath == true)
        {  
        bool estouPertoDoJogador = agente.remainingDistance <= agente.stoppingDistance;

        if(estouPertoDoJogador)
        {
            animacaoChefe.Atacar(true);
                Vector3 direcao = jogador.position - transform.position;
                movimentoChefe.Rotacionar(direcao);

        }
        else
        {
            animacaoChefe.Atacar(false);
        }
        }
    }

    void AtacaJogador()
    {
        int dano = Random.Range(30, 40);
        jogador.GetComponent<ControlaJogador>().TomarDano(dano);
    }

    public void TomarDano(int dano)
    {
        statusChefe.Vida -= dano;
        AtualizarInterface();
        if(statusChefe.Vida <= 0)
        {
            Morrer();
        }
    }

    public void Morrer()
    {
        animacaoChefe.Morrer();
        movimentoChefe.Morrer();
        this.enabled = false;
        agente.enabled = false;
        Destroy(gameObject, 2);
        Instantiate(KitMedicoPrefab, transform.position, Quaternion.identity);
    }

    void AtualizarInterface()
    {
        sliderVidaChefe.value = statusChefe.Vida;
        float porcentagemDaVida = (float)statusChefe.Vida / statusChefe.VidaInicial;
        Color corDaVida= Color.Lerp(CorDaVidaMinima,CorDaVidaMaxima, porcentagemDaVida);
        ImageSlider.color = corDaVida;
    }
}

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement;

7 respostas

Oi, Tulio, tudo bem?

Você pode subir o projeto num Google Drive, Dropbox, etc com link público e compartilhar por aqui?

Creio que eu vá ter que olhar a interação entre os scripts.

ok segue o link do projeto: https://drive.google.com/open?id=1yIjsFbncentq7nVMzKvYeVTJZC1E3_rz

Oi, Tulio, não entendi muito bem o problema. Porque eu testei com seu projeto e aparentemente não tem nada de anormal, quando o Chefe nasce ele me vem em direção ao jogador e faz o ataque normal.

Ele é impedido de atacar de longe pelo hasPath e estouPertoDoJogador.

Você pode verificar se sua bool de Atacando no chefe não está marcada como true e se a animação de Idle ou Andar estão como padrão pra ele não atacar.

Outra coisa que notei é que tem um zumbi no seu jogo que não veio de um gerador então delete ele porque ele pode causar erros no jogo.

Consegue me passar algum passo a passo de como esse problema acontece.

Bom dia,realmente muito estranho,por que quando o chefe e instanciado, começo a perde vida sem que tenha um inimigo me atacando e acabo perdendo o jogo,na minha tela acontece isso sem nenhum inimigo por perto,acontece logo a pós a mensagem que o chefe apareceu para o jogado,se eu aumenta o tempo de geração do chefe so vai acontecer quando ele e gerado....Em relação as animações conferir aqui

Boa tarde professor, comecei um novo projeto e ele deu o mesmo problema que citei anteriormente,resolvi comentar função CalcularPosicaoMaisDistanteDoJogador conforme a imagem a baixo(que esta no link) e volta tudo ao normal,não acontece o problema,mais não consigo entender o porque que a função CalcularPosicaoMaisDistanteDoJogador esta interferindo com esse problema

https://drive.google.com/open?id=19p0SI17O14Vi_OOiSVAQzLWymZmmHpWk

solução!

Não deveria mudar nada.

Consegue me mandar esse projeto novamente? Porque eu não consegui replicar ainda o erro aqui.

Tente trocar a linha que testa se o chefe já possui caminho para:

if (!agente.pathPending) ou if (!agente.pathPending && agente.hasPath)

Bom dia Henrique,deu certo troca a linha para if (!agente.pathPending && agente.hasPath) muito obrigado!!! =)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software