Programação na Unity 3D 2018
Desenvolvimento 3D
A Unity 3D é usada para o desenvolvimento de jogos, mas ela é capaz de fazer muito mais que isso. Neste post explico como funciona a programação na Unity 2018. Ao final, deixo o link de um curso gratuito.

Programação na Unity 3D
1. Game
Um jogo, ou um game, é um tipo de software complexo de ser feito. Ele exige uma etapa de criação e planejamento enorme antes da implementação. Imagine desenvolver um game por meses ou anos e, depois de publicá-lo, descobrir que ele possui falhas básicas em itens que não são técnicos. Por exemplo, um jogo feito para crianças visualmente, mas complexo demais, não é adequado. Da mesma forma, um game para adulto, mas com dinâmicas muito infantis, pode se tornar chato e não atrair público. Várias estratégias podem ser usadas nesta etapa, como uma pesquisa de mercado, uma enquete com projeto crowdfunding, um demo etc. Na minha opinião, a maioria das pessoas já tem uma ideia de game, ou no mínimo boas referências e inspirações.
Com a ideia e o planejamento em mãos, os detalhes começam a surgir. Definição de quais e quantos personagens jogáveis, quais serão os não jogáveis (NPC), cenários e assim vai. Nesta etapa, dois profissionais são muito requisitados: o Game Designer e o Level Designer. A especificação do game, incluindo as regras e a dinâmica de jogabilidade, pode estar descrita sem nada visualmente e sem nada programado. Contudo, o ideal é avançar também nestas frentes. Na parte visual, fazer um rascunho ou um concept dos principais elementos e prever os principais itens da interface ajuda muito. Na parte de sistema, prever determinados comportamentos com demos montados apenas com a parte matemática pode poupar tempo no futuro.
Quando tudo isso está pronto é preciso de uma entidade: o programador ou, no caso de games, Game Developer. Um profissional que trabalha com a parte de programação no desenvolvimento de games.
2. Game 2D x 3D
Muitas vezes acabo indo direto demais ao ponto e esqueço de comentar uma importante área. Os games 2D. Eu sou de uma geração que jogou muito os jogos originais do Street Fighter, Mario Bros, Prince of Persia e outros. Quando digo original, me refiro a primeira versão desses games, que atualmente existem em versões bem mais sofisticadas (e maioria em 3D). Todos esses games são exemplos vivos que um game 2D pode ser tão legal como um Game 3D. Periodicamente eu instalo emuladores para jogar alguns games antigos, como Yo-noid. A verdade é: tem muito game 2D da década de 90 são melhores que games atuais em termos de jogabilidade. Agora imaginem um bom game 2D feito atualmente, com os recursos existentes disponíveis hoje!
Portanto, sem desmerecer os games 2D, focarei na parte que gosto: software 3D, com programação no espaço tridimensional. O mundo real é tridimensional, com largura, altura e profundidade, por isso games e outros tipos de software 3D contam com essa vantagem de representar o mundo virtual de forma mais verossímil.
3. Game Engine
Um software 3D tem características marcantes em relação a um software convencional, por exemplo, uma aplicação web ou um software com formulários. Uma delas é desenhar várias vezes por segundo os frames (ou quadros) exibidos na tela. Um frame é simplesmente uma imagem, de forma que um vídeo, ou uma animação, é uma sequência de imagens. Quando o olho humano vê por volta de 30 quadros por segundo (e daí vem o FPS, de frames per second), consegue ter a percepção de movimento.
Em um game 3D, esses frames são compostos pela combinação de vários elementos de uma cena. Por exemplo, um personagem, o cenário, objetos do cenário, iluminação, sombras e outros. Agora, pare e pense: como os elementos 3D são transformados em uma ou várias imagens 2D? Porque uma imagem, exibida na tela, tem largura e altura, de forma que ela pode conter noções de profundidade, mas tecnicamente é bidimensional. Essa transformação é conhecida como renderização. Como o termo também é usado em outras áreas para representar processamento digital, como renderizar vídeos, falamos em renderização 3D.
Uma game engine, finalmente, é um tipo de software que possui um motor gráfico (e por isso o termo engine em inglês) para a renderização 3D. É uma de suas principais funcionalidades. Caso um game fosse desenvolvido digamos, manualmente, conhecido pelos programados como “na unha”, ele precisará adicionar um módulo para trabalhar com o universo 3D. Por exemplo, com o IDE (ambiente de desenvolvimento integrado) Visual Studio é possível adicionar a biblioteca gráfica OpenGL e programar no espaço 3D, mas programas na Unity é mais rápido e fácil.
3.1 Unity 3D
Existem várias games engines. Algumas 100% gratuitas, outras 100% pagas outras flexíveis, isto é, permitem versões gratuitas e pagas conforme a situação. A imagem abaixo ilustra algumas das principais. Não tenho uma pesquisa de mercado na mão, mas arrisco a dizer que a Unity 3D é que a tem maior market share atualmente. Além disso, para fins educacionais ou se você faturar pouco (veja regras atualizadas no site unity3d.com), ela é gratuita.
As vantagens não param por aí. Você pode fazer apps de Realidade Aumentada, Realidade Virtual ou simplesmente um software 3D interativo. Eu já usei muito para simuladores físicos, de modo que mesmo feita para fazer games, sua dinâmica permite desenvolver uma grande variedade de software. Para finalizar, quero destacar também a excelente documentação do site oficial, Unity 3D Learn, e também a flexibilidade de exportar um mesmo game, software ou app para diferentes sistemas operacionais. Um mesmo software desenvolvido para PC pode ser transformado para Android em minutos.

