Mostrando postagens com marcador TUTORIAIS - SPACE INVADERS. Mostrar todas as postagens
Mostrando postagens com marcador TUTORIAIS - SPACE INVADERS. Mostrar todas as postagens

sexta-feira, 13 de agosto de 2010

023 - Space invaders (8) - Tags: a identidade no jogo

No últimos posts, desenvolvemos a IA dos aliens: sua movimentação pela zona de jogo e os momentos nos quais os aliens atirariam.

Só que não adianta nada ter uma nave que se move para os lados, aliens querendo te destruir e vários tiros se quando você mata o alien, você não ganha ponto. Ou quando você é morto, não aparece a tela de Game Over.

Vamos pensar da seguinte forma: todo game possui um "juiz" que valida as ações executadas no jogo. Tomemos como exemplo Mario. Esse "juiz" verifica quantas moedas o nosso encanador de boné vermelho pegou ao longo da fase, quantos bichinhos ele matou, quanto vale cada bichinho morto, os combos, o equipamento que ele está usando [cogumelo, fireflower, a capa que voa, invencibilidade...], etc.

Agora nós vamos dar vida a esse "juiz", que irá dizer o que acontece se, por exemplo, você atira e destroi o alien [já criamos o poder destrutivo do tiro. Mas quantos pontos você ganha por ter feito isso?].

Isso será feito com a ajuda das TAGS. São termos gerais que identificam grupos de GameObjects no Unity. Isso será uma referência para os nossos scripts que terão execuções especiais se um objeto com determinada tag estiver envolvido na ação.

As tags podem ser editadas no menu Edit >> Project Settings >> Tags
As informações aparecem na guia Inspector



Criaremos, a princípio, 4 tags para identificar os elementos principais do jogo:

  • Nave: identificará a nave do protagonista
  • Alien: identificará os aliens em jogo
  • TiroNave: identificará o tiro da nave do protagonista
  • TiroAlien: identificará o tiro da nave alien.
Para criar uma nova tag, na guia inspector, na parte de tags, clique no espaço vazio ao lado de Element 0 e coloque o nome da tag desejada [conforme mostrado acima].




Nos scripts, usaremos as tags entre aspas duplas dessa forma: "Nave", "Alien", "TiroNave", "TiroAlien"


A seguir quero compartilhar com vocês a minha recente descoberta e que será bem útil em nosso jogo: o sistema de pontuação. É aqui que começaremos a usar as nossas tags.

quinta-feira, 12 de agosto de 2010

022 - Space invaders (7) - Artilharia pesada

Na última postagem, vimos como aplicar os scripts de movimentação dos aliens nos modelos. Vimos também a necessidade de dois componentes que permitam a interação do alien com o ambiente: rigidbody e box collider. Estes dois componentes serão bastante úteis quando analizarmos colisões entre tiro e GameObject.

Anteriormente vimos como fazer a nave do protagonista atirar. Agora faremos os aliens atirarem.

1) A primeira coisa que precisamos é de um canhão para a nave. A construção de um canhão já foi explicada no post 008
Dê o nome deste canhão de "Canhao_alien".

2) Uma vez criado o canhão, é necessário um script que permita a sua ativação de forma automática, ou seja, quando o alien irá atirar, a frequência do tiro e a velocidade.
Crie um novo script. Dê o nome de "Atirar_alien". Copie o texto abaixo:

var newObject : Transform;
var tstart = 0.0;
var freq = 0.0;
InvokeRepeating ("LaunchProjectile", tstart, freq);

function LaunchProjectile () {
    Instantiate (newObject, transform.position + Vector3.forward * -55, transform.rotation);
}

3) Aplique este script à "Canhao_alien"

4) Jogue o "Canhao_alien" dentro do prefab do alien. Procure posiciona - lo no lugar mais conveniente conforme o seu modelo de alien.
Lembre - se: qualquer alteração no prefab fará com que você o perca, isto é, tire do objeto o rótulo de prefab. Depois de colocar o canhão, clique em Apply para salvar as alterações nele.

5) No nosso script "Atirar_alien" existem 3 valores que precisam ser determinados:
  • New Object: determina o objeto que será instanciado [no nosso caso, a prefab "Tiro"]
  • Tstart: determina quando o alien começará a atirar
  • Tfreq: determina a frequência de tiro. Quanto menor esse valor, mais tiros por frame serão gerados


