Unity 3D
Unity 3D
Assim como toda game engine, ela facilita o desenvolvimento de jogos pelo
fato de o desenvolvedor não precisar programar diretamente para DirectX ou
OpenGL, pois ela já faz isso automaticamente. A Unity pode fazer jogos para
produtos da Apple (Mac, iPhone, iPod, iPad), da Microsoft (Xbox, Windows),
da Google (dispositivos com Android), da Sony (Playstation 3), da Nintendo
(Wii) e para navegadores Web (Internet Explorer, Mozilla Firefox, Google
Chrome, Opera e Safari).
Blender: .blend;
Autodesk 3DS Max: .max;
Autodesk Maya: .mb or .ma;
Maxon CINEMA 4D: .c4d;
Cheetah3D: .jas;
Luxology Modo 3D: .lxo - a partir do modo 501;
NewTek LightWave: é necessário exportar para .fbx utilizando o plugin
para exportar para fbx do LightWave.
Unity também lê arquivos .FBX, .dae, .3DS, .dxf, .obj e também aceita o
.collada. Para arquivos de textura (arquivos 2D) ela aceita os formatos: PSD,
TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT.
A partir da Unity 4.2, foi adicionado à versão free sombras em tempo real para
luzes direcionais e também foi adicionado suporte ao DirectX11, o que dá às
sombras uma resolução perfeita dos pixels, texturas para criar objetos 3D a
partir de tons de cinza, gráficos, animações faciais mais suaves e um impulso
para o frames per second.
A engine também conta com a Unity Asset Server - uma solução de controle
de versão para os assets e scripts. Ele usa PostgreSQL como um backend, um
sistema de áudio construído sobre a biblioteca FMOD (com capacidade de
reprodução de áudio Ogg Vorbis comprimido), reprodução de vídeo usando o
Theora codec, um motor de terreno e vegetação (que suporta Tree
Billboarding, Occlusion Culling com Umbra), lightmapping embutido e
iluminação global com Beast, rede multijogador usando RakNet, e pathfinding
mesh navigation embutido.
Além disso, ela também foi construída com suporte para a engine de física
Nvidia PhysX (a partir da Unity 3.0) com suporte adicional para a simulação
de tecido em tempo real, raycasts e camadas de colisão.
A Unity3D além dessas características é free, apesar de ter a versão Pro que
tem um preço não fora da realidade.
Primeiros passos
O exemplo criado para este artigo utilizou a versão 4.2 da Unity 3D, a qual
pode ser encontrada no endereço que consta na seção Links. Após instalação,
o primeiro passo será criar um projeto para criarmos nosso jogo eletrônico.
Para isto, basta clicar sobre o ícone da Unity que veremos o wizard para
criação de projetos, conforme Figura 1. Caso a Unity já abra o projeto
demostranstrativo - o qual já vem instalado juntamente com o software,
selecione no menu superior File -> New Project.
Em seguida, na aba Create New Project, vamos definir uma pasta no sistema
para receber todos os arquivos que farão parte do projeto. Seguindo o exemplo
deste artigo, iremos criar uma pasta nomeada Point and Click diretamente no
desktop.
Conceito
Interface
Scene View
A Scene View é sua “caixa de areia” interativa. Ela é utilizada para selecionar
e posicionar os ambientes, o jogador, as câmeras, inimigos, e todos os outros
GameObjects. Manobra e manipulação de objetos dentro da Scene View são
algumas das funções mais importantes da Unity, então é importante estar apto
a fazê-los rapidamente.
Figura 4. Toolbar
Figura 6. Layout
No sentido de oferecer uma visualização mais fácil para o desenvolvedor,
podemos arranjar a interface conforme Figura 6 e por fim salvá-la na opção
Save Layout, também incluso na Figura 7. Este novo arranjo das
views permitirá visualizarmos as abas Scenes e Game simultaneamente,
conforme mencionado anteriormente.
Assets
Agora que já conhecemos a aba Project View, podemos criar um script para o
projeto. Conforme já comentando, os scripts dentro da Unity podem ser
desenvolvidos em UnityScript, C#, ou Boo. É possível utilizar uma ou todas
as linguagens de script em um único projeto, pois não há nenhuma penalidade
por usar mais de uma.
Para editar o script criado, basta clicar duas vezes sobre ele no Project View.
Isso iniciará o editor selecionado nas preferências da Unity, que por padrão
será o MonoDeveloper. Logo, todos os scripts serão alterados em um editor de
texto externo, e não diretamente na Unity. Se preferir o Visual Studio, basta
alterar a opção em Edit -> Preferences -> External Tools -> External Script
Editor.
ScriptEnemy;
ScriptScreenMainMenu;
ScriptScreenWin;
ScriptScreenLose.
GameObjects
Inicialmente iremos criar dois objetos, uma Sphere (esfera) e um Cube (cubo).
Para incluir estes elementos na Hierarchy temos duas possibilidades. A
primeira seria clicar no botão Create, posicionado no alto da aba Hierarchy,
como pode ser visto na Figura 11, e selecionar em seguida Sphere e Cube. A
segunda opção pode ser encontrada no menu superior da interface, na opção
GameObject -> Create Other -> Sphere e/ou Cube, conforme Figura 12.
Figura 12. GameObjects
Agora, para melhor entendimento das funções destes objetos, vamos renomeá-
los para EnemyCircle(Sphere) e EnemySquare (Cube). Logo em seguida,
precisaremos criar “n” instâncias dos dois tipos de inimigos criados,
associando a eles futuramente um script para manipulá-los. Para evitar o
retrabalho de associar o script para cada GameObject, iremos criar Prefabs.
Criando um Prefab
Para associarmos Materials aos Prefabs, basta arrastar cada um dos materiais
sobre o Prefab correspondente. Em seguida, podemos também arrastar o
mesmo script ScriptEnemy sobre os dois Prefabs. Desta forma teremos os
GameObjects em forma de círculo e cubo associados a respectivos materiais e
a um script através de um Prefab. O resultado pode ser visto na aba
Inspector ao selecionarmos qualquer um dos Prefabs, conforme a Figura 16.
Figura 16. Inspector
Inspector(Inspetor)
Agora que temos todos os assets necessários para a construção do jogo, vamos
salvar o que temos até aqui dentro de uma Scene.
Scenes
Lembrar sempre de salvar a cena após alguma alteração nos objetos contidos
na mesma (os mesmos listados na aba Hierarchy). O resultado final das
alterações na câmera pode ser visto na Figura 18.
Camera Inspectorb>Figura 18. Camera Inspector
Agora, vamos inserir alguma ação no jogo. Para isso, vamos abrir o arquivo
ScriptPlayer clicando duas vezes sobre ele. Para este artigo, o IDE de
programação escolhida foi o próprio MonoDeveloper.
Independente onde for feito o click dentro da tela de jogo, a mensagem será
escrita igualmente. O próximo passo é identificar o click somente sobre algum
dos Prefabs.
Após testar, é importante não se esquecer de clicar no mesmo botão Play para
dar Stop, pois qualquer alteração feita na Scene enquanto o jogo estiver em
execução será perdida após o Stop, pois alteração em jogo, obviamente, faz
parte do gameplay e não de alguma customização que deva ser feita no
cenário.
Raycast
Listagem 3. Raycast.
01 using UnityEngine;
02 using System.Collections;
03
04 public class ScriptPlayer : MonoBehaviour
05 {
06 // Use this for initialization
07 void Start()
08 {
09
10 }
11
12 // Update is called once per frame
13 void Update()
14 {
15 // Verificando se foi clicado com o botao esquerdo do mouse.
16 if (Input.GetMouseButtonDown(0))
17 {
18 Debug.Log("O clique funcionou!");
19
20 // Variável que receberá o objeto que a linha imaginaria
// colidir.
21 RaycastHit hit;
22 // Linha iniciada a partir do ponto onde está posicionado
// o mouse.
23 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
24
25 if (Physics.Raycast(ray, out hit, 100f))
26 {
27 Debug.Log("O clique colidiu com um objeto!");
28 }
29 }
30 }
31 }
32
Como pode ser visto na Figura 23, o uso de uma tag para identificar a
câmera, agora será criada uma nova tag chamado Enemy, com o intuito de
identificar com apenas uma palavra os dois tipos de inimigos que existem no
projeto. Caso houvesse mais do que dois tipos, como é normal em jogos, o uso
de tags seria cada vez imprescindível.
Já é possível testar o jogo e verificar que a cada dois clicks sobre cada um dos
objetos randomizará uma nova posição para o mesmo.
Perceba que também foi adicionado um valor padrão de 1 para uma nova
variável chamada enemyPoints (utilizaremos a mesma mais à frente). Com a
adição do tempo para respawn e randomização de cores, pode-se novamente
testar o jogo, o qual terá uma visualização semelhante à Figura 32.
Após salvar a Scene atual (SceneGameLevel), vamos criar uma nova cena que
será o menu inicial do jogo clicando no menu superior em File -> New Scene,
conforme Figura 33.
Nesta nova cena faremos o seguinte para prepará-la para ser o menu inicial:
Listagem 13. ScriptScreenMainMenu.
01 using UnityEngine;
02 using System.Collections;
03
04 public class ScriptScreenMainMenu : MonoBehaviour
05 {
06 void OnGUI()
07 {
08 if (GUI.Button(new Rect(10, 10, 120, 40), "Start Game"))
09 {
10 Application.LoadLevel("SceneGameLevel");
11 }
12 if (GUI.Button(new Rect(10, 70, 120, 40), "Exit Game"))
13 {
14 Application.Quit();
15 }
16 }
17 }
Novamente temos o uso do método OnGUI, onde foram incluídos dois botões
em tela. Os dois são posicionados através do script/class Rect e setados seus
valores no segundo parâmetro do método: Start Game e Exit Game. O método
GUI.Button executa duas funções: uma delas seria a de escrever o texto no
botão e a segunda seria a detecção de algum click sobre ele. No caso do click
no botão Start Game, teremos a chamada ao método Application.LoadLevel
que carregará a scene setada no seu parâmetro. No caso de click no botão Exit
Game teremos a chamada ao método Apllication.Quit, que fecha o jogo.
Depois de concluído esta etapa, devemos salvar a nova cena (Ctrl + S),
nomeando-a SceneScreenMainMenu, conforme Figura 35.
Antes de testarmos, vamos nos adiantar e criar duas novas cenas para o jogo:
SceneScreenWin;
SceneScreenLose.
Builds
A primeira vez que for acessando esta janela em um projeto, ela irá aparecer
com Scenes in Build vazia. Se o jogo for construído com essa lista vazia,
apenas a Scene que estiver aberta no momento será incluída no Build. Se
desejarmos construir rapidamente uma execução de teste com apenas um
único arquivo Scene, bastar construir com a lista de Scene vazia mesmo.
Nesse ponto, observe que cada uma das Scenes tem um valor diferente de
índice. A Scene 0 será a primeira Scene que carregada quando o jogo for
executado fora o editor da engine. Como já mostrado anteriormente, para
carregar uma nova Scene, utiliza-se o comando Application.LoadLevel a
partir de algum scripts.
Para remover uma Scene da lista, clique para destacar a Scene e pressione a
tecla Delete. A Scene irá desaparecer da lista e não será incluída no build.
Listagem 14. ScriptScreenWin.
01 using UnityEngine;
02 using System.Collections;
03
04 public class ScriptScreenWin : MonoBehaviour
05 {
06 void OnGUI()
07 {
08 GUI.Label(new Rect(10, 10, 120, 40), "YOU WIN!!!");
09
10 if (GUI.Button(new Rect(10, 70, 120, 40), "Restart Game"))
11 {
12 Application.LoadLevel("SceneGameLevel");
13 }
14 if (GUI.Button(new Rect(10, 140, 120, 40), "Exit Game"))
15 {
16 Application.Quit();
17 }
18 }
19 }
Listagem 15. ScriptScreenLose.
01 using UnityEngine;
02 using System.Collections;
03
04 public class ScriptScreenLose : MonoBehaviour
05 {
06 void OnGUI()
07 {
08 GUI.Label(new Rect(10, 10, 120, 40), "YOU LOSE!!!");
09
10 if (GUI.Button(new Rect(10, 70, 120, 40), "Restart Game"))
11 {
12 Application.LoadLevel("SceneGameLevel");
13 }
14 if (GUI.Button(new Rect(10, 140, 120, 40), "Exit Game"))
15 {
16 Application.Quit();
17 }
18 }
19 }
Enfim, temos nosso jogo finalizado. Por mais simples que seja o gameplay do
jogo construído, a intenção deste artigo foi a de apresentar a ferramenta e os
conceitos que envolvem a criação de um jogo. Ainda, explorar um pouco do
C# para o desenvolvimento na Unity.
Conclusão
A Unity 3D é uma poderosa ferramenta para criação de jogos e com ela vem
uma infinidade de recursos para elaboração dos mesmos. Este artigo teve o
intuito de apresentar para os apaixonados por jogos que é possível criar os
seus próprios com a ajuda de uma interface amigável, que nos facilita em
diversos pontos do desenvolvimento, caso quiséssemos fazer tudo “na mão”.
Toda a parte de LoopGame, desenho e renderização gráfica já está embutida
no software, além da outros recursos não abordados aqui, como sistemas de
partículas, efeitos de luz e sombra, áudio, entre outros. A área de criação de
jogos no Brasil ainda engatinha, mas se for do interesse do leitor de ingressar
nesse ramo ou pelo menos conhecer, existem diversos tutoriais disponíveis
pela internet e com pouco esforço é possível encontrar alguns bastante
profissionais.