Tutorial: Desenvolvimento de Jogos com Unity 3D



Documentos relacionados
Desenvolvimento de jogos com Unity

Microsoft Access XP Módulo Um

Pesquisa e organização de informação

Noções de. Microsoft SQL Server. Microsoft SQL Server

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

UNIVERSIDADE FEDERAL DE GOIÁS CERCOMP (CENTRO DE RECURSOS COMPUTACIONAIS) TUTORIAL DE USO DO WEBMAIL - UFG

Persistência e Banco de Dados em Jogos Digitais

Fluxo de trabalho do Capture Pro Software: Indexação de código de barras e separação de documentos

Desenvolvendo Websites com PHP

02 - Usando o SiteMaster - Informações importantes

ANDRÉ APARECIDO DA SILVA APOSTILA BÁSICA SOBRE O POWERPOINT 2007

4 O Workflow e a Máquina de Regras

Novell. Novell Teaming 1.0. novdocx (pt-br) 6 April 2007 EXPLORAR O PORTLET BEM-VINDO DESCUBRA SEU CAMINHO USANDO O NOVELL TEAMING NAVIGATOR

Fluxo de trabalho do Capture Pro Software: Indexação de OCR e separação de documentos de código de correção

Manual do Usuário Android Neocontrol

CorelDRAW UM PROGRAMA DE DESIGN

Engenharia de Software III

Manual do Ambiente Moodle para Professores

Planejando o aplicativo

TRBOnet MDC Console. Manual de Operação

Orientação a Objetos

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

ADMINISTRAÇÃO DE SISTEMAS OPERACIONAIS COTAS DE DISCO. Professor Carlos Muniz

Iniciação à Informática

Guia de início rápido do Powersuite

Bem- Vindo ao manual de instruções do ECO Editor de COnteúdo.

Microsoft Office PowerPoint 2007

SIMULADO Windows 7 Parte V

Análise de Dados do Financeiro

2 Diagrama de Caso de Uso

Utilização. de Shaders de efeitos realistas para jogos. Bruno Pereira Evangelista. Pontifícia Universidade Católica de Minas Gerais

PROVA DE NOÇÕES DE MICROINFORMÁTICA

OpenGL. Uma Abordagem Prática e Objetiva. Marcelo Cohen Isabel Harb Manssour. Novatec Editora

1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2.

Anexo III Funcionamento detalhado do Sistema Montador de Autoria

Criando um script simples

Introdução a Java. Hélder Nunes

INTRODUÇÃO AO WINDOWS

Capacidade = 512 x 300 x x 2 x 5 = ,72 GB

Construtor de sites SoftPixel GUIA RÁPIDO - 1 -

GUIA UNITY 3D E SKETCHUP

CENTRO UNIVERSITÁRIO CATÓLICA DE SANTA CATARINA PRÓ-REITORIA ACADÊMICA NÚCLEO DE EDUCAÇÃO EM AMBIENTES DIGITAIS NEAD

Status. Barra de Título. Barra de Menu. Barra de. Ferramentas Padrão. Caixa de nomes. Barra de. Ferramentas de Formatação. Indicadores de Coluna

GUIA BÁSICO DA SALA VIRTUAL

Estacionamento de Caminhão com Lógica Fuzzy. Daniel Ricardo dos Santos Diogo de Campos Maurício Oliveira Haensch

PROMOB ARCH PRIMEIROS PASSOS

COMO USAR DOIS MONITORES NO WINDOWS 8

MANUAL GDS TOUCH. Versão: 1.0 Direitos reservados.

Manual Operacional SIGA

Semântica para Sharepoint. Busca semântica utilizando ontologias

MANUAL DE INSTALAÇÃO 1) ORACLE VIRTUALBOX ; 2) MICROSOFT WINDOWS ; 3) SUMÁRIOS GENEPLUS.

Universidade Federal de Santa Maria UFSM Centro de Tecnologia CT. Power Point. Básico

Informática Básica. Microsoft Word XP, 2003 e 2007

QUESTÕES SOBRE WINDOWS 7

Roteiro 2: (Planilhas Eletrônicas) - Função procv / manipulação de formulários

Google Drive. Passos. Configurando o Google Drive

Lidar com números e estatísticas não é fácil. Reunir esses números numa apresentação pode ser ainda mais complicado.

Introdução ao Tableau Server 7.0

Aula 01 - Formatações prontas e condicionais. Aula 01 - Formatações prontas e condicionais. Sumário. Formatar como Tabela

O Primeiro Programa em Visual Studio.net

MANUAL DO INSTAR-MAIL 1.0. Pagina de login e senha do Instar-Mail

Como Usar o DriverMax

DIFERENÇAS ENTRE FUNÇÃO E BLOCO FUNCIONAL; CRIAÇÃO DE FUNÇÃO / BLOCO FUNCIONAL; UTILIZAÇÃO NO LADDER; EXEMPLO DE BLOCO FUNCIONAL;

Professor: Ronilson Morais Lobo. Salvador / 2015

Manual SAGe Versão 1.2 (a partir da versão )

Table of Contents. PowerPoint XP

PdP. Autor: Luís Fernando Patsko e Tiago Lone Nível: Intermediário Criação: 26/12/2005 Última versão: 18/12/2006

