3
respostas

Código

Olá Henrique,

Modifiquei o código da classe Carrossel para tentar escrever menos linhas de código e o jogo não funciona como deveria. Ao invés de criar variaveis e discriminá-las no metodo Awake, coloquei todas as variaveis no metodo Update, no entanto, a velocidade de movimento do cenário aumenta e não se repete dando o efeito de jogo continuo. Não entendi porque isto acontece. Apesar do metodo Awake ser diferente do metodo Update, todas as variaves na classe e no metodo awake são chamadas no metodo update. Somente inseri tudo no metodo Update.

Segue abaixo o metodo normal e o que modifiquei este como comentário.

public class Carrossel : MonoBehaviour {

    public float velocidade;
    private Vector3 posicaoInicial;
    private float tamanhoRealDaImagem;

    private void Awake()
    {
        posicaoInicial = transform.position;
        tamanhoRealDaImagem = GetComponent<SpriteRenderer>().size.x;
        float escala = transform.localScale.x;
        tamanhoRealDaImagem = tamanhoRealDaImagem * escala;
    }

    void Update()
    {
        float deslocamento = Mathf.Repeat(velocidade * Time.time, tamanhoRealDaImagem);
        transform.position = posicaoInicial + Vector3.left * deslocamento;

    }

/*
public float velocidade;


void Update()
    {
    float deslocamento = Mathf.Repeat(velocidade * Time.time, GetComponent<SpriteRenderer>().size.x * transform.localScale.x);
    transform.position +=  Vector3.left * deslocamento;
    }
*/

}

3 respostas

Oi Bruno tudo bom?

Não necessariamente um código com menos linhas é um código melhor. Em muitos casos a legibilidade do código fica prejudicada justamente pq vc tem uma única linha muito longa.

O problema dessas linhas muito longas é que é muito fácil se perder tentando entender o que ela faz. E quando alguém esta distraído lendo o código pode deixar passar informações importantes. Por exemplo, no seu caso vc chama o GetComponent<SpriteRenderer> no meio do seu calculo de deslocamento, se eu não tiver atento eu posso não ver que logo depois dessa chamada vc usa o localScale. Isso pq tenho que rolar a página para o lado para terminar de ler sua linha.

Outro ponto importante de levar em conta antes de "deixar o código menor" é pensar em qual impacto que isso terá no sistema como um todo. No caso de jogos é ainda mais importante e devemos ter muito cuidado quando colocamos algo no método Update justamente porque esse método é executado 60 vezes por segundo. Então, tudo que colocamos ali tem um poder de afetar a performance do jogo muito grande.

Em computação sempre ouvimos falar que precisamos evitar fazer trabalho inútil. E pensa comigo, o tamanho da nossa imagem muda constantemente? não né, então pq eu preciso pedir para todo frame a Unity buscar na arvore de componentes do objeto pelo componente SpriteRenderer e então pegar a informação do tamanho da imagem?

Não vale a pena, pq essa busca pelo componente é algo super pesado e não devemos fazer no método update. Por isso no código original eu uso apenas o Awake para isso e salvo essa informação dentro do meu objeto, onde o acesso é muito mais rápido.

A mesma coisa acontece quando vc chama o transform.localScale.x. Infelizmente a unity não deixa esse aqui tão claro. Mas sempre que ue chamos o transform na hora de compilar o código a unity substitui essa chamada por um getCompoenent<Transform> ( deixei passar no curso, mas deveria ter cacheado essa referência para o transform tbm.

Dados todas essas considerações, o erro que ta acontecendo no seu código é um erro de lógica. No código original eu uso a variável Posição inicial e somo o deslocamento que calculamos nessa posição antes de atribuir para a posição atual do objeto. No seu caso vc simplesmente soma o deslocamento direto na posição atual do objeto e nesse caso suas peças vão eternamente para a esquerda pq quando o deslocamento é calculado como 0 o objeto simplesmente não se move naquele frame, mas ele não volta para a posição inicial. Como eu uso a posição inicial de âncora, quando meu deslocamento é 0 eu só atribuo o resultado da soma na posição atual, então se meu deslocamento é 0 a atribuição fica assim

posicao atual = 0 + posição Inicial que é o mesmo que dizer posição atual = posição inicial

é nesse momento que formamos o loop.

Olá Ricardo, valeu pela resposta. O problema é que eu fico perdido com tantas variáveis e métodos.... Apesar de ter visto e acompanhado alguns cursos de Unity, ainda não consigo escrever os códigos sozinho. Também já vi vídeos no youtube explicando sobre "C++". Tem alguma sugestão para este problema? O receio que tenho de fazer curso de C# na Alura é que os métodos disponíveis no Unity devem ser diferente dos métodos usados no curso. Valeu! Bruno

Oi Bruno tudo bem?

Os cursos de C# são imprescindíveis para fazer as aulas. Sem eles vai ser difícil acompanhar. E não se preocupe que os métodos vão ser diferentes. No curso você vai aprender a trabalhar com linguagem orientada a objetos e como usar métodos de terceiros.

Espero ter ajudado!!!