Assim como os scripts para mover o alien, também é preciso determinar valores diferentes para cada canhão de cada alien. A frequência de tiro pode ser a mesma, ou pode ser variável para dar a noção de incerteza de quando será o próximo ataque.

6) O tiro que sairá do canhão alien deve ser diferente daquele que sai do canhão da nave do protagonista. Isso porque este último possui trajetória voltado para o norte [para a parte alta da tela]. Se esse tiro for colocado como objeto a ser instanciado pelo canhão alien, o que vai ocorrer? Ao invés de o tiro ir para baixo [na direção da linha de movimentação da nave do protagonista], ele vai para cima e não atingirá ninguem, ou seja, o tiro literalmente vai sair pela culatra. :p
Para isso, teremos de criar outro prefab que irá representar o tiro do alienígena. Usa - se então o mesmo processo descrito no post 008.
Esse tiro deverá ter os mesmos scripts do tiro do protagonista: "Atirar - mover tiro" e "ColisaoTrigger".

A seguir, teremos o sistema de tags. Um sistema bastante útil para, por exemplo, fazer o score de jogo ou determinar o seu fim.

terça-feira, 10 de agosto de 2010

021 - Space invaders (6): Hora de adestrar aliens parte 2

Certo, galera. Temos enfim os scripts que farão os aliens se moverem. Agora precisamos posiciona - los no cenário de forma a determinar as suas trajetórias e ações. Faremos um passo a passo disso.

Até este ponto usamos as formas que o próprio Unity nos oferecia, ou seja, cubos. Para criar os modelos que realmente serão usados no jogo, precisaremos de ferramentas de modelagem adicionais, afinal o Unity não é uma boa pedida para modelagem. Nesse caso, sugiro para vocês o SketchUp. Maiores informações sobre ela podem ser encontradas no blog de Anderson Sampaio.

Existem outras ferramentas além dessa. Tô sugerindo essa pois boa parte da modelagem foi feita nela.

Vamos começar a treinar os aliens para não fazerem feio na hora do jogo.

1) Se lembra do terreno que pedi no inicio do tutorial? Será nele que colocaremos os aliens da espera, ou seja, aqueles que você não vê enquanto joga.



2) Vamos criar a área onde todo o jogo se desenvolverá - onde a nave do protagonista vai ficar e por onde os aliens irão passar.
GameObject >> Create Other >> Plane



3) Ajuste as dimensões do plano (Inspector >> Transform >> Scale)
X = 200
Y = 100
Z = 150
O Eixo y não influencia muito no plano.



4) Agora é hora de acionar o SketchUp. Aqui nós vamos usar o formato .FBX. Vá no menu Assets >> Import New Asset.



5) Selecione o .fbx do seu modelo de alien e clique em Import.



6) O arquivo importado aparecerá como novo objeto na guia Project.



7) Jogue esse novo objeto no cenário e edite as suas dimensões.
X = 400
Y = 400
Z = 400



8) Se você criar um modelo monocromático, como esse do primeiro alien, você pode alterar a textura do modelo pelo próprio Unity. Crie um novo material (Assets >> Create >> Material)



9) Nomeie "Cor Alien 1"

10) Clique no modelo do alien que está no cenário.

11) Na guia Hierarchy, perceba que esse modelo está dividido em partes. Vamos editar cada parte com o nome "Mesh"



12) Clique em um dos "Mesh" de seu alien.

13) Vá em Inspector >> Mesh Renderer >> Element

14) Mude para "Cor Alien 1"





15) Faça isso para todas as Mesh que tiver no alien.



16) Converta esse alien em um prefab. Só relembrando como se converte algo em prefab:
Assets >> Create >> Prefab
Nesse momento o ícone do prefab está cinza
Nomeie o prefab com F2
Arraste o objeto da guia Hierarchy para dentro do icone do prefab criado
Agora temos o ícone azul.

Nesse caso, nomeie - o de "Alien_Direita"

17) Delete o alien atual (que está na guia Hierarchy) e substitua - o pelo prefab.