ATENÇÃO: * Arquivos com tamanho superior a 500 KB NÃO SERÃO ACEITOS * SOMENTE serão aceitos documentos do formato: PDF

Programação de Robótica: Modo Circuitos Programados - Avançado -

Sistemas Distribuídos

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

Como funciona? SUMÁRIO

Dicas para usar melhor o Word 2007

Bruno Pereira Evangelista.

AULA 1 Iniciando o uso do TerraView

Auxiliar de instalação (Português Brasileiro) Primeiros passos

Tutoriais de apoio para a migração do Atualização: 30/04/2014

TUTORIAL AUTODESK 360 COLABORAÇÃO E ARMAZENAMENTO DE ARQUIVOS

Personalizações do mysuite

Tutorial Plone 4. Manutenção de Sites. Universidade Federal de São Carlos Departamento de Sistemas Web Todos os direitos reservados

FERRAMENTAS DE COLABORAÇÃO CORPORATIVA

2. ENTRADA DE DADOS 2.1. TEXTOS

TELA PRINCIPAL. Exibe uma lista de configurações de efeitos disponíveis. A visualização pode ser filtrada por: Aplicação, Cliente e Categoria.

Permissão de Usuários

Um Ambiente Gráfico para Desenvolvimento de Software de Controle para Robôs Móveis Utilizando Simulação 3D

MANUAL DE INSTRUÇÕES. Versão 1.0. Visão Transportador

DarkStat para BrazilFW

Programação de Computadores - I. Profª Beatriz Profº Israel

Um Driver NDIS Para Interceptação de Datagramas IP

Gerenciamento de Arquivos e Pastas. Professor: Jeferson Machado Cordini jmcordini@hotmail.com

APLICAÇÃO PARA ANÁLISE GRÁFICA DE EXERCÍCIO FÍSICO A PARTIR DA PLATAFORMA ARDUINO

ANEXO 11. Framework é um conjunto de classes que colaboram para realizar uma responsabilidade para um domínio de um subsistema da aplicação.

3. No painel da direita, dê um clique com o botão direito do mouse em qualquer espaço livre (área em branco).

Sistemas Operacionais

INDICE 1. INTRODUÇÃO CONFIGURAÇÃO MÍNIMA INSTALAÇÃO INTERLIGAÇÃO DO SISTEMA ALGUNS RECURSOS SERVIDOR BAM...

Processo de Controle das Reposições da loja

O PaperPort 12 Special Edition (SE) possui uma grande variedade de novos e valiosos recursos que ajudam a gerenciar seus documentos.

Índice. Manual Backup Online. 03 Capítulo 1: Visão Geral

Simão Pedro P. Marinho, Ramon Orlando de Souza Flauzino NARRATIVAS DIGITAIS

VERSÃO PARA INTERNET. Tutorial SIGA BRASIL CNT

Transcrição:

Tutorial:DesenvolvimentodeJogoscomUnity3D ErickBaptistaPassos epassos@ic.uff.br JoséRicardodaSilvaJr. josericardo.jr@gmail.com FernandoEmilianoCardosoRibeiro one.fernando@gmail.com PedroThiagoMourão pedrothiago@hotmail.com 1

Apresentação Essetutorialéapresentadocomoumabreveintroduçãoaodesenvolvimentodejogoscomo motor Unity3D. Explicações muito detalhadas, mesmo que cobrindo apenas parte das funcionalidades existentes, ocupariam bem mais que as três dezenas de páginas disponíveis paraestetutorial.dessaforma,recomendamosoleitorinteressadoabuscarmaisinformações na abrangente e excelente documentação da ferramenta, disponível tanto localmente, ao se realizarasuainstalação,quantoonlineatravésdositehttp://www.unity3d.com/support. Tambémporquestõesdeespaço,nãofoiincluídaumaintroduçãogeralaodesenvolvimento dejogos.espera sequeoleitorpossuaalgumafamiliaridadecomosconceitoseferramentas relacionados ao assunto tais como renderização em tempo real, modelagem e animação 3D, texturas e Shaders. Também espera se que o leitor possua noções de programação, preferencialmentecomalgumalinguagemorientadaaobjetos. O conteúdo do texto está organizado em forma crescente de complexidade, de forma a facilitar a leitura. Entretanto, as seções apresentadas também podem ser lidas de forma independente. AimagemdacapafoicedidadoprojetoFrançaAntártica,decujaequipededesenvolvimento fazem parte alguns dos autores. O jogo França Antártica está sendo desenvolvido através da Unity3DeéumprojetofinanciadopelaSecretariadeCulturadoEstadodoRiodeJaneiro. Por fim, informa se que algumas das figuras e exemplos apresentados foram adaptados do manualdaferramenta,detutoriaisonline(http://www.unity3d.com/resources),bemcomode discussões disponíveis no forum comunitário de desenvolvedores Unity (http://forum.unity3d.com). Também recomendamos o leitor que explore essas referências paraummaioraprofundamento. 2

