Cursos / Jogos Digitais / Desenvolvimento com Motores de Jogos II / Aula

arrow_back Aula 15 - Jogo Farm Coins - Parte 2

Obstáculos Móveis

Vamos agora revisar o script que criamos. MoverPlataforma tem cinco variáveis, são elas:

  • Vector3 posicaoInicial: armazenará a posição do GameObject “PosicaoInicial”.
  • Vector3 posicaoFinal: armazenará a posição do GameObject “PosicalFinal”.
  • Public float velocidade = 3f: determina a velocidade da plataforma (por padrão 3.0).
  • Vector3 destinoAtual: armazena o destino atual do movimento, ou seja, para onde a plataforma está se movendo naquele momento (deve alternar entre posicaoInicial e posicaoFinal). Todas as vezes que ela mudar de direção mudamos o valor dessa variável.
  • Bool voltando: um booleano que guarda a informação sobre se a plataforma está indo para a posição final (voltando = false) ou para a posição inicial (voltando = true). Todas as vezes que ela mudar de direção, mudamos o valor dessa variável.

Observe o método Start() abaixo:

Repare que nele definimos o valor de quatro variáveis. Primeiramente, queremos guardar as posições dos GameObjects PosicalInicial e PosicaoFinal nas variáveis posicaoInicial e posicaoFinal respectivamente (que são do tipo Vector3). Como não criamos uma referência aos GameObjects filhos no script, utilizaremos uma técnica de pegar essa referência pelo seu nome. Para isso, usaremos o transform.FindChild(), o qual recebe o nome do GameObject filho que está sendo buscado como parâmetro. O retorno do FindChild() é o transform do GameObject para o qual passamos o nome, e dele queremos recuperar a posição, por isso utilizamos o seguintes comandos para os dois GameObjects filhos do PlataformaMovel:

Ainda no método start, utilizamos o comando destinoAtual = posicalFinal; para determinar que a princípio a Plataforma deve se mover em direção à posicaoFinal. Da mesma forma, determinamos que inicialmente voltando = false, ou seja, como a Plataforma inicia indo para a posicaoFinal, então ela não está “voltando” ainda.

No começo do método Update() temos os comandos:

Primeiramente, dizemos que a variável “movimento” corresponderá à velocidade que escolhemos multiplicada pelo tempo passado desde o último frame exibido na tela, sendo esse tempo sempre armazenado em Time.deltaTime. Essa é uma prática muito comum para ter uma física, independentemente da taxa de atualização dos frames do jogo. A variável “movimento” é do tipo float e guarda o quanto a plataforma deve se mover nesse frame atual (mas não ainda para onde ela se move).

Em seguida, com o comando transform.position = Vector3.MoveTowards (transform.position, destinoAtual, movimento); determinamos que a nova posição de PlataformaMovel (transform.position) será alterada e receberá um novo valor correspondente justamente à posição do ponto que está entre a plataforma e o destino, porém somente a uma distância da plataforma do tamanho da variável “movimento”. O Vector3.MoveTowards faz exatamente isto: recebe duas posições (a da plataforma e a do destino), além de uma certa quantidade de unidades a se mover (variável movimento), e retorna um novo Vector3 que representa esse passo em direção ao destino. Isso faz a plataforma efetivamente “andar” em direção ao destino um pouco a cada frame.

Ainda no método Update() temos o restante dos comandos como a seguir:

O trecho de código acima inicialmente calcula a distância da Plataforma até o destinoAtual utilizando o Vector3.Distance(), o qual recebe dois Vector3 como parâmetro e retorna a distância entre eles. Logo em seguida, é feita uma verificação sobre se distanciaAoDestino é menor que 0.1, ou seja, se o objeto chegou ao destino e é o momento de alternar a direção do movimento. É importante fazer essa verificação considerando uma certa margem de erro (+- 0.1), pois às vezes o objeto pode “passar direto” do seu destino, sem nunca ter ficado exatamente sobre ele, já que a física do jogo é calculada em intervalos frame a frame. Caso seja verdade que o objeto chegou ao destino, então se verifica se ele estava indo em direção ao Início ou ao Final com o comando if (voltando). Em cada caso se realiza a troca das variáveis voltando e destinoAtual: se ele está voltando, então a variável voltando agora é igual a false e o destinoAtual = posicaoFinal, caso contrário então a variável voltando agora é igual a true e o destinoAtual = posicaoInicial.

Versão 5.3 - Todos os Direitos reservados