
Naquela lição sobre o movimento do zumbi, aprendemos uma forma simples de movimentar um modelo. Mas ela só funciona se o movimento é num dos eixos globais (do espaço). Vamos ver agora como criar um movimento que segue os eixos locais de um modelo. Isso é muito importante quando queremos criar tiros dados pelo avatar, por uma metralhadora parada mas não nos eixos globais, um tanque se movimentando etc.
A outra coisa importante que vamos aprender é o conceito de parentesco entre modelos "pais" e "filhos". Já falamos de modelos com seus sub-modelos, criado no Blender. Mas aqui a coisa é diferente. Podemos acoplar, como "filho" de um modelo, outro modelo que não foi criado junto. Para isso usamos a janela "Jogo/Hierarchy". Basta arrastar o nome de modelo X por sobre o nome de um modelo Y e o primeiro virará "filho" do segundo.
O mais importante é que: quando o "pai" se movimenta, o "filho" vai junto. Vamos ver agora como usamos isso naquele caso do nosso game, em que temos "demônios" que disparam balas mortais pelos olhos.
Primeiro precisamos criar as novas texturas para o nosso conhecido modelo "demiurgo.blend":

Como já vimos no caso do zumbi, temos que importar um novo demiurgo (que virá com o nome "demiurgo 2") e colocar nele as novas texturas.
Vamos usar, nessa lição, aquela técnica da "prova de conceito". Assim, nosso espaço será bem simplificado, apenas com uma porta que o avatar deverá tentar cruzar, se livrando das balas disparadas pelos olhos do demônio.
IMPORTANTE: Não gire o demônio antes dos procedimentos que vamos ensinar. Depois, poderemos girá-lo, justamente para ver como a técnica funciona para casos fora dos eixos globais.

Precisamos criar nossa "bala" que será uma pequena esfera amarela. Criamos duas delas. A uma delas daremos o nome: "balaPai" e para a outra: "balaFilha". A primeira deverá estar, na janela "Jogo/Hierarchy", sob "demiurgo 2" e a segunda, obviamente sob a "balaPai". Colocamos as duas dentro da cabeça do demônio.

O truque, razão de criarmos duas balas, é que a balaFilha vai ser lançada à frente durante um espaço de "tempo". No fim desse tempo, a bala volta para a posição da balaPai e recomeça tudo (ela é relançada etc.). Esse tipo de tiro, que vamos ver no script, só funciona para quando o atirador está parado, mesmo que esteja em ângulo em relação aos eixos globais. Vamos ver, numa outra lição, um script para quando o atirador se movimenta.
Usaremos no script a função Translate da Classe Transform. A sintaxe dessa função é:
transform.Translate(Vector3.forward * n);
A expressão: Vector3.forward fará com que o modelo vá, para frente (considerando seus eixos locais) uma unidade (pé virtual). Para mudar essa distância, multiplicamos por um dado valor.
Existe a expressão Vector3.right. Multiplicando o vetor por -1, se for o caso, teremos todas as direções atendidas.
Tente entender a lógica do script que vamos acoplar na balaFilha e que chamamos de: "tiroParado.js":
var delta = 0.05;
var tempo = 0;
function Update (){
if(tempo == 0){
transform.position = GameObject.Find("balaPai").transform.position;
transform.rotation = GameObject.Find("balaPai").transform.rotation;
tempo = 1;
}
if(tempo >= 1){
//Ajustar o delta se for fullScreen
if (Screen.fullScreen){
delta = 0.01;
}
transform.Translate(Vector3.forward * tempo * delta);
tempo = tempo + 1;
}
if (Screen.fullScreen){
if(tempo > 300){
tempo = 0;
}
}
if(!Screen.fullScreen){
if(tempo > 70){
tempo = 0;
}
}
}
A cada loop do Update, a bala avança mais 0,05 do pé-virtual. Até termos 70 loops (nosso limite para a variável "tempo"). Nessa hora, a bala volta para a posição da balaPai e tudo recomeça.
Como já dissemos, a velocidade do loop Update, no caso do jogo estar em "fullScreen", é diferente. Então temos que fazer os ajustes. A expressão:
!Screen.fullScreensignifica:"quando não é fullScreen".
Repare como podemos acessar as Propriedades de um dado modelo, estando o script dentro de outro modelo, usando, no caso,
GameObject.Find("balaPai").
Importante lembrar que, no Collider da balaFilha, temos que ticar "Is Trigger".
Por falar em colisão, temos que acoplar, também na balaFilha, o script que faz a bala matar o modelo que é atingido:
var quemColidiu: Collider;
function OnTriggerEnter (other : Collider){
quemColidiu = other;
Destroy(quemColidiu.gameObject);
}
Na nossa "prova de conceito, podemos agora (e só agora), dar uma girada no demônio. Par isso usamos o terceiro botão que fica acima das Views e arrastamos os círculos que surgem no modelo selecionado.

Teste nossa "prova de conceito", inclusive se deixando "matar":
LIÇÃO ANTERIOR PRÓXIMA LIÇÃO ÍNDICE HOME PAGE
