Iniciar o desenvolvimento de Games com Unity 3D

Atualmente, um dos principais nichos do mundo da computação é o desenvolvimento de games. Desde a programação dos motores de jogo até o design do game em si, trata-se de uma arte que envolve, geralmente, muitas pessoas. Porém, com o grande salto de qualidade dos smartphones, o desenvolvimento de games cresceu enormemente, e muitos desenvolvedores resolvem se aventurar na criação de jogos simples, que muitas vezes se tornam grandes sucessos, vide Angry Birds.

Para facilitar o desenvolvimento de jogos, surgiu o Unity 3D, um motor de jogo genérico, além de uma ferramenta extremamente poderosa para criação de games de todos os tipos, para várias plataformas diferentes. Essa ferramenta permite a utilização de todo tipo de scripts, tanto na linguagem C# como em JavaScript, para adicionar lógica ao seu game. Já em termos de elementos visuais, o Unity permite a utilização de elementos criados nas principais aplicações do gênero, como Maya e Blender.

Introdução ao Unity 3D

O Unity 3D se apresenta como um Game Engine, ou motor de jogo, mas na realidade é muito mais do que isso. A ferramenta possui um estilo de programação e organização dos projetos todo especial, além de muito simples. A grande sacada da ferramenta é apostar no que já está pronto, criando muitas possibilidades aos desenvolvedores, que podem focar no que fazem de melhor, que é criar o comportamento dos PCs (Player Characters) e NPCs (Non-Player Characters).

O Unity tem um foco muito claro de desenvolvimento, embora possa ser utilizado para outros tipos de projeto com alguma tranquilidade. Ele se propõe a ser um modelo para a criação de jogos de aventura, como RPGs, FPSs e TPSs. Tudo isso está permeado por uma capacidade gráfica muito grande.

