Roll a ball - Unity 3D
A Unity é uma poderosa plataforma para desenvolvimento 3D, boa parte da comunidade
de usuários da ferramenta foca seus desenvolvimentos nos recursos 3D,
e boa parte dos jogos publicados feitos nela são jogos 3D.
Para iniciar no desenvolvimento 3D, vamos aprender a fazer um dos “clássicos” da Unity,
o jogo Roll a Ball. Roll a Ball é um jogo feito com o propósito de ser um tutorial para iniciantes
na Unity, porém, vamos analisar aqui cada detalhe desse.
na Unity, porém, vamos analisar aqui cada detalhe desse.
Esse tutorial é um pouco mais complexo que os outros até então disponibilizados em nosso
blog, por isso, não estaremos detalhando precisamente algumas etapas que já ensinamos
nos outros tutoriais.
blog, por isso, não estaremos detalhando precisamente algumas etapas que já ensinamos
nos outros tutoriais.
Criando o projeto
Diferente dos projetos criados anteriormente, vamos criar um projeto configurado com os
recursos para desenvolvimento 3D.
Abra sua Unity, vá em Novo, para criar um novo projeto, de o nome de RollaBall,
confira se se o Template está em 3D.
Conhecendo o ambiente 3D.
A diferença mais notável entre o ambiente 3D e 2D, que pode ser observado logo quando
criamos o projeto, é a perspectiva da câmera. Não trabalhamos mais com um plano,
agora devemos dispor os objetos do jogo levando em conta a profundidade.
Observe na imagem acima, a presença também de luz e sombra, vamos trabalhar
com isso futuramente.
Começando o jogo
Certifique-se de que as telas estão posicionadas da maneira que mais te agrada,
e vamos começar!
e vamos começar!
Na aba de Hierarquia, temos dois componentes já definidos, Main Camera e Diretional Light,
esses componentes são essenciais para ambiente 3D.
Renomeie o objeto criado para Ground. Agora, na aba da Projeto, clique com o botão direito,
vá em Create e clique em Material, nomeie o novo material para Background.
Um material em unity é similar a uma textura, que podemos aplicar a objetos 3D,
Altere os valores da cor para os da imagem acima.
Agora que criamos um material, vamos adicionar ele ao nosso Ground.
Basta arrastar o material para dentro do objeto Ground, dentro da aba Scene.
Agora nosso chão tem uma cor!
Para concluir as configurações do Ground, clique sobre ele, é deixe a aba Inspector similar a:
Agora, nosso chão está completo, vamos adicionar um player.
Na aba Hierarchy, vá em 3D Object -> Sphere.
Renomeie esse objeto para Player. A esfera será controlada pelo jogador,
e deve respeitar as leis da física, por isso, vamos adicionar 2 componentes a ela.
Dentro da aba Inspector da esfera, vá em Add Component, e adicione um Rigidbody e
um Sphere Collider. O rigidbody torna a esfera um corpo rígido, que obedece às leis da física,
sofre efeito da gravidade e não pode passar através outros objetos, o Sphere Collider vai definir as
linhas de colisão da esfera.
Altere as configurações da esfera na aba Inspector, deixe as dessa forma:
Observe que esse objeto tem uma Tag, tags são formas de identificar objetos e agrupá los.
Selecione a tag Player para essa esfera. Vamos fazer essa esfera se movimentar,
para isso vamos criar um novo script, chamado PlayerController, dentro da aba Project,
vá em Create -> C# Script para fazê-lo.
Dentro do Script, coloque:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
private Rigidbody rb;
public float speed;
void Start(){
rb = GetComponent<Rigidbody>();
}
void FixedUpdate(){
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3 (moveHorizontal,0.0f,moveVertical);
rb.AddForce(movement * speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag ("Pick Up"))
{
other.gameObject.SetActive (false);
}
}
}
Esse script faz a movimentação do personagem, além disso, ele tem um método
para testar colisão, mas vamos entrar em detalhe sobre isso depois.
para testar colisão, mas vamos entrar em detalhe sobre isso depois.
Coloque o script dentro do Inspector do Player, e define o valor de Speed para 10.
Rode o jogo para testar a movimentação do personagem.
Observe que a câmera não está muito bem posicionada em relação ao Player, para resolver isso,
crie um script chamado CameraController, e vamos alterá-lo para:
using UnityEngine;
using System.Collections;
public class CameraController : MonoBehaviour {
public GameObject player;
private Vector3 offset;
void Start ()
{
offset = transform.position - player.transform.position;
}
void LateUpdate ()
{
transform.position = player.transform.position + offset;
}
}
Arraste o script para o Inspector da Câmera, e arraste o Objeto Player,
da aba Hierarchy para o valor Player do script dentro do Inspector de câmera:
Agora, teste novamente o jogo.
Para evitar que a esfera caia para fora da plataforma, vamos colocar paredes,
crie um Empty Object chamado Walls dentro da aba Hierarchy.
Agora crie um 3D Object -> Cube, nomeie ele como West Wall,
coloque dentro desse objeto o componente Box Collider, agora, duplique o
objeto West Wall até você ter 3 cópias dele, renomeie cada umas das cópias para:
East Wall, North Wall e South Wall.
coloque dentro desse objeto o componente Box Collider, agora, duplique o
objeto West Wall até você ter 3 cópias dele, renomeie cada umas das cópias para:
East Wall, North Wall e South Wall.
Agora altere o Inspector de cada uma delas para:
West Wall:
East wall:
North Wall:
South Wall:
Rode o jogo, verá que a esfera não é mais capaz de cair da plataforma.
Temos um jogador, temos uma plataforma, e temos paredes, agora, falta
um objetivo no jogo. Se você se lembra da imagem inicial deste tutorial,
temos alguns pontos para serem pegos no jogo.
um objetivo no jogo. Se você se lembra da imagem inicial deste tutorial,
temos alguns pontos para serem pegos no jogo.
Vamos configura-los!
Vá em Object 3D -> Cube, e altere seu Inspector para:
Observamos alguma coisa nesse Inspector, a primeira delas, a tag, diferente do Player,
a tag Pick up não é nativa da Unity, vamos então ter que criar uma nova, clique na tag
e selecione Add tag…
Agora, uma nova aba foi aberta, clique em + e crie a tag chamada Pick Up,
agora, de volta ao Inspector do objeto Pick Up, vamos selecionar a tag que criamos para ele.
Vamo criar também um novo material para nosso objeto, crie um material com o
nome Pick Up, com a seguinte cor:
Agora, coloque o material dentro do objeto Pick up, dentro da aba Scene.
Nós temos os objetos em jogo, mas eles não fazem nada,
vamos então criar um script chamado Rotator, para dar movimento ao nosso
pontos, com o seguinte conteúdo:
Nós temos os objetos em jogo, mas eles não fazem nada,
vamos então criar um script chamado Rotator, para dar movimento ao nosso
pontos, com o seguinte conteúdo:
using UnityEngine;
using System.Collections;
public class Rotator : MonoBehaviour {
void Update ()
{
transform.Rotate (new Vector3 (15, 30, 45) * Time.deltaTime);
}
}
Este script rotaciona o objeto a cada frame do jogo.
No script do Player, temos um método que detecta quando colidimos com algum objeto
com a tag Pick Up.Porém, só temos um objeto em jogo, vamos criar mais!
com a tag Pick Up.Porém, só temos um objeto em jogo, vamos criar mais!
Para evitar que repitamos todo esse processo denovo e denovo, vamos transformar
nosso objeto Pick up num prefab.
nosso objeto Pick up num prefab.
Prefabs são objetos pré-configurados, que podemos exportar e reutilizar em outras cenas,
projetos, etc. Porém, se você tiver um script ou um material dentro de um prefab,
você deve manter eles sempre juntos. Para transformar o objeto num prefab,
apenas arraste ele da aba Hierarchy para a aba Project:
projetos, etc. Porém, se você tiver um script ou um material dentro de um prefab,
você deve manter eles sempre juntos. Para transformar o objeto num prefab,
apenas arraste ele da aba Hierarchy para a aba Project:
Enfim, vamos posicionar os vários pontos pelo mapa, da maneira que preferir, apenas arraste
o prefab para a cena. Antes disso, crie um Empty para organizar seus objetos pick up.
Agora sim, espalhe seu objetos pelo mapa da maneira que preferir. Lembre-se de não colocar
muitos para não poluir o mapa.
Nós temos um player, um cenário e um objetivo, mas, como o jogador vai saber quantos
pontos tem? Para isso, vamos configurar um placar. Dentro da aba Hierarchy ,
vá em UI->Text, observe que foi criado um objeto chamado Canvas, e dentro dele um
objeto Text, e um objeto EventSystem, vamo mudar o inspector o objeto Text. Para posiciona-
lo no conto superior da tela, vamos clicar no quadrado dentro do Rect Transform,
no Inspector do objeto Text, segurando as teclas Ctrl e Alt simultaneamente,
selecione o quadrado da esquerda superior:
Agora, altere o restante do Inspector para:
Agora, temos um placar posicionado, só falta configurar o script dele, para simplificar,
altere o script PlayerContoller para:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour {
public Text placar;
private Rigidbody rb;
private int pontos;
public float speed;
void Start(){
rb = GetComponent<Rigidbody>();
pontos = 0;
placar.text = "Pontos: " + pontos.ToString();
}
void FixedUpdate(){
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3 (moveHorizontal,0.0f,moveVertical);
rb.AddForce(movement * speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag ("Pick Up"))
{
other.gameObject.SetActive (false);
pontos++;
placar.text = "Pontos: " + pontos.ToString();
}
}
}
Observe que, logo na linha 4, estamos usando uma nova dependência, para poder acessar os
métodos da UI da Unity, observe que, sempre que ocorre a colisão com os pontos,
o placar é alterado com o novo valor dos pontos.
Rode o jogo.
0 Comentários