18) Aplique nele o script "Move_alien_direita" que criamos no post anterior. Cuidado para não aplicar em alguma parte do prefab. O script deve ser aplicado em "Alien_direita".
Isso fará com que você perca o prefab temporariamente.



19) Clique em Apply



20) Copie e cole mais 4 desses aliens, posicionando - os em diagonal. Procure usar as setas para posiciona - los no mesmo plano. (As coloridas que aparecem na tela, não as do teclado!!!)



21) Edite cada alien separadamente conforme a figura abaixo:



22) Salve e teste. Ctrl+S e Ctrl+P
Perceba que os aliens se movem para a direita, mas não caem. Eles flutuam no ar.

Isso acontece porque eles não são corpos rígidos - corpos com massa - e acabam não sofrendo influência da gravidade local e de outras forças externas.

23) Selecione um dos aliens.
Component >> Physics >> Rigidbody
De novo perderemos o prefab tempoariamente. Novamente, Apply
Isso aplicará "Rigidbody" aos 4 aliens restantes.



24) Salve e teste.
Agora os aliens sofrem ação da gravidade, mas acabam atravessando o plano.

Isso ocorre porque eles não possuem superficie de contato. São "fantasmas" na verdade.

25) Selecione um dos aliens
Component >> Physics >> Box Collider



26) Ajuste a posição e as dimensões do Box Collider
Sugiro como na figura abaixo



27) Apply!

28) Salve e teste.
Agora os aliens deslizam pelo plano e caem logo em seguida.
Se estiverem muito próximos, poderão até bater uns nos outros, desviando a sua trajetória. Procure posiciona - los de forma que isso não aconteça.

Siga esses mesmos passos para criar outros aliens, para que você possa aplicar os outros 5 scripts restantes.

Dicas:

  1. Nomeie cada alien dessa forma: "Alien_[nome do script]"
  2. Dê para cada alien uma cor diferente (caso ele seja monocromático, ou seja, as cores de cada parte não tenham sido editadas préviamente no SketchUp)
  3. Na hora de ajustar os Tstart dos novos aliens, procure colocar o mesmo intervalo entre eles (1 >> 1,5 >> 2 >> 2,5 >> 3 >> 3,5)
  4. Se houver um alien com outro script de movimento, coloque um intervalo maior entre os Tstart. (EX.: Entre o último "Alien_direita" e o primeiro "Alien_esquerda". Coloque Tstart = 3 para "Alien_direita" e Tstart = 4 para "Alien_esquerda").
A seguir, vamos aprender a fazer os aliens atirarem.

sexta-feira, 6 de agosto de 2010

020 - Space invaders (5): Hora de adestrar aliens

Desculpem a demora em postar aqui. Tive vários problemas com minha internet e ainda o jogo de Miúda. Hora de voltarmos ao nosso tutorial Space Invaders depois de mais de 2 meses parado.

O que faremos agora será mover os aliens. A princípio faremos vários scripts que farão eles se moverem de diferentes formas. Esses scripts terão alguns elementos em comum, como início do movimento, velocidade e autodestruição do alien (não é bom ele ficar muito tempo no cenário, mesmo que fora do alcance da câmera. Isso pesa muito a memória).

1) Vamos primeiro tentar fazer os aliens descerem contra a sua nave, partindo da direita para a esquerda.
Crie um novo script e nomeie "Move_alien_esquerda". Escreva o script abaixo


var x = 1.0;
var y = 25.0;
var velocidade = -5.0;
var tstart = 0.0;
var tfreq = 0.0;
InvokeRepeating ("MoveAlien", tstart, tfreq);

function MoveAlien () {
transform.Translate(x-(y*0.0125), 0, velocidade);
y++;
Destroy(gameObject, 10+tstart);
}


Nesse script, assim como em outros que virão a seguir, teremos as seguintes variáveis comuns:

  • velocidade: determina a velocidade com o qual o alien se projetará na direção do eixo Z (ou seja, de cima para baixo)
  • tstart: determina quando o alien começará a se mover
  • tfreq: determina a velocidade com o qual o alien se moverá no todo.
A nossa base para os outros scripts será a função MoveAlien. Só mudaremos algumas coisinhas nesse script de forma a gerar os outros efeitos.

2) Vamos mover os aliens da esquerda para a direita da mesma forma que o script 1. Crie outro script e nomeie "Move_alien_direita". Escreva o mesmo script acima.