Uma das grandes vantagens que o Unity nos traz é a possibilidade de utilizar elementos criados por outros em nossos games. Afinal, é muito raro encontrarmos um programador com aptidão para design gráfico. Como mostra a Figura 1, podemos realizar o download de inúmeros elementos gráficos para nosso game, a partir da loja oficial do Unity 3D (Asset Store - https://www.assetstore.unity3d.com/). Essa loja possui vários elementos disponíveis, desde simples modelos até projetos completos, onde o desenvolvedor pode conhecer e aprender mais sobre os meios do Unity. Existem vários elementos gratuitos, que podem ser utilizados em seus games. Porém, obviamente, o que há de melhor em termos gráficos são pagos.

Unity 3D Asset Store

Figura 1. Unity 3D Asset Store

Outra grande vantagem do Unity é a disponibilização de ferramentas de aprendizado para o desenvolvedor. No site da ferramenta (http://unity3d.com/learn) estão disponíveis vários tutoriais, além de toda a documentação necessária para o desenvolvedor utilizar as classes do Unity em seus scripts. Como podemos ver na Figura 2, existem tutoriais em diversos tópicos, como animação, áudio, navegação e scripts. Além disso, o Unity também fornece a oportunidade de treinamentos ao vivo, em algum tópico recente da ferramenta.

Tutoriais do Unity 3D

Figura 2. Tutoriais do Unity 3D

Atualmente, o Unity está em sua versão 5, que veio com algumas melhorias com relação ao Unity 4. Houveram algumas melhorias na seção de áudio dos games, bem como na iluminação dos mesmos. Outras alterações foram realizadas, porém nada muito radical. Uma das principais alterações para essa nova versão foi a criação de um editor 64bits, o que melhora a capacidade do Unity para projetos maiores.

Outra grande vantagem que o Unity traz é na sua utilização. Para desenvolvedores solo, a grande sacada é a utilização da versão gratuita do Unity. Essa versão não contém os elementos avançados disponíveis na ferramenta, como filtros de áudio e informações de performance, mas é uma excelente opção para jogos mais simples. Além disso, com o download da versão free do Unity, o desenvolvedor ganha 30 dias da versão Pro, para ter uma ideia do que está perdendo. Para mais informações, acesse http://unity3d.com/unity/licenses. Caso o desenvolvedor esteja interessado em adquirir a licença do produto, o Unity oferece a compra da licença, por $1500, ou o aluguel, por $75 ao mês.

O Unity permite o desenvolvimento de games pra diversas plataformas, e essa é a principal vantagem da ferramenta. Com ele, é possível criarmos games para iOS, Android, BlackBerry, Windows Phone ou Windows. Não é necessário nenhuma programação extra, apenas a reconstrução do projeto com a plataforma-alvo selecionada.

Entendendo o Unity 3D

Antes de começarmos a criação de nossos games com o Unity, é preciso que entendamos como o mesmo funciona internamente. O motor de jogo possui uma formulação toda especial, que deve ser levada em consideração quando estamos criando um game com a ferramenta. É preciso entender o que são e como trabalhar com Game Objects, Models, Materials e Textures, entre outros elementos importantes únicos do Unity.

Primeiramente, o mais importante. Os games do Unity são baseados em cenas, os Game Objects são praticamente todos os objetos dentro da cena. São todos os elementos posicionados dentro da cena através de um sistema de coordenadas, seja em 2 ou 3 dimensões. Câmeras, modelos, luzes, sistemas de partículas: todos são Game Objects. Esses elementos são a unidade fundamental dentro de qualquer cena de game dentro do Unity. Todos os objetos do game podem se movimentar dentro da cena (embora nem todos o façam). Para isso, o Unity utiliza um conceito um pouco diferente, chamado de Transform. Cada objeto dentro do game no Unity possui um transform, que por sua vez contém as coordenadas para a posição, rotação e escala do objeto, como vemos na Figura 3. A rotação é expressada em coordenadas retangulares através dos chamados ângulos de Euler, que variam de 0 a 360º.

coordenadas do transform

Figura 3. Coordenadas do transform

Para movimentar um objeto dentro da cena, é bastante simples. Basta modificar a posição do objeto utilizando um script como mostrado na Listagem 1, que altera a coordenada x da posição do objeto. Já para rotacionar um objeto, é um pouco mais complexo. As rotações no Unity são controladas pela classe Quaternion, que é uma classe bastante complexa. Essa classe possui alguns métodos interessantes, entre os quais podem ser destacados o Slerp(from, to, time) e o Lerp(from, to, time), que servem para interpolar o objeto de uma rotation (from) para outra (to) por um tempo time. A utilização dos mesmos está exemplificada também na Listagem 1.

Listagem 1. Rotação e translação de objetos

void Update () {
                Quaternion to = new Quaternion ();
                gameObject.transform.position = new Vector3 (gameObject.transform.position.x + 1f, gameObject.transform.position.y, gameObject.transform.position.z);
                gameObject.transform.rotation = Quaternion.Slerp (gameObject.transform.rotation, to, Time.time * 0.1f);
      }

Outros elementos importantes dentro das cenas do Unity são os modelos, materiais e texturas (Models, Materials e Textures). Os modelos são os elementos gráficos dentro de uma cena. Esses elementos são modelados utilizando materiais, texturas e os chamados shaders. Os materiais são baseados em texturas e shaders: a textura diz o que é desenhado na superfície do material, enquanto os shaders dizem como será desenhado. O modelo da Figura 4 mostra como funciona essa correlação entre esses elementos.

Models no Unity

Figura 4. Models no Unity

Outro elemento essencial dentro de muitos games do Unity, embora não em todos, são os Terrains. Esses elementos são utilizados para a criação de paisagens dentro das cenas, principalmente utilizados em games ao ar livre. Como podemos observar na Figura 5, esses elementos também são considerados Game Objects dentro do Unity e podem ser alterados da forma que desejarmos, para criarmos montanhas, depressões, entre outros. Basicamente, a cena é criada da forma que o desenvolvedor desejar. Além disso, esse elemento permite a adição de materiais que representam água, grama, pedras etc., elementos disponíveis gratuitamente na Asset Store. Cada pedaço do terreno pode ser modificado para que o jogador tenha mais dificuldades (ou não possa) passar sobre a água, por exemplo.

Utilizando
    Terrains

Figura 5. Utilizando Terrains

O Unity também permite a criação dos chamados prefabs (pré-fabricados). Estes são objetos complexos, normalmente um conjunto de vários outros objetos, que são montados de uma determinada forma e salvos para serem reutilizados. Por exemplo, se criarmos um objeto que contém um cubo e um cilindro, como mostra a Figura 6, podemos salvá-lo como um prefab para ser reutilizado. Para salvá-lo, basta arrastar o elemento para a pasta Assets, normalmente na parte inferior da ferramenta.

Prefabs

Figura 6. Prefabs

Além disso, é preciso conhecer e trabalhar com câmeras e luzes dentro de um game. Esses dois são talvez os mais importantes, graficamente, dentro de um game. São elementos que são responsáveis por criar grande parte da experiência que o usuário terá dentro do game. No Unity, cada game pode conter várias câmeras e luzes, dependendo da necessidade do desenvolvedor.

As luzes, dentro do Unity, podem ser de 3 tipos: direcional, pontual e spotlights. A luz direcional faz parte de quase todos os games ao ar livre, representando o sol. Esse tipo de luz irá iluminar todos os objetos que ela alcançar. Trata-se de uma luz com alcance infinito em uma determinada direção. Já a luz pontual funciona como uma lâmpada: ela irá transmitir luz de uma direção central esfericamente em todas as direções. É o tipo mais comum em áreas internas dentro das cenas. Esse tipo de luz permite uma definição de alcance, definida na propriedade Range. Por fim, as spotlights são luzes que iniciam em um ponto e irradiam em uma determinada direção em uma formato cônico, como em um farol de carro. Essas luzes possuem a propriedade Spot Angle, que determina o raio do cone de luz emitido.

Já as câmeras possuem apenas um tipo, e várias propriedades que podem ser adaptadas dependendo da necessidade dentro da cena. Algumas dessas propriedades são necessárias quando lidamos com múltiplas câmeras, por exemplo. A propriedade Depth é responsável por informar ao Unity qual a ordem de prioridade para as mesmas. Números menores são desenhados primeiro, o que significa que os números maiores podem sobrescrever os menores. Para evitar esse comportamento quando utilizando múltiplas câmeras, é preciso entender outra propriedade, View Port. Como podemos observar na Figura 7, as duas câmeras possuem profundidades diferentes (propriedade Depth), e são mostradas em posições diferentes através da propriedade View Port, com uma delas funcionando como um mapa no canto inferior esquerdo.

Trabalhando com múltiplas câmeras

Figura 7. Trabalhando com múltiplas câmeras.

Por fim, mas não menos importante, é preciso entender um pouco sobre os scripts dentro de um Unity Game. Os scripts são atribuídos aos Game Objects, definindo um comportamento qualquer para ele. Dentro do Unity, esses scripts podem ser criados utilizando C#, JavaScript ou BooScript. Geralmente, como mostrado na Listagem 1, todos os scripts irão trabalhar de alguma forma como o objeto do jogo. Além disso, o Unity possui inúmeras classes que cuidam de translação, rotação, colisão, animação, entre outros, dos Game Objects dentro da cena de nosso game. Todos os scripts são criados em um software anexo ao Unity, o MonoDevelop. Para mais informações, acesse http://docs.unity3d.com/Documentation/ScriptReference/index.html.

Criando um game simples com C# e Unity

Para finalizarmos nosso artigo, vamos criar um game extremamente simples utilizando o Unity. Tudo o que esse game irá fazer é movimentar um PC dentro do terreno que foi criado anteriormente. Esse terreno será melhorado de forma a se parecer um pouco mais com uma paisagem, pela adição de texturas de grama.

Primeiramente, vamos preparar a cena de nosso game. Como já vimos, o terreno está praticamente pronto, restando apenas adicionar as texturas ao mesmo para criarmos uma experiência interessante para o jogador. Como foi informado anteriormente, o Unity possui alguns elementos gráficos referentes aos terrenos que podem ser utilizados em nossos games. Portanto, iremos importar esses pacotes para nosso projeto, primeiramente. Para isso, basta clicar com o botão direito na pasta Assets e selecionar Import Packages->Terrain Assets. Então, uma tela como a da Figura 8, irá aparecer, onde você pode selecionar os elementos necessários. Nesse caso, iremos selecionar todos e escolhê-los posteriormente.

Importando pacotes para o Game

Figura 8. Importando pacotes para o Game

Então, iremos adicionar as texturas necessárias ao nosso terreno. No Unity, esse processo funciona muito como a criação de uma escultura. Estamos esculpindo o terreno de acordo com as texturas que possuímos. O pacote que adicionamos possui algumas texturas de grama que iremos utilizar em nosso terreno. Para adicionar essa textura, basta clicarmos em Edit Textures->Add Texture, como mostra a Figura 9. Para criarmos nossa cena, iremos adicionar as texturas Grass e Grass (Hill) e adicioná-las ao nosso terreno.

Adicionando texturas ao terreno

Figura 9. Adicionando texturas ao terreno

O pacote que importamos para o nosso projeto possui algumas árvores, palmeiras, e para criar uma paisagem mais interessante iremos adicionar algumas delas. Para isso, na aba Trees dentro do terreno, iremos em Edit Trees->Add Tree, e iremos adicionar a palmeira, como mostra a Figura 10. Repare que o número de árvores colocadas na paisagem varia conforme modificamos a propriedade Tree Density.

Adicionando árvores à paisagem

Figura 10. Adicionando árvores à paisagem

Agora que temos uma paisagem simples, podemos nos concentrar em outros aspectos da criação do game. Primeiramente, vamos posicionar o nosso prefab criado anteriormente. Nesta etapa, iremos fazer dele o nosso PC. Não se trata de um objeto extremamente complexo (é apenas uma junção de um cilindro e um cubo), mas o conceito é válido aqui. A ideia é fazer com que esse elemento se mova dentro da cena, utilizando as teclas de direção ou WASD.

Primeiramente, vamos definir os controles do nosso game. Para isso, vamos em Edit->Project Settings->Input, onde esses elementos podem ser definidos. Como vemos na Figura 11, o movimento é definido nas direções horizontal e vertical, tanto o botão normal e o botão alternativo. Ao longo do eixo horizontal, esquerda e direita ou a e d, e ao longo do eixo vertical, cima ou baixo ou w e s.

Definição das teclas de movimento

Figura 11. Definição das teclas de movimento

Agora, iremos transformar o prefab criado em um Character Controller. O Unity fornece dois deles, um em primeira e outro em terceira pessoa, prontos para utilização. Para isso, basta importar o pacote Character Controller utilizando o mesmo procedimento que utilizamos para as texturas do terreno e simplesmente utilizar. Porém, vamos trabalhar de forma um pouco diferente aqui.

Primeiramente, vamos entender o que é o Character Controller. Trata-se de um elemento físico do game, responsável por controlar os Game Objects da maneira que o desenvolvedor desejar, além de também tratar da colisão entre objetos. Para adicionar esse elementos ao nosso prefab, vamos em Add Component->Physics->Character Controller, como mostra a Figura 12.

Adicionando componente Character
    Controller

Figura 12. Adicionando componente Character Controller

Para podermos movimentar o nosso jogador dentro da cena, precisamos de um script que controle esse movimento. Para isso, vamos criar um script chamado MovimentoGameExemplo.cs, e adicionar o código necessário para isso. Antes de adicionarmos o código, vamos entender os métodos que o Unity cria para nós. O método Start() é executado apenas uma vez, antes do começo do game, e normalmente é utilizado para inicialização de variáveis, entre outros. O método Update(), por sua vez, é executado a cada frame. Aqui, é preciso ter cuidado para não sobrecarregar o método Update() com muita informação, uma vez que ele será executado constantemente.

Em nosso game, o jogador irá se movimentar apenas no plano. Portanto, iremos alterar apenas as componentes x e z de nossa posição. Antes de mais nada, porém, iremos pegar o movimento das teclas de direção definidas. Para isso, utilizamos o método da classe Input, GetAxis(). Esse método recebe como parâmetro o nome da entrada, definido no InputManager. Como vimos na Figura 11, esses nomes são Horizontal e Vertical. Então, iremos utilizar esses valores obtidos para atualizar a posição do jogador, conforme mostra a Listagem 2.

Listagem 2. Movimento do jogador

void Update () {
                float x = Input.GetAxis ("Horizontal");
                float z = Input.GetAxis ("Vertical");
                gameObject.transform.position = new Vector3 (transform.position.x + x, transform.position.y, transform.position.z + z);
      }

Com isso, temos um jogador que se movimenta ao longo de um terreno. Repare que o jogador passa por dentro das montanhas e se movimenta sem qualquer controle de velocidade. Para controlarmos isso, seria necessário criar elementos de detecção de colisão, entre outras ferramentas mais avançadas. Para evitar esses problemas, uma ideia seria utilizar os scripts prontos que temos a nossa disposição no pacote de Character Controllers do Unity. Além disso, o Unity também fornece um script que permite à câmera acompanhar o jogador, o que é desejável em praticamente todos os jogos em terceira pessoa.

Como vimos, o Unity possui inúmeros elementos que servem para facilitar a vida do desenvolvedor de games. Porém, existem vários aspectos que precisam ser levados em conta ao longo do desenvolvimento, caso queiramos criar uma jogabilidade melhor para nossos jogadores.

Uma das grandes vantagens na utilização do Unity é a presença de uma comunidade bastante ativa, sempre atenta às novidades. Além disso, é muito simples de aprender a utilizar a ferramenta, e vale a pena. A criação de games acaba ficando muito mais simples quando utilizamos o Unity. Porém, é preciso ter atenção, pois a forma de desenvolvimento é um tanto quanto diferente daquela que verificamos em outros motores de jogo, como, por exemplo, o Microsoft XNA.

Links Úteis

Saiba mais sobre Unity 3D ;)