1 Introdução Guiadeleitura BreveapresentaçãodosmódulosdaUnity3Dedetalhamentodainterfacedoeditordecenas. 2 CriaçãoeManipulaçãodeGameObjects ExplicaçãodomodelodeobjetosdaUnity3Deasformasbásicasdecriação,composiçãoe alteraçãodosmesmos. 3 MateriaiseShaders BreveintroduçãoàlinguagemdeespecificaçãodeShadersdaUnity3D:ShaderLab.São demonstradosexemplosparapipelinedefunçãofixa,bemcomoshadersprogramáveis. 4 SistemadeFísica IntroduçãoaoscomponentesrelacionadosaosubsistemaPhysXdesimulaçãofísica. 5 Scripting Apresentação,atravésdeexemplos,dosprincipaisconceitosparaaprogramaçãodescripts comaunity3d. 6 Conclusão Consideraçõesfinaisdosautores. Bibliografia Leiturasrecomendadasparaaquelesinteressadosemummaioraprofundamento. 3

1 Introdução Odesenvolvimentodejogos3Déumaatividadeaomesmotempogratificanteedesafiadora. Diversashabilidades,dediferentesáreasdoconhecimento,sãonecessáriasnesseprocesso.O usodeferramentasparaauxiliarnastarefasrepetitivaséfundamentalnessetipodeatividade, eaolongodotempo,umtipoespecialdeferramenta,conhecidocomomotordejogos(game engine) foi evoluindo de maneira paralela aos próprios jogos, ao ponto que se tornaram produtosvaliososedecertaformapopulares. Alguns módulos e funcionalidades auxiliares são condições necessárias para que uma ferramenta seja considerada um motor de jogos completo. Em especial, um sistema de renderização 3D com suporte a Shaders programáveis e um sistema de simulação física são fundamentais. Uma boa arquitetura para a programação de scripts, um editor de cenas integrado,eacapacidadedeseimportardiretamentemodelos3d,imagenseefeitosdeáudio produzidos em ferramentas externas, são as características existentes nos motores de jogos. Além disso, é desejável que os jogos desenvolvidos possam ser distribuídos em múltiplas plataformascomopc,consolesoumesmodispositivosmóveis. AUnity3DabstraidodesenvolvedordejogosanecessidadedeutilizardiretamenteDirectXou OpenGL (apesar de ainda ser possível, caso necessário), suportando a criação de Shaders complexoscomalinguagemcgdanvidia.internamente,osubsistemadesimulaçãofísicaéo popularphysx,tambémdanvidia.paraaexecuçãodescripts,aunityusaumaversãodealto desempenhodabibliotecamono,umaimplementaçãodecódigoabertodoframework.netda Microsoft. Aindaquesejaumaferramentaqueincluioestadodaartenoseusegmento,aUnity3Dtem um preço acessível, o que é apenas mais uma das razões para sua crescente popularidade. MesmousandoaversãomaisbaratadaUnity3d,osjogospodemserdesenvolvidosparaPC, Mac ou mesmo embutidos em uma página Web. Com a aquisição de licenças específicas, pode sedesenvolveredistribuirjogosparaiphone,atravésdalojaonlinedaapple,oumesmo paraoconsolewiidanintendo. 1.1 Interface O motor de jogos Unity3D possui uma interface bastante simples e amigável que objetiva facilitar o desenvolvimento de jogos de diversos gêneros e outros sistemas de visualização. Sua área de trabalho é composta de várias janelas chamadas views, cada uma com um propósitoespecífico.afiguraabaixoéumacapturacontendoumarepresentaçãoesquemática eaidentificaçãodecadaumadessasjanelasnoeditordecenasdaunity3d. 4

Projectview Figure1 InterfacedoeditordecenadaUnity3D(UNITYTECHNOLOGIES2009A) AjanelaProjectéainterfaceparamanipulaçãoeorganizaçãodosváriosarquivos(Assets)que compõemumprojetotaiscomoscripts,modelos,texturas,efeitosdeáudioeprefabs,osquais serão detalhados mais adiante na seção de scripting. A estrutura exibida na janela Project é correspondente à sub pasta Assets dentro da pasta do projeto no sistema de arquivos do computador. Recomenda se que a manipulação de sua estrutura e conteúdo seja efetuada somentedentrodaunity3d,afimdemanteraintegridadedosmetadadosquesãoassociados a estes elementos. Entretanto, certas mudanças, como atualização de uma textura por um editordeimagensporexemplo,oumesmoaadiçãodenovosassets,podeserfeitadeforma seguradiretamentenosistemadearquivos. Figure2 JanelaProject 5

Hierarchyview A janelahierarchy exibe todos os elementos da cena que encontram se na cena que se está editando. Além disso, nessa janela podemos organizar e visualizar a hierarquia de de composição entre os vários objetos que compõem a cena(grafo de cena). O funcionamento dessesobjetos,bemcomoahierarquiadetransformaçãoseráexplicadomaisdetalhadamente napróximaseção. Sceneview Figure3 JanelaHierarchycomdoisobjetos AjanelaSceneéaformaprincipaldemanipulaçãodoselementosvisuaisnoeditordecenasda Unity, possibilitando a orientação e posicionamento desses elementos com um feedback imediatodoefeitodasalteraçõesefetuadas.nestajanela,pode semanipulargraficamenteos objetosatravésdasopçõesdearrastaresoltarcomomouse.essamanipulaçãoésemelhante àquela de ferramentas de modelagem 3D e pode se manipular objetos tais como câmeras, cenários,personagensetodososelementosquecompõemacena. Devidoasuagrandeimportânciaduranteodesenvolvimentodeumaaplicação,váriasformas denavegaçãosãooferecidasafimdeaumentaraindamaisaprodutividadedodesenvolvedor. Além disso, as ferramentas básicas de manipulação dos elementos da cena, tais como pan, translação,rotaçãoeescalatambémestãodisponíveisparautilizaçãonestajanelaatravésde atalhosdeteclado(teclasq,w,eer). 6