Na linha 10, onde tem - se
y++;
Troque por
y--;

3) Vamos mover os aliens apenas no eixo horizontal, sem eles descerem contra a sua nave. Partindo da direita para a esquerda.
"Move_alien_esquerda_semdescer"

Aqui, o valor da variavel velocidade sempre será nulo.
Na linha 9, onde tem - se
transform.Translate(x-(y*0.0125), 0, velocidade);
Troque por
transform.Translate(x-(y*0.0125), 0, 0);


4) Agora mover os aliens da mesma forma que em 3, partindo da esquerda para a direita.
"Move_alien_direita_semdescer"




Na linha 9, onde tem - se
y++;
Troque por

y--;

5) Agora, vamos mover os aliens em linha reta, apenas descendo. Sem se mover para a esquerda ou direita.
"
Move_alien_desceReto"

var tstart = 0.0;
var tfreq = 0.0;
var velocidade = -5.0;
InvokeRepeating ("MoveAlien", tstart, tfreq);

function MoveAlien () {
transform.Translate(0, 0, velocidade);
Destroy(gameObject, 10+tstart);
}


6) E por fim, faremos os aliens descerem e pararem depois de um certo tempo.
"Move_alien_parar"

var x = 1.0;
var y = 0.0;
var parar = 100;
var tstart = 0.0;
var tfreq = 0.0;
InvokeRepeating ("MoveAlien", tstart, tfreq);

function MoveAlien () {
if (y < parar) {
transform.Translate(0, 0, 5);
y++;
}
else {
y += 0.1;
}
Destroy(gameObject, 30);
}

Com isso temos 6 scripts diferentes para mover os aliens de 6 diferentes formas:
  1. Move_alien_esquerda
  2. Move_alien_direita
  3. Move_alien_esquerda_semDescer
  4. Move_alien_direita_semDescer
  5. Move_alien_desceReto
  6. Move_alien_parar
Basta aplicar cada script aos modelos dos aliens que você desejar.
No cenário, clique no modelo do alien de sua preferência. Depois vá em "Component >> Scripts".

Escolha um dentre os 6 scripts que estão listados acima.
Você pode editar os valores das variáveis na própria tela do Unity, sem ter de alterar o script diretamente. Dessa forma, você pode setar valores individuais para cada alien.














Principalmente quanto a Tstart. É importante haver valores diferentes para essa variável. Na próxima, veremos como ajustar os valores dessa variável para diversos aliens no cenário.

segunda-feira, 5 de julho de 2010

017 - Space invaders (4): Tiro destrutivo

Demorei mas cheguei. Finalmente, depois de um bom tempo elaborando o jogo, continuaremos o nosso tutorial de Space Invaders.

Na última postagem, vimos como instanciar o tiro, certo? Por enquanto, o tiro não fará nada. Possivelmente irá atravessar o objeto que tocar nele.

Nesse caso, usaremos uma função do unity chamada OnTriggerEnter. Essa função funciona da seguinte forma: o objeto (trigger = gatilho), ao encostar em algum corpo rígido, irá executar os scripts que estiverem na função OnTriggerEnter.

No caso do tiro, o objetivo será destruir alguma coisa.

Vá em Project >> Create >> JavaScript. Renomeie para "ColisaoTrigger".

Para facilitar a sua vida, organize a guia project em pastas. Coloque scripts em uma pasta de scripts, sons em uma pasta de sons, cenas em uma pasta de scenes e assim sucessivamente. Acredite: isso irá ser bastante útil.

Duplo clique em "ColisaoTrigger". O UniSciTE abrirá uma nova janela.

Escreva o script abaixo:

