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

Personagem não para quando chega onde ele tem que vagar.

Quando eu coloco o jogo para rodar, o Zumbi cria os pontos aleatórios, vai até eles, mas quando chega ele não para de andar naquela direção, ele segue reto até o fim e nunca para, só quando o contador chega a 0 e ele tem que ir atrás de outra posição.

Provavelmente deve ser um erro bobo que eu não estou conseguindo enxergar.

Meu código:

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

public class Script_Inimigo_Controle : MonoBehaviour, Interface_Matavel { private Vector3 direcao; private Vector3 posicaoAleatoria;

public float distanciaAteOndeVaga = 10;
private float contadorVagar;
private float tempoVagando = 4;

public GameObject Jogador;
public AudioClip SomDeMorte;
private Script_Movimento movimentar;
private Script_Animação animar;
private Script_Status status;

void Start()
{

    Jogador = GameObject.FindGameObjectWithTag("Jogador");

    movimentar = GetComponent<Script_Movimento>();
    animar = GetComponent<Script_Animação>();
    status = GetComponent<Script_Status>();
    ZumbisDiferentes();

}
void Update()
{

}

void FixedUpdate()
{
    float distancia = Vector3.Distance(transform.position, Jogador.transform.position);

    movimentar.Girando(direcao);
    animar.Movimentar(direcao.magnitude);

    if (distancia > 15)
    {
        Vagar();
    }
    else if (distancia > 2)
    {
        Perseguir();
    }
    else
    {
        animar.Atacar(true);
    }
}

void Perseguir()
{
    direcao = Jogador.transform.position - transform.position;
    status.Velocidade = 5.0f;
    movimentar.Girando(direcao);
    movimentar.Movendo(direcao, status.Velocidade);

    animar.Atacar(false);
}

void Vagar()
{
    contadorVagar -= Time.deltaTime;
    status.Velocidade = 1.5f;
    if (contadorVagar <= 0)
    {
        posicaoAleatoria = AleatorizarPosicao();
        tempoVagando = Random.Range(1, 4);
        contadorVagar += tempoVagando;
    }                 
    bool pertoSuficiente = Vector3.Distance(transform.position, posicaoAleatoria) <= 0.05;


    if (pertoSuficiente == false)
    {
        direcao = transform.position - posicaoAleatoria;
        movimentar.Girando(direcao);
        movimentar.Movendo(direcao, status.Velocidade);

    }

}

Vector3 AleatorizarPosicao()
{
    Vector3 posicao = Random.insideUnitSphere * distanciaAteOndeVaga;
    posicao += transform.position;
    posicao.y = transform.position.y;
    return posicao;
}
void AtacaJogador()
{
    int danoZumbi = Random.Range(20, 35);
    Jogador.GetComponent<Script_Jogador>().TomarDano(danoZumbi);
}
void ZumbisDiferentes()
{

    int gerarTipoDeZumbi = Random.Range(1, 28);
   transform.GetChild(gerarTipoDeZumbi).gameObject.SetActive(true);
}

public void TomarDano(int Dano) { status.Vida -= Dano; if (status.Vida <= 0) { Morrer(); } }

public void Morrer()
{
    Destroy(gameObject);
    Script_Audio_Controle.instancia.PlayOneShot(SomDeMorte);
}

}

6 respostas

Oi, Antonio, tudo bem?

Você pode zipar seu projeto e mandar para gente num Dropbox, Google Drive, etc? Assim a gente pode debugar com mais qualidade :)

Claro, segue o link para download do projeto:

https://drive.google.com/open?id=1xiLdHH8awSXlDwQjgqs5HG1_t3ew9wi6

Hoje eu abri ele e também havia um erro quando eu dava play no jogo, estou tentando encontrar onde foi mas não consigo.

O jogo roda normalmente mas aparece o erro 2 vezes no console quando eu dou play.

Oi, Antonio, tudo bom?

Acho que alguma coisa no seu Rigidbody está fazendo ele "quicar" dá uma olhada no eixo Y dos zumbis. Dessa forma ele nunca chega no lugar final.

No Prefab eu desabilitei o Use Gravity e fiz ele ser instanciado um pouco acima no gerador algo como 0.1f no Y ao invés de 0 e isso solucionou o problema fazendo com que ele chegue no lugar final.

Claro que tudo depende de quão longe é, aumentando o tempo entre o Random de posições você pode verificar isto.

Você pode fazer um else do pertoSuficiente se quiser que ele pare ou mexer no tempo para ele sempre ficar andando por aí. Era mais ou menos isso? Sobre alguns zumbis que andam errado por aí, isso é um Bug no Rigidbody você pode sanar aumentando a massa no zumbi.

Sim, quando eu estou dando play o seguinte erro aparece:

NullReferenceException: Object reference not set to an instance of an object Script_Interface_Controle.Awake () (at Assets/Scripts/Script_Interface_Controle.cs:22)

E eu não sei de onde ele está saindo, não existe um erro no código sendo mostrado pelo visual studio.

Edit: Encontrei o erro: eu tinha invertido no código o Awake e o Start.

Colocando Vida = VidaInicial; no start e o SliderVidaJogador.maxValue = scriptJogador.status.Vida; no Awake. Logo não fazia sentido algum e dava erro.

Boa, Antonio! Todos os problemas foram solucionados? :)

Você pode marcar uma resposta como solução e se precisar de mais alguma ajuda estamos por aqui :)

solução!

Desculpe a demora para responder professor, eu acabei encontrando a reposta revisando as suas video-aulas. Eu acabei cometendo o erro grotesco de trocar: direcao = posicaoAleatoria - transform.position;

por:

direcao = transform.position - posicaoAleatoria;

E isso estava fazendo ele correr da posicao ao invés de ir até ela, não é atoa que o zumbi corria infinitamente até o horizonte.

Ainda bem que foi um erro simples de código.

Obrigado pela ajuda e o apoio.