Gameview Figure4 JanelaScene A janela Game é responsável pela visualização da aplicação em desenvolvimento da forma queelaseráexibidaquandofinalizada.nessajanela,pode serapidamenteterumapréviade comooselementosestãosecomportandodentrodaaplicação.alémdisso,aunityfornecea opçãodeseparalisar(botãopause)asimulaçãoenquantoelaestiveremdepuração,deforma a possibilitar que os parâmetros dos vários elementos possam ser ajustados para experimentação.lembramosqueoajustedessesparâmetrosnãonecessitamqueasimulação estejaparalisada,podendoseralteradosinclusiveenquantoasimulaçãoestejaemexecução. Nesta janela, também pode se visualizar várias informações estatísticas (stats) sobre a simulação,taiscomotempodeprocessamentoenúmerodeframesporsegundo,númerode triângulos e vértices renderizados, memória de textura utilizada, entre outras. Esta opção é importante para a depuração do desempenho da simulação para uma posterior otimização, casosejanecessário. Inspectorview NajanelaInspector,tem seacessoaosváriosparâmetrosdeumobjetopresentenocenário, bem como aos atributos de seus componentes (Components). Essa estrutura utilizada pela Unityparaacomposiçãodeobjetosserámelhorexplicadanapróximaseção.Aindanajanela Inspector, pode se ajustar os atributos públicos(parâmetros) de cada componente, inclusive duranteaexecuçãodaaplicação. 7

2 CriaçãoeManipulaçãodeGameObjects Figure5 JanelaInspector Muitosmotoresdejogosdegeraçãoanteriordisponíveisnomercadosãobaseadosnousode especialização/herançaparaasclassesqueirãorepresentarobjetosdejogo.nestaarquitetura, oselementosdeumjogoherdamdeumaclassebásica(normalmentealgocomogameobject) e as novas funcionalidades são acrescentadas. Assim como em outras categorias de desenvolvimentodesoftwareorientadoaobjetos,ousodemasiadodeherançanessetipode situaçãotornou seobsoleto,principalmenteporsuapoucaflexibilidadequandoosobjetosde jogopossuemmúltiploscomportamentos,oqueexigiriaherançamúltipla. A Unity3D é baseada em um modelo mais moderno para a arquitetura de objetos de jogo baseadoemcomposição[bilas2002,stoy2006,passosetal.2008].nessemodelo,umobjeto dejogoéespecificadoatravésdacomposiçãodeváriasfuncionalidades,quesãoagregadas(ou removidas). Cada funcionalidade é implementada por um componente (classe que herda de umcomponentebásico).essecontainergenéricoaindaédenominadogameobjectefunciona comoumrepositóriodefuncionalidades,oumaisespecificamente,componentes. 8

Oscomponentessãoentãoresponsáveisporimplementarosdiversoscomportamentosque um Game Object pode ter. Um componente pode ser desde um script, uma geometria de colisão,ouatéumatexturadegui.ouseja,gameobjectspodemrepresentarqualquercoisa nocenário,sendocaracterizadoscomoumasimplescâmeraouumpersonagemapenaspelos diferentes componentes que agrega. Conforme observado no manual de usuário da Unity (traduçãolivre): GameObjectéumapanelavaziaeoscomponentessãoosingredientesque irãocriarsuareceitadejogabilidade. Abaixo apresentamos a estrutura de um Game Object padrão que representa uma câmera virtual. Nessa figura, a câmera é um Game Object, porém, só é definida como câmera pois possui um componente com essa funcionalidade. Além disso, possui os componentes auxiliaresguilayer,flarelayereaudiolistener. Figure6 ComposiçãodeumGameObject(Camera) UmaobservaçãoimportantesobreosGameObjectséquetodoselesjápossuempelomenoso componentetransform,responsávelpeloseuposicionamento,orientaçãoeescalanosistema referencialdacena.alémdisso,essecomponenteéresponsávelpeladefiniçãodahierarquia detransformações,permitindooefeitodetransformaçãorelativadeacordocomaestrutura deascendência/descendênciadecadagameobject. 9