function OnTriggerEnter (other : Collider) {
Destroy(other.gameObject);
Destroy(gameObject);


O que esse script irá fazer:

  • A variável Other é do tipo Collider. Ohter representa outros rigidbodies que possívelmente colidirão com o tiro. Essa função está definida para eles.
  • Destroy(other.gameObject);  Fará com que, quando o tiro colidir, destrua aquele objeto que bateu nele.
  • Destroy(gameObject); Fará com que o tiro também seja destruido, a menos que você queira que o seu tiro faça outras vítimas por um longo tempo.
Ctrl+S para salvar. Aguarde o script compilar.

No prefab do tiro, em Inspector >> Box Collider, marque a caixa Is Trigger.


































Anexe o script ao prefab Tiro. Essa mensagem aparecerá na tela. Clique em "continue".




















O que aconteceu é que os prefabs que estão na cena, se alterados, deixam de ser prefabs. Para alterar um prefab, clique em "Apply", na guia Inspector. Isso irá salvar alterações de seu prefab. Para retornar ao último ajuste salvo do prefab, clique em "Reconnect"











Voltando ao nosso protótipo de nave, ela precisa estar apta a colidir com alguma coisa. Iremos adicionar um script de rigidbody. Clique no objeto da nave.

Vá no menu Component >> Physics >> Rigidbody

Isso irá adicionar o script Rigidbody a nave, permitindo que esta colide com outros objetos em cena.

Há um problema em nosso tiro. Já que ele destruirá tudo aquilo que ele tocar, como o tiro é criado dentro do canhão, este também será destruído e, lógico, não teremos mais tiros. O que é preciso ser feito é instanciar o tiro fora do canhão. Volte ao script "Atirar - Criar Tiro"

var newObject : Transform;
private var x = 1;
function Update () {
    
if
 (Input.GetButtonDown("Fire1")) {
        
Instantiate(newObject, transform.position,transform.rotation);
    
}
}

Altere o script para

var newObject : Transform;
private var x = 1;
function Update () {
    
if
 (Input.GetButtonDown("Fire1")) {
        
Instantiate(newObject, transform.position + Vector3.forward * 55transform.rotation);
    
}
}

Ctrl+S para salvar. Ctrl+P para testar. O tiro irá destruir objetos, mas não destruirá o canhão.

sexta-feira, 21 de maio de 2010

008 - Space Invaders (3) - Tiro

Aqui faremos a nave atirar (apenas atirar, não desenvolver o poder destrutivo).

A criação de um tiro é, na realidade, um processo chamado no Unity de Instantiate (instanciar). O jogo criará outro game object pre-determinado pelo programador. No nosso caso, o tiro.

Toda nave possui um canhão, certo?

Vá em "GameObject >> Create Other>> Cube" e crie outro cubo.

Nome: "Canhao" (sem til, mesmo).
Scale: x = 1; y = 0,2; z = 1

Esse não será o canhão que o jogador irá ver na tela. Ele será, na verdade, a "fonte geradora" dos disparos da nave.

Vamos, lá. arraste "Canhao" para dentro de "Nave". Você terá algo mais ou menos assim... (clique na imagem para visualização completa)



Para que o canhão fique invisível, vá ma tela "Inspector >> Mesh Renderer >> Materials >> Default - Diffuse"

Mude para "Shadow Material >> Transparent >> Cutout >> Bumped Diffuse"

Alfha Cutout = 0 (todo p/ direita).

Agora vamos criar o tiro própriamente dito (o objeto a ser instanciado).

Para dominar a técnica de instanciar objetos, faremos isso com cubos.

Novamente, "GameObject >> Create Other >> Cube"

Nome: "Tiro"

Scale x = 20; y = 2; z = 100

Mude a textura para "Fire Add" (da mesma maneira que deixamos o canhão transparente)

Shader: "particles >> additive"

Agora o script de tiro. "Project >> Create >> JavaScript"


Nome: "Atirar - mover tiro"


Escreva o script abaixo:


var velocidade = 10;

function Update () {
    transform.Translate(0, 0, velocidade);
    Destroy (gameObject, 5);
}


Este script irá:
  • transform.Translate(0, 0, velocidade); //Mover o objeto criado;
  • Destroy (gameObject, 5); //Destruir o objeto após 5 segundos. Se ele não for destrído, vai dar problema.

Para que a instancia funcione, o objeto precisa ser especial, mais precisamente um Prefab. Para criar um, vá na tela "Project >> Create >> Prefab"

O ícone desse prefab esta cinza, certo? Renomeie para "Tiro".

Pegue o "Tiro" da tela "Hierarchy" e mova - o para dentro do prefab "Tiro".

Agora o ícone esta azul. Que lindo!!!

Agora o script para que o jogador possa atirar. Ele será adicionado ao canhão de "Hierarchy".

Faça o mesmo processo, só que daremos o nome de "Atirar - criar tiro" e colocaremos o script abaixo:

var newObject : Transform;
private var x = 1;

function Update () {
    if
(Input.GetButtonDown("Fire1")) {
        Instantiate(newObject, transform.position, transform.rotation);
    }
}

Agora, sempre que ctrl (default para tiro) for pressionada, a prefab "Tiro" aparecerá no jogo. Automaticamente ela irá se mover por causa do primeiro script já criado.

Adicione este script ao "Canhao".

Em "Inspector >> Atirar - criar tiro(script)" coloque New Object = Assets: Tiro

Ctrl+S para salvar. Ctrl+P para testar. Veja que apertando ctlr sairá um tiro e, depois de 5 segundos, ele desaparecerá da tela (a câmera, depedendo da velocidade do tiro, poderá não ver o tiro sumir).

007 - Space Invaders (2) - Visão geral e nave

Aqui falarei sobre como irá ser a mecânica básica da nave.
  • Terreno
  • Visão do jogador
  • Movendo a nave pela tela
1. TERRENO
Para melhor trabalharmos, criaremos tudo em cima de um terreno provisório. Vá no menu "Terrain --> Create terrain".

Posicione na tela "Inspector >> Transform", position, x=0, y=0, z=0.

Se quiser coloque textura no terreno, mas deixe - o plano!

2. VISÃO DO JOGADOR
Geralmente o unity possui scripts para jogos em primeira pessoa, daí não existe um script que mova apenas o personagem, deixando a câmera fixa. Neste jogo, tentaremos criar uma falsa aparência de 2d com vista de cima.

Basta posicionar a câmera acima do cenário e rotaciona - la em 90 graus. Em "Inspector >> Transform", faça Rotation x = 90.
Na tela "Scene", posicione a câmera como melhor achar conveniente. Oriente - se usando  a tela "Game".

3. MOVENDO A NAVE PELA TELA
Para criar o desenho da nave, pode - se usar um programa de modelagem, pois o Unity não é aconselhavel para tal intuito.

De forma primitiva, usaremos aquilo que o programa pode nos disponibilizar, ou seja, um cubo. Vá ao menu "GameObject >> Create Other >> Cube"
Aperte F2 e renomeie para "Nave"

Na tela "Inspector >> Transform", ajuste as dimensões do cubo: scale x = 200; y = 10; z = 100

Para mover a nave, aí é que entra a parte de programação. Na tela "Project", clique em "Create >> JavaScript."

Aparecerá na mesma tela um script com o nome "NewBehaviourScript". Aperte F2 (Windows) e renomeie para "Mover nave" (coloque outro nome a gosto, desde que não tenha acentuação gráfica.).

Clique duas vezes no script. Abrirá uma nova janela no UniSciTE (programa do Unity para programar scripts):






















Escreva o script abaixo:

var velocidade = 30;

function Update () {
    transform.Translate(Input.GetAxis("Horizontal") * velocidade, 0, 0);
}

Dessa forma a nave se moverá com a velocidade que você determinar sempre que esquerda ou direita (ou A e D) forem pressionados. Por default, ela se moverá à 30 fps, podendo ser alterado fora do script na tela "Inspector".

Aperte Ctrl+S para salvar.

Volte ao unity.

Pegue o script "Mover nave" da tela "Project" e arraste - a para dentro da "Nave" na tela "Hierarchy".

Ctrl+S para salvar. Ctrl+P para testar o jogo.

A princípio a nave se moverá para alem da visão da tela, pois ainda não limitamos por onde ela ira se movimentar. Isso será feito mais adiante.

terça-feira, 18 de maio de 2010

006 - Tocando Space Invaders (1) - Introdução.

Aqui vou falar sobre como estou tentando desenvolver o space invaders para o processo seletivo.

Em programação, basicamente tentarei:
  • Mover a nave
  • Fazer a nave atirar
  • Desenvolver a ai dos aliens e do boss
  • Sistema de levels
  • Desenho do jogo
  • Menu
  • HUD
  • Jogabilidade
Algumas dessas coisas já expliquei nas postagens anteriores, mas nas próximas postagens irei detalhar os processos.