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

Duvida relacionada ao escopo da variável local inimigo Aula 3 - Video 2

Aos 07:50 segundos do segundo video da aula 3. Detectando colisões e destruindo inimigos, o instrutor fez algo que me deixou com uma duvida no funcionamento do escopo de variáveis locais.

void OnTriggerEnter(Collider elementoColidido){
        if (elementoColidido.CompareTag ("inimigo")) {
            Destroy (this.gameObject);
            //Destroy (elementoColidido.gameObject);
            //Debug.Log ("Colidiu");
            Inimigo inimigo = elementoColidido.gameObject.GetComponent<Inimigo>();
            inimigo.RecebeDano (pontosDeDano);
        }

eu inicialmente imaginei que ele faria da seguinte forma.

elementoColidido.gameObject.GetComponent<Inimigo>().RedebeDano(pontosDeDano);

pois dessa forma acessamos o gameobject desse collider e verificamos se nele existe um componente do tipo inimigo. E então acessamos o RecebeDano desse componente.

Agora que vem a duvida. Quando eu crio uma variável local do tipo Inimigo e a chamo de inimigo, a faço uma atribuição desse elemento que recebeu a colisao do missil, que é o inimo que tambem é do tipo Inimigo. dessa forma

            Inimigo inimigo = elementoColidido.gameObject.GetComponent<Inimigo>();
            inimigo.RecebeDano (pontosDeDano);

Mas essa variável não é local? Dessa forma eu não tenho dois objetos agora em tempo de execução do tipo inimigo, o meu inimigo propriamente criado no inicio do jogo e agora essa "copia" desse primeiro objeto nesse segundo objeto do tipo Inimigo só que em uma variável que existe apenas dentro do escopo da função OnTriggerEnter() ?? Ou seja, ele não executa essa função e retira 10 pontos de vida (caso esse seja o valor passado) so que dessa variavel local? Assim quando o codigo sair dessa função e outro missil atingir o inimigo, ele nao estaria com os mesmos 20 pontos de vida?(caso esse fosse os pontos iniciais) Esse valor nao é decrementado apenas da variavel local inimigo? Como que esse valor decrementado é passado p o inimigo que veio do Collicder elemento Colidido? Por acaso nao estamos copiando o conteudo desse objeto para o objeto que sera refenciado pela vaariavel de refencia local inimigo? Estamos na verdade atribuindo tipo o valor em sua memoria? Tipo um ponteiro? Eu realmente fiquei sem entender pq que eu fazendo essa atribuição o valor realemnete é decrementado das vidas do inimigo....Eu fiz da minha maneira e como esta na aula e realmente funciona, porem nao entendi pq que o da aula funciona.

2 respostas
solução!

Oi Daniel,

Na realidade o código é o mesmo. Só fizemos desta forma para ficar mais legível do que tudo na mesma linha:

Inimigo inimigo = elementoColidido.gameObject.GetComponent<Inimigo>();
inimigo.RecebeDano (pontosDeDano);

Quando você atribui o valor para a variável inimigo, você está copiando a referência (o ponteiro) ao objeto e não o valor do mesmo.

Abraço!

Obrigado Joviane! Eu então imaginei certo quando imaginei que estávamos copiando a referencia de memoria do objeto Inimigo(como ponteiro). Perguntei , pois tenho a impressão que em Java já fiz algo parecido, e eu não estaria copiando o ponteiro e sim apenas copiando todo o conteúdo do objeto e apenas colocando esse valor em outra variável de referência do mesmo tipo, e caso eu fosse imprimir seus valores daria a impressão que sao objetos iguais, porem seriam objetos distintos com endereços na área de memoria heap. Ate pq toda vez que se entra no funcao OnTriggerEnter() Uma nova referencia do tipo Inimigo é criada. Irei analisar melhor a situação, agora que você me confirmou que o que esta acontecendo é que ele esta recebendo o endereço de memoria mesmo como se fosse um ponteiro em C. 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