Engines Unity 3D
3.2 Arquitetura de um software na Unity
Um game ou, de forma mais genérica, um software feito na Unity 3D é organizado em cenas. Cada cena possui pelo menos uma câmera virtual, pois, sem isso, é como se não existisse uma janela de renderização para a cena 3D. É através da câmera virtual que veremos a cena, mas é possível também ter várias câmeras. Pense em um jogo de futebol. Cada câmera captura um ângulo diferente da partida.
Além de câmeras virtuais, uma cena também possui objetos. Na Unity, os objetos recebem o nome de GameObject. Cada objeto é formado por componentes ou, em inglês, components. Um componente é algo contextual, ou seja, depende do tipo de objeto criado. Uma câmera tem o componente Transform, responsável pelo posicionamento do objeto na cena, além do componente Camera. Uma fonte de luz tem o componente Transform e o componente Light. O componente Transform está presente em todos os objetos, já o Camera somente em objetos do tipo câmera, assim como Light em objetos referentes a iluminação.
Na hora de gerar um arquivo executável é preciso selecionar quais cenas farão parte do software que será gerado.
3.3 Programação na Unity
A programação na Unity 3D é feita usando scripts com a linguagem C#. Scripts são arquivos com código escrito em C# e com extensão “.cs”. Quando um script é escrito e salvo no projeto da Unity, ele pode ser adicionado a um objeto como um componente. Assim, scripts são componentes dentro da Unity. É possível também criar um script que é usado indiretamente em uma cena, mas não está anexado a nenhum objeto. Esses detalhes vou deixar para quem assistir o curso para que este post não fique longo demais.
Agora, é possível fazer um jogo sem programação? Não na Unity 3D. O que pode acontecer, eventualmente, é você aprender a fazer um game usando só a interface da Unity, que é chamada de Editor. Neste caso, você estará usando programação indiretamente arrastando os scripts em objetos, mas não saberá o que está acontecendo de fato. Muitos fazem dessa forma, com foco somente no resultado: se rodar, deu certo. Isso pode gerar algumas complicações no futuro, mas se for para efeito de testes e diversão, está valendo!
3.4 Programação na Unity com que objetos 3D?
Uma dificuldade comum para desenvolvedores dentro da Unity é obter modelos 3D personalizados. Você idealizou um game com certos personagens, cenários. Como conseguir que eles se tornem de verdade? Em geral, se você quiser como pensou, é preciso contratar um designer 3D para criá-lo sob medida. Este é um processo bem bacana que já participei algumas vezes, mas envolve investimentos que nem sempre estão disponíveis. Por isso, existem alternativas. Uma delas é comprar um modelo 3D pronto dentro da loja da Unity, chamada Unity Store. Outra é comprar em sites especializados, como o TurboSquid. Atenção à diferença entre low poly e high poly na hora de comprar um.
Por fim, uma versão pra lá de programador é usar objetos 3D conhecidos, como cápsulas, esferas, cubos. Objetos que estão prontos e à disposição para serem usados na Unity. Veja o game de Duelo entre 2 cápsulas abaixo! O visual é tosco, mas com ele é possível adquirir importantes fundamentos da Unity.

Game 3D
4. Curso
Conforme vimos neste post, é possível usar diferentes game engines para desenvolver um jogo. Uma game engine pode fazer muito mais do que um game, até porque um game é um tipo de software bem complexo de ser feito. A seguir, deixo o link do curso gratuito para você aprender passo a passo a desenvolver esse game Duelo. No entanto, para entendê-lo plenamente, é preciso ter noções de programação, C# e software 3D. Por isso, divido abaixo as duas possíveis trilhas.
Curso de Unity 2018 (gratuito):
https://www.udemy.com/programacao-na-unity-requisito-desenvolvedor-3d-level-1/
Noções de programação (pago):
https://www.udemy.com/desenvolvedor-junior-level-1-fundamentos-do-desenvolvimento/
Noções de C# (pago):
https://www.udemy.com/skill-level-1-csharp-visualstudio2017-frameworkdotnet/
Avançado de desenvolvimento 3D (pago):
https://www.udemy.com/especializacoes-em-computacao-grafica-desenvolvedor-3d-lvl1/