tutorial: desenvolvimento de jogos com unity 3d · pdf [email protected] ... de...

30
Tutorial: Desenvolvimento de Jogos com Unity 3D Erick Baptista Passos [email protected] José Ricardo da Silva Jr. [email protected] Fernando Emiliano Cardoso Ribeiro [email protected] Pedro Thiago Mourão [email protected] VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009 1

Upload: hoanglien

Post on 18-Feb-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

Tutorial:DesenvolvimentodeJogoscomUnity3D

[email protected]

José[email protected]

[email protected]

PedroThiagoMourã[email protected]

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

1

Apresentação

Essetutorialéapresentadocomoumabreveintroduçãoaodesenvolvimentodejogoscomo

motor Unity3D. Explicações muito detalhadas, mesmo que cobrindo apenas parte dasfuncionalidades existentes, ocupariambemmais que as três dezenas de páginas disponíveisparaestetutorial.Dessaforma,recomendamosoleitorinteressadoabuscarmaisinformações

naabrangenteeexcelentedocumentaçãoda ferramenta,disponível tanto localmente,aoserealizarasuainstalação,quantoonlineatravésdositehttp://www.unity3d.com/support.

Tambémporquestõesdeespaço,nãofoi incluídauma introduçãogeralaodesenvolvimentodejogos.Espera‐sequeoleitorpossuaalgumafamiliaridadecomosconceitoseferramentas

relacionadosaoassunto taiscomorenderizaçãoemtempo‐real,modelagemeanimação3D,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 formaindependente.

AimagemdacapafoicedidadoprojetoFrançaAntártica,decujaequipededesenvolvimentofazempartealgunsdosautores.O jogoFrançaAntárticaestásendodesenvolvidoatravésda

Unity3DeéumprojetofinanciadopelaSecretariadeCulturadoEstadodoRiodeJaneiro.