Figure7 Estruturamínimadeumobjeto Na Unity também temos o conceito de Prefab. Um Prefab é simplesmente um modelo de composição de Game Object já definido, ou mais precisamente, umtemplate que define um elemento através da composição dos vários componentes. Podemos citar, por exemplo, a definiçãodeumhumanóidequenecessitadeumscriptdemovimentaçãoeumcomponente decolisão.nessecaso,poderíamoscriarumprefabdessehumanóideecriarváriascópiasdo mesmo,inclusivecomparâmetrosdiferentes.dessaforma,temosumganhoconsiderávelde tempo pois isso evitaria que tivéssemos que recriar essa composição para cada instancia de humanóidepresentenocenário.prefabsserãomaisdetalhadosnaseçãosobrescripting. ImportaçãodeAssets Geralmente,grandepartedodesenvolvimentodeumjogoestárelacionadocomautilizaçãoe manuseiodeassetstaiscomotexturas,modelos3d,efeitosdesomescripts.essesdiferentes tipos de artefatos são desenvolvidos em ferramentas externas, especializados na construção decadaumdostiposdeassets.apóssuacriaçãoouedição,assetsprecisam,dealgumaforma, seremimportadosparadentrodeeditordecenasdomotordejogos. AUnitypossuiumaformamuitosimpleserobustadeimportaçãodeAssetsparadentrodeum projeto, bastando que os mesmos sejam arrastados para dentro de uma pasta da janela Project.Aoefetuaresteprocedimento,aimportaçãoéfeitaautomaticamenteparaoprojeto, sem nenhuma intervenção do usuário, ficando imediatamente disponível para ser utilizada dentrodaaplicação.aunityaceitaformatosdedistribuiçãopopularesparamodelos3d(.fbx), áudio(wav,mp3,etc)etexturas(jpg,png,bmpoumesmo.psddiretamente). AlémdessasimplicidadedeimportaçãodosAssets,aUnitytambémofereceapossibilidadeda visualização em tempo real de qualquer alteração feita nos mesmos. Com isso, tem se um ganho de produtividade, pois não precisa se importar manualmente novas versões para dentro da Unity a cada vez que desejarmos efetuar uma alteração. A Unity verifica cada arquivomodificadoeautomaticamenteatualizaomesmonacena. 3 MateriaiseShaders Jogos3Dnormalmentepossuemumgrandeapelovisual,ondeacriatividadeecapacidadedos artistas realiza um papel fundamental para o sucesso. Atualmente, os dispositivos gráficos permitem o uso de soluções sofisticadas para a exibição em tempo real das malhas 3D dos elementosdeumacena.emespecial,faz seonipresenteousodeshadersprogramáveis. OmotordejogosUnity3DpermitetantoacriaçãodeShadersemlinguagensdeprogramação como Cg ou GLSL, quanto o uso de função fixa, além de incluir uma versátil coleção desses 10

Shadersnainstalaçãopadrão.OvinculoentreumShadereumamalha3Dsefazatravésdeum Material, que funciona como um container para as propriedades visuais que cada objeto da cenapossui.afiguraaseguirmostracomoaatribuiçãodessaspropriedadespodeserfeitana janelainspectordentrodoeditordecenas. Figure8 ManipulaçãodeumMaterial AespecificaçãodeumShaderdefinequaissãoaspropriedadesqueestenecessitapararealizar a exibição do objeto, enquanto o Material define os valores para essas propriedades. A próximafiguramostraumarepresentaçãoesquemáticadessarelação.doisshaderssãousados: uma para o corpo do carro e um para as rodas. Para o corpo do carro, dois materiais são criados utilizando se do mesmo Shader. Em um deles, o valor da propriedade Color FX, especificada pelo Shader, é atribuída com a cor vermelha, enquanto no outro é usada a cor azul.dessaforma,pode seaplicaressesdiferentesmateriaisaobjetosnacena,comoilustrado nafigura. Figure9 Relaçnaoentreshaders,materiaiseobjetos 11

