Problema na animação dos inimigos apenas quando compilado

No meu projeto TimeHunt quando compilo o jogo os inimigos andam na animação de parado quando estão no estado de patrulha e quando estão no estado de perseguição a animação funciona corretamente mas na unity o projeto não compilado funciona normalmente, e a compilação não apresentou nenhum erro.

Aqui está funcionado tudo certo. Posta mais detalhes pra gente ver. Tá usando qual versão da Unity?

image

No jogo compilado, a animação de andar no estado de patrulha não funciona(continua na animação de parado) e quando ele passa para o estado de perseguição a animação de andar funciona.
Mas no projeto da unity a animação de andar funciona normalmente em todos os estados.

E quando ele está perseguindo o jogador, é tocada a animação de andar? Ou fica apenas na animação de parado e o inimigo se movendo?

Sim, a animação de andar é tocada quando o inimigo está no estado de perseguição, porém no estado de patrulha ela não é tocada. Mas esse problema acontece apenas no jogo já compilado.

Vou gravar um vídeo, postar no youtube e trazer o link aqui:

Preste atenção que quando iniciei no projeto da unity o esqueleto estava se movendo com a animação tocando normalmente, mas quando abri o jogo compilado o esqueleto estava se movendo na animação de parado, só trocou para a animação de andar quando foi para o estado de perseguição

Durante a execução, dentro do Editor, está aparecendo algum erro no Console?

O inimigo Minotauro também está com esse problema?

1 curtida

O editor não está apresentando nenhum erro. Todos os inimigos que andam estão com esse problema incluindo o minotauro.
Relembrando aqui esse problema só acontece no jogo compilado, na unity funciona normalmente.

Se puder, compacta sua pasta do projeto em ZIP e envia aqui (via google drive). Dessa forma, consigo testar e ver o que pode ser.

Certo, assim que eu fizer o upload no drive colocarei o link aqui:

https://drive.google.com/drive/folders/1HgVicnu1Fk0iQpqOS9AWJAVJvTEvxiSW

Se conseguir identificar o problema, pode me avisar @lucas

Esses últimos dias estou focado no lançamento do novo módulo do curso e acabou não dando tempo de olhar para você. Mas até quinta feira dou uma olhada e te retorno.

1 curtida

Oi, eu agradeceria se pudesse dar uma olhada no meu projeto

Desculpa mesmo a demora para te responder. Consegui analisar seu projeto agora e identifiquei o erro. Vou te mostrar uma forma de como analisar seu jogo compilado.

1) Compile o game em Development Build e defina para conectar ao Profiler da Unity

2) Realize uma nova compilação

3) Abra seu jogo e reproduza o problema. Assim que o erro ocorrer, você pode fechá-lo.

Ao usar o autoconnect, o jogo vai se conectar com a Unity e gerar os relatórios de profile e console. Agora na Unity, vá em Console, clique nos 3 pontinhos na vertical e clique em Open Player Log conforma abaixo:

4) Analise o log

Nesse log vai mostrar detalhadamente quais os erros que aconteceram durante a execução do jogo.

No print acima podemos que está acontecendo um erro no script InimigoGenericoMovimento, linha 34. É um erro de referencia nula.

Conteúdo da linha 34:

    public override void OnEnter()
    {
        animator.SetBool("Andar", true);
    }

Se o erro é de referencia nula, só pode ser algo relacionado ao animator, ou seja, quando essa linha é chamada, a variável animator ainda não foi definida. Dessa forma, fui ver onde ela está definida, e é bem aqui:

    void Start()
    {
        animator = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();

        posicaoInicial = transform.position;
        player = GameObject.FindGameObjectWithTag("Player");
    }

Ela está definida dentro do método de Start. Isso está causando o problema! O método de OnEnter está sendo chamado antes do método de Start acima, ocasionando o erro.

Uma forma simples de resolver isso é colocar o conteúdo acima dentro do método Awake (Que executa antes de Start), só trocar Start por Awake:

    void Awake()
    {
        animator = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();

        posicaoInicial = transform.position;
        player = GameObject.FindGameObjectWithTag("Player");
    }
1 curtida