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

Personagens ficam parados no lugar

Ao implementar o codigo, o personagem utilizando o novo script para de se movimentar. Sei que deve ser algo pequeno, mas nao consigo descobrir.

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

public class MovimentaPersonagem : MonoBehaviour
{
    private Rigidbody meuRigidbody;

    void Awake()
    {
        meuRigidbody = GetComponent<Rigidbody>();
    }

    public void Movimentar(Vector3 direcao, float velocidade)
    {
        meuRigidbody.MovePosition(meuRigidbody.position + (direcao.normalized * velocidade * Time.deltaTime));
    }

    public void Rotacionar(Vector3 direcao)
    {
        Quaternion novaRotacao = Quaternion.LookRotation(direcao);
        meuRigidbody.MoveRotation(novaRotacao);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ControlaInimigo : MonoBehaviour
{

    public GameObject Jogador;
    public float Velocidade = 5;
    private Rigidbody rigidbodyInimigo;
    private Animator animatorInimigo;
    private MovimentaPersonagem movimentaInimigo;

    // Start is called before the first frame update
    void Start()
    {
        Jogador = GameObject.FindWithTag("Jogador");
        int geraTipoZumbi = Random.Range(1, 28);
        transform.GetChild(geraTipoZumbi).gameObject.SetActive(true);

        rigidbodyInimigo = GetComponent<Rigidbody>();
        animatorInimigo = GetComponent<Animator>();
        movimentaInimigo = GetComponent<MovimentaPersonagem>();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        float distancia = Vector3.Distance(transform.position, Jogador.transform.position);

        Vector3 direcao = Jogador.transform.position - transform.position;

        Quaternion novaRotacao = Quaternion.LookRotation(direcao);
        rigidbodyInimigo.MoveRotation(novaRotacao);

        if (distancia > 2.5)
        {

            //rigidbodyInimigo.MovePosition(GetComponent<Rigidbody>().position + direcao.normalized * Velocidade * Time.deltaTime);
            movimentaInimigo.Movimentar(direcao, Velocidade);

            animatorInimigo.SetBool("Atacando", false);
        }
        else
        {
            animatorInimigo.SetBool("Atacando", true);
        }
    }

    void AtacaJogador()
    {
        int dano = Random.Range(10, 20);
        Jogador.GetComponent<Controla_Jogador>().TomarDano(dano);
    }
4 respostas

Oi, Luis, tudo bem? Aparece algum erro no console quando você dá Play?

Agora que mencionou, aparece a seguinte mensagem no console ao criar um novo inimigo:

NullReferenceException: Object reference not set to an instance of an object ControlaInimigo.FixedUpdate () (at Assets/Scripts/ControlaInimigo.cs:40)

solução!

Olhando nesse log de erro, ele indica que algo está estranho na linha 40 da sua ControlaInimigo:

(at Assets/Scripts/ControlaInimigo.cs:40)

O erro em sí é o NullReferenceException que geralmente acontece quando tentamos acessar alguma coisa de uma variável, porém essa varíavel ainda está como null, ou seja, tentamos usar alguma coisa de algo que nem se quer existe ainda.

O código da linha ofensora é o:

movimentaInimigo.Movimentar(direcao, Velocidade);

Nessa linha a única variável que vc ta tentando acessar algo de dentro é a movimentaInimigo. Então acredito que ela esteja com valor null ainda.

Só pra explicar um pouco melhor: sempre que vc dá "." (ponto-final) depois de uma variável, é pq quer acessar algo de dentro dela, porém se essa variavel é null, o C# vai lançar essa exception e quebrar sua aplicação.

O que vc pode tentar fazer pra corrigir é tentar ver onde vc ta inicializando essa variável (ou seja, colocando algum valor nela), e ver pq não ta funcionando.

Pelo que percebi, ali no seu Start, vc tenta inicializar ela com um:

movimentaInimigo = GetComponent<MovimentaPersonagem>();

Então, tenta checar lá no editor do Unity, se o seu GameObject do inimigo está com o script de MovimentaPersonagem, pq se não tiver, esse GetComponent vai retornar null, e vai colocar isso na sua variável, que acaba extourando a exception mais pra frente.

Era isso mesmo, Guilherme. Nao havia adicionado o script ao meu inimigo. 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