Por fim, informa‐se que algumas das figuras e exemplos apresentados foram adaptados domanualdaferramenta,detutoriaisonline(http://www.unity3d.com/resources),bemcomodediscussões disponíveis no forum comunitário de desenvolvedores Unity

(http://forum.unity3d.com). Também recomendamos o leitor que explore essas referênciasparaummaioraprofundamento.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

2

Guiadeleitura

1‐Introdução

BreveapresentaçãodosmódulosdaUnity3Dedetalhamentodainterfacedoeditordecenas.

2‐CriaçãoeManipulaçãodeGameObjects

ExplicaçãodomodelodeobjetosdaUnity3Deasformasbásicasdecriação,composiçãoe

alteraçãodosmesmos.

3‐MateriaiseShaders

BreveintroduçãoàlinguagemdeespecificaçãodeShadersdaUnity3D:ShaderLab.Sãodemonstradosexemplosparapipelinedefunçãofixa,bemcomoShadersprogramáveis.

4‐SistemadeFísica

IntroduçãoaoscomponentesrelacionadosaosubsistemaPhysXdesimulaçãofísica.

5‐Scripting

Apresentação,atravésdeexemplos,dosprincipaisconceitosparaaprogramaçãodescriptscomaUnity3D.

6‐Conclusão

Consideraçõesfinaisdosautores.

Bibliografia

Leiturasrecomendadasparaaquelesinteressadosemummaioraprofundamento.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

3

1‐Introdução

Odesenvolvimentodejogos3Déumaatividadeaomesmotempogratificanteedesafiadora.

Diversashabilidades,dediferentesáreasdoconhecimento,sãonecessáriasnesseprocesso.Ousodeferramentasparaauxiliarnastarefasrepetitivaséfundamentalnessetipodeatividade,eaolongodotempo,umtipoespecialdeferramenta,conhecidocomomotordejogos(game

engine) foi evoluindo de maneira paralela aos próprios jogos, ao ponto que se tornaramprodutosvaliososedecertaformapopulares.

Alguns módulos e funcionalidades auxiliares são condições necessárias para que umaferramenta seja considerada um motor de jogos completo. Em especial, um sistema de

renderização 3D com suporte a Shaders programáveis e um sistemade simulação física sãofundamentais. Uma boa arquitetura para a programação de scripts, um editor de cenasintegrado,eacapacidadedeseimportardiretamentemodelos3d,imagenseefeitosdeáudio

produzidosemferramentasexternas, sãoascaracterísticasexistentesnosmotoresde jogos.Além disso, é desejável que os jogos desenvolvidos possam ser distribuídos em múltiplasplataformascomoPC,consolesoumesmodispositivosmóveis.

AUnity3DabstraidodesenvolvedordejogosanecessidadedeutilizardiretamenteDirectXou

OpenGL (apesar de ainda ser possível, caso necessário), suportando a criação de ShaderscomplexoscomalinguagemCgdaNVidia.Internamente,osubsistemadesimulaçãofísicaéopopularPhysX,tambémdaNVidia.Paraaexecuçãodescripts,aUnityusaumaversãodealto

desempenhodabibliotecaMono,umaimplementaçãodecódigoabertodoframework.NetdaMicrosoft.

Aindaquesejaumaferramentaqueincluioestadodaartenoseusegmento,aUnity3Dtemum preço acessível, o que é apenasmais uma das razões para sua crescente popularidade.

MesmousandoaversãomaisbaratadaUnity3d,os jogospodemserdesenvolvidosparaPC,Mac ou mesmo embutidos em uma páginaWeb. 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 objetivafacilitar 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áticaeaidentificaçãodecadaumadessasjanelasnoeditordecenasdaUnity3D.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

4

Figure1‐InterfacedoeditordecenadaUnity3D(UNITYTECHNOLOGIES2009A)

Projectview

AjanelaProjectéainterfaceparamanipulaçãoeorganizaçãodosváriosarquivos(Assets)que

compõemumprojetotaiscomoscripts,modelos,texturas,efeitosdeáudioePrefabs,osquaisserãodetalhadosmais adiantena seçãode scripting.Aestruturaexibidana janelaProject é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 efetuadasomentedentrodaUnity3D,afimdemanteraintegridadedosmetadadosquesãoassociadosa estes elementos. Entretanto, certasmudanças, como atualização de uma textura por um

editordeimagensporexemplo,oumesmoaadiçãodenovosAssets,podeserfeitadeformaseguradiretamentenosistemadearquivos.

Figure2‐JanelaProject

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

5

Hierarchyview

A janelaHierarchyexibetodososelementosdacenaqueencontram‐senacenaqueseestá

editando. Além disso, nessa janela podemos organizar e visualizar a hierarquia de decomposiçãoentreosváriosobjetosquecompõemacena (grafodecena).O funcionamentodessesobjetos,bemcomoahierarquiadetransformaçãoseráexplicadomaisdetalhadamente

napróximaseção.

Figure3‐JanelaHierarchycomdoisobjetos

Sceneview

AjanelaSceneéaformaprincipaldemanipulaçãodoselementosvisuaisnoeditordecenasda

Unity, possibilitando a orientação e posicionamento desses elementos com um feedbackimediatodoefeitodasalteraçõesefetuadas.Nestajanela,pode‐semanipulargraficamenteosobjetosatravésdasopçõesdearrastaresoltarcomomouse.Essamanipulaçãoésemelhante

àquela de ferramentas demodelagem 3D e pode‐semanipular objetos tais como câmeras,cenários,personagensetodososelementosquecompõemacena.

Devidoasuagrandeimportânciaduranteodesenvolvimentodeumaaplicação,váriasformasdenavegaçãosãooferecidasafimdeaumentaraindamaisaprodutividadedodesenvolvedor.

Além disso, as ferramentas básicas demanipulação dos elementos da cena, tais comopan,translação,rotaçãoeescalatambémestãodisponíveisparautilizaçãonestajanelaatravésdeatalhosdeteclado(teclasQ,W,EeR).

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

6

Figure4‐JanelaScene

Gameview

A janelaGame é responsável pela visualização da aplicação em desenvolvimento da forma

queelaseráexibidaquandofinalizada.Nessajanela,pode‐serapidamenteterumapréviadecomooselementosestãosecomportandodentrodaaplicação.Alémdisso,aUnityforneceaopçãodeseparalisar(botãopause)asimulaçãoenquantoelaestiveremdepuração,deforma

a possibilitar que os parâmetros dos vários elementos possam ser ajustados paraexperimentação.Lembramosqueoajustedessesparâmetrosnãonecessitamqueasimulaçãoestejaparalisada,podendoseralteradosinclusiveenquantoasimulaçãoestejaemexecução.

Nesta janela, também pode‐se visualizar várias informações estatísticas (stats) sobre a

simulação,taiscomotempodeprocessamentoenúmerodeframesporsegundo,númerodetriâ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

Najanela Inspector, tem‐seacessoaosváriosparâmetrosdeumobjetopresentenocenário,bem como aos atributos de seus componentes (Components). Essa estrutura utilizada pelaUnityparaacomposiçãodeobjetosserámelhorexplicadanapróximaseção.Aindanajanela

Inspector, pode‐seajustarosatributospúblicos (parâmetros)de cada componente, inclusiveduranteaexecuçãodaaplicação.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

7

Figure5‐JanelaInspector

2‐CriaçãoeManipulaçãodeGameObjects

Muitosmotoresdejogosdegeraçãoanteriordisponíveisnomercadosãobaseadosnousodeespecialização/herançaparaasclassesqueirãorepresentarobjetosdejogo.Nestaarquitetura,oselementosdeumjogoherdamdeumaclassebásica(normalmentealgocomoGameObject)

e as novas funcionalidades são acrescentadas. Assim como em outras categorias dedesenvolvimentodesoftwareorientadoaobjetos,ousodemasiadodeherançanessetipodesituaçãotornou‐seobsoleto,principalmenteporsuapoucaflexibilidadequandoosobjetosde

jogopossuemmúltiploscomportamentos,oqueexigiriaherançamúltipla.

A Unity3D é baseada em ummodelomaismoderno para a arquitetura de objetos de jogobaseadoemcomposição[Bilas2002,Stoy2006,Passosetal.2008].Nessemodelo,umobjetodejogoéespecificadoatravésdacomposiçãodeváriasfuncionalidades,quesãoagregadas(ou

removidas). Cada funcionalidadeé implementadapor um componente (classequeherdadeumcomponentebásico).EssecontainergenéricoaindaédenominadoGameObjectefuncionacomoumrepositóriodefuncionalidades,oumaisespecificamente,componentes.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

8

Oscomponentessãoentãoresponsáveispor implementarosdiversoscomportamentos que

umGame Object pode ter. Um componente pode ser desde um script, uma geometria decolisão,ouatéumatexturadeGUI.Ouseja,GameObjectspodemrepresentarqualquercoisanocenário,sendocaracterizadoscomoumasimplescâmeraouumpersonagemapenaspelos

diferentes componentes que agrega. Conforme observado no manual de usuário da Unity(traduçãolivre):“GameObjectéumapanelavaziaeoscomponentessãoosingredientesqueirãocriarsuareceitadejogabilidade”.

Abaixo apresentamos a estrutura de umGame Object padrão que representa uma câmera

virtual. Nessa figura, a câmera é umGameObject, porém, só é definida como câmera poispossui um componente com essa funcionalidade. Além disso, possui os componentesauxiliaresGUILayer,FlareLayereAudioListener.

Figure6‐ComposiçãodeumGameObject(Camera)

UmaobservaçãoimportantesobreosGameObjectséquetodoselesjápossuempelomenosocomponenteTransform,responsávelpeloseuposicionamento,orientaçãoeescalanosistema

referencialdacena.Alémdisso,essecomponenteéresponsávelpeladefiniçãodahierarquiadetransformações,permitindooefeitodetransformaçãorelativadeacordocomaestruturadeascendência/descendênciadecadaGameObject.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

9

Figure7‐Estruturamínimadeumobjeto

Na Unity também temos o conceito de Prefab. Um Prefab é simplesmente ummodelo de

composiçãodeGameObject jádefinido,oumaisprecisamente,umtemplatequedefineumelemento através da composição dos vários componentes. Podemos citar, por exemplo, adefiniçãodeumhumanóidequenecessitadeumscriptdemovimentaçãoeumcomponente

decolisão.Nessecaso,poderíamoscriarumPrefabdessehumanóideecriarváriascópiasdomesmo, inclusivecomparâmetrosdiferentes.Dessaforma,temosumganhoconsiderávelde

tempopois issoevitariaque tivéssemosque recriar essa composiçãopara cada instanciadehumanóidepresentenocenário.Prefabsserãomaisdetalhadosnaseçãosobrescripting.

ImportaçãodeAssets

Geralmente,grandepartedodesenvolvimentodeumjogoestárelacionadocomautilizaçãoemanuseiodeAssetstaiscomotexturas,modelos3D,efeitosdesomescripts.Essesdiferentes

tiposdeartefatos sãodesenvolvidosem ferramentasexternas,especializadosna construçãodecadaumdostiposdeAssets.Apóssuacriaçãoouedição,Assetsprecisam,dealgumaforma,seremimportadosparadentrodeeditordecenasdomotordejogos.

AUnitypossuiumaformamuitosimpleserobustadeimportaçãodeAssetsparadentrodeum

projeto, bastando que os mesmos sejam “arrastados” para dentro de uma pasta da janelaProject.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émofereceapossibilidadedavisualizaçã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 paradentro da Unity a cada vez que desejarmos efetuar uma alteração. A Unity verifica cadaarquivomodificadoeautomaticamenteatualizaomesmonacena.

3‐MateriaiseShaders

Jogos3Dnormalmentepossuemumgrandeapelovisual,ondeacriatividadeecapacidadedos

artistas realiza um papel fundamental para o sucesso. Atualmente, os dispositivos gráficospermitemo uso de soluções sofisticadas para a exibição em tempo real dasmalhas 3D doselementosdeumacena.Emespecial,faz‐seonipresenteousodeShadersprogramáveis.

OmotordejogosUnity3DpermitetantoacriaçãodeShadersemlinguagensdeprogramação

comoCg ouGLSL, quanto o uso de função fixa, alémde incluir uma versátil coleção desses

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

10

Shadersnainstalaçãopadrão.OvinculoentreumShadereumamalha3Dsefazatravésdeum

Material, que funciona comoumcontainerparaaspropriedadesvisuaisque cadaobjetodacenapossui.AfiguraaseguirmostracomoaatribuiçãodessaspropriedadespodeserfeitanajanelaInspectordentrodoeditordecenas.

Figure8‐ManipulaçãodeumMaterial

AespecificaçãodeumShaderdefinequaissãoaspropriedadesqueestenecessitapararealizar

a exibição do objeto, enquanto o Material define os valores para essas propriedades. Apró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,especificadapeloShader, é atribuída coma cor vermelha, enquantonooutroéusadaa corazul.Dessaforma,pode‐seaplicaressesdiferentesmateriaisaobjetosnacena,comoilustrado

nafigura.

Figure9‐Relaçnaoentreshaders,materiaiseobjetos

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

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.UmavezcriadooMaterial,pode‐seaplicá‐loaumobjetoeexperimentar‐sealterarosvaloresdesuaspropriedades. Para aplicar umMaterial a um objeto, basta de arrastar o mesmo da janela

ProjectparaqualquerobjetonacenaounajanelaHierarchy.

ParaaespecificaçãodeShaders,tantodefunçãofixaquantoprogramáveis,aUnity3Dpossuiuma linguagem própria chamada ShaderLab, que possui alguma semelhança com osarquivos.FXdefinidosparaoMicrosoftDirectXouaespecificaçãoNVidiaCgFX.Essalinguagem

declarativapossuiumasintaxesimplese incluicapacidadespoderosascomoreuso,múltiplospassos, criação procedural de texturas, entre outras.Nas próximas seções será apresentadaumabreveintroduçãoaessalinguagem.

3.1‐IntroduçãoaShaderLab

ParasecriarumnovoShader,pode‐seescolherAssets‐>Create‐>Shaderdomenuprincipal,ou

duplicarumexistenteetrabalharapartirdomesmo.ShadersnaUnity3Dsãoarquivosdetextoepodemsereditadosfazendo‐seumduplo‐cliquenosmesmosnajanelaProject.IniciaremosaexplicaçãocomumShaderbastantesimples:

Shader "Tutorial/Basic" { Properties { _Color ("Main Color", Color) = (1.0,0.5,0.5,1.0) } SubShader { Pass { Material { Diffuse [_Color] } Lighting On } } }

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

12

EsseShader simplesdemonstraumadas formasmaissimplesdeserenderizarumobjetoda

cena. É definida apenas uma propriedade de cor (_Color), cujo valor padrão é especificadoatravésdeseuscomponentesRGBA.Pararenderização,existeumaúnicaopçãodeSubShadercomumpassoapenas,queatribuiocomponentedifusonapipelinedefunçãofixacomovalor

especificadoparaapropriedade_Coloreligandoaopçãodeiluminaçãoporvértices.

OShaderaseguirdefineumarenderizaçãomaiscompleta,masaindabaseadaemiluminaçãoporvé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ódigodoShaderficarádefinidodentrodeumblocodelimitadopor{}.

*Éinteressantequeonomesejacurtoedescritivo,nãosendonecessáriocorrespondercomonomedoarquivo.shader;

* Para utilizar‐se submenus, basta que se use o caractere /, por exemplo: um nome

"MeusShaders/Teste"iriaserorganizadoemumsubmenunoInspectordeumMaterialcomoMeusShaders‐>Teste.UmShaderésemprecompostodeumblocodepropriedadesseguidoporumoumaisblocosdeSubShaders,queserãoexplicadosaseguir.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

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 daseguinteformanoeditordecena:

Figure10‐PropriedadesdeumShader(UNITYTECHNOLOGIES2009A)

A estrutura de uma declaração de uma propriedade é mostrada na figura que segue. Oprimeiro 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. Oultimo termoespecifica o valor padrãopara a propriedade. Encorajamoso leitor a buscar areferência completa sobre tipos de propriedades possíveis no manual de usuário da

ferramenta.

Figure11‐Declaraçãodeumapropriedade(UNITYTECHNOLOGIES2009A)

3.1.2‐SubShaders

Dispositivosgráficosdiferentespossuemcapacidadesdiferentes.Porexemplo,amaioriadas

placasgráficasatuaisdãosuporteaPixelShaders,masmuitasplacasembarcadasemplacasmãe baratas não. Algumas suportam 4 texturas em um único passo, enquanto outrassuportamapenas2,eassimpordiante.Parapermitirofuncionamentodojogoparaqualquer

que seja o dispositivo do usuário, um Shader pode conter múltiplos SubShaders. Pararenderizar um objeto, a Unity3D passa por todos os SubShaders e usa o primeiro que sejacompletamentesuportadopelohardwareemuso.Ocódigoaseguirilustraaestruturabásica

deumShaderdessetipo:

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

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 doobjetoé renderizada, portantoaomenosumpassoénecessário.OexemploVertxLit possuiapenasumpasso:

//... 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áficopararenderizarageometriade algumamaneira específica.No exemplo acima, o blocoMaterial vincula as propriedades

definidaspeloShadercomosparâmetrosdematerialdosistemadeiluminaçãoemfunçãofixa.O comando Lighting On liga a funcionalidade de iluminação por vértices, enquantoSeparateSpecular 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 fixaOpenGL/Direct3D dos dispositivos gráficos.O comando SetTexture é bastante importante, eespecificaaformacomoaspropriedadesmapeadasparatexturassãoaplicadasemconjunto

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

15

comomodelode iluminaçãodapipeline.Essecomandoéseguidoporumblococontendoa

fórmula que define a equação de combinação das texturas para cada pixel/fragmentorenderizado.Noexemploemquestão:

Combine texture * primary DOUBLE, texture * constant

Nessecomando,otermotextureéreferenteàcorobtidapelomapeamentodatextura(nessecaso_MainTex).Estacorémultiplicada(*)pelacorprimária(primary)dovértice,computada

pelaequaçãodeiluminaçãodapipelinefixaeposteriormenteinterpoladaparacadapixel.Estevaloréduplicado(DOUBLE)paraintensificara iluminaçã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). Diferentesmodos de combinação de textura podem ser especificados para a obtenção dos resultadosdesejados.

3.2‐ShaderlabProgramável

AUnitypermiteaodesenvolvedorousodeShadersprogramadosnalinguagemCgdaNVidia

ou em assembly. Também é possível a criação de Shaders com GLSL caso o jogo sejadisponibilizadoapenasparaMacOSX,umavezqueomóduloderenderizaçãoparaWindowsusaDirectX,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 materiaisparaessesShaders;permiteautilizaçãomistade função fixa comShaders programáveisem

um mesmo objeto (com o uso de múltiplo passos de renderização). O código a seguirexemplificacomoumpassoderenderizaçãopodeserespecificadoatravésdeumcódigoemCg.

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çãodanormaldosvérticesparacomporacorexibida.Omarcador#pragmavertexvertindicaafunçãoqueseráexecutadacomooVertexShaderparaosobjetosqueusamdesseShaderpararenderização.

Deformasimilar,pode‐sedefiniroPixelShader.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

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çãoparaexibirascorescomputadasporesseVextexShader.Afiguraaseguirmostraoresultadodessecódigoaplicadoaumobjeto.

Figure12‐Shaderqueexibenormais

Damesma formaqueosShaderde função fixa,épossível sepassarparâmetrosdematerialquesãoespecificadosnoeditordecena,usartexturas,múltiploscanaisdemapeamentoUV,

ouqualqueroutraopçãoquesejainteressanteparaseatingirosresultadosdesejados.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

17

4‐SistemadeFísica

A Unity3D utiliza internamente o popular motor de física PhysX da NVidia para efetuar a

simulação físicade corpos rígidoseo tratamentode colisões.APhysX éummotorde físicautilizado em vários jogos populares tais comoMass Effect,Medal of Honor: Airbone, entreoutros,sendoconsideradoumdosmaiscompletosdomercado,inclusivecomapossibilidade

deserexecutadoemGPUs,oquepodeacarretaremmaiordesempenho.Comessaintegração,odesenvolvedortemacessosimplificadoaumsistemadesimulaçãofísicasofisticado.VáriasdasfuncionalidadesoferecidaspelaPhysXsãomanipuladasgraficamenteatravésdainterface

daUnity,permitindoquesimulaçõesfísicascomplexassejamdesenvolvidasempoucotempo,aumentandoaprodutividadedodesenvolvedor.

Colliders

Geometrias básicas de colisão tais como esfera, cubo, cápsula, ou precisas como umMeshCollider, 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 dasimulaçãofísica.Osparâmetrosdecadageometriadecolisãoestãodisponíveisparaalteraçãopeloeditordecena.

Dessaforma,pode‐setratarasimulaçãofísicadeváriosobjetosatravésdautilizaçãodeumageometria 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ãoefetuadasafimdegarantirumbomdesempenhodasimulação.

Além de sua função principal na simulação física, estes componentes também podem serutilizados como triggers, ou seja, elementos que ativam o processamento de um trecho de

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

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émofereceacessoaumtipoespecialde objeto disponível na PhysX: o Character Controller. Geralmente, o controle preciso deobjetos 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. Comosabemos, esse tipo de simulação física é bastante complexo, pois além do tratamento dasforç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‐seapossibilidadedecontrolaressetipodeobjetofacilmente,evitandotodasasoperaçõesindesejadasditasanteriormente,mantendoa

interação com os objetos do cenário. Abaixo tem‐se um exemplo da configuração desseobjetoemumpersonagem.

Figure13‐Componenteparapersonagens

Ragdolls

AlémdoCharacterController, tem‐se tambémapossibilidadedesimular ragdolls comouso

do componente Character Joint. Este componente permite que simulações de personagensinanimados (mortos?) sejam realizadas mais fielmente, tal como um “boneco de pano”.Utilizando umWizard, pode‐se especificar onde encontram‐se os pivôs de rotação, alémde

váriosoutrosparâmetrosresponsáveispelasimulaçãodessetipodeobjeto.Abaixotemosumaimagemdaconfiguraçãodessetipodesimulação.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

19

Figure14‐Sistemaderagdoll

WheelColliders

Um outro recurso bastante útil oferecido pela PhysX através da Unity é um componenteespecialparasimulaçãodeveículoschamadoWheelCollider.Comestecomponente,pode‐sesimular força de tração, fricção, entre outras características que ocorrem normalmente em

rodasdeveículos.Nestecaso,omovimentodocarroéefetuadoatravésdaaplicaçãodeforçasnessescomponentes.Autilizaçãodestecomponentepermitesimulardesdeforçasdefricçãoatéocomportamentodeamortecedores,conformepodeserobservadoabaixo.

Figure15‐WheelColliders

Utilizando a hierarquia entreGameObjects daUnity, omovimento de um veículo pode ser

simuladofacilmenteatravésdaconfiguraçãohierárquicadestescomponentescorretamente.

Joints

Umafuncionalidademuito importantedisponívelnaUnityéapossibilidadedousodeJoints,oujunções,deváriostiposparaasimulaçãodeobjetosconectadosaoutroscomrestriçõesemseugraudeliberdade.OsseguintesJointsestãodisponíveisnaPhysXatravésdaUnity:

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

20

HingeJoint:permiteaconexãodedoisobjetosatravésdasimulaçãodeumadobradiça.Ideal

paraasimulaçãodeportas,pênduloseoutrosobjetosquenecessitemdestetipodeconexão.

Figure16‐HingeJoint

Spring Joint:permiteaconexãodedoisabjetosatravésdasimulaçãodeumamola.Objetosconectados utilizando esse tipo de joint possuem uma distânciamáxima de separação que,apóssoltos,tendemavoltarasuadistânciaderepouso.

Figure17‐SpringJoint

FixedJoint:permiteaconexãoentredoisobjetosdeformaqueosmovimentosdeumobjetosejamdependentesdooutro.SimilarautilizaçãodashierarquiasdetransformaçãodaUnity,

porém,implementadoatravésdafísica.Idealparaobjetosquepossamserdesconectadosumdooutroduranteasimulaçã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 demovimento e/ou rotação e aceleração demovimento e rotação. Dessa forma, temos comoconstruirumjointdeacordocomanecessidaderequerida.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

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 objetosinteragem através do ajuste das propriedades dosmateriais que estes objetos utilizam taiscomofricçãoeoefeitodainteraçãoentreacolisãodedoisobjetos.

5‐Scripting

OsistemadescriptingdaUnity3Déabrangenteeflexível,oquepermiteodesenvolvimento

de jogos completos sem a necessidade do uso de C/C++. Internamente, os scripts sãoexecutados através de uma versãomodificada da bibliotecaMono, uma implementação decó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 comocomponentes de game objects. Dessa forma, é importante projetar os scripts de maneiramodular,ganhandocomissoaflexibilidadedoreuso.Nessaseção,iremosdescreveralgumas

característicasimportantesdosistemadescriptingdaUnity3D.

5.1‐Criaçãodescripts

Paracriarumscript,bastaescolheraopçãoAssets‐>Create‐>Javascriptnomenuprincipal.Tambémé possível se criar scripts usandoo botão direito domouse sobre a janelaproject.Existeaopçãodesecriaroscriptemqualquerumadastrêslinguagensdisponíveis.

Figure19‐Criaçãodeumscript(UNITYTECHNOLOGIES2009A)

ÉpossívelseeditaroscriptclicandoduasvezessobreomesmonajanelaProject.Issoiráabriroeditorpadrão(UniScitenoWindowsouUnitronnoMacOSX).Aediçãodescriptssempreé

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

22

feita emumprograma externo e não diretamente pelaUnity3D, que pode ser alterado nas

preferênciasdeusuário.EsseéoconteúdodeumJavascriptrecem‐criadonaUnity3D:

function Update () { }

Um script novo não realiza tarefa alguma ainda, então pode‐se adicionar funcionalidade aomesmo.Ocódigoaseguirservecomoumexemplobásico:

function Update () { print("Hello World"); }

Aoserexecutado,essecódigoiráexibiraexpressão"HelloWorld"noconsole.Masaindanãoexistenadaquecausaaexecuçãodessecódigo.ÉnecessárioseacoplaressescriptaumGameObjectativonacenaparaqueissoocorra.Issopodeserfeitosearrastandooarquivodoscript

paraoobjeto escolhido tantona janelaHierarchy, quantodiretamente aomesmona janelaScene. Tambémpode‐se selecionar o objeto escolhido e adicionar o script através domenuprincipal,comomostraafiguraaseguir.

Figure20‐Adiçãodeumscriptaumobjetoselecionado(UNITYTECHNOLOGIES2009A)

Ao se selecionar o objeto ao qual o script recém‐criado foi adicionado, será possível sevisualizaromesmo,indicandosuacorretavinculação.

Figure21‐Scriptvinculadoaobjeto(UNITYTECHNOLOGIES2009A)

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

23

Afunçãoprint()ébastanteútilquandoseestádepurandoumscript,masnãofaznadadeútil

emtermosde jogabilidade.Ocódigoa seguiradicionaalguma funcionalidadeaoobjetoquecontémoscript:

function Update () { transform.Rotate(0, 5*Time.deltaTime, 0); }

Para quem é novo em linguagens de script para jogos, o código pode parecer um pouco

confuso.Algunsconceitosimportantesquedevemseraprendidos:

1.functionUpdate(){}éasobrescritadométodoUpdate,queseráexecutadopelaUnity3Dumavezacadaframe;

2.transforméumareferênciaaocomponenteTransformdoGameObjectemquestão.

3.Rotate()éummétodoexistentenocomponenteTransform;

4.Osparâmetrosdessemétodorepresentamosgrausderotaçãosobrecadaumdoseixos

emumespaço3D:X,Y,andZ.

5. Time.deltaTime é um atributo da classe Time que representa o tempo que passou (emsegundos)desdequeoúltimoUpdateocorreu.Essavariávelserveparagarantirqueoobjetoem questão seja rotacionado na mesma velocidade, independente da capacidade de

processamento do computador no qual o código será executado. Dessa forma, 5 *Time.deltaTimerepresenta5grausporsegundo.

Já existem referências como essa para alguns componentes que são comuns de seremutilizadosemobjetos.Algunsdosmaisimportantessão:

• transform‐representaoposicionamento,orientaçãoeescaladoobjeto;

• rigidbody‐representaocorporígidoparaosub‐sistemadefísica(quandoexistir);• animation ‐ utilizadoparaacionaros ciclosdeanimaçãodeummodelo criadoemuma

ferramentadeanimaçãocomoo3DStudioMax;

• renderer‐componenteencarregadodaexibiçãodeumobjetonacena;• audio‐fontedeefeitodeáudio,vinculadaaumobjetopara incorporarposicionamento

deáudio3D;

• collider‐geometriadecolisãoparaosubsistemadefísicaouparautilizaçãocomoTrigger.

5.2‐Acessoaoutroscomponentesetrocademensagens

Entretanto, muitos outros componentes pré‐existentes, assim como Scripts criadosespecificamente para cada jogo, não têm referências especiais incluídas. Para esses, énecessária algumamaneira de se obter uma referência em tempode execução. Isso é feito

atravésdométodoGetComponent()existenteemqualquerscript.Essemétodopodeserusadopara se obter a referência a qualquer componente vinculado ao objeto no qual o script emquestãoestáacoplado(ouaqualquerobjetoquesetenhaumareferênciaemumavariável).O

exemploaseguirmostracomoobterareferênciaaumscriptchamado"Controlador":

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

24

var c : Controlador = GetComponent(Controlador); c.MeuMetodo();

Nesse exemplo, a variável "c" foi usada para se guardar a referencia a instância do script

Controlador vinculado aomesmo objeto de jogo em questão. Em seguida, foi executado ométodo"MeuMétodo"nessamesmainstância.

É sempre preferível, por questões de desempenho, guardar referências aos componentes

comoexemplificadoacima. Entretanto, existem situaçõesondepode serdesejável seenviaruma determinada mensagem a todos os componentes de um determinado objeto. Isso épossível através do método SendMessage da classeGameObject. Todo script tem acesso à

instância deGameObject ao qual está vinculado. O seguinte exemplo tenta executar (casoexista)ométodo"Teste"emtodososcomponentesdoobjetoaoqualessescriptforvinculado:

gameObject.SendMessage("Teste");

UmexemplocomumparaousodeSendMessageéaaplicaçãode"dano"aumpersonagemque foi atingido por uma bala, bomba, ou qualquer outro objeto do jogo que possa causar

algum efeito desse tipo. A solução pode ser criar esse projétil como um objeto comcomponentes de física (collider e rigidbody), e incluir um script simples que envia umamensagemassimqueesseprojétilatingiralgonacena:

function OnCollisionEnter(collision : Collision) { collision.gameObject.SendMessage("AplicarDano"); Destroy(this.gameObject); }

Ocódigoacima seráexecutadoassimqueoprojétil (objeto contendo representação físicaeesse script) colidir com outro objeto com física na cena. Amensagem enviada irá causar a

execuçãodométodo"AplicarDano"emtodososscriptsdoobjetoatingido,casoessemétodoexista.Alinhaseguinteremoveoprojétildacena.

5.3‐Acessoavariáveis

Osscriptsderotaçãoapresentadosatéagoragiramoobjeto5grausacadasegundo.Talvezseja interessante rotacionar aumavelocidadeangular diferentedessa.Umaopçãoé alterar

esse valor no código e salvá‐lo, mas exige uma recompilação desse, aomesmo tempo queimpedequeusemosomesmoscriptcomdiferentesvelocidades.Existeumaformabemmaisrápida para isso, que inclusive permite a alteração de parâmetros como esse em tempo de

execuçãonoeditordecena,eébastantesimplesdeserimplementada.

Em vez de digitar o valor 5 diretamente, pode‐se criar um atributo speed, do tipo float, noscripteusaressenachamadaaométodoRotate().Oexemploaseguirmostracomoissopodeserfeito:

var speed = 5.0; function Update () { transform.Rotate(0, speed*Time.deltaTime, 0); }

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

25

Agoraobserveoobjeto contendoo script na janela Inspector. Pode‐senotarqueo valordo

atributoaparecenoeditordecena,comomostraafiguraaseguir.

Figure22‐Alteraçãodovalordeumatributo(UNITYTECHNOLOGIES2009A)

EstevalorpodeagorasermodificadodiretamentepelajanelaInspector,damesmaformaque

pode‐serenomearumarquivo.Selecionando‐seamesma,pode‐sealterarseuvalor.Tambémpode‐sedeslizaros valores comomouseusandoobotãodireito.Pode‐sealterarovalordeatributoscomoesseaqualquermomento,inclusiveenquantoojogoestásendoexecutado.

Ao apertar o botão Play e modificar‐se o valor desse atributo, a velocidade de rotação do

objeto irá ser alterada instantaneamente.Ao se sairdomododeexecução,o valor voltaaoanterior. Dessa forma, pode‐se experimentar a vontade e ao final decidir manter o valoranterioroualterá‐lodeformapermanente(semobotãoPlaypressionado).

Essa formadealteraçãode valoresematributos também implicaqueépossível seusarum

mesmo script em diversos objetos, cada um com um valor específico para omesmo. Cadaalteraçãofeitairáafetaravelocidadeapenasdoobjetonoqualamudançafoirealizada.

5.4‐PrefabseInstanciação

A criação de game objects através de composição é bastante flexível, mas em algunsmomentospodeserbastantetrabalhosorecriarcertasdessascomposiçõesqueprecisamser

usadasemdiversascenasdeummesmojogo,compartilhadascomoutrosdesenvolvedoresoumesmoinstanciadasinterativamenteduranteaexecuçãodojogo.

Um Prefab é um tipo de asset ‐ um Game Object reusável armazenado na janela Project.Prefabs podem ser inseridos em diversas cenas,múltiplas vezes em cada uma delas. Ao se

adicionar um Prefab a uma cena, está sendo criada uma instância do mesmo. Todas essasinstâncias estão ligadas ao Prefab original e são no fundo clones desse. Independente dequantasinstânciasexistamnoprojeto,qualquermudançafeitaaoPrefaboriginalseráaplicada

atodasessascópiasexistentesnascenas.

ParasecriarumPrefab,éprecisocriarumcontainervazioparaomesmousandoomenu.EssePrefabvazionãocontémumGameObjectainda,eportantonãopodeserinstanciadonacena

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

26

ainda.ApósserrecheadocomdadosdeumGameObject,issopodeserfeito.Afiguraaseguir

mostraumPrefab recém‐criado,aindasemconteúdo (indicadopelaausênciadecoremseunomenajanelaProject).

Figure23‐CriaçãodeumPrefab(UNITYTECHNOLOGIES2009A)

Parapreencherumprefab,deveserusadoalgumobjetoexistentenacenaatual.Oseguinteroteiroexplicacomoesseprocessopodeserrealizado:

1.EscolhaAssets‐>Create‐>Prefabnomenuprincipaledêumnomeaomesmo;

2.NajanelaHierarchy,selecioneoGameObjectquesedesejaguardarcomoumPrefab;

3.ArrasteesolteesseobjetodajanelaHierarchysobreonovoPrefabnajanelaProject.

Após realizados esses passos, o objeto, todos os seus "filhos", componentes e valores deatributos foram copiados noPrefab. Agora é possível se criar diversas instâncias domesmo

arrantando‐separacenaapartirdajanelaHierarchy.OpróprioobjetousadoparaacriaçãodoPrefabfoitransformadoemumainstânciadomesmo.

Todas as instânciasdeumPrefab possuemamesmaestruturae, originalmente, osmesmosvalores para os atributos de seus componentes. Entretanto, é possível alterar diversas

instâncias, ainda vinculadas aoPrefab original, os valores de alguns atributos. As alteraçõesfeitasaoPrefabaindaserãopropagadasparaessas instâncias,apenasosatributosmarcadoscomoespecíficos terão seus valoresmantidos. A seguinte figuramostra esse procedimento,

que consiste em se marcar a caixa que fica a esquerda do nome do atributo, na janelaHierarchy (noexemploemquestão,oatributodenomeRepeatTriggernãoseráalteradodeacordocomasmodificaçõesnoPrefab).

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

27

Figure24‐AtributodesvinculadodoPrefab(UNITYTECHNOLOGIES2009A)

Emdiversassituaçõespodesernecessáriose instanciarobjetosemtempodeexecução.Um

exemploque ilustraessecenáriopodeseracriaçãode foguetesquesão lançadosquandoojogadorpressionaumateclaoubotão.Prefabssãoumaferramentaútilnessassituações,poisacriaçãodecópiasdosmesmosatravésdescriptsébastantesimples,comoexplicadoaseguir.

AprimeiratarefaéacriaçãodeumPrefabcontendooscomponentesevalorescalibradospara

osatributosdesejadosparaoreferidofoguete.Nãoiremosentraremdetalhessobreacriaçãodafuncionalidadedofogueteemsi,esimcomoprocessodeinstanciaçãodomesmo.ParaseterareferênciaaumPrefabatravésdeumscript,bastaquesecrieumatributocujotiposeja

umdoscomponentesexistentesnessePrefab.Nonossoexemplo,ofogueteseráguiadopelosistema de simulação física, e conseqüentemente um dos componentes do mesmo é um

Rigidbody,dessaformaoscriptdeinstanciaçãodeveincluiraseguintelinha:

var rocket : Rigidbody;

IssoirápermitiraodesenvolvedorarrastaroPrefabdofoguetediretamentedajanelaProject

paraajanelaHierarchydeformaaestabelecerareferêncianecessária.Ocódigoaseguircriauma instância do foguete em tempo de execução, ao mesmo tempo que adiciona umavelocidadeinicialaomesmo,referenteàorientaçãodoobjetoqueocriou:

var r : Rigidbody = Instantiate(rocket, transform.position, transform.rotation); rocket.velocity = transform.forward * speed;

ÉimportanteobservarqueocódigoacimaindependedaestruturautilizadaparaoPrefabquerepresentao foguete,desdequeomesmo incluaumcomponenteRigidbody. Issopermitea

criaçãodeprotótipossimplesefuncionaisbemantesdaexistênciadeAssetsdefinitivoscomomodelos3Dousistemasdepartículas.Osscriptscriadosinicialmenteaindaserãopossíveisdese usar mesmo com a evolução desse Prefab para uma versão mais bem acabada para a

representaçãodessefoguete.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

28

6‐Conclusão

EssetutorialapresentouumintroduçãosucintasobreomotordejogosUnity3D.Oobjetivofoi

expor de maneira simplificada as principais funcionalidades dessa versátil ferramenta dedesenvolvimento de jogos. Espera‐se que o leitor interessado busque um maioraprofundamentonesseassuntoatravésdabibliografiasugeridanofinaldessetutorial.

Osautoresgostariamdeagradeceràspessoasquediretaouindiretamentecontribuírampara

a confecção desse material. Em especial gostaríamos de agradecer às nossas famílias, pelapaciência e apoio incondicional, e também à excelente comunidade de desenvolvedores ecolaboradoresUnitypelasexcelentesinformaçõesetutoriaisdisponibilizados.

Finalmente,osautoresgostariamdeagradecerosleitoresdessetutorialeinformarqueatoda

aequipedoUFF‐MediaLabsecolocaàdisposiçãoparacontatoatravésdosemailsinformadosnacapa.

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

29

Bibliografia

BILAS,S.2002.Adata‐drivengameobjectsystem.TalkattheGameDevelopersConference’02.

PASSOS, E. B., SILVA, J., NASCIMENTO, G. T., KOZOVITS, L. CLUA, E. W. G. 2008. Fast and safe

prototypingofgameobjectswithdependencyinjection.AnaisdoSimpósioBrasileirodeGameseEntretenimentoDigital.SãoLeopoldo,RS.2008

STOY,C.2006.Gameobjectcomponentsystem. InGameProgrammingGems6,CharlesRiverMedia,M.Dickheiser,Ed.,Páginas393a403.

UNITY TECHNOLOGIES. 2009 (A). Unity 3D User Manual [online]. Disponível em:

www.unity3d.com/support/documentation/Manual[Acessadoem20agostode2009].

UNITY TECHNOLOGIES. 2009 (B). Unity 3D Community Forum [online]. Disponível em:forum.unity3d.com/[Acessadoem25agostode2009].

UNITY TECHNOLOGIES. 2009 (C). Unity 3D Online Tutorials [online]. Disponível em:www.unity3d.com/support/documentation/tutorials[Acessadoem30agostode2009].

UNIFY COMMUNITY. 2009. Unity 3D Community Wiki [online]. Disponível em:

www.unifycommunity.com/wiki[Acessadoem28agostode2009].

VIII Brazilian Symposium on Games and Digital Entertainment Rio de Janeiro, RJ – Brazil, October, 8th-10th 2009

30