Ir para


- - - - -

[Unity 3D] Projectile

Unity 3D Desenvolvimento de Jogos Atirar Projétil Projectile Atirando

  • Responder
Não há respostas neste tópico

#1 ixnaydk

    Enciclopédia

  • Administrador
  • 9.456 Posts:
  • Gender:Male

Postou 26 fevereiro 2012 - 09:54

E ai pessoal, tudo na boa?

Nesse tutorial estarei explicando como fazer nosso personagem atirar, para isso usaremos uma coisa muito importante no Unity chamado de Prefab, durante o tutorial estarei explicando melhor o uso disso.
Para quem não acompanhou o tutorial anterior, é bom dar uma olhada nesse link http://forum.paodemu...showtopic=11811

Vamos abrir nosso projeto e criar um Empty Object clicando em GameObject -> Create Empty.
Mas pq vamos criar um objeto vazio?
Dessa maneira, podemos ter um maior controle no objeto que iremos vincular a esse objeto vazio, e dessa maneira também poderemos utilizar o Particle System para criar um projétil diferenciado.
Imagem anexa: 000.png

Feito isso, vamos criar uma bola em GameObject -> Create Other -> Sphere.
Essa bola será nosso verdadeiro projétil, arraste ela para o objeto vazio que criamos anteriormente.
Para organizar melhor nossos objetos, vamos renomea-los da seguinte maneira:
- Cube -> Player
- GameObject (objeto vazio) -> Projectile
Não é necessário renomear a bola.
Imagem anexa: 001.png

Após nomear os objetos, vamos fazer algumas alterações neles.
Clicando no objeto Projectile, vamos alterar sua posição X para 9 e posição Z para 6.
Ainda com o Projectile selecionado, vamos adicionar dois novos componentes nele, o Sphere Collider e o Rigidbody.
Para isso, clique em Component -> Physics -> Rigidbody e depois Component -> Physics -> Sphere Collider

Reparem que na aba Inspector apareceu os novos componentes de nosso objeto.
Agora nos componentes precisamos fazer algumas pequenas alterações, em Rigidbody precisamos descarmar a opção Use Gravity e marcar a Is Kinematic.
Já em Sphere Collider, marque a opção Is Trigger e altere o Radius para 2.5
Imagem anexa: 002.png

Agora vamos as explicações sobre o Rigidbody e o Sphere Collider

Rigidbody
O Rigidbody habilita os controles de física em seus GameObjects. Podendo receber forças, velocidades e gravidade que fazem ele se mover de forma realistica.
Qualquer objeto com o Rigidbody pode ser controlado pela física de duas maneiras, via script ou utilizando a PhysX da NVIDIA com opções pré-definidas do componente.
Com a opção que iremos usar nesse tutorial, a Is Kinematic, estaremos fazendo ele ignorar a PhysX para fazer o nosso controle via script.
O componente Rigidbody merece um tutorial a parte explicando toda sua funcionalidade. Mas para maiores informações, segue o link da documentação: http://unity3d.com/s...-Rigidbody.html

Sphere Collider
Esse tipo de collider é um dos vários que temos a disposição no Unity. Como o nome já diz, ele cria uma colisão em forma de espera no objeto em que foi adicionado.
Ele é composto das seguintes opções:
Is Trigger: A opção que estaremos usando nesse tutorial, com ela habilitada, a PhysX não irá atuar sobre o collider, e também será utilizado em eventos onde ocorre o contato com outro collider.
Material: Com o material, vc pode recriar a física de vários materiais como metal, gelo, pedra entre outros, é possível criar o próprio material.
Center: Indica o centro da sua sphere collider.
Radius: Raio, usado para definir o tamanho da collider.
Para maiores informações, segue o link da documentação: http://unity3d.com/s...reCollider.html

Agora que já conhecemos melhor esses dois componentes, vamos fazer uma alteração em nossa Sphere para ficar com o mesmo tamanho do Radius que definimos na Sphere Collider.
Para isso, clique na Sphere e altere sua escala XYZ para 5.
Além disso, vamos apagar a Sphere Collider que tem na esfera, não precisamos dele já que temos um no objeto "pai".
Imagem anexa: 003.png

Agora chegou a hora de fazermos a Prefab, mas o que vem a ser isso?
A Prefab é um GameObject reutilizável, chamado via script. Dessa maneira economizamos memória instanciando vários desses objetos, assim não precisamos coloca-los fisicamente em cena.
Para maiores informações, segue o link da documentação: http://unity3d.com/s...al/Prefabs.html

Vamos criar nossa Prefab da seguinte maneira, clique com o botão direito em Project e depois em Create -> Prefab. Vamos nomea-la como Projectile.
Repare no quadrado cinza antes do nome da prefab, quando esse quadrado está cinza, significa que não existe nenhum objeto vinculado a ela.

Clique e arraste seu objeto Projectile para a prefab criada.
Além do quadrado da prefab ter ficado azul, o nome do objeto também ficou azul, isso significa que a prefab está vinculada a algum objeto e que o objeto na cena pertence a uma prefab.
Imagem anexa: 004.pngImagem anexa: 005.png

Feito o vínculo, vem a parte mais estranha de se trabalhar com a prefab.
Apague seu objeto Projectile da aba Hierarchy. Mas pq estamos apagando ele?
Simples, se a prefab é um objeto instanciado por script, não precisamos dele fisicamente em cena. Estranho, mas lógico heheh :P

