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

Estou em duvida de como escrever os Scripts de Jogador e Inimigo.

Estava olhando o código e pensando em uma maneira de colocar o tempo entre as posições do inimigo nesse novo script.

Só que estou bugando, foi mencionado para fazer uma herança de Status, para herdar exatamente o que ? (Não sei se todos viram a aula, mas esta no final dela.)

Na aula foi passado para colocar a variável:

private float tempoEntrePosicoesAleatorias = 4;

no status do inimigo que esta herdando de status.

Para depois ser usado pela classe ControlaInimigo . Agora o que eu quero saber é se tenho que escrever um método em StatusInimigo para depois usar na classe controla ControlaInimigo ?

Resumindo: Tentei escrever o código, mas não sei bem como já que não entendi o que foi proposto, e tambem envolve outras variáveis. Preciso de uma luz.

6 respostas

Oi, Matheus, bom ponto!

Não é de fato necessário pro curso, é mais uns exemplos que vocês podem fazer pra se desafiar.

O que eu falei do Status é o seguinte, não temos um Script que é utilizado para guardar os Status do nosso zumbi? Como a Vida?

É pegar essa variável private float tempoEntrePosicoesAleatorias = 4; que parece um Status do nosso zumbi jogar para o Script de Status e usá-la a partir de lá. Só que ela não é somente do nosso Zumbi?

Então seria criar um script Status padrão com algumas coisas e fazer um script StatusInimigo que herda de Status ou seja tem os mesmos campos mas inclui esse campo que só faz parte do nosso zumbi.

Consegui ser mais claro ou ainda tá meio embaralhado? hehe

Bons estudos :)

Opa ! Que resposta rápida hehehe Obrigado,

Sim, eu consegui visualizar melhor essa questão, e percebi alguns outros pontos que talvez possam ir para o StatusInimigo como TomarDano, já que lida com o status HP.

Eu fiz uma modificação agora no StatusInimigo:

public class ControlaStatusInimigo : ControlaStatus {

    private float contadorVagar;
    [HideInInspector]
    public Vector3 posicaoRandom;
    private ControlaInimigo controlaInimigo;

    void Start()
    {
        controlaInimigo = GetComponent<ControlaInimigo>();
    }


    //posição aleatoria
    public void PosicaoAleatoria()
    {
        contadorVagar -= Time.deltaTime;
        if (contadorVagar < 0)
        {
            posicaoRandom = controlaInimigo.PosicaoRandom();
            contadorVagar += tempoEntrePosicoesAleatorias;
        }
    }
}

A classe Status só tem a variável:

public class ControlaStatus : MonoBehaviour {

    public int VidaInicial = 10;
    [HideInInspector]
    public int Vida;
    public float Velocidade = 10;
    [HideInInspector]
    public float tempoEntrePosicoesAleatorias = 4;


    void Awake () {
        Vida = VidaInicial;
    }



}

E a classe ControlaInimigo ficou assim:

Declaração:

    public GameObject Jogador;
    private ControlaMovimento controlaMovimento;
    private ControlaAnimacao controlaAnimacao;
    private ControlaStatusInimigo controlaStatusInimigo;
    public AudioClip SomDeMorte;
    private Vector3 direcao;
    private int distanciaParaVagar = 20;

E o método Vaga():

    void Vagar()
    {
        controlaStatusInimigo.PosicaoAleatoria();

        bool ficouPertoOSuficiente = Vector3.Distance(transform.position, controlaStatusInimigo.posicaoRandom) <= 0.05;
        if (ficouPertoOSuficiente == false)
        {
            SeguirParaPosicaoAleatoria();
        }

    }

Não sei se essa é a ideia por trás do que você pediu.

Da uma olhada e da sua opinião kkkkk Tenho uma noção de Orientação a Objeto, mas sempre foi um problema na facul hehehe

solução!

Isso aí! Tomar dano e outras coisas que são relativos a vida fazem sentido no Status também.