Deformamaisespecífica,umShaderdefine: * O método de renderização de um objeto. Isso inclui o uso de diversas variações, dependendododispositivográficodousuário; *TodososVertexePixel Shadersusadosnessarenderização; *Aspropriedadesqueserãoatribuíveisnasespecificaçõesdemateriais; *Parâmetrosnuméricosoudecorquetambémserãoatribuíveisnosmateriais; UmMaterialdefine: *Quaistexturasusarparaarenderização; *Quaiscoresusar; *OsvaloresdequaisqueroutrosAssetstaiscomoCubmaps,limiaresdeluminância,etc. ParasecriarumnovoMaterial,usa seassets >Create >Materialnomenuprincipal.Umavez criadoomaterial,pode seaplicá loaumobjetoeexperimentar sealterarosvaloresdesuas propriedades. Para aplicar um Material a um objeto, basta de arrastar o mesmo da janela ProjectparaqualquerobjetonacenaounajanelaHierarchy. ParaaespecificaçãodeShaders,tantodefunçãofixaquantoprogramáveis,aUnity3Dpossui uma linguagem própria chamada ShaderLab, que possui alguma semelhança com os arquivos.fxdefinidosparaomicrosoftdirectxouaespecificaçãonvidiacgfx.essalinguagem declarativapossuiumasintaxesimpleseincluicapacidadespoderosascomoreuso,múltiplos passos, criação procedural de texturas, entre outras. Nas próximas seções será apresentada umabreveintroduçãoaessalinguagem. 3.1 IntroduçãoaShaderLab ParasecriarumnovoShader,pode seescolherassets >Create >Shaderdomenuprincipal,ou duplicarumexistenteetrabalharapartirdomesmo.shadersnaunity3dsãoarquivosdetexto epodemsereditadosfazendo seumduplo cliquenosmesmosnajanelaproject.iniciaremosa explicaçãocomumshaderbastantesimples: Shader "Tutorial/Basic" { Properties { _Color ("Main Color", Color) = (1.0,0.5,0.5,1.0) SubShader { Pass { Material { Diffuse [_Color] Lighting On 12

Esse Shader simples demonstra uma das formas mais simples de se renderizar um objeto da cena. É definida apenas uma propriedade de cor (_Color), cujo valor padrão é especificado atravésdeseuscomponentesrgba.pararenderização,existeumaúnicaopçãodesubshader comumpassoapenas,queatribuiocomponentedifusonapipelinedefunçãofixacomovalor especificadoparaapropriedade_coloreligandoaopçãodeiluminaçãoporvértices. OShaderaseguirdefineumarenderizaçãomaiscompleta,masaindabaseadaemiluminação porvértices: Shader "VertexLit" { Properties { _Color ("Main Color", Color) = (1,1,1,0.5) _SpecColor ("Spec Color", Color) = (1,1,1,1) _Emission ("Emmisive Color", Color) = (0,0,0,0) _Shininess ("Shininess", Range (0.01, 1)) = 0.7 _MainTex ("Base (RGB)", 2D) = "white" { SubShader { Pass { Material { Diffuse [_Color] Ambient [_Color] Shininess [_Shininess] Specular [_SpecColor] Emission [_Emission] Lighting On SeparateSpecular On SetTexture [_MainTex] { constantcolor [_Color] Combine texture * primary DOUBLE, texture * constant Todo Shader deve iniciar com a palavra reservada Shader seguido de uma string que representaseunome.esteseráonomeexibidonajanelainspector.todoocódigodoshader ficarádefinidodentrodeumblocodelimitadopor{. *Éinteressantequeonomesejacurtoedescritivo,nãosendonecessáriocorrespondercom onomedoarquivo.shader; * Para utilizar se submenus, basta que se use o caractere /, por exemplo: um nome "MeusShaders/Teste"iriaserorganizadoemumsubmenunoInspectordeumMaterialcomo MeusShaders >Teste.UmShaderésemprecompostodeumblocodepropriedadesseguido porumoumaisblocosdesubshaders,queserãoexplicadosaseguir. 13

3.1.1 Propriedades As propriedades definidas no bloco inicial de um Shader serão aquelas que podem ser atribuídas através da janela Inspector para os materiais. O exemplo anterior apareceria da seguinteformanoeditordecena: Figure10 PropriedadesdeumShader(UNITYTECHNOLOGIES2009A) A estrutura de uma declaração de uma propriedade é mostrada na figura que segue. O primeiro termo designa o nome interno (referência à variável), enquanto os valores entre parênteses especificam a descrição (para a janela Inspector) e o tipo, respectivamente. O ultimo termo especifica o valor padrão para a propriedade. Encorajamos o leitor a buscar a referência completa sobre tipos de propriedades possíveis no manual de usuário da ferramenta. 3.1.2 SubShaders Figure11 Declaraçãodeumapropriedade(UNITYTECHNOLOGIES2009A) Dispositivos gráficos diferentes possuem capacidades diferentes. Por exemplo, a maioria das placas gráficas atuais dão suporte a Pixel Shaders, mas muitas placas embarcadas em placas mãe baratas não. Algumas suportam 4 texturas em um único passo, enquanto outras suportamapenas2,eassimpordiante.parapermitirofuncionamentodojogoparaqualquer que seja o dispositivo do usuário, um Shader pode conter múltiplos SubShaders. Para renderizar um objeto, a Unity3D passa por todos os SubShaders e usa o primeiro que seja completamentesuportadopelohardwareemuso.ocódigoaseguirilustraaestruturabásica deumshaderdessetipo: 14

Shader "Structure Example" { Properties { /*...shader properties... SubShader { //...subshader com Vertex e Pixel/fragment shaders... SubShader { //...subshader que usa 4 texturas por passo... SubShader { //...subshader que usa 2 texturas por passo... SubShader { //...subshader "feio" mas que roda em qualquer hardware... :) Cada SubShader é composto por uma coleção de passos. Para cada passo, a geometria do objeto é renderizada, portanto ao menos um passo é necessário. O exemplo VertxLit possui apenasumpasso: //... Pass { Material { Diffuse [_Color] Ambient [_Color] Shininess [_Shininess] Specular [_SpecColor] Emission [_Emission] Lighting On SeparateSpecular On SetTexture [_MainTex] { constantcolor [_Color] Combine texture * primary DOUBLE, texture * constant //... Todososcomandosemumpassoconfiguramohardwaregráficopararenderizarageometria de alguma maneira específica. No exemplo acima, o bloco Material vincula as propriedades definidaspeloshadercomosparâmetrosdematerialdosistemadeiluminaçãoemfunçãofixa. O comando Lighting On liga a funcionalidade de iluminação por vértices, enquanto SeparateSpecular On define o uso de uma cor separada para o parâmetro de reflectância especular. Todos esses comandos são mapeados diretamente ao modelo de pipeline de função fixa OpenGL/Direct3D dos dispositivos gráficos. O comando SetTexture é bastante importante, e especificaaformacomoaspropriedadesmapeadasparatexturassãoaplicadasemconjunto 15

com o modelo de iluminação dapipeline. Esse comando é seguido por um bloco contendo a fórmula que define a equação de combinação das texturas para cada pixel/fragmento renderizado.noexemploemquestão: Combine texture * primary DOUBLE, texture * constant Nessecomando,otermotextureéreferenteàcorobtidapelomapeamentodatextura(nesse caso_maintex).estacorémultiplicada(*)pelacorprimária(primary)dovértice,computada pelaequaçãodeiluminaçãodapipelinefixaeposteriormenteinterpoladaparacadapixel.este valoréduplicado(double)paraintensificarailuminação.ovalordetransparência(alpha)é opcionalmente especificado após a vírgula, onde é computado pela multiplicação do valor alpha da textura com a cor constante definida para a pipeline(constantcolor). Diferentes modos de combinação de textura podem ser especificados para a obtenção dos resultados desejados. 3.2 ShaderlabProgramável AUnitypermiteaodesenvolvedorousodeShadersprogramadosnalinguagemCgdaNVidia ou em assembly. Também é possível a criação de Shaders com GLSL caso o jogo seja disponibilizadoapenasparamacosx,umavezqueomóduloderenderizaçãoparawindows usadirectx,quenãosuportatallinguagem. Os Shaders programáveis são incluídos diretamente em uma especificação ShaderLab, substituindo o papel de um passo de renderização em um SubShader. Essa integração é bastante interessante por dois motivos: simplifica a passagem de parâmetros de materiais para esses Shaders; permite a utilização mista de função fixa com Shaders programáveis em um mesmo objeto (com o uso de múltiplo passos de renderização). O código a seguir exemplificacomoumpassoderenderizaçãopodeserespecificadoatravésdeumcódigoem Cg. Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // Código para Vertex e Pixel Shaders (funções vert e frag) ENDCG Oexemploaseguir,umaespecificaçãoShaderLabcompleta,usaainformaçãodanormaldos vérticesparacomporacorexibida.omarcador#pragmavertexvertindicaafunçãoqueserá executada como o Vertex Shader para os objetos que usam desse Shader para renderização. Deformasimilar,pode sedefiniropixelshader. 16

Shader "Debug/Normals" { SubShader { Pass { Fog { Mode Off CGPROGRAM #pragma vertex vert // parâmetros de entrada para o Vertex Shader struct appdata { float4 vertex; float3 normal; ; struct v2f { float4 pos : POSITION; float4 color : COLOR; ; v2f vert (appdata v) { v2f o; o.pos = mul( glstate.matrix.mvp, v.vertex ); o.color.xyz = v.normal * 0.5 + 0.5; o.color.w = 1.0; return o; ENDCG Observa se que nesse exemplo, não foi especificada uma função para o Pixel Shader, que nessecasoseráumaversãopadrãoqueusainterpolaçãoparaexibirascorescomputadaspor essevextexshader.afiguraaseguirmostraoresultadodessecódigoaplicadoaumobjeto. Figure12 Shaderqueexibenormais Da mesma forma que os Shader de função fixa, é possível se passar parâmetros de material quesãoespecificadosnoeditordecena,usartexturas,múltiploscanaisdemapeamentouv, ouqualqueroutraopçãoquesejainteressanteparaseatingirosresultadosdesejados. 17

4 SistemadeFísica A Unity3D utiliza internamente o popular motor de física PhysX da NVidia para efetuar a simulação física de corpos rígidos e o tratamento de colisões. A PhysX é um motor de física utilizado em vários jogos populares tais como Mass Effect, Medal of Honor: Airbone, entre outros,sendoconsideradoumdosmaiscompletosdomercado,inclusivecomapossibilidade deserexecutadoemgpus,oquepodeacarretaremmaiordesempenho.comessaintegração, odesenvolvedortemacessosimplificadoaumsistemadesimulaçãofísicasofisticado.várias dasfuncionalidadesoferecidaspelaphysxsãomanipuladasgraficamenteatravésdainterface daunity,permitindoquesimulaçõesfísicascomplexassejamdesenvolvidasempoucotempo, aumentandoaprodutividadedodesenvolvedor. Colliders Geometrias básicas de colisão tais como esfera, cubo, cápsula, ou precisas como um Mesh Collider, são implementados como componentes para objetos de jogo na Unity. Esses componentes podem ser anexados a um objeto da cena, que passará a fazer parte da simulaçãofísica.osparâmetrosdecadageometriadecolisãoestãodisponíveisparaalteração peloeditordecena. Dessaforma,pode setratarasimulaçãofísicadeváriosobjetosatravésdautilizaçãodeuma geometria envolvente ou, caso necessário, até mesmo da geometria real do objeto, geralmente sendo utilizado em cenários estáticos, que necessitam de fidelidade de representação. Além disso, devido ao fato do cenário ser estático, várias otimizações são efetuadasafimdegarantirumbomdesempenhodasimulação. Além de sua função principal na simulação física, estes componentes também podem ser utilizados como triggers, ou seja, elementos que ativam o processamento de um trecho de 18

código caso ocorra uma colisão com estes. Componentes definidos como triggers não são simuladoscomocomponentesdefísicanormaisduranteasimulação. CharacterController Adicionalmenteaoquejáfoiapresentado,aUnitytambémofereceacessoaumtipoespecial de objeto disponível na PhysX: o Character Controller. Geralmente, o controle preciso de objetos que sofrem ação da física é bastante complicado de ser efetuado durante uma simulação. Um exemplo desse tipo de precisão seria o controle de um personagem. Como sabemos, esse tipo de simulação física é bastante complexo, pois além do tratamento das forças,deve setratartambémoasrotaçõesindesejadas. Uma solução seria simplesmente ignorar a geometria de colisão do personagem, porém adotando essa solução não teríamos a interação do mesmo com os objetos do cenário. UtilizandoocomponenteCharacterController,tem seapossibilidadedecontrolaressetipode objetofacilmente,evitandotodasasoperaçõesindesejadasditasanteriormente,mantendoa interação com os objetos do cenário. Abaixo tem se um exemplo da configuração desse objetoemumpersonagem. Ragdolls Figure13 Componenteparapersonagens Além do Character Controller, tem se também a possibilidade de simular ragdolls com o uso do componente Character Joint. Este componente permite que simulações de personagens inanimados (mortos?) sejam realizadas mais fielmente, tal como um boneco de pano. Utilizando um Wizard, pode se especificar onde encontram se os pivôs de rotação, além de váriosoutrosparâmetrosresponsáveispelasimulaçãodessetipodeobjeto.abaixotemosuma imagemdaconfiguraçãodessetipodesimulação. 19

WheelColliders Figure14 Sistemaderagdoll Um outro recurso bastante útil oferecido pela PhysX através da Unity é um componente especialparasimulaçãodeveículoschamadowheelcollider.comestecomponente,pode se simular força de tração, fricção, entre outras características que ocorrem normalmente em rodasdeveículos.nestecaso,omovimentodocarroéefetuadoatravésdaaplicaçãodeforças nessescomponentes.autilizaçãodestecomponentepermitesimulardesdeforçasdefricção atéocomportamentodeamortecedores,conformepodeserobservadoabaixo. Figure15 WheelColliders Utilizando a hierarquia entre Game Objects da Unity, o movimento de um veículo pode ser simuladofacilmenteatravésdaconfiguraçãohierárquicadestescomponentescorretamente. Joints UmafuncionalidademuitoimportantedisponívelnaUnityéapossibilidadedousodeJoints, oujunções,deváriostiposparaasimulaçãodeobjetosconectadosaoutroscomrestriçõesem seugraudeliberdade.osseguintesjointsestãodisponíveisnaphysxatravésdaunity: 20

HingeJoint:permiteaconexãodedoisobjetosatravésdasimulaçãodeumadobradiça.Ideal paraasimulaçãodeportas,pênduloseoutrosobjetosquenecessitemdestetipodeconexão. Figure16 HingeJoint Spring Joint: permite a conexão de dois abjetos através da simulação de uma mola. Objetos conectados utilizando esse tipo de joint possuem uma distância máxima de separação que, apóssoltos,tendemavoltarasuadistânciaderepouso. Figure17 SpringJoint FixedJoint:permiteaconexãoentredoisobjetosdeformaqueosmovimentosdeumobjeto sejamdependentesdooutro.similarautilizaçãodashierarquiasdetransformaçãodaunity, porém,implementadoatravésdafísica.idealparaobjetosquepossamserdesconectadosum dooutroduranteasimulação. Figure18 FixedJoint Configurable Joint: esse tipo de joint oferece a possibilidade de customização de seu comportamento. Aqui, vários tipos de configuração podem ser efetuadas como restrição de movimento e/ou rotação e aceleração de movimento e rotação. Dessa forma, temos como construirumjointdeacordocomanecessidaderequerida. 21

Por fim, a PhysX nos permite efetuar simulações de superfícies de contatos através dos materiais físicos. Com isso, temos a possibilidade de alterar a forma como os objetos interagem através do ajuste das propriedades dos materiais que estes objetos utilizam tais comofricçãoeoefeitodainteraçãoentreacolisãodedoisobjetos. 5 Scripting OsistemadescriptingdaUnity3Déabrangenteeflexível,oquepermiteodesenvolvimento de jogos completos sem a necessidade do uso de C/C++. Internamente, os scripts são executados através de uma versão modificada da biblioteca Mono, uma implementação de código aberto para o sistema.net. Essa biblioteca, permite que os scripts sejam implementadosemqualquerumadetrêslinguagens,àescolhadoprogramador:javascript,c# ouboo(umdialetodepython).nãoexistepenalidadeporseescolherumalinguagemououtra, sendo inclusive possível se usar mais de uma delas em um mesmo jogo. A documentação oficial,entretanto,utilizajavascriptparaamaioriadosexemplos. De forma consistente à arquitetura desenvolvida, scripts na Unity3D são acoplados como componentes de game objects. Dessa forma, é importante projetar os scripts de maneira modular,ganhandocomissoaflexibilidadedoreuso.nessaseção,iremosdescreveralgumas característicasimportantesdosistemadescriptingdaunity3d. 5.1 Criaçãodescripts Paracriarumscript,bastaescolheraopçãoAssets >Create >Javascriptnomenuprincipal. Também é possível se criar scripts usando o botão direito do mouse sobre a janela project. Existeaopçãodesecriaroscriptemqualquerumadastrêslinguagensdisponíveis. Figure19 Criaçãodeumscript(UNITYTECHNOLOGIES2009A) ÉpossívelseeditaroscriptclicandoduasvezessobreomesmonajanelaProject.Issoiráabrir oeditorpadrão(uniscitenowindowsouunitronnomacosx).aediçãodescriptssempreé 22