Sem o objeto em cena, vamos começar a criar nosso script.
Clique com o botão direito em Project e depois Create -> Javascript, dê o nome de Projectile.js

Como começou a ficar bagunçado nossa aba Project, vamos criar umas pastas para organizar tudo isso.
Clicando com o botão direito em Project e depois Create -> Folder. Vamos criar 3 pastas, Prefabs, Scenes e Scripts.
Organizando os arquivos dessa maneira:
Imagem anexa: 006.png

Tenha o costume de sempre organizar seu projeto, senão vai chegar uma hora que vc não vai mais saber do que se trata tal script, prefab e tal.

Agora sim, vamos abrir nosso script e digitar as seguintes linhas:
Imagem anexa: 007.png

Explicando as linhas:
#pragma strict
Continuo sem saber :P
Assim que entender essa linha que é adicionada automaticamente nos scripts do Unity 3.5 eu faço uma explicação sobre ele.

var projectileSpeed : float = 7.5f;
Estamos criando uma var float para definir a velocidade do projétil, estou deixando 7.5 como velocidade padrão, mas fiquem a vontade para alterar.

var amtToMove : float;
Variável auxiliar na movimentação do projétil.
Com ela aumentamos nosso código em 1 linha, mas pelo menos fica mais organizado.

function Update()
Como já disse em algum outro tutorial, a function Update é atualizada a todo momento no jogo, vc não quer que seu personagem só se mexa pelo primeiro frame né? :P
#namesmapraça :P

amtToMove = projectileSpeed * Time.deltaTime;
Aqui estamos definindo por quanto tempo, Time.deltaTime, nosso projétil irá "voar" a uma velocidade de 7.5
Podemos ler como: Voe a 7.5 por X segundos.

transform.Translate(Vector3.right * amtToMove);
Assim como foi explicado no tutorial sobre Movimentação, aqui é onde o projétil realmente vai se mover.
No caso, o Vector3.right significa que ele está indo para frente.

if(transform.position.z >= 180.0f)
Nosso projétil não pode ir infinitamente até o outro lado da cena, então em algum momento precisamos destruir ele.
Lembrem que no tutorial de Movimentação nós achamos os limites superior/inferior e os laterais, no caso, estou usando um dos limites laterais como limite.

Destroy(this.gameObject);
Passando pelo if, ele vai cair nesse Destroy(this.gameObject).
O this.gameObject, indica o nosso projétil, sendo assim ele será destruido.

Com isso terminamos o script Projectile, agora clique e arraste esse script até nossa prefab Projectile.

Clique em Play e tente atirar... mas como vamos atirar se não definimos nada do tipo?

Terminamos do script do projétil, mas ainda precisamos fazer algumas alterações no script do jogador.
Para isso, abra o script Player e vamos editar para deixa-lo assim:
Imagem anexa: 008.png

Repare que temos dois novos bloques de código, instancia o projectile como rigidbody e atirando, vou explicar as linhas.
var projectile : Rigidbody;
Estamos setando uma variável global do tipo Rigidbody, ela será usada para vincular nosso projétil ao player.

if(Input.GetKeyDown(KeyCode.LeftControl))
Nesse if é onde finalmente iremos meter bala.
O comando Input.GetKeyDown(KeyCode.LeftControl) é acionado toda vez que a tecla Ctrl esquerda for apertada (GetKeyDown), ou seja, se vc segurar ela, não vai sair uma rajada de tiro. Mas irei explicar como fazer isso em um outro tutorial.

var projectileRigid : Rigidbody;
Estamos setando outra variável Rigidbody, essa será usada para instanciar o nosso projétil em cena.

var projectilePos = new Vector3(transform.position.x + 6,transform.position.y,transform.position.z);
Nessa variável, estaremos setando a posição que será lançado o projétil.
Os transform.position.xyz faz ele pegar a posição atual do player.
No transform.position.x, estamos somando 6 apenas para uma correção de posicionamento, assim o projétil sai da frente do player e não de dentro dele.

projectileRigid = Instantiate(projectile, projectilePos,Quaternion.identity);
Finalmente estamos instanciando nosso projétil.
O comando Instantiate precisa de 3 valores para poder funcionar.
O primeiro valor, projectile, é nosso projétil, a variável global setada lá pra cima.
O segundo, é a posição em que o projétil vai sair.
E por fim, o terceiro valor é a rotação do objeto. Repare que temos um carinha novo no terceiro valor, o Quaternion.identity significa que não terá nenhum tipo de rotação.

Salve e feche o script, o último passo de nosso tutorial é clicar no objeto Player, repare que em Player (Script) terá uma nova opção chamada Projectile.
Arraste nossa prefab Projectile para o campo em branco desse Projectile que está no player.

Feito isso, vinculamos o nosso projectile ao player.
Imagem anexa: 009.png

Salve tudo e clique em Play, aperte o ctrl esquerdo e nosso carinha estará atirando!
Imagem anexa: 010.png

Reparem que quando o projétil chega no limite da tela ele é destruido.

E assim chegamos ao fim de mais um tutorial.
Guardem esse projeto pq na próxima aula iremos destruir uns inimigos.

É isso ai, qualquer dúvida só postar.





1 usuário(s) está(ão) lendo este tópico

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)