Essa parte da posição aleatória acho que faz mais sentido jogar na parte de movimento do inimigo e não no status, porque senão o status tem que comunicar com o ControlaInimigo ou com o MovimentaInimigo. Isso não é tão bom.

Então o Status seria como um script com alguns métodos auxiliares que eu uso no ControlaInimigo e o MovimentaInimigo a mesma coisa, mas nenhum deles dependem de ControlaInimigo nem de ninguém.

Fazer com que em teoria cada script funcionasse sozinho mas no ControlaInimigo a gente junta vários deles e põe tudo pra funcionar.

Entendi, voltei os Scripts para como eles estavam antes.

Vou pensar em como organizar melhor isso depois. Tenho mais algumas horas até a facul hehe, então vou continuar com as aulas.

Mas eu reparei em outra coisa, no Unity na parte de console esta me avisando que a variáveldirecao esta vazia. Essa é a mensagem:

Look rotation viewing vector is zero UnityEngine.Quaternion:LookRotation(Vector3) ControlaMovimento:RotacionarPersonagens(Vector3) (at D:/Unity/Projetos/Apocalipse Zumbi Alura/apocalipse-zumbi-alura/Assets/Scripts/ControlaMovimento.cs:21) ControlaInimigo:FixedUpdate() (at D:/Unity/Projetos/Apocalipse Zumbi Alura/apocalipse-zumbi-alura/Assets/Scripts/ControlaInimigo.cs:33)

O código de ControlaInimigo:

    void FixedUpdate()
    {
        //Distancia entre o jogador e o zumbi
        float distancia = Vector3.Distance(transform.position, Jogador.transform.position);

Essa e a linha 33: controlaMovimento.RotacionarPersonagens(direcao);
        controlaAnimacao.AnimacaoMovimentar(direcao.magnitude);

        if (distancia > 20)
        { 
            Vagar();
        }
        else if (distancia > 2.5)
        {
            //SeguirJogador();    
            direcao = Jogador.transform.position - transform.position;
            controlaMovimento.MovimentoPersonagens(direcao, controlaStatusInimigo.Velocidade);
            controlaAnimacao.Atacar(false);
        }
        else
        {
            controlaAnimacao.Atacar(true);
        }
    }

Código ControlaMovimento:

public class ControlaMovimento : MonoBehaviour {
    private Rigidbody rigidbodyMovimento;

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

    public void MovimentoPersonagens(Vector3 direcao, float velocidade)
    {
       //Pega a posição atual do zumbi e soma com a direção do jogador e faz com que o zumbi ande de maneira normalizada (1)
       rigidbodyMovimento.MovePosition(rigidbodyMovimento.position + (direcao.normalized * velocidade * Time.deltaTime));
    }

    public void RotacionarPersonagens(Vector3 direcao)
    {
Essa e a linha 21: Quaternion novaRotacao = Quaternion.LookRotation(direcao);
        rigidbodyMovimento.MoveRotation(novaRotacao);

Então isso é um erro mais tranquilo que o Unity "resolve" não dando muitos problemas pro seu jogo. Mas a causa é que o LookRotation fica bravo com você se ele recebe direcao 0 hehe.

Talvez o que você possa fazer pra evitar isso é fazer algum if tipo

if(direcao.magnitude != 0) ou if(direcao != Vector3.zero) passando as duas linhas do RotacionarPersonagens pra dentro dele.

Hehe entendi ! Vlws

Eu curti de verdade mexer com o Unity e sempre tive vontade de trabalhar com criação/desenvolvimento de jogos. Mas não sou bom em programação (curso ciêncida da computação, mas em espirito queria estar dento de uma sala dentro Saga kkkk) muito menos em designe (desenhos/modelagens) kkkkkk só que resolvi investir tempo e me dedicar em algo que eu gosto.

Por isso estou pertubando bastante XD hahaha