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

Depois do Script Status no inimigo, 100000 de inimigos sendo criados por segundo

Depois de aplicar o script de status no inimigo, o gerador de inimigos ficou louco, o meu tinha algumas modificações do do curso em si. Estou recebendo um erro no console, NullReferenceException. No meu caso cada gerador de Zumbi gera zumbis com uma velocidade diferente, eu estava usando esse cod para gerar. com o uso do Status eu fiz igual no heroi, coloquei o public Status statusInimigo. e tentei usar no gerador, mas ele cria 5 mil zumbis instantaneamente

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

public class GeradorZumbis : MonoBehaviour
{
    public GameObject Zumbi;
    private float contadortampo = 0;
    public float TempoGerarZumbi = 1;
    public int DanoZumbi;
    public float VelocidadeZumbi; 
    // Start is called before the first frame update

    // Update is called once per frame
    void Update()
    {
        contadortampo += Time.deltaTime;

        if (contadortampo > TempoGerarZumbi)
        {
            Instantiate(Zumbi, transform.position, transform.rotation);
            Zumbi.GetComponent<ControlaInimigo>().Dano = DanoZumbi;
            Zumbi.GetComponent<ControlaInimigo>().statusInimigo.Velocidade = VelocidadeZumbi;
            contadortampo = 0;

https://drive.google.com/file/d/1xULKEBGhNCda3jyk3gH9vpT_yoBoSdla/view?usp=sharing

8 respostas
solução!

Oi, Danilo, tudo bem?

Provavelmente é porque seu script tá gravando nas linhas do Update então tempo não é zerado.

Quando você faz Instantiate o objeto gerado não é o prefab do zumbi, ele usa o prefab mas gera uma cópia, então é outro objeto entende?

Você não conseguiria fazer GetComponent. Teria que ser algo assim:

// salvo o zumbi que acabou de ser gerado numa variável
var zumbiCriado = Instantiate(Zumbi, transform.position, transform.rotation);
// agora posso acessar ele
zumbiCriado.GetComponent<ControlaInimigo>().Dano = DanoZumbi;
zumbiCriado.GetComponent<ControlaInimigo>().statusInimigo.Velocidade = VelocidadeZumbi;

Ou melhor ainda você pode duplicar os prefabs dos zumbis e já criar o prefab para cada dificuldade mudando o status e pedir para aquele gerador usar aquele prefab.

Mas funcionava antes do status, e realmente ele criava zumbi(clone) no jogo

Sim. O Instantiate tá tudo certo. O problema é o GetComponent abaixo como expliquei acima você não quer acessar o GetComponent do prefab mas sim o GetComponent do zumbi que você acabou de criar, não é?

Por isso tava dando erro de NullReferenceException a Unity não conseguia acessar o componente do prefab

Eu entendi isso, mas não entendi como/pq funcionava antes do status

Como estava seu código antes?

Igual, só essa linha diferente.

zumbiCriado.GetComponent<ControlaInimigo>().Velocidade = VelocidadeZumbi;

É que antes você podia acessar o componente diretamente. Mas agora o seu Componente controla inimigo teria que rodar para preencher a variável statusInimigo não é?

Como para preencher statusInimigo só acontece no Awake/Start isso não pode acontecer editando o prefab diretamente, porque o Awake/Start não rodou. Por isso dava o erro de NullReferenceException. A variável estava null porque o Awake/Start não rodou no prefab. Já que ele é basicamente um objeto constante no projeto.

E é por isso que agora você tem que acessar o zumbi que foi criado e não o prefab. Assim o Awake dele roda porque ele agora existe no jogo e você consegue acessar.

Tudo que é preenchido de forma dinâmica via código você não conseguir fazer no prefab porque vai estar nulo.

Entendi, eu achei q era isso mas mudei do start pro awake e não tinha mudado, biu tentar desse jeito

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