Você está na página 1de 36

Jogo de Plataforma 3d

Thiago Campos Viana 06/11/2010 19:37

Esse tutorial uma traduo do original em ingls criado pela Unity Technologies. Para acompanhar o tutorial ser necessrio baixar o projeto do tutorial do Unity3d: 3DPlatformTutorialStart.zip Este tutorial no est completo, a previso que sua traduo termine no comeo de dezembro de 2010. A Unity Technologies permite a traduo de seus tutoriais seguindo as condies comentadas no seguinte tpico: http://forum.unity3d.com/threads/57347-Can-I-translate-Unity-documentation-andpost-it-on-my-site Sendo assim ressalto que este tutorial apenas uma traduo e no sou o autor do tutorial original, apenas desta traduo, quem criou o artigo original foi a Unity Technologies. Tambm devo esclarecer que esta traduo no fiel ao texto original, ela uma traduo adaptada.

Introduo
Com o seu vasto conjunto de funcionalidades, incluindo mapa de terreno com relevo, suporte a jogos redes multiplayer nativo, completa integrao do motor fsico com a linguagem de script, o Unity pode ser atrativo para novos usurios, porm dominando suas vrias ferramentas pode se tornar infinitamente compensador. Esse tutorial mostrar o passo-a-passo completo da construo de um level de um jogo de plataforma com uma perspectiva em terceira pessoa. Isso inclui tudo desde o controle do jogador, deteco de coliso, programao avanada de scripts, blobshadows, IA bsica, interface de usurio, cut-scenes e efeitos de udio locais. O Unity uma poderosa ferramenta para desenvolvimento de jogos, apropriada para vrios generos de jogos, do jogo de tiro em primeira pessoa a jogos de quebra-cabea.

O que voc aprender


Este tutorial foca no lado tcnico da construo de um jogo no Unity, abordando os seguintes tpicos: Controle do personagem; Projectors; Audio Listeners, Audio Sources & Clipes de Audio; Cameras multiplas ( e como realizar trocas entre as mesmas ) Sistema de script da interface de usurio, UnityGUI; Colises; Mensagens e Eventos; Iluminao; Sistema de partculas; Blob shadows; Scripting ( IA, mquina de estados, controle do jogador ). Este tutorial mostrar como esse conjunto de funcionalidades podem ser combinados para criar um jogo.

O que voc j deve saber


Este tutorial utiliza profundamente o sistema de scripting, ento recomendado que voc esteja familiar com pelo menos uma das trs linguagens suportadas: JavaScript, C# ou Boo. Neste tutorial a linguagem utilizada a JavaScript. Assume-se tambm que voc esteja familiarizado com a interface do Unity e sabe como realizar operaes bsicas, tais como posicionar um asset na cena, adicionar um Component um GameObject e editar propriedades no Inspetor.

Organizao do Projeto
O Unity no fora um modo particular de organizao dos assets de um projeto. Voc pode preferir organizar seus assets por tipo, com pastas separadas para Texturas, Modelos, Efeitos sonoros e assim por diante. A Unity Technologies percebeu que isso funciona bem para projetos pequenos. Para projetos complexos ela recomenda a organizao dos assets por funes, agrupando-os em pastas como Player, Enemies, Props, Scenery, e assim por diante. O projeto do tutorial foi desenvolvido por inmeras equipes e cresceu organizadamente para refletir seus diferentes padres e estilos. Foi decidido deixar a organizao do projeto como era para representar a organizao e estrutura de projetos menores. GameObjects & Components abstratos Projetos feitos com o Unity coloca cada asset da cena no centro do processo de desenvolvimento.Isto torna o processo bastante visual, com a maior parte do trabalho envolvendo apenas clicar e arrastar. Isto ideal para a grande parte do trabalho de design, porm nem todo asset pode ser mostrado desta forma. Alguns assets so abstratos ao invs de objetos visuais, ento eles so representados ou por icones abstratos ou por gizmos -- exemplo: Audio sources e iluminao -ou eles no so representados de nenhuma forma na Viso de Cena. Scripts caem nesta categoria. Os scripts definem como assets e GameObjects em uma cena do Unity se interagem e sua interatividade est no centro de todo os jogos. Por esta razo, normalmente bom planejar manter anotaes informativas dentro de seus scripts. Este tutorial assume que voc pode ler os scripts do projeto e compreender os vrios comentrios.

Entretanto, quando uma tcnica de scripting em particular ou conceito importante, ele ser abordado em detalhe. Os scripts foram documentados em detalhe e tambm foram projetados para serem auto explicativos tanto quanto possvel. Ns encorajamos a leitura pelo script a medida que os introduzimos pelo tutorial, estudando seus funcionamento. Sinta-se livre para experimentar!

Arquivos
Os arquivos mais atualizados para este tutorial podem ser baixados em: http://unity3d.com/support/resources/files/3DPlatformTutorialStart.zip A pasta "Scenes" contm a cena inicial para este tutorial chamada "TheGame" , a qual inclui a geometria do level, o set-up da cmera, iluminao, a nave espacial e os principais itens do jogo. Este tutorial assume que voc conhece os controles bsicos do Unity, ou seja, como posicionar um objeto na cena, ento o ponto de inicio da cena possui um cenrio bsico e alguns props posicionados.

Convenes tipogrficas
Este um tutorial longo contendo um monte de informaes. Para facilitar sua compreenso, algumas convenes simples so utilizadas:

Background & Tangentes


Textos em caixas como este contm informaes adicionais que podem ajudar a tornar claro o texto principal. Cdigos de script aparecero como mostrados abaixo:
// Isto um cdigo de script. function Update() { doSomething(); }

Notas: Os scripts inclusos neste tutorial contm vrios comentrios e foram projetados para serem fceis de seguir. Estes comentrios so normalmente omitidos do cdigo neste tutorial para economizar espao. Aes que voc deve realizar no Unity so mostradas do modo a seguir: Clique nisto; Depois nisto; Ento clique em Play. Nomes de scripts, assets, itens de menu ou Propriedades do Inspetor so mostradas em textos em negrito.

Convenes do Unity
O Unity um sistema de desenvolvimento nico. A maioria dos desenvolvedores trabalhando em um editor de cdigo passa 90% do tempo editando cdigo e at mesmo escrevendo cdigo para carregar e utilizar os assets. No Unity diferente: Ele centrado nos assets ao invs de centrado no

cdigo, colocando o foco nos assets do mesmo modo que um programa de modelagem 3D. Por esta razo, vale a pena compreender as convenes chave e a terminologia do desenvolvimento no Unity: Projetos Um jogo desenvolvido no Unity consiste de um Projeto. Ele contm os elementos de um projeto, tais como modelos, scripts, fases, menus, etc. Normalmente, um nico arquivo de projeto ir conter todos os elementos de seu jogo. Quando voc inicia o Unity, a primeira coisa que ele faz abrir um arquivo de projeto. Se voc acabou de instala-lo, ele ir abrir o arquivo de projeto contendo o demo "A ilha". Cenas Cada projeto contm um ou mais documentos chamados de Cenas. Uma cena ir conter uma nica fase do jogo, porm a maioria dos elementos da interface de usurio , tais como menu de jogo, sequncias de fim de jogo ou cut-scenes podem tambm aparecer em um arquivo de cena. Jogos complexos podem utilizar cenas para fins de inicializao, ou seja, todas as fases de um jogo sero cenas, porm nem toda cena ser uma fase.

GameObjects, Componentes, Assets e Prefabs


A chave para compreender o unity compreender a relao entre GameObject e Componente. GameObjects Um GameObject uma unidade fundamental de construo no Unity. Um GameObject um recipiente de peas de funcionalidades chamados de Componentes. Um GameObject quase sempre contm mais de um Componente. Todos os GameObjects contm um Componente do tipo Transform, o qual define sua posio e orientao.
Hierarquia de GameObjects

O grande lance do GameObject a habilidade dele poder conter outros GameObjects, como se fosse uma pasta de arquivos do Windows. Isto torna possvel a organizao dos GameObjects por hierarquia, assim um modelo complexo ou um rig completo de iluminao podem ser definidos em um nico GameObject pai. De fato, a maioria dos modelos no Unity aparecero em uma hierarquia de GameObjects pois isto reflete como eles so definidos em um programa de modelagem. Um GameObject definido dentro de outro GameObject considerado um GameObject filho.

Componentes
Componentes so os blocos de funcionalidades que compem um GameObject. Sem eles, um GameObject no faria nada de interessante. Um Componente pode representar entidades visiveis, como meshes, materiais, dados de terrenos ou sistema de partculas. Outros componentes so mais abstratos, como Cmeras e Luzes, os quais no possuem modelos fsicos os representando, ao invs disso, voc ver um cone e algumas ilustraes representando-os e suas configuraes. Um Componente sempre deve ser adicionado um GameObject; ele no pode existir sozinho. GameObjects suportam multiplos Componentes de certos tipos - um GameObject pode conter qualquer nmero de scripts, por exemplo. Porm outros, como aqueles usados para definir um sistema de partculas, so exclusivos e podem apenas aparecer uma vez em um GameObject. Se voc deseja definir um sistema de partculas multiplo, voc pode utilizar uma hierarquia de

GameObjects, porm no pode adicionar vrios Componente do tipo Sistema de Partculas a um mesmo GameObject.

Assets
Todos os seus Assets aparecero na Viso de Projeto, eles podem ser qualquer coisa: um material ou textura, um arquivo de udio, ou at mesmo um completo, pr-fabricado GameObject ( conhecido como "Prefab" ). Por exemplo, um Prefab de um personagem jogador pode ser definido como um nico Asset, contendo o modelo e suas animaes. Ele pode tambm conter Componentes do tipo script, clipes de udio e qualquer outro componente que ele precisa para funcionar, assim voc pode simplesmente arrastar ele para a cena e instantaneamente ter um avatar completamente funcional.

cones e Gizmos personalizados


Se voc desejar, voc pode mandar o Unity mostrar cones e outras informaes visuais para seus Assets. Voc ver um exemplo disto no prximo captulo. Seus Assets de projeto so mostrados na viso de projeto. Quando voc arrasta um deles para sua Cena, ele aparecer na Viso de Hierarquia, a qual define o contedo da Viso de Cena. A Viso de Cena o equivalente ao estgio em um teatro. Ele pode ter uma fase, um menu, um lobby para jogos multiplayer - o que voc desejar. A Viso de Projeto permanece a mesma em todas as cenas de seu projeto. Prefabs Um Prefab um Asset que foi definido como um template. Ele para o Unity o que um template de documento para o Word. Quando voc coloca um Prefab na cena, o Unity coloca um link para o Prefab na Viso de Hierarquia, no uma copia completa. Isto chamado de instanciao. Cada link que voc cria uma referncia uma instncia de um Prefab. Se voc clicar em um Prefab na Viso de Projeto e mudar suas configuraes, voc perceber que as mudanas sero aplicadas em todas as instncias do Prefab na cena. Ento se um inimigo no est se comportando corretamente, basta editar o Prefab do inimigo e todos os inimigos daquele tipo se comportar corretamente. Entretando voc pode editar as configuraes diretamente na instncia ao invs do Prefab, assim as mudanas sero aplicadas apenas na instncia em questo do Prefab. Os Prefabs so mostrados em letras azuis tanto na Viso de Projeto quanto na Viso de Hierarquia. Nota: Uma instncia de um Prefab no pode possuir Componentes adicionais, pois isto quebrar a ligao entre a instncia e o Prefab. O Unity o alertar se voc tentar adicionar um Componente. Voc poder tambm atualizar o Prefab com as mudanas na instncia.

Agradescimentos
Este tutorial no poderia ter sido produzido sem as seguintes pessoas: David Helgason, Joachim Ante, Tom Higgins, Sam Kalman, Keli Hlodversson, Nicholas Francis, Aras Pranckeviius, Forest Johnson e, naturalmente, Ethan Vosburgh o qual produziu os belos Assets para este tutorial.

Primeiros Passos
Animando o Lerpz
Neste captulo veremos os seguintes tpicos: Implementando os controles da cmera e do jogador em terceira pessoa. Controlando e blending animaes. Utilizando o sistema de partculas e implementando os propulsores do jet-pack. Adicionando uma blob-shadow ao jogador. Gerenciando os estados do jogador. Manipulando a energia do jogador, morte e renascimento. Antes de iniciarmos, ns precisamos saber sobre do que se trata o jogo. Em resumo, ns precisamos... Todo jogo de plataforma tem o personagem principal que controlado pelo jogador. Nossa estrela o Lerpz. A Trama Nosso heri o Lerpz: um alien visitando o Robot World Version 2. O qual substituiu o Robot World Version 1, que sofreu um falha de segmentao brutal particular e repentinamente foi engolido por sua estrela muitos anos atrs. Infelizmente, Lerpz teve pouca sorte: sua espao-nave foi confiscada por policiais corruptos locais. Aps procurar por toda parte, Lerpz encontrou sua nave presa por uma barreira de energia, mas como ele poder pegar ela de volta do sobrinho obsessivo compulsivo do nojento Sr. Grande, o Sr. Maior Ainda? O Sr. Maior Ainda adora arranjar artisticamente os clulas de combustveis da nave em seu ptio flutuante. Ele admira em particular o modo como elas brilham nas plataformas de propulso, e claro, so mais baratas que objetos de decorao intergalticos. Porm existe uma coisa que o Sr. Maior Ainda no sabe! Graas ao seu estilo mo-de-vaca de fazer as coisas, Lerpz sabe que se ele coletar todas as clulas de combustivel da nave, a energia utilizada para mant-las flutuando sobre as plataformas sobrecarregar o sistema de segurana. Isto far com que a barreira de energia que mantm a nave do Lerpz presa baixe. Ento Lerpz poder entrar em sua nave espacial, colocar as clulas de combustvel nos devidos lugares e voar pelo espao sideral. Ento, tudo que nosso heri precisa fazer coletar clulas de combustvel suficiente e a barreira de energia baixar. Lerpz poder pegar a nave e escapar do planeta. O Sr. Maior Ainda contratou guardas rob para tentar impedir Lerpz, porm, felizmente, eles no so inteligentes. Agora que tudo est definido, ns podemos comear a criar nosso heri.

Apresentando Lerpz
Abra o projeto e a v para a Viso de Projeto e abra a cena "Scenes"->"TheGame". Abra a pasta de objetos na Viso de Projetos. Arraste o Prefab do Lerpz para a Viso de Cena. Clique na entrada do Lerpz na Viso de Hierarquia e renomei-a para "Player". Mantenha o objeto Player selecionado e mova o mousa para a Viso de Cena e tecle 'F' ( Focus ) para centralizar o modelo na Viso de Cena. Movo o Lerpz para a plataforma com o propulsor de salto ( uma com listras amarelas ),

prxima a jaula, veja a imagem a seguir.

Posicionando o Lerpz na Cena Se voc clicar em Play agora, ver que o Lerpz parado no local que acabamos de posicion-lo, prximo a jaula. Neste momento, Lerpz no pode se mover e a cmera precisa ser linkada ao nosso personagem. Clique no boto Play novamente para encerrar o jogo. Ns precisamos fazer o Lerpz se mover, mas primeiro, precisamos fazer algo antes, dar uma olhada em como funcionar a cmera.

Cmeras de jogos em terceira pessoa


Em um jogo de tiro em primeira pessoa, a cmera o prprio ponto de vista do jogador, ento no existe necessidade de se preocupar em fazer ela seguir um outro objeto na cena. O jogador controla o objeto cmera diretamente. Cmeras para jogos em primeira pessoa so relativamente fceis de se implementar. Entretanto, uma cmera com um ponto de vista em terceira pessoa requer que a cmera siga o jogador por toda parte. Pode parecer uma idia simples, at a gente perceber que a cmera tambm precisa evitar ficar entre objetos do cenrio e o jogador, para no perder o jogador de vista. Isto possvel utilizando raycasting para verificar se objetos indesejados esto entre a cmera e o avatar do personagem, porm existe casos especiais a serem lembrados: O que acontece se o Lerpz se virar para uma parede? A cmera dever se mover para cima e olhar para baixo e focar o personagem ou dever ir para o lado? E se o inimigo ficar entre a cmera e nosso personagem? Como deve funcionar o controle do jogador? Ele deve ser relativo a viso da cmera? Se sim, isso pode ser confuso se a cmera se move em uma direo inesperada para evitar obstculos. Inmeras solues foram criadas para este tipo de cmera atravs do tempo. discutvel que nenhuma delas conseguiu ser 100% perfeita. Algumas solues tornam transparentes tudo entre elas e seu foco, incluindo paredes e inimigos. Outras opes incluem cmeras que seguem o jogador por toda parte, mas que, se necessrio, atravessar paredes e construes para manter a viso do jogador consistente. O projeto fornecido neste tutorial inclui alguns scripts de cmera diferentes, mas para atender os

propsitos deste tutorial ns utilizaremos o SpringFollowCamera. Ns o encontramos na Viso de Projeto dentro da sub pasta Camera localizada na pasta Scripts. Arraste o script SpringFollowCamera da Viso de Projeto para o objeto NearCamera na viso de Hierarquia. Clique em Play. Voc receber uma mensagem de erro. Ela aparecer logo ao lado dos botes Play, Pause e Step na parte inferior da janela do Unity. Abra a Console de Debug ( Shift+ Ctrl + C no PC ou Shift + Cmd + C no Mac ). Se ele j no estiver visvel. Ele mostra qualquer erro, aviso ou outras informaes de debugging do seu jogo. Voc provalvelmente ver vrias cpias de mensagens repetidas no seu log. Se voc destacar uma dessas mensagens, voc ver um pouco mais de detalhes sobre esta mensagem, como mostrado na imagem a seguir.

No target error message

Dica
Sempre que possvel, o Log da janela Debug mostrar uma linha levando ao objeto com problemas na Viso de Hierarquia, ou para a Viso de Projeto caso a falha seja em um Prefab ou script. Voc pode ver a linha na imagem acima. O tipo de erro UnassignedReferenceException um dos erro que voc ver com mais frequncia se voc um novato com o Unity. Clique no objeto NearCamera na Viso de Hierarquia e olhe as propriedades do Componente de Script SpringFollowCamera. A propriedade Target ( alvo ) est configurado para None ( Transform), ou seja no existe um objeto alvo para a varivel, ento vamos definir ele: Pare o jogo se voc ainda no o fez. Se ainda no fez, clique no objeto NearCamera na Viso de Hierarquia. Arraste o GameObject Player da Viso de Hierarquia para a varivel Target na Viso do

Inspetor. Fazendo Mudanas Durante a Execuo do Jogo Quando voc est jogando, o Unity permite que voc mude as propriedades dos diversos GameObjects e Componentes do jogo. Entretanto, ele no ir salvar estas mudanas! No momento que voc parar o jogo, todas as mudanas sero discartadas! Se voc deseja manter essas mudanas, sempre pare o jogo primeiro! Se voc clicar em Play, a cmera ainda no funcionar. Voc ver erros relacionados ao script SpringFollowCamera. Ele precisa que o Target tenha um script do tipo ThirdPersonController anexado a ele. Isto aontece pois a cmera em terceira pessoa estritamente dependente do controle do jogador: ela precisa saber exatamente o que o jogador est fazendo para reagir apropriadamente. A configurao final deve parecer com a imagem abaixo:

Spring Follow Camera script settings Altere os nmeros se voc no gosta do modo que a cmera funciona; isso uma questo de gosto e no existe uma nica soluo correta para isto. Esta a primeira de uma srie de dependncias que a gente precisar lidar. Finalize a conexo entre a cmera e o jogador arrastando o script ThirdPersonController da pasta Scripts->Player na Viso de Projeto para o GameObject Player na Viso de Hierarquia. Isto ir quebrar a ligao entre o Prefab. O script ThirdPersonController tambm possui suas prprias dependncias. A mais importante delas o Componente CharacterController. Felizmente, o prprio script j avisa o Unity sobre isso, ento o Unity automaticamente adiciona este Componente. Conexes e Dependncias O Unity tem como enoque mostrar os Assets visualmente, porm eles precisam estar conectados

entre eles para funcionar corretamente durante o jogo. Estas conexes so dificeis de serem mostradas visualmente. Estas conexes so conhecidas como dependncias, e isso o que acontece quando um objeto precisa de um outro para funcionar. O segundo objeto, em contrapartida, pode necessitar de outros objetos para funcionar. O resultado que seus Assets esto associados entre eles por virtualmente. A definio de todas estas dependncias um elemento chave de um projeto de um jogo. Ns agora precisamos adicionar uma tag ( marcador ) para o GameObject do nosso jogador. Assim os scripts podem encontrar nosso jogador na cena simplesmente pedindo ao Unity que encontre o GameObject com a tag especificada. Com o objeto Player selecionado, v na Viso do Inspetor e abra o menu drop-down Tag e escolha a tag "Player", como mostrado a seguir.

Selecionando a tag player Nota: As tags listadas no menu acima so as fornecidas pelo Unity por padro. Ns veremos como criar nossas prprias Tags e Layers mais tarde. A tag ser utilizada mais tarde, vamos retornar ao CharacterController e ao nosso script. Selecione o objeto Player e olhe na Viso do Inspetor. Ela deve se parecer com algo como isto:

Character Controller and Third Person Controller Script Components in place Nosso prximo passo ajustar o as variveis do CharacterController. No momento, o CapsuleCollider que ele utiliza est localizado muito abaixo do eixo Y, assim o Lerpz fica flutuando no ar. Voc pode ver a posio do Collider na Viso de Cena: ele a malha cilindrica longa e azul. Ns precisamos mudar o valor do centro Y.

Adjusting the Character Controllers Capsule Collider -- displayed as a blue wireframe Posicione o Capsule Collider como mostrado na figura acima. Voc ter que fazer alguns experimentos at conseguir uma boa posio, por experincia um valor de 1.03 para o centro Y do CharacterController deixa os ps do Lerpz alinhado perfeitamente com o cho. Se voc clicar em Play agora, o Lerpz poder mover pelo cenrio com seus ps grudados no cho.

Os scripts CharacterController e o ThirdPersonController


Na maioria dos jogos, o a avatar do jogador capaz de feitos fisicamente impossiveis, tais como virar e para instantaneamente, saltar distncias improvaveis e outras aes que seria dificil modelar utilizando a fsica tradicional. O CharacterController por outro lado desacopla o avatar do nosso jogador do motor fsico, suportando controle de movimentos bsicos. O CharacterController simplifica o movimento para um jogador e inimigos. Ele consiste de um CapsuleCollider adaptado a sistema de movimentao bsico, permitindo que nosso personagem se mova pelo cenrio, suba inclinaes ou desa por depresses.Voc pode configurar o valor mximo para o passo do personagem, assim como limitar as inclinaes que ele poder se mover. O CharacterController normalmente utilizado em algum script. O script conversa com o CharacterController e extende suas funcionalidades para cumprir as necessidades do jogo. No nosso projeto, o script ThirdPersonController realiza essa funo e adiciona o suporte necessrio para o nosso jogo de plataforma. Ele l as entradas do controle, teclado, mouse e outras entradas de dispositivos e controla o avatar do jogador de acordo com os comandos recebidos. O Gerenciador de Entradas do Unity ( Edit->Project Settings->Input Manager ) permite que voc defina como os dispositivos de entrada iro controlar o jogador. Nota: No h nada de especial com os scripts que estamos usando para o jogador. Eles so scripts comuns do Unity que foi desenvolvido para este projeto. No existe um script padro para controlar o personagem. O script ThirdPersonController j vm como parte do Prefab, ento no h necessidade de adicion-lo como componente do GameObject Player. O prximo passo fazer as animaes do Lerpz rodarem corretamente e adicionar os movimentos adicionais, como o pulo e o soco. Animando o Lerpz At este momento, o Lerpz est apenas vagando pelo cenrio. Isto acontece porque o CharacterController no realiza as aes de animao do modelo. Ele no sabe nada sobre o nosso modelo ou suas sequncias de animaes desenvolvidas para cada movimento. Ns precisamos conectar o Lerpz com suas sequncias de animao e isto feito com script ThirdPersonPlayerAnimation. Use o menu de Componente para adicionar o script ThirdPersonPlayerAnimation ao GameObject Player. Se voc clicar em Play agora, ver as animaes do Lerpz corretamente. Ento o que acabou de acontecer aqui? A resposta est em como o Unity manipula as informaes das animaes de um personagem. Animao do Personagem As sequncias de animaes de um personagem so criados por um programa de modelagem, como

o Blender, Maya, 3D Studio Max ou Cheetah 3D. Na importao para o Unity, estas sequncias so automaticamente extradas e armazenadas em um Componente do tipo Animao. Estas sequncias de animaes so definidas em um esqueleto virtual, que utilizado para animar o modelo base. Estes esqueletos definem como o mesh do modelo -- os dados importantes que definem as superfcies visveis do modelo -- modificado e transformado pelo motor para reproduzir as animaes necessrias.

Armaduras & Esqueletos


Se voc est acostumado com animao a tcnica de animao stop-motion ou "claymation", voc deve saber do seu uso de armaduras de metal. O modelo animado produzido por cima da armadura. Os esqueletos virtuais utilizados em modelos 3D so equivalentes diretos destes modelos e so raramente to complexos quanto esqueletos reais. O Componente mesh destes modelos normalmente refernciado como skinned mesh. O esqueleto virtual fornece o esqueleto sob o mesh e define como ele animado. Combinando Animaes As animaes do personagem so normalmente misturadas para fornecer a flexibilidade necessrias para um jogo. Por exemplo, uma animao do tipo walk cycle pode ser combinada com uma srie de animaes de fala, sendo o resultado um personagem que anda e fale ao mesmo tempo. Combinaes so utilizadas tambm para reproduzir transies suaves entre animaes, como uma transio entre um walk cycle e uma sequncia de soco. Ns precisamos utilizar um script para avisar o Unity quando ns precisamos trocar as animaes, quando uma animao combinada e como isto deve ser feito. a que entra os scripts. O Script ThirdPersonPlayerAnimation O modelo do Lerpz que estamos utilizando foi criado para ser usado em vrios projetos e possui quinze sequncias de animao. Apenas onze so utilizadas nesse tutorial. Se voc selecionar o objeto Player na Viso de Hierarquia e olhar no Inspetor, voc ver todas as quinze animaes listadas no Componente de Animao, das quais apenas as seguintes so empregadas nesse tutorial: 1. 2. 3. 4. 5. 6. 7. Walk -- O walk cycle padro. Run -- Uma animao de corrida. Segure a tecla Shift durante o jogo para correr. Punch -- Acionada quando for atacar um inimigo. Jump -- Acionada quando o Lerpz saltar. Jump Fall -- Acionada quando o Lerpz chega ao pice de seu salto e comea a cair. Idle -- Um loop que acionado quando o Lerpz est parado. Wall Jump -- Uma animao de um salto mortal que acionada quando o Lerpz salta contra uma parede. 8. Jet-Pack Jump -- Acionada quando o jet-pack do Lerpz est amenizando sua queda. 9. Ledge Fall -- Acionada quando o Lerpz cai de alguma plataforma. 10. Buttstomp -- Acionada quando o Lerpz leva uma porrada de um inimigo. 11. Jump Land -- Animao de aterrissagem aps um salto ou queda. O modelo e animaes para o personagem Lerpz foi criado com o Maya e importado para o Unity. Para maiores informaes sobre como importar modelos e animaes, consulte o manual do Unity. A maior parte das animaes so controladas atravs do script ThirdPersonPlayerAnimation, o qual verifica o script de controle do jogador e reage de acordo com as informaes daquele script. O script mais um conjunto de funces de respostas de mensagens. As mensagens relevantes so enviadas pelo script ThirdPersonController, o qual l os dispositivos de entrada e atualiza o

estado do personagem de acordo com as informaes recebidas. O movimento de ataque do Lerpz -- seu soco -- controlado por um outro script, o ThirdPersonCharacterAttack. Ns iremos tratar desse script mais tarde. Isto pode parecer uma deciso arbitrria mas no . A maioria dos movimentos bsicos -- andar, correr, saltar, etc -- so muito parecidos, no importa como o seu personagem se parece. Entretando, movimentos de ataque e defesa tendem a ser mais variados. Em alguns jogos de plataforma um personagem pode ter uma arma, em outros, ele pode realizar movimentos de artes marciais. Neste tutorial, o Lerpz um mestre na arte marcial mais popular no Velho Oeste, o soco-na-cara. A animao uma animao simples de soco. Gizmos O script ThirdPersonCharacterAttack tambm inclui uma funcionalidade muito til: um gizmo que desenha uma esfera para representar a rea afetada pelo soco do Lerpz. Gizmos so desenhados dentro de uma de duas funes de manipulao de mensagens de desenho -- Neste exemplo, o gizmo -- a malha esfrica amarela desenhada na posio do soco mostrando a rea que afetada -- desenhada em resposta funo OnDrawGizmosSelected(). Esta funo deve ser esttica e ser chamada pelo prprio Editor do Unity. Uma alternativa a funo OnDrawGizmos(), que ser chamada pelo Editor do Unity em todo ciclo de atualizao, independente de se o GameObject pai foi selecionado. O Jet-Pack

Lerpzs Jetpack in action At este momento, nosso personagem est correndo e pulando por a, mas seu Jat-Pack ainda no est funcionando. O Lerpz utiliza o jato de seu Jet-Pack para diminuir sua velocidade de queda, o movimento j est funcionando, mas o Jet-Pack no produz nenhum tipo de animao. Para fazer os jatos funcionarem, ns precisaremos adicionar dois Sistemas de Partculas e um Componente do tipo Ponto de Luz. O sistema de partculas produzir um efeito de chamas, enquanto o ponto de luz dar a iluso de que as chamas esto funcionando como uma fonte de iluminao.

Dica
Idealmente ns teramos um ponto de luz para cada jato, porm os exaustores do jato esto to

prximos que poderamos utilizar apenas um e obter o mesmo efeito. Como luzes so computacionalmente caras, isto boa forma de otimizao. O que um Sistema de Partculas? Sistemas de partculas emitem dzias de partculas -- normalmente figuras 2D planas ou sprites -em um mundo 3D. Cada partcula emitida a uma certa velocidade e acelerao, e dura por um certo tempo. Dependendo das configuraes e do material utilizado, estes sistemas de partculas podem ser utilizados para simularem qualquer tipo de coisa, desde fogo, fumaa, exploses at mesmo campos estrelares. Adicionando os Sistemas de Partculas Utilize o Menu do GameObject para criar um GameObject vazio na Viso de Hierarquia. Renomeie o GameObject para "Jet". Com o novo GameObject selecionado, adicione: Um Ellipsoid Particle Emitter. Um Particle Animator. Um World Particle Collider. Um Particle Renderer. Desative a opo "Enabled" do checkbox na Viso do Inspetor para o Componente ParticleRenderer. Isto ir desabilita-lo temporariamente. Posicione o GameObject "Jet" logo abaixo do exaustor direito. Reative o ParticleRenderer. Ajuste as configuraes para o EllipsoidParticleEmitter como mostrado a seguir:

Ellipsoid Particle Emitter settings Estas configuraes iro resultar em um estreito fluxo de partculas que ns utilizaremos para simular um jato de chamas. Dica: Se as partculas no esto se movendo diretamente para baixo, use as ferramentas de rotao do Unity para rotacionar nosso objeto at que ele se mova alinhado com o exaustor do jet-pack. Quando terminar, o sistema de partculas ser anexado ao objeto filho do personagem com o nome "torso". Isto far que o jato siga os movimentos do jogador. Neste momento ns estamos mais preocupados em fazer com que ele se parea legal, no se preocupe muito com uma posio muito precisa. As vriaveis MinSize e MaxSize definem o intervalo do tamanho das partculas. As variveis MinEnergy e MaxEnergy definem a durao mnima e mxima das partculas. Nossas partculas duraro apenas por um pequeno perodo de tempo -- 0,2 segundos neste caso -- antes de desaparecer. Ns configuramos a quantidade de partculas a serem emitidas para 50. As variveis MinEmission e MaxEmission definem o intervalo da quantidade de partculas que aparecero na tela ao mesmo tempo. Ns escolhemos os valores de mximo e mnimo parecidos pois do contrrio ele pareceria estar explodindo ao invs de piscando suavemente. O resultado deve ser um fluxo suave de

partculas. Nota: Ns desabilitamos a opo "Simulate in Worlspace" aqui. Isso ajuda a dar a impresso que ns temos um jato de gs quente e rpido ao invs de uma chama muito mais lenta, mesmo embora as partculas no esto se movimento rpidamente. Fazendo com que o jato ignore os giros e rotaes do Lerpz, ele parecer a uma chama quente de uma tocha. Agora mude as configuraes do Componente ParticleAnimator como mostrado a seguir:

Configurao do Particle Animator. Os valores no quadro definem as cores de entradas da animao. No esquea de ajustar as outras configuraes tambm! Configuraes do Particle Animator Color Red Green Blue Opacity Animation(0) 254 255 219 100 Animation(1) 254 255 116 29 Animation(2) 255 92 0 13 Animation(3) 105 63 50 10 Animation(4) 13 15 17 4 O Particle Animator ir animar as cores das partculas enquanto elas se movem. As partculas iniciaro brancas, escurecendo para amarelo e laranja enquanto o nosso jato virtual sopra. Desde que ns iremos renderizar uma textura em toda partcula, o Particle Animator ser usado para tingir esta partcula, ento a cor ir animar subtamente, porm efetivamente. A janela de dialogo de seleo de cor que aparece quando voc clica em uma cor tambm oferece um slider para a opo "Opacity". A tabela mostrada cor as configuraes das cores, tambm inclui isto, se voc reduzir a opacidade atravs do ciclo de animao, as partculas das chamas parecer que esto desaparecendo enquanto elas sopram. Nota: As configuraes de opacidade mudam o canal alpha das partculas, definindo o quanto elas so transparentes. Este material de partculas que ns usamos j inclui as configuraes necessrias para o canal alpha, a qual modificada posteriormente pela configurao do valor para "Opacity".

O prximo o Particle Renderer. Este Componente desenha cada partcula, ento necessrio definir quais partculas aparecero. Tambm necessrio definir o material que ser utilizado para renderizar cada partcula. Ns queremos algo parecido com um jato de chamas, ento ns devemos utilizar o material "fire add", o qual pode ser encontrado em: Particles->Sources->Materials->fire add

Dica
Este asset tambm incluso na pasta dos Standard Assets. Mude as configuraes do Componente como mostrado a seguir:

Particle Renderer As configuraes de Stretch Particles falam para o Unity quando as partculas devem ser renderizadas estendidas se elas esto se movendo em alta velocidade. Ns queremos que as partculas se alongam um pouco de acordo com sua velocidade. Nota: As configuraes Cast Shadows e Receive Shadows no possuem efeitos, a menos que voc utilize um shader personalizado. Isso um tpico avanado e est fora do escopo deste tutorial. Adicionando Luz Nosso jato parece legal, porm ele realmente uma iluso. O sistema de partculas jorra um monte de pequenas imagens, porm o efeito de chamas resultante no emite luz. Para completar a iluso,

ns criaremos um GameObject do tipo Point Light separadamente. Ns o ligaremos e desligaremos sincronizadamente com os jatos de chamas. O resultado ser um jato de chamas que parecer iluminar imediamente seus arredores. Ns usaremos apenas um nico ponto de luz, ao invs de um ponto de luz para cada jato, isto economiza poder de processamento e mantm a iluso. Cria um novo GameObject do tipo Point Light. D o nome de "Jet Light" para este GameObject e posicione-o entre os dois jatos do jet-pack do Lerpz. Ns voltaremos ao sistema de partculas em breve. Esta luz ir criar a iluso de que os jatos esto emitindo luz. Para que este efeito funcione, ns precisamos de ponto de luz brilhante com uma grande intensidade. Selecione a luz e ajuste suas configuraes como mostradas a seguir:

Configuraes da luz do Jet Pack Cores: Red 255, Green 206, Blue 155, Opacity 100. Por que no h sombras? Sombras so computacionalmente caras para a maioria dos hardwares. Faz sentido evitar calculalas se podemos fazer isso, e est uma das reas que podemos fugir disso. Os jatos no so grandes, ento eles s precisam iluminar as costas do Lerpz. O ponto de luz tambm ser refletido pelos objetos prximos, mas ele no brilhar suficientemente para que a falta de sombras seja percebida. O prximo passo atualizar o GameObject Player e incluirnosso jato e objetos de luz. Para fazer isto, ns primeiro vamos adicionar nosso jato Viso de Projetos como um Prefab: Na Viso de Projetos, selecione a pasta (vazia) Player, ento clique em Create. No menu drop-down, escolha Prefab. Isto ir criar um objeto Prefab vazio dentro da pasta. Renomeie o Prefab vazio para Jet. Arraste nosso novo GameObject da Viso de Hierarquia para o nosso novo Prefab. O nome Jet da Viso de Hierarquia deve se tornar azul para mostrar que agora ele est ligado ao Prefab. Ns iremos utilizar duas instncias do nosso Prefab Jet para o jet pack do Lerpz. Utilizando um Prefab significa que podemos aperfeioar ambos os jatos apenas editando o Prefab original. Apague o nosso objeto Jet original da Viso de Hierarquia. Porm deixe o nosso objeto Jet Light onde ele est. Agora ns adicionaremos duas vezes o objeto jet e uma vez o objeto light ao nosso objeto Player.

V para o objeto Player na Viso de Hierarquia. Abra-o at encontrar o objeto filho torso. Arraste o objeto Prefab Jet para este objeto duas vezes. Isto criar duas instncias do objeto Jet. Renomeie as instncias para Jet L (esquerda) e Jet R (direita). Solte o objeto Jet Light no mesmo objeto torso. Voc deve ter agora uma hierarquia de objeto igual a esta:

Hierarquia do Jet-Pack Utilize as ferramentas de manipulao do Unity para posicionar cada Prefab Jet na sua posio correta no Jet Pack que est nas costas do Lerpz. Voc dever ter que rotacion-los para as partculas irem na direo correta. Mova o objeto Jet Light em um ponto entre os dois Prefabs do Jet. Quando voc terminar isso, o Lerpz deve ter agora dois jatos com chamas funcionando em suas costas no momento em que ele se move. Ns estamos quase terminando! O passo final fazer com o objeto Prefab do Jet e o Jet Light sejam ativados apenas quando o Lerpz estivar saltando. A gente consegue isso atravs de scripts. Procure pelo script JetPackParticleController em Scripts->Player e arraste-o para o objeto no topo da hierarquia do objeto Player. Isso adicionar o script ao nosso personagem do jogador. Voc deve perceber que agora o jet-pack funciona como esperado. O script controla os dois sistemas de partculas e a luz, sincronizando-os com os movimentos do Lerpz e disparando todos esses elementos combinados toda vez que o jogador precionar o boto de pulo para pular ou para amenizar a queda.

Jet-Pack funcionando

Blob Shadows
O Lerpz deve ser fcil de ser identificado a todo tempo, assim os jogadores no perdero o trajeto de seu avatar quando o jogo se tornar visualmente confuso. A maior parte desta responsabilidade do artista e do game designer, porm h certos elementos que devem ser manipulados pelo Unity. Um dos mais importantes destes elementos so as sombras e iluminao. Para ajudar na performance, os efeitos de luzes so geralmente pr-renderizados em uma textura pelo artista utilizando um programa de modelagem, esta tcnica conhecidda como "baking". Esta tcnica apenas funciona bem em objetos estticos. Um personagem andando sob uma iluminao de rua precisa reagir aquela luz em tempo real. A soluo posicionar as luzes dinmicas onde elas devem estar, se voc usa texturas "baked", lembre-se de adicionar uma luz em todo lugar onde supostamente teria uma luz "baked", porm faa com que a luz afete apenas objetos em movimentos. As luzes j foram colocadas na cena para voc. Isto deixa um elemento final: sombras. Em um jogo de plataforma 3d, a sombra desempenha um papel muito importante em dizer-nos onde nosso personagem ir aterrissar se ele est pulando ou caindo. Isso significa que o Lerpz deve ter uma boa e visivel sombra, o que no o caso at o momento. Sombras podem ser produzidas utilizando luz, com as sombras sendo computadas e renderizadas em tempo real pelo motor grfico. Entretanto, tais sombras so caras em termos de poder de processamento. Para piorar, nem todas as placas grficas podem computar sombras rapidamente ou efetivamente; as placas mais velhas no capazes de faz-lo de modo algum. Por esta razo, ns usaremos uma Blob Shadow para o Lerpz. Adicionando uma Blob Shadow Uma Blob Shadow uma trapaa. Ao invs de lanar raios de luz e verificar se eles batem em alguma coisa, ns simplesmente projetamos uma imagem escura -- neste caso apenas um borro negro circular -- em qualquer coisa abaixo do jogador. Isto mais rpido e mais fcil para a placa de vdeo fazer, assim isso pode funcionar bem para a maior parte dos hardwares. O Unity inclui um Prefab Blob-Shadow em sua coleo Standard Assets, ento devemos utiliza-las ao invs de tentar criar uma por conta prpria. Este Asset j foi importado e includo no projeto na pasta Blob-Shadow. Abra esta pasta e clique no Prefab blob shadow projector e arraste ele no objeto no topo da hierarquia do personagem -- Player -- na Viso de Hierarquia. Isso deve adicionar o

Projector logo abaixo do level de topo na hierarquia do objeto Player:

The Blob Shadow Projector Prefab in the Players hierarchy Agora, ns precisaremos modificar a posio do blob shadow projector e os dados de rotao para ficar logo acima do personagem e apontar para baixo. Selecione o layout 4-Split. Selecione os valores de rotao do blob shadow projector para 0, 90 e 180 respectivamente. Agora use as vises de topo e lateral para mover o projector logo acima da cabea do Lerpz. Voc deve mover ele para cima e para baixo um pouco, at ficar feliz com o tamanho da sombra.

Criando um novo Layer


Neste momento voc deve ter percebido que a blob shadow tambm projetada no Lerpz. Isso no era para acontecer. Existem duas opes para arrumar isso: mover a configurao de Near Clip Plane para um valor maior para o projetor, ou simplesmente dizer para ele para no projetar em layer pr-estabelecidos. A melhor opo a segunda. Por que no ajustar o Near Clip Plane? Esta tcnica pode parecer a mais fcil num primeiro momento, mas o plane deveria ser ajustado por scripts para levar em conta as animaes do Lerpz. Seu p move-se para cima quando ele salta, depois move-se um pouco mais prximo quando aterrissa. Como a sombra deve ser sempre projetada no solo que o Lerpz fica, isso significa que o Near Clip Plane no deve permanecer o mesmo ao longo dessas sequncias de animaes. Abra o GameObject Player. Abra o drop-down menu de layer na Viso do Inspetor. Escolha "Add new layer". Clique em na primeira entrada User Layer vazia e nomei-a noShadow. Voc deve ver agora algo como isto no Inspetor:

Adicionando um novo Layer utilizando o Tag Manager. Agora clique de volta no objeto Player na Viso de Hierarquia para mostrar as configuraes no Inspetor. Clique no drop-down menu Layer e configure-o para o novo nome de layer, noShadow. O Unity perguntar se voc deseja aplicar essa mudana para todos os objetos filhos: clique "Change Children Layers". Agora ns precisamos avisar o Blob Shadow Projector para no projetar em objetos nesse layer. Clique no objeto de blob shadow para mostrar suas propriedades na viso do Inspetor. Olhe a entrada Ignore Layer no componente Projector. Utilize o menu drop-down para selecionar o layer noShadow, o que deve ser aplicado aos filhos tambm, como mostrado a seguir:

As configuraes da blob shadow Se voc clicar em Play agora e se mover pelo cenrio, voc dever notar que a sombra se comporta bem como era de se esperar... exceto que se voc pula pelos itens de clulas de combustvel. Se voc tentar isso, ver que a sombra se projeta neles tambm. Ns queremos que isso no ocorra. Ns trataremos desses itens depois, para consertar esse

problema: Pare o jogo. V na Viso de Projetos e localize o FuelCellPrefab e o HealthLifePickUpPrefab dentro da pasta Props. Selecione o objeto raiz de cada Prefab e mude seu layer para noShadow como mostrado a seguir:

Layer mudado para noShadow Nota: Quando fazer uma mudana em um objeto pai, o Unity perguntar se a mudana deve ser aplicada aos objetos filhos. Fazer isso pode ser perigoso se voc no pensou em todas as possibilidades. Nesse caso ns queremos que todos os objetos filhos fiquem tambm no layer noShadow, ento ns simplesmente concordamos quando o Unity perguntar.

Conceitos de Scripting
Um teatro de marionetes composto por mquinas incrivelmente complexas, conhecidas como automata, desenvolvida pelos nossos ancestrais com a finalidade de entretenimento. Algumas so bem elaborados e podem at realizar algumas brincadeiras utilizando fantoches. Outras so interativas e mudam seu comportamento de acordo com as entradas de usurios. Essas mquinas so basicamente as mesmas: os projetistas criaram os assets -- fantoches, props, cenrios, etc -- e ento projetaram mquinas para fazer esses assets se comportarem como desejado. O princpio bsico permaneceu intacto durante os anos. Os computadores meramente transformaram mquinas fsicas, construdas com ferros e cordas, em mquinas virtuais controladas por listas de instrues. O Unity se refere a tais listas como scripts. A maioria dos scripts so centrados em um conceito popular de desenvolvimento de jogos: Mquinas de Estado Finitos. Uma Mquina de Estado Finito essencialmente define um sistema de condies de interesso, conhecidos como estados. Um estado pode ser qualquer coisa, como quando um objeto deve ser renderizado, ou quando ele deve ser sujeito as leis da fsica, ser luz ou receber sombras, quando ele pode pular, sua posio na tela, e por a vai. A Viso do Inspetor permite que ns mudemos tais estados diretamente pois estes estados so comuns em quase todos os jogos. Entretando, existe outro tipo de estado especfico do jogo em si. O Unity no sabe se o avatar alien, quanto ele deve receber de dano quando sofre um ataque ou que ele possui um jet-pack. Como o Unity pode ficar ciente do comportamento necessrio do guarda robtico ou como ele deve interagir com o Lerpz? a que os scripts entram. Ns usamos os scripts para adicionar os elementos de interao e os estados de gerenciamento especificos para nosso jogo. Nosso jogo dever se manter informado sobre um grande nmero de estados. O que inclui: A energia do Player; O nmero de clulas de combustveis que o jogador encontrou; Quando o jogador encontrou clulas de combustveis suficiente para desligar o campo de

fora; Quando o jogador pisou em uma plataforma de salto; Quando o jogador tocou em um item; Quando o jogador tocou na nave; Quando o jogador tocou um respawn point; Quando a tela de game over ou de abertura deve ser mostrada; e muito maIs. Muitos desses estados necessitam que testes sejam feitos contra estados de outros objetos para assegurar que eles esto atualizados. Em alguns casos ns precisamos de at alguns estados intermedirios, para suportar nossa transio. Por exemplo, pegando uma clula de combustvel forar uma verificao para ver se o jogador j encontrou clulas suficientes para desligar o campo de fora.

Organizao e Estrutura
Neste tutorial as mquinas de estados do jogador, estgio e inimigos so manipulados por um conjunto de scripts ligados por vrios GameObjects. Esses scipts se comunicam, enviando mensagens para os outros e chamando funes entre eles. Existem vrias maneiras de realizar essas ligaes: Adicionando um link exposto no Inspetor, no qual voc arrasta o objeto relevante. Isto ideal para scripts de propsito geral que voc queira reutilizar em seus projetos. Esse o modo mais eficiente pois o script simplesmente puxa os dados das variveis relevante e no precisa fazer nenhum tipo de busca. Entretanto, assumido que voc sabe antecipadamente qual objeto ou componente ser ligado. Ns utilizamos essa opo para as tomadas de cmeras no scipt LevelStatus. Esse script j est anexado ao GameObject Level. Isso nos d a flexibilidade para montar vrias cmeras, uma para a tomada de "level exit unlocked" e outra para a tomada "unlocked". Mas a opo est l para ser mudada. Criando um link dentro da funo de script Awake(). A funo Awake() chamada em todos scripts que voc escreve antes da primeira chamada a funo Update(). Criando a ligao aqui permite que voc crie um cache para ser utilizado mais tarde na funo Update(). Normalmente voc definir uma varivel privada com uma ligao para outro objeto ou componente que voc precise acessar dentro de seu script. Se voc precisar fazer uma chamada a funo GameObject.Find() para localizar os objetos relevantes, muito melhor fazer isso apenas uma vez, dentro de Awake(), pois a funo GameObject.Find() bem lenta. Esta opo mais recomendada para aquelas situaes que voc no precisa da flexibilidade da anterior, mas no quer realizar toda uma busca pelo GameObject em todo ciclo de atualizao do jogo. A soluo ento buscar o objeto quando o script est "acordando", armazenando o resultado da busca para utilizar nas sees de atualizao. Por exemplo, o script LevelStatus, que manipula o estado do level, cria um cache das ligaes de inmeros objetos, incluindo o objeto Player. Ns sabemos que isso no ir mudar, ento ns precisamos fazer com que o computador faa esse trabalha para a gente. Criando a ligao durante a funo Update(). Esta funo chamada pelo menos uma vez em todo ciclo do jogo, ento melhor evitar utilizar funes lentas aqui. Entretando, as funes GameObject.Find() e GetComponent() podem ser bem lentas. Esta opo utilizada naquelas situaes que o objeto que voc necessita verificar pode mudar a

qualquer momento durante o jogo. Por exemplo, em qual dos multiplos respawn points da cena desse tutorial o player deve reaparecer? Isso claramente muda durante a execuo do jogo, ento ns precisamos manipular isso de acordo. O problema disso que lento, ento melhor projetar o seu jogo para que voc no precise disso com frequncia.

Scripts em um Ambiente de Desenvolvimento Visual


O Unity ferramenta diferente que faz com que nela seja focado nos assets visuais ao invs das ligaes e conexes entre eles. Um projeto grande com o Unity pode ter dezenas de scripts de complexidade variada espalhados pela Hierarquia de Objetos, ento o projeto utilizado nesse tutorial usa algumas tcnicas de orientao a objetos para aliviar isso. O script que lida com uma parte particular da mquina de estados -- ie animaes do jogador -- deve tambm manter-se informado das variveis de estado relevantes. Isso pode tornar as coisas um pouco complicadas quando um script precisa acessar uma varivel de estado armazenada em outro script, isso o porqu que alguns scripts criam um cache dos valores localmente para acessar essa informaes rapidamente. Essa tcnica tambm resulta em uma cadeia de comandos, onde as funes em um script simplesmente chama um funo similar em outro script. A manipulao da morte do jogador e a energia um exemplo disso. Nota: Quando voc pegar mais experincia com o Unity, voc descobrir outros meios de manipular estados que podem ser mais adequados a seu prprio jogo. Os padres de projetos utilizados nesse tutorial no podem ser considerados uma soluo apropriada para todas as situaes. Se voc desejar, voc pode transformar o nosso GameObject Player em um Prefab contendo todas as mudanas que fizemos, ento voc poder reutiliza-lo em outros projetos como ponto de partida: Clique na pasta Player na Viso de Projeto. Crie um novo Prefab. Ele aparecer dentro da pasta Player. D o nome apropriado para o Prefab -- Eu sugiro LerpzPrefab. Arraste o nosso GameObject Player para o LerpzPrefab para completar o processo. Morte e Renascimento Os personagens de jogos de plataformas correm bastantes riscos com suas vidas e o Lerpz no excesso. Ns precisamos assegurar que ele perde uma vida se ele cair das plataformas. Ns tambm precisamos fazer com que ele reaparea um ponto a salvo no cenrio -- chamado de "respawn point" -- ento ele poder continuar sua jornada. Outro ponto que se o Lerpz pode cair para fora do cenrio, possvel que outros residentes tambm podem, ento isso deve ser lidado apropriadamente. A melhor soluo para isso usar um box collider para capturar tudo que esteja caindo do cenrio. Ns faremos isso to longo e largo que se o jogador tentar utilizar o jet-pack enquanto cai ns iremos captura-lo. Entretanto o Lerpz precisar de algum lugar para reaparecer. Ns voltaremos aos respawn points brevemente. Primeiro vamos construir nosso box collider: Criie um GameObject vazio. Renomei-o para FalloutCatcher. Adicione um Componente do tipo Box Collider ele. Adicione o script FalloutDeath em Componentes->ThirPerson->Props. Utilize o Inspetor para mudar os valores como mostrado na screenshot abaixo:

Configuraes do FalloutCatcher

O Script FalloutDeath
Este script curto porque ele simplesmente delega todo o servio para o script ThirdPersonStatus. Esse outro script deve estar anexado ao Lerpz, mas no faremos isso agora. O cdigo para manipular o gatilho de coliso est na funo OnTriggerEnter(). Esta funo chamada pelo Unity quando o BoxCollider atingido por outro GameObject contendo um Componente do tipo Collider, tal como o Lerpz ou um inimigo. Existem trs testes: um para o jogador, outro para um objeto RigidBody simples e um terceiro para verificar se um objeto possui um Componente do tipo CharacterController. O segundo teste procura qualquer props como caixas ou cubos caindo fora do cenrio. Ns no temos tais itens no level, mas ns podemos adicionar um se voc gostaria de realizar experimentos. O terceiro teste usado em inimigos como se eles no possuissem fisicas ordinrias em anexo. Se o jogador atinge o box collider, o cdigo simplesmente chama a funo FalloutDeath() no script do Lerpz ThirdPersonStatus. Em outro objeto com um collider que atinge nosso GameObject, ns simplesmente o destrumos, removendo-o da cena, para qualquer outro caso ele cara eternamente. Alm disso, ns temos: Uma funo bem til -- Reset() -- que certifica que qualquer componente necessrio est presente. Esta funo chamada pelo Unity automaticamente quando adicionado um componente pela primeira vez. Ela tambm pode ser chamada pelo editor clicando no cone de roda dentada na parte direita de qualquer componente na Viso do Inspetor:

O Menu de Comando Reset O comando @Script tambm adiciona os scripts diretamente para o menu de componentes do

Unity.Isso mais conveniente e faz com que no precisamos procurar po isso dentro da Viso de Projeto -- til se voc possui um projeto complexo com muitos assets. Se ns tentarmos rodar o jogo nesse ponto, o Unity ir acusar um erro porque ele no sabe onde deve fazer o Lerpz reaparecer. a que entram os respawn points. Respawn Points Quando o personagem morre, ns precisamos de algum lugar seguro para fazer ele re-aparecer. Neste tutorial, o Lerpz reaparecer em um dos trs respawn points. Quando o Lerpz toca um destes pontos, ele se tornar ativo e ser a que ele reaparecer se morrer.

O Lerpz em cima de um Respawn Point Os respawn points so instncias do Prefab RespawnPrefab. Voc encontra ele na Viso de Projeto na pasta props. Este Prefab um modelo de uma base de teleport, acoplada com trs sistemas de partculas completos, um ponto de luz e outras coisas. Segue a estrutura bsica: RSBase contm o modelo em si: uma base cilindrica curta com um disco azul brilhanteno centro. RSSSPotlight um objeto do tipo ponto de luz que brilha uma luz azulm cima da superficie do objeto, dando a iluso de que a textura em azul est brilhando. Os demais GameObjects so sistemas de partculas. O script de Respawn anexado ao objeto pai do Prefab RespawnPrefab faz a troca entre esses sistemas de partculas dependendo do estado do Prefab. Se o ponto de respawn estiver inativo, um efeito de partculas sutil mostrado se parecendo com uma neblina. Isto est contido no RsParticlesInactive. Se o ponto de respawn est ativo, um efeito maior, pomposo, mostrado. Ele est contido no RsParticlesActive. Apenas um ponto de respawn pode estar ativo no estgio um dado momento. Quando o player toca o ponto de respawn, um objeto collider, configurado como trigger, detecta isto e engatilha a ativao do ponto de respawn. Os trs sistemas de partculas restantes - RSParticlesRespawn1, RSParticlesRespawn2 e

RSParticlesRespawn3 - so ativados juntos quando o player realiza o respawn no ponto de respawn. Estes so sistemas de partculas do tipo um-tiro. O script permite que eles sejam mostrados na tela, ento restaura o sistema de partculas RsParticlesActive assim que essa sequncia do tipo um-tiro completada. O prefab contm o script Respawn, que controla o estado do ponto de respawn. Entretanto, para que o jogo saiba qual ponto de respawn especifico que o jogador precisa retornar quando ele morre, ns precisamos arranjar os pontos de respawn em uma hierarquia em um script de controle mestre. Vamos fazer isso agora: Arraste o RespawnPrefab na cena. Posicione-o como mostrado na figura na logo abaixo. Mude o nome da instncia para Respawn1. Repita os passos acima mais duas vezes. Voc pode colocar eles onde desejar -- adicione mais se voc quer! Eu sugiro colocar um prximo a arena bem no final do estgio e outro prximo as rvores no jardim acima das plataformas. O prximo passo criar um GameObject vazio que ser o container. Mude o nome dele para RespawnPoints. Faa com que todas as instncias do prefab do respawn sejam filhas desse objeto, RespawnPoints.

Posicionando o primeiro ponto de respawn Como isso funciona Quando a cena carregado, o Unity chama a funo Start() em cada instncia do script de Respawn, onde algumas variveis muito teis so inicializadas e so criados caches de ponteiros para outros elementos . O mecnismo chave centrado ao redor de uma varivel esttica:
static var currentRespawn : Respawn;

Ela define uma varivel global chamada currentRespawn. A palavra-chave static significa que ela compartilhada atravs de todas as instncias do script. Isto permite que a gente saiba qual ponto de respawn o atual, qual o ativo. Entretanto, quando a cena comea, nenhum desses pontos est ativado, ento ns precisamos configurar qual o ponto padro

para nossa cena. A Viso do Inspetor do Unity no mostra tipos de variveis estticas de jeito nenhum, ento o script define uma propriedade InitialRespawn, que precisa ser iniciada para cada instncia. Arraste o ponto de respawn padro nela. Voc precisar repetir este passo para todos os pontos de respawn na cena. Neste tutorial o ponto de respawn padro o Respawn1 localizado prximo a jaula e logo abaixo do ponto de partida do jogador.

factbox
No possvel configurar essas propriedades diretamente no Prefab original. Quando um ponto de respawn ativo pelo jogador tocando seu collider, o script daquele ponto de respawn primeira desativa o antigo ponto de respawn e muda a varivel currentRespawnPoint para ele mesmo. A funo SetActive() cuida de iniciar os sistemas de partculas relevantes e os efeitos sonoros. A reapario do jogodar manuseada pelo script ThirdPersonStatus, que gerencia a maioria dos estados do jogador no jogo. Adicione o script ThirdPersonStatus para o GameObject Player. Este script pode ser encontrado em: Script->Player->ThirdPersonStatus. O ponto de respawn tambm manuseia efeitos sonoros. Eles so tocados uma vez, exceto por um Audio Source anexado a cada prefab do Respawn. Este componente contm o som "ativo", que um loop. O script simplesmente habilita ou desabilita este som apropriadamente, ou quando est tocando o efeito sonoro, quando o jogador est reaparecendo na tela ou ativando o respawn, ou quando o ponto de respawn desativado. Nota: O Unity permite adicionar efeitos sonoros facilmente. Quando voc planejar adicionar tal asset, considere cuidadosamente como ele ser usado. Por exemplo, ns no inclumos um som de "respawn desativado" porque ns nunca iriamos ouvir o som sendo tocado neste caso, porm se fosse em um jogo multiplayer isso aconteceria. Este script no nada complexo e voc deve achar o cdigo muito fcil de entender. Ns voltaremos a falar em pontos de respawn mais tarde.

Preparando a Cena
Com o nosso heri agora se movendo, o prximo passo dar a ele algo o que fazer.

Primeiros Passos
Nesta seo ns veremos como construir o mundo do jogo onde se passa a ao. Nosso primeiro passo preparar o estgio. O arquivo do tutorial j vem com um cenrio pr-pronto e recheado com um certo nmero de itens para o jogador coletar. Ns precisaremos colocar um pouco mais de props e elementos, porm a maior parte j foi feita para voc pois colocar todos esses props poderia levar muito tempo.

Iluminao
O estgio j vm com uma iluminao ambiente e tambm com vrios pontos de luz. Isto ilumina o cenrio, o jogador, os inimigos e, at o momento, os itens (pickups).

Neste projeto, as luzes foram posicionadas pelo artista que modelou o level. A luz desempenha um importante papel na criao do ambiente e senso do lugar que normalmente melhor deixar isto para o modelador que fez o level.

Colocando Props
O conjunto bsico j foi provido para voc, atravs de vrios props j em seus lugares. Construindo Seus Prprios Levels Este level foi construido arranjando os componentes no Maya e depois importando o level no Unity. Se voc gostaria de experimentar, ou mesmo criar levels adicionais, os elementos individuais de cenrio podem ser encontrados na pasta Build Your Own! na Viso de Projeto. Existe uma grande quantidade de props de clulas de combustiveis e arranjar todas elas poderia ser muito chato. Se voc leu os tutoriais anteriores voc j deve saber como fazer, ento ns nos limitaremos a colocar os itens de energia, as plataformas de salto e os pontos de respawn, entre outros.

Itens Corao
Ns comearemos com uma tarefa simples: adicionar alguns itens que o jogador dever coletar no cenrio. Os itens j esto definidos como Prefabs na Viso de Projeto. Pocure dentro da pasta "Props" e voc encontrar o objeto HealthLifePickUpPrefab pronto para usar.

Posicionando um item corao Arraste para a Viso de Cena e utilize a ferramenta de posicionamento do Unity para posicion-lo em algum lugar do cenrio. Repita o processo at que tenha colocado meia dzia destes pelo mapa. Onde eles ficaro de seu gosto, embora eles no devam ser to fceis de sereis encontrados. Considere como o jogador deve jogar e decida onde sero os melhores lugares para tais itens. melhor no ser to generoso para que o jogo no fique to fcil. Finalmente, ns devemos agrupar esses itens em alguma pasta para evitar que eles poluam a Viso de Hierarquia. Ns podemos fazer isso criando um GameObject vazio, GameObject->Create empty, renomeando esse objeto para HealthPickups e arrastando os itens de corao para dentro dele.

Hierarquia dos Itens Coraes O Campo de Fora

O campo de fora No momento, o campo de fora que est barrando a nave de nosso heri no est animado. O resultado visual desapontador. Existem vrios modos de conseguir um efeito visual decente, mas qual escolher? s vezes uma soluo simples a melhor: ns iremos apenas animar as coordenadas UV da textura para dar o efeito de um campo de fora em movimento. A animao ser feita usando um script curto que encontrado dentro da pasta Scripts->Misc na viso de projeto. Ele chamado FenceTextureOffset e se parece com isso:
var scrollSpeed = 0.25; function FixedUpdate() { var offset = Time.time * scrollSpeed; renderer.material.mainTextureOffset = Vector2 (offset,offset); }

A primeira linha expe uma propriedade que podemos editar diretamente atravs da interface do

Unity, ScrollSpeed. A funo FixedUpdate() chamada uma certa quantidade de vezes por segundo pelo Unity. Ns utilizamos uma formula curta - multiplique o ScrollSpeed pelo tempo atual - para definir o offset da textura. Propriedades Charmosas Quando o Inspetor do Unity mostra propriedades e variveis, seus nomes so ajustados para fazer com que eles paream melhores. Normalmente, isto apenas significa procurar pelas letras maisculas no nome e inserir um espao antes de cada uma. Alm disso, o Unity torna maiscula a primeira letra do nome. Ento scrollSpeed mostrada como Scroll Speed. Quando uma textura renderizada, a textura em si apenas uma imagem, normalmente. A propriedade do material mainTextureOffset diz ao Unity que para desenhar o offset da textura dentro de suas coordenadas UV. Isto pode ser utilizado para produzir alguns resultados muito eficazes sem ter que usar sequncias de animes complexas. Expanda o GameObject levelGeometry para revelar os diferentes elementos dos dados do level. Ns precisamos animar a cerca do objeto impoundFence, ento solte o script fenceTextureIOffset nesse objeto. Programando os Itens No momento o Lerpz no pega nenhum dos itens da fase. Isto porque no mandamos o Unity permitir que o nosso heri faa isso. Ns precisamos adicionar dois elementos para cada item: Um Collider Component. Um script para manipular o Collider e atualizar a energia do jogador, etc. Os itens da viso de hierarquia so todos instncias de um Prefab, e so mostrados em azul. Editando o Prefab original diretamente, ns automaticamente atualizaremos todos os itens do jogo. Os dois prefabs que nosso heri pode coletar so FuelCellPrefab e HealthPickUpPrefab. Eles podem ser encontrados dentro da pasta Props na Viso de Projeto. Selecione a raiz do objeto HealthPickUpPrefab. Use Component->Physics->Add Sphere Collider para adicionar um sphere collider para o Prefab. Voc deve ver ele aparecer no Inspetor. Finalmente, selecione o checkbox Is Trigger.

O HealthPickUpPrefab no Inspetor Nota: Um script ObjectRotator j est anexado ao Prefab. Ele apenas faz o pickup rotacionar no lugar e bem simples. Ns veremos um exemplo mais complexo de animao por script em um dos captulos finais. Colliders tem dois usos: ns podemos tocar eles com alguma outra coisa, ou ns podemos utilizlos como Triggers ( Gatilhos ).

Triggers
Triggers so componentes invisiveis que disparam um evento. No Unity, um Trigger um Collider simples com a propriedade Is Trigger selecionada. Isto significa que quando algo colide com o Trigger, ele funcionar como um interruptor virtual ao invs de uma entidade fsica. Os Triggers enviam um de trs mensagens de eventos quando algo muda o estado deles: OnTriggerEnter(), OnTriggerStay() e OnTriggerExit(). As mensagens de evento do Trigger so enviadas para qualquer script anexado ao objeto do Trigger, ento ns precisamos adicionar um script apropriado para o nosso Health prefab. V para o menu Components e escolha o script Pickup no sub-menu Third Person Props. Isso adicionar o script Pickup ao nosso Prefab. Mude a propriedade Pickup Type na viso do inspetor para Health, como mostrado na figura acima. Finalmente, mude a propriedade Amount para 3 ou mais. Isto a quantidade de energia que o pickup dar ao player.

Quanto de energia?
O display que mostra os dados do jogador, isto , sua energia, vidas, etc, pode manipular apenas uma quantidade mxima de 6. O que acontece se o jogador j possui uma barra de energia cheia? Isto uma questo de gosto, mas ns escolhemos fazer o Trigger adicionar uma vida extra. A lgica para isso pode ser encontrada no script de estado do jogador, ThirdPersonStatus. As clulas de combustveis so configuradas do mesmo jeito, com apenas duas diferenas: O Pickup type deve ser FuelCell. O valor Amount, que o nmero de combustvel que o pickup representa ( 1 parece ser o melhor ). Plataformas de salto

Plataforma de salto As plataformas de saltos so esses modelos com texturas amarelas e pretas no cho. Elas foram criadas para aumentar o salto do Lerpz. Ns devemos utilizar um Collider com um script anexado para isso. Primeiro, crie um GameObject vazio e chame-o de JumpPadTriggers. Ns o usaremos como uma pasta para manter todos os nossos objetos do tipo trigger juntos. Agora ns construiremos nosso Prefab: Crie um GameObject vazio. Renomei-o para JumpPadTrigger. Adicione um componente BoxCollider a ele. Configure o Collider como sendo um Trigger. Adicione o script JumpPad. Este o objeto criado, agora precisamos torn-lo um Perfab: Escolha Prefab no menu Create na viso de Projeto. Arraste e solte nosso GameObject JumpPadTrigger para o novo Prefab. Renomeie o Prefab para JumpPadTrigger. Remova o GameObject original da Viso de Hierarquia. Arraste um prefab JumpPadTrigger para a cena e posicione-o dentro de uma das plataformas

de saltos. Existem seis no total. O valor padro da varivel JumpHeight 5 e no suficiente para lanar o Lerpz diretamente no jardim da cena, eu sugiro usar um valor entre 15 e 30 para estas plataformas. Finalmente aperte o play e teste o jogo, certifique-se que os novos triggers funcionam corretamente. Nota: Os scripts funcionam parecidos com o Prefab: ns apenas adicionamos um link para o script Pickup na pasta Props para o Nosso Prefab. Editando um na nossa Viso de Projetos ir afetar todas as copias na cena. Boa organizao importante se voc quer que seu fluxo de trabalho seja suave e livre de dores de cabea. Utilize instncias de Prefab sempre que possvel. Tente organizar por funo ao invs de tipo. Utilize GameObjects vazios como containers. Voc ficar surpreso com a quantidade de recursos necessrios em at mesmo projetos de pequena escala.

GUI
Quantas vidas ainda restam? Qual o nvel de energia do Lerpz? hora de falarmos sobre a GUI ( Graphical User Interface - Interface Grfica de Usurio ). A Interface de Usurio Jogos normalmente possuem Interfaces Grficas de Usurios, GUIs, tais como menus, tela de opes e por a vai. Alm disso, jogos frequentemente possuem uma GUI sobreposta no topo do prprio jogo. Isto pode ser to simples quanto um placar mostrado na lateral, ou um design mais elaborado envolvendo cones, mostrurios de inventrios e a barra de energia. O Unity possue um sistema de GUI para tornar fcil a construo de GUIs para jogos e esse ser o sistema que iremos utilizar para o jogo Lerpz Escapes. O novo sistema de GUI do Unity 2.x ou superior Anteriormente, voc mandaria o Unity desenhar um boto e o Unity enviaria uma srie de mensagens para seu script quando o usurio passasse o mouse em cima do boto, clicasse nele, ou soltasse o boto e assim por diante. O antigo sistema era baseado no modelo tradicional de Event-Driven GUI, mas o Unity 2 introduziu um novo sistema GUI, conhecido como GUI de modo imediato. Se voc est acostumado com o sistema tradicional, ficar chocado com conceito do GUI de modo imediato. Segue um exemplo:
function OnGUI() { If (GUI.Button (Rect(50, 50, 100, 20), "Start Game") ) Application.LoadLevel("FirstLevel"); // load the level. }

OnGUI() chamado pelo menos duas vezes em cada ciclo do jogo.

Você também pode gostar