Sei sulla pagina 1di 100

Unity3D

O Unity3D um programa de desenvolvimento com todos os recursos necessrios para desenvolver qualquer tipo de jogo em 3D que voc possa imaginar. Ele possui uma verso gratuita, que pode ser encontrada no link http://unity3d.com/unity/download/, com a maioria das funcionalidades que um desenvolvedor amador necessita para criar seus jogos e public-los como programa para Windows ou em uma pgina web. Estes jogos para sites funcionam de um modo parecido com os jogos ou animaes para sites criados em Flash, ou seja, necessrio que a pessoa instale um plugin para que eles funcionem. Esse plugin um programa que encontrado no link http://unity3d.com/webplayer/ e funciona parecido com o plugin do Flash, ou seja, voc consegue jogar atravs do seu navegador, Internet Explorer, Firefox, entre outros.

Contedo
Unity3D no Brasil Exemplos de jogos Programas auxiliares Instalando o Unity no Windows O ambiente do Unity A interface Saiba mais

Unity3D no Brasil
Algumas empresas brasileiras j esto utilizando esta ferramenta em seus projetos, um exemplo Aquiris, empresa do sul do pas, que criou o jogo Super Voleibol Brasil. Esse jogo foi patrocinado pela Olympikus e pode ser jogado diretamente pelo navegador. Alm desse jogo a Aquiris j trabalhou desenvolvendo jogos e programas para Embraer, GM, Coca-Cola, Kibon entre outros.

Super Vlei Brasil (Aquiris) A Edgy, que uma empresa paulista, tambm trabalha com a ferramenta e j criou vrios projetos para montadoras de automveis, entre elas Chevrolet, Volkswagen, Peugeot, alm de empresas de outros segmentos, como o caso das Casas Bahia.

Um exemplo de jogo que a empresa criou o Rally Toureg.

Rally Touareg (Edgy) Alm dessas empresas, existem mais, como o caso da CuboCC e seu jogo para a Rexona Race e a Quantix Games, a qual no consegui encontrar um jogo desenvolvido por ela, mas em seu site encontra-se uma referncia ao Unity3D.

Rexona Race

Exemplos de jogos
A verso gratuita do Unity3D tem como foco amadores e pequenas empresas desenvolvedoras de jogos, sendo quase impossvel para ns, amadores, ou essas pequenas empresas criarem jogos como um World of Warcraft ou um FarCry, mas existem grandes empresas utilizando o Unity que criaram jogos impressionantes. Um deles o MMORPG mais conhecido desenvolvido com o Unity3D o Fusion Fall, da Cartoon Network, ele um jogo para web com visual de desenho animado. Para desenvolver esse tipo de jogo necessrio utilizar a licena profissional, a qual no gratuita, mas aqui serve como exemplo de um jogo grande, para centenas de jogadores. Para jogos com poucos jogadores, cerca de 12, a verso gratuita suficiente.

Fusion Fall ( Web MMORPG ) Alm disso, existem licenas do programas, no gratuitas, que permitem desenvolver jogos para o vdeo Nintendo Wii, como o caso do JumpStart, e para iPhone, Zombieville. O jogo Zombieville simplesmente um dos jogos mais vendidos para iPhone, chegando a ficar no topo da lista de mais vendidos. Existe um plano da empresa criar uma licena para que se possa publicar os jogos tambm para o Xbox 360, assim, se voc criar um jogo que faa sucesso, voc tem a possibilidade de publicar para diversas outras plataformas.

JumpStart para Nintendo Wii

Zombieville (iPhone)

Um aviso
Os jogos apresentados neste captulo foram desenvolvidos por profissionais que trabalham neles durante muito tempo e j possuem uma grande experincia na rea de desenvolvimento de jogos. Quando voc comear a desenvolver, no fique frustrado se seu jogo no parecer to bom ou no conseguir criar uma funcionalidade parecida com as dos jogos citados, com o tempo voc aprender a desenvolver jogos cada vez melhores e quem sabe um dia faa parte do time de desenvolvimento de um grande jogo. Outra a coisa a ser lembrada que a verso gratuita da engine no permite o desenvolvimento de jogos para iPhone ou para o Nintendo Wii, apenas para Windows, MAC e para internet, mas nada impede de voc comprar uma licena para desenvolver para essas plataformas aps voc desenvolver um jogo de sucesso para Windows, por exemplo, e comprar essas licenas com o dinheiro obtido para ganhar mais dinheiro. Mas isso no um problema para aqueles que desejam apenas desenvolver para Windows e tem o desenvolvimento de jogos apenas como um hobby.

Programas auxiliares
Alm do Unity3D existem outros programas auxiliares para o desenvolvimento de um jogo, segue aqui uma lista desses programas, todos so gratuitos: Blender: Ferramenta para modelagem e animao de objetos 3D. Audacity: Editor de audio open source. Gimp: Editor de imagens. Inkscape: Para criao de desenhos. Melody Raiser: Programa de gerao de msica procedural. LMMS: Programa para criao de msicas. SFXR: Programa de gerao de efeitos sonoros. MapZone Editor: Ferramenta para criao de texturas. Crazy Bump: Ferramenta para criao de bump maps.

No o enfoque deste tutorial detalhar o funcionamento desses programas, voc s precisa saber que eles sero necessrios caso voc queira criar seus prprios modelos, animaes, msicas e tudo mais.

Instalando o Unity no Windows


No video a seguir mostrado um tutorial sobre como instalar o Unity e logo abaixo a transcrio do video. Baixe o Unity, aps terminar o download, execute o instalador. A verso utilizada nesse tutorial a 2.6.1, porm no houve mudanas na verso 3.0.

Object 1

A seguinte tela ir aparecer:

Instalao do Unity, passo 1 Clique em Next.

Instalao do Unity, passo 2 Leia o acordo de licena e, se concordar, clique em I Agree para ir para a prxima tela.

Instalao do Unity, passo 3 Clique em Next.

Instalao do Unity, passo 4 Escolha o local da instalao e clique em Install.

Instalao do Unity, passo 5 Aguarde a instalao finalizar.

Instalao do Unity, passo 6 Clique em Finish, o Unity ser executado.

Instalao do Unity, passo 7 Clique em Register.

Instalao do Unity, passo 8 Selecione Internet Activation e clique em Avanar.

Instalao do Unity, passo 9 Espere o programa se conectar ao servidor e abrir seu navegador:

Instalao do Unity, passo 10 Clique na pgina que foi aberta pelo navegador em Free.

Instalao do Unity, passo 11 Pronto! Agora voc poder utilizar a verso gratuita do Unity por tempo indeterminado, porm a verso pro por apenas 30 dias.

Instalao do Unity, passo 12 Clique em Concluir. E abra o Unity novamente. No prximo captulo farei uma breve introduo interface do Unity, aos principais conceitos envolvendo programao 3D e uma descrio das principais palavras relacionadas a esse tipo de programao.

O ambiente do Unity
Este captulo apresenta uma breve introduo ao ambiente de desenvolvimento do Unity3D assim como alguns dos vrios conceitos envolvidos na rea de programao de jogos 3D. O objetivo deste captulo tornar o leitor mais familiar com o uso do Unity3D e com os principais termos encontrados na rea, pois existem muitas pessoas com pouca experincia na rea e que costumam ficar confusas com eles. Boa parte do que est neste captulo est disponvel na prpria documentao do Unity, porm em ingls.

Object 2

A interface
Antes de continuar lendo este tutorial, recomendo que instale o programa do Unity3D e execute. Para aqueles que esto abrindo o programa pela primeira vez ele abrir o projeto Tropical Paradise por padro.

Tela inicial do Unity O Unity possibilita ao usurio escolher o lugar que cada elemento do programa ir ficar, porm o Unity possui alguns layout pr-configurados, o layout usado na imagem o padro, se o seu programa est configurado com um layout diferente voc pode mud-lo na Barra de ferramentas-> Window->Layouts->Revert Factory Settings. Essa tela composta dos seguintes elementos:

Viso de Projeto

Unity - Viso de Projeto Quando voc cria um projeto no Unity, ele ir criar uma pasta contendo todas as Assets (scenes, scripts, modelos 3D, texturas, arquivos de udio, vdeo, imagens, etc) do projeto. Tudo o que tem nessa pasta, mostrado na viso de projeto. Se voc clicar com o boto do direito do mouse em alguma dessas Assets, voc poder escolher a opo Reveal in Explorer, que abrir a pasta que contm o arquivo. Ateno: no mova os arquivos usando o Explorer do Windows, use o editor do Unity, pois isso pode causar problemas ao projeto. Para adicionar novas Assets ao projeto, voc pode arrastar o arquivo do Windows para a viso de projeto ou utilizar o comando na barra de ferramentas Assets -> Import New Asset. O arquivo ficar pronto para ser usado no projeto. As cenas do jogo tambm ficam nessa pasta. Cada cena representa um level do jogo. O Unity carrega por padro a cena Islands.unity, para criar uma nova aperte ctrl+n ou v na Barra de Ferramentas->File->New Scene. Para salvar a cena aperte ctrl+s ou v na Barra de Ferramentas>File->Save Scene. Alguns Assets precisam ser criados diretamente no editor do Unity, para fazer isso, v na viso do projeto e use o menu Create, ou clique com o boto direito do mouse->Create. Mais tarde irei explicar o que cada tipo de Assets, por hora tente criar uma pasta, para mudar o nome dela, a selecione com um clique e aperte F2, digite o nome e aperte "Enter".

Unity - Viso de Projeto - Create Hierarquia

Unity - Viso de Hierarquia A viso da hierarquia da cena mostra todos os elementos presentes na cena, cada GameObject. Alguns desses objetos so instncia diretas de Assets,m tais como modelos do Blender, outros so Prefabs, ou seja, objetos personalizados, uma mistura de modelos com scripts e outras coisas, que iro compor boa parte dos jogos do Unity. Voc pode clicar e arrastar objetos para mudar a hierarquia deles, ou seja, organiz-los como se fossem pastas, objetos que esto dentro de outro objetos so filhos deste objeto, o objeto que contm esses filhos chamado de pai. Um objeto filho herdar o movimento, rotao e escala de seu pai. Essa informao muito importante, pois voc dever ficar atento a este fato quando comear a programar seu jogo. Voc pode expandir ou contrair o objeto pai para ver quais so seus filhos sem afetar com isso o jogo.

Object 3

Dois objetos sem pais

Um objeto sendo pai de outro

Menu de Topo

Menu de Topo do Unity O menu de topo consiste em cinco controles bsicos. Cada um relacionado a partes diferente do editor. Transform Tools ferramenta utilizada na viso da cena.

Transform Tools Transform Gizmo Toggles -- afeta o que a viso da cena mostra. Transform Gizmo Toggles Play/Pause/Step Buttons -- used with the Game View utilizado para executar/pausar/encerrar o jogo.

Play/Pause/Step Buttons Layers Drop-down -- View controla quais objetos sero mostrados na cena. Layers Layout Drop-down -- controla a disposio de todas as vises. Layout

Viso da Cena
A viso da cena o lugar onde voc pode organizar a disposio dos objetos na cena do jogo. Voc pode selecionar e mudar de posio os jogadores, a cmera, os inimigos e todos os outros GameObjects, alm de poder mudar a escala deles, ou seja, o tamanho desses objetos. Esse editor de cena uma das ferramentas mais importantes do Unity, ento voc deve aprender a mexer com ele. Para selecionar um objeto basta clicar nele na viso de cena ou na viso de hierarquia, para focar o objeto basta apertar a tecla f na viso de cena.

Object 4

Unity - Viso de Cena Posicionamento de objetos Ao selecionar algum objeto voc pode utilizar a Transform Tools, para mudar sua posio (translate tool), rotao (rotate tool) ou tamanho (scale tool).

Transform Tools Scene Gizmo

Scene Gizmo No canto superior direito da viso da cena est o Gizmo da cena. Ela mostra a orientao da cmera da cena e possibilita voc mudar rapidamente a orientao da mesma, basta clicar em algum de seus vrtices ou no centro para habilitar uma viso em perspectiva da cena, se segurar o shift enquanto clica no centro do Gizmo, voc habilita a viso isomtrica.

Viso em Perspectiva

Viso isomtrica. Os objetos no ficam menores com a distncia aqui! Barra de controle da cena Barra de controle da cena O primeiro menu drop-down para escolher o modo de desenho. A mudana no modo de desenho no ter efeitos no jogo quando ele for publicado.

Draw Mode drop-down O Segundo o modo de renderizao. Tambm no ter efeito no jogo aps publicado.

Render Mode drop-down Os outros dois botes so relacionados iluminao da cena e o segundo a apresentao de skybox, elementos da GUI e outras coisas na viso da cena. Barra de Cena - Botes

Viso de jogo

Viso de Jogo

A viso de jogo renderizada atravs da cmera dentro do jogo. Ela representa como seu jogo ficar quando for publicado. Play Mode

Play/Pause/Step Buttons Use estes botes par controlar a viso de jogo. Aperte o play para iniciar o jogo, se apertar play novamente o jogo encerrado, para pausar o jogo aperte pause. Barra de controle da viso de jogo Barra de controle da viso de jogo O primeiro menu drop-down controla a escala, o segundo maximize a tela quando o jogo comear, o terceiro mostra os Gizmos da cena e o quarto as estatsticas do jogo, tais como frame rate e nmero de polgonos na cena.

Estatstica do jogo

Inspetor

Inspetor Jogos feitos no Unity so compostos de muitos GameObjects que contm modelos, scripts, som, ou outros elementos grficos, tais como luz. O inspetor mostra detalhadamente as informaes sobre o GameObject selecionado, incluindo todos os componentes pertencentes a este objeto. Nessa viso voc pode modificar os valores das propriedades desses componentes que o GameObject possui. Toda propriedade mostrada no inspetor pode ser modificada. At variveis de scripts podem ser modificadas sem modificar o script original. Voc pode mudar essas propriedades enquanto o jogo est rodando para experimentar e encontrar os valores ideais para essas propriedades para seu jogo. Esta uma funcionalidade muito importante, pois na maioria dos casos de desenvolvimento de jogo no possvel modificar valores de variveis enquanto o jogo est em execuo.

Adicionando componentes atravs do menu de componentes Clicando com o boto direito do mouse no ttulo do componente na viso do inspetor, aparece uma lista de opes onde voc pode remover o componente do GameObject.

Remover Componentes Use o menu drop-down de Layer para associar um layer de renderizao a seu GameObject. Utiliza o menu drop-down de Tag para associar uma Tag a seu GameObject. Voc tambm pode mudar o nome de seu GameObject atravs do inspetor.

Associando Layers Barra de Status A barra de status est no canto inferior da tela e ela mostra erros de compilao e mensagens de debug. Se existe algum problema no seu jogo, ficar de olho nessa barra o melhor caminho, voc pode dar um clique duplo com o mouse para mostrar o console com as mensagens da barra de status. Console Se voc der um clique duplo na barra de status ou escolhendo Barra de Ferramentas->Window>Console, aparecer o Console.

Viso do Console O Console mostra mensagens de erros, warnings e textos de debug. Voc enviar suas prprias mensagens para o console utilizando Debug.Log() ou Debug.Error() em seus cdigo.

Saiba mais
Confira os principais videos sobre o Unity3D em portugus, tambm veja nossa seo de tutoriais; Baixe os principais projetos, assets e tutoriais disponveis gratutamente sobre o Unity3D; Participe de nosso frum; Baixe e jogue nossos projetos; Torne-se um membro do site e hospede seus jogos e modelos .obj aqui mesmo para que seus amigos possam testar.

Editor de Terrenos
Thiago Campos Viana 06/11/2010 19:07

ndice de artigos
1. Editor de Terrenos 2. Navegando pelo terreno Uma das vantagens de se utilizar um motor de jogo a possibilidade de realizar vrios trabalhos com ferramentas grficas, podendo visualizar o que est fazendo. O editor de level do Unity possui uma ferramenta para edio de terrenos que permite aos desenvolvedores paisagens ricas em

detalhes de um modo simples e rpido comparado com o uso de modeladores 3d, tais como Blender e 3D Studio Max, para a realizao dessa tarefa. Esse tutorial uma traduo da documentao do Unity da parte que explica o processo de criao de terrenos.

Utilizando Terrenos
Criando um novo Terreno Um novo terreno pode ser criado a partir da Barra de Ferramentas->Terrain->Create Terrain. Isto adicionar um Terreno para sua viso de projeto e para a viso de hierarquia.

Menu de Terreno Seu novo terreno ir se parecer com a seguinte imagem:

Um novo terreno na viso da cena Se voc preferir um terreno com um tamanho diferente, v em Barra de Ferramentas->Terrain->Set Resolution

Alterando a resoluo do terreno Na imagem acima, existem variveis que podem ser alteradas: Terrain Width: A largura do terreno. Terrain Height: A altura do terreno. Terrain Length: O comprimento do terreno. HeightMap Resolution: A resoluo do HeightMap para o terreno selecionado. Detail Resolution: A resoluo do mapa que controla a grama e os meshes de detalhes. Por questes de performance, quanto menor o valor, melhor. Control Texture Resolution: The resolution of the splat map used to layer the different textures painted onto the Terrain. Base Texture Resolution: A resoluo da textura de composio usada no lugar da diviso do mapa a certas distncias.

Navegando pelo terreno


Thiago Campos Viana 06/11/2010 19:07

ndice de artigos
1. Editor de Terrenos 2. Navegando pelo terreno Terrenos funcionam um pouco diferente dos outros GameObjects. A coisa mais notvel que no possvel mudar a posio dos terrenos pelo editor de cena. Ao invs disso, voc pode utilizar pincis para pintar e manipular seu terreno. Se voc deseja mudar a posio do terreno, voc o faz mudando os valores das propriedades Transform, no inspetor, mas no possvel mudar sua escala ou rotacion-lo. Quando o terreno estiver selecionado na viso de hierarquia, voc pode apertar a tecla F para centraliz-lo no editor da cena.

Editando o Terreno
Quando o terreno est selecionado, aparecer no inspector as ferramentas de edio de terreno.

A Ferramenta de Edio de Terrenos no Inspetor Continua...

Introduo ao JavaScript
Thiago Campos Viana 06/11/2010 10:15

ndice de artigos
1. 2. 3. 4. 5. 6. 7. 8. Introduo ao JavaScript Variveis e tipos de dados Declarao de variveis e palavras reservadas Operadores do JavaScript Comandos condicionais Objetos, propriedades e mtodos Comentrios de Cdigo Isso no tudo

O Unity3d permite aos desenvolvedores escolher entre trs tipos de linguagem de programao

diferentes: Java Script, C# e Boo. Dentre estas, por ser a mais simples, esta apostila adotou a linguagem Java Script para criar os cdigos responsveis por controlar o funcionamento do jogo. A partir deste ponto, assume-se que o leitor est familiarizado com a interface do Unity3d.

Seu primeiro programa


Crie um novo projeto, Barra de Ferramentas->File->New Project. Aparecer uma caixa de dialogo onde voc poder escolher o local onde seu projeto ser criado em seu computador e os pacotes contendo um conjunto de Assets a serem importados para o projeto durante a criao do projeto. Cheque a opo Standard Assets.unityPackage, o local do seu projeto e o nome dele e clique no boto Create. Um projeto totalmente novo ser criado, esse processo pode demorar um pouco. Voc ver uma tela mais ou menos assim:

Unity - Tela 1 Salve a cena, ctrl+s, escolhe um nome para ela, por exemplo, level1. Crie um Cubo, Barra de Ferramentas->GameObject->Create Other->Cube. Com o Cubo Selecionado aperte f na viso de cena. Selecione a cmera na viso de hierarquia e v em Barra de Ferramentas->GameObject>Move To View.

Voc ter uma cena mais ou menos assim:

Unity - Tela 2 Mude a posio da cmera at que ela focalize o cubo, nesse caso clique na translate tool e mude a posio da cmera pelo eixo z, azul, aperte o play para ver como ficaria a cena durante o jogo. Voc pode mudar o layout clicando e arrastando a aba Game at a parte inferior da viso de cena, faa isso at que o layout e a posio da cmera o do cubo fique do seguinte modo:

Unity - Tela 3 Quando voc apertar o play no ver apenas uma tela azul, ver um quadrado preto no centro da tela. Isso significa que voc j aprendeu o bsico da interface do Unity, agora estamos pronto para comear a aprender um pouco de Java Script. Na viso de projeto clique em Create->Java Script. Mude o nome do script, selecionando-o e apertando F2, para Ola. D um duplo clique no script na viso de projetos. Um editor de script ser aberto e ter o seguinte contedo:

function Update () { }

Mude o script e escreva o seguinte cdigo:


function Update () { print("Ola"); }

Clique e arraste o script da viso de projeto para a viso de hierarquia no objeto Cubo. Aperte o play. Voc ver na barra de status, na parte inferior, a seguinte mensagem: Ola

Unity - Tela 4 Aperte o play novamente para encerrar o jogo. D um duplo clique na barra de status para abrir o console e confira que a mensagem foi exibida no console. Isso significa que tudo funcionou, mas agora voc deve estar se perguntando, Ok, mas o que aconteceu?. A primeira parte que consiste em posicionar a cmera para que ela focalize o Cubo intuitiva, funciona como na vida real, onde quando se deseja tirar uma foto, necessrio posicionar a cmera em um determinado local e mirar ela em um objeto para que este objeto aparea na foto. Foi o que fizemos. Voc poderia utilizar as outras ferramentas de posicionamento, tais como a rotate tool para rotacionar a cmera em conjunto com a translate tool para que o objeto fosse visto de um outro ngulo. necessrio prestar ateno no campo de viso da cmera que representado na viso de cena como um campo com arestas brancas. Tudo o que est dentro deste campo ser renderizado na cena. Na segunda parte criamos um Java Script e adicionamos a ele a um objeto, assim o objeto passou a ter esse script como um de seus componentes. Esse script tem uma funo chamada Update() que executada repetidamente e automaticamente pelo Unity em intervalos curtos de tempo, vrias vezes por segundo, depende da quantidade frames por segundo do jogo, ela executada uma vez a cada frame. Quando um script com essa funo colocado em um GameObject. Se voc colocar esse script em mais de um GameObject, cada GameObject executar seu prprio script, executando a funo

Update() desse script. No so todas as funes que so executadas automaticamente, porm se voc colocar uma funo em um script com o nome de Update(), essa funo ser executada automaticamente pelo Unity. O comando print exibe um texto no Console e na barra de status. Antes de explicar detalhadamente como o Java Script funciona, vamos a mais um teste, mude o cdigo do script Ola para:
function Update () { transform.Rotate(0, 5*Time.deltaTime, 0); }

Aperte play e perceba que o cubo comea a girar ao redor do eixo y! Ou seja, a funo transform.Rotate(0, 5*Time.deltaTime, 0) fez com que ao invs do programa mostrar um texto na barra de status, faz o cubo girar. Agora hora de entender como funciona a linguagem de programao Java Script, que ser responsvel por controlar todos os elementos dos jogos feitos com o Unity.

Variveis e tipos de dados


Thiago Campos Viana 06/11/2010 10:15

ndice de artigos
1. 2. 3. 4. 5. 6. 7. 8. Introduo ao JavaScript Variveis e tipos de dados Declarao de variveis e palavras reservadas Operadores do JavaScript Comandos condicionais Objetos, propriedades e mtodos Comentrios de Cdigo Isso no tudo

Na escola aprendemos a representar valores atravs de variveis, principalmente nas aulas de matemtica. Por exemplo, quando eu digo que um nmero x vale 5 e digo que um nmero y igual a x+1, sabemos que o se substituirmos o x do x+1 por 5, que o valor de x conclumos que y igual a 5+1, ou seja, 6. Assim: x=5; y = x + 1 => y = 5 + 1 => y = 6; Para declarar variveis em Java Script, fazemos assim:
var x = 5; var y = x+1;

V no script Ola e mude-o para:


var x = 5; function Update () { var y = x+1; print(y); }

Aperte o play e perceba que a barra de status mostra o valor 6.

Nesse caso, x e y so variveis, ou seja, valores que podem sofrem alterao. Se mudarmos o valor de x para 20 e se y igual a x+1, ento y passar a ser 21. Pois y representado em funo de x. Esse um dos conceitos fundamentais que voc deve entender para comear a programar Java Script, representar valores em forma de variveis.

Agora selecione o Cubo na viso de hierarquia e veja que a viso do inspetor est diferente na parte que mostra o script Ola. Mude o valor de x no inspetor para 20 e aperte play. Perceba que a barra de status agora mostra o valor 21. Se voc abrir o script Ola ver que ele est inalterado, x ainda est com o valor 5, isso por que o inspetor permite voc alterar valores de variveis de um script sem alterar o script em si. Isso evita que voc tenha que reescrever o script toda vez que voc tiver que adicionar ele a um novo GameObject e ter que mudar alguns valores desse script. Voc pode alterar o valor de x enquanto o jogo est rodando e ver o resultado, isso permite voc achar um bom valor para a varivel, porm valores alterados durante a execuo do jogo sero revertidos para o valor que estava antes da execuo. Voltemos a histria de variveis. Podemos dizer que x uma varivel do tipo laranja e que y tambm laranja, ento x representa 5 laranjas e y 6 laranjas, quando dizemos isso, estamos especificando um tipo para a varivel x, dizemos isso quando desejamos fazer alguma coisa com essas variveis que s podem ser feitas se elas forem de um tipo. Nesse caso desejamos fazer um suco de laranja. O Java Script possui uma srie de tipos bsicos e cada um serve para alguma coisa, um deles o tipo String que serve para trabalhar com palavras. Por exemplo, para declarar uma varivel do tipo String e atribuir a ela a mensagem Ola, podemos fazer desse modo:
var mensagem:String = Minha primeira string;

Para fazer um teste v no script Ola e altere-o para:


var mensagem:String = Minha primeira string; function Update () { print(mensagem); }

Aperte play e veja que o a funo print exibe na barra de status o valor da mensagem, ou seja, Minha primeira string. Como voc pode perceber, a funo print serve para testar o programa, ela poder mostrar o valor de qualquer varivel que voc declarar. A seguir veremos os tipos de variveis que o Java Script possui, se quiser testar cada tipo, basta alterar o cdigo para que a funo print imprima o valor de sua varivel, por exemplo, voc pode usar print(n), onde n seria o nome da varivel do tipo nmero, voc especificar outro nome para sua varivel, mas lembre-se de corrigir a funo print. O Java Script possui os seguintes tipos primitivos: Tipo sbyte short int long byte ushort uint ulong float double boolean Descrio Inteiro de 8-bit com sinal. Inteiro de 16-bit com sinal. Inteiro de 32-bit com sinal. Inteiro de 64-bit com sinal. Inteiro de 8-bit sem sinal. Inteiro de 16-bit sem sinal. Inteiro de 32-bit sem sinal. Inteiro de 64-bit sem sinal. Nmero decimal. Nmero decimal duas que pode ter um valor maior que o float, usado para nmeros muito extensos. Represents a true / false value. Reprenseta verdadeiro (true) ou falso (falso), Um caracter. Representa um texto ou uma srie de caracteres. Exemplo var n : sbyte = -2; var n : short = -2; var n : int = 2; var n : long = 2; var n : byte = 2; var n : ushort = 2; var n : uint = 2; var n : ulong = 2; var f : float = 2.0; var f : double = 2.0;

var b : boolean = true; char var c : char = "c"[0]; String var s : String = "Hello, world"; Cada um deles serve para uma coisa. Voc no precisa especificar o tipo de sua varivel, geralmente voc s vai especificar quando voc deseja restringir certas operaes para trabalham com um determinado tipo ou usar uma funo que trabalhar com uma caracterstica que apenas aquele tipo possui, por exemplo se voc quer usar nmeros inteiros em sua conta, voc dever usar o tipo int ou algum outro que represente apenas nmero inteiros, como o short que para inteiros pequenos. Alm dos tipos primitivos definidos na prpria linguagem do Java Script, existem os tipos complexos, os quais fazem parte do Unity e voc pode criar seu prprio tipo de dado, o que chamamos de classes. Um dos tipos complexos que voc utilizar muito o tipo Array, que representa um conjunto de variveis. Como nas matrizes e vetores das aulas de matemtica.

Declarao de variveis e palavras reservadas


Thiago Campos Viana

06/11/2010 10:15

ndice de artigos
1. 2. 3. 4. 5. 6. 7. 8. Introduo ao JavaScript Variveis e tipos de dados Declarao de variveis e palavras reservadas Operadores do JavaScript Comandos condicionais Objetos, propriedades e mtodos Comentrios de Cdigo Isso no tudo

Para declarar uma varivel necessrio escrever primeiro a palavra var e depois o nome da varivel, toda comando em um Java Script deve ser encerrado com um ; (ponto e virgula), vamos declarar uma varivel com o nome de ano:
var ano;

Voc pode atribuir um valor para uma varivel em sua declarao:


var ano = 2009;

Tambm possvel especificar um tipo de uma varivel em sua declarao colocando : (dois pontos) e o nome do tipo depois do nome, por exemplo, como ano um nmero inteiro podemos declarar ele como sendo do tipo int assim:
var ano : int = 2009;

O primeiro caractere do nome de uma varivel deve ser uma letra ou _ (underline), maiscula ou minscula, os demais caracteres podem ser nmeros, letras ou o caractere especial _ (underline). Exemplos de nomes vlidos para variveis: Homem, homem2, _homem, mul89_her, bola883, bola, b, c, iiio0__ou, etc Exemplos de nomes invlidos para variveis: 9homem, %idade, *ok, .ddd, &hoje Uma varivel tambm no pode ter os seguintes nomes pois so palavras reservadas da linguagem Java Script: as boolean break byte case char class continue default double else enum float for if in int long new null private protected public return static string super switch this true typeof uint ulong ushort virtual void

false

sbyte

while

Ou seja, tambm seria invlida a seguinte varivel:


var continue;

Essas palavras reservadas so os tipos de variveis e comandos que a linguagem usa para especificar o que o programa deve fazer.

Operadores do JavaScript
Thiago Campos Viana 06/11/2010 10:15

ndice de artigos
1. 2. 3. 4. 5. 6. 7. 8. Introduo ao JavaScript Variveis e tipos de dados Declarao de variveis e palavras reservadas Operadores do JavaScript Comandos condicionais Objetos, propriedades e mtodos Comentrios de Cdigo Isso no tudo

Variveis podem ser utilizadas para realizar operaes, para isso existem os operadores, os quais j vimos a alguns deles nas aulas de matemtica e isso facilita saber para que servem, um exemplo o operador + que realiza adio:
var x = 2 + 4;

Nesse caso o operador + far uma soma de 2 com 4, o que resulta em 6, e esse ser o valor de x. Tambm poderamos fazer:
var n1 = 2; var n2 = 4; var x = n1 + n2;

O operador mais tambm tem uma funo especial com variveis do tipo string, ele permite juntar duas strings em uma s:
var palavra = Bom + dia;

Faz com que a varivel palavra tenha o valor de Bom dia. Tambm podemos fazer:
var p1 = Bom ; var p2 = dia; var palavra = p1 + p2;

A tabela a seguir contm os operadores existentes em Java Script e suas aplicaes: Operador Funo Exemplo Resultado

+ + * / % ++

Concatena strings. Soma dois nmeros. Subtrai o nmero da esquerda pelo da direita. Multiplica um nmero pelo outro. Divide o nmero da esquerda pelo da direita. Retorna o resto da diviso. Incrementa em 1 o valor da varivel. Pode ser usado a direita ou a esquerda da varivel.

var palavra = Bom + dia; var total = 5 + 6; var total = 11 3; var total = 2*5; var total = 9 / 2; var total = 9 % 2; var total = 2; total++;

Bom dia 11 8 10 4.5 1 3

Decrementa em 1 o valor var total = 2; 1 da varivel. Pode ser usado a direita ou a esquerda da total--; varivel. Alm dos operadores matemticos, existem os operadores relacionais, que retornam verdadeiro (true) ou falso (false), ou seja, retorna um valor booleano, dependendo se a expresso verdadeira ou no: Operador Funo Exemplo Resultado < Menor que. 4 < 5; true > Maior que. 4 > 5; false == Igual. 4 == 5; false <= Menor ou igual. 4 <= 5; true >= Maior ou igual. 4 >= 5; false != Diferente. 4 != 5 true Tambm podemos combinar duas expresses relacionais atravs dos operadores lgicos &&, que verifica se as duas expresses so verdadeiras, e o || que verifica se uma das duas expresses verdadeira. Exemplos para o operador lgico E, &&: Resultado falso, pois se uma das expresses for falsa, o resultado ser falso, como 4 > 5 falso, ento essa expresso retornaria false. 4 < 5 && 4 != 5 verdadeiro, pois 4 menor que 5 e 4 diferente de 5. Exemplos para o operador lgico OU, ||: Resultado verdadeiro, pois se uma das expresses for verdadeira, o resultado ser verdadeiro, e como 4 < 5 verdadeiro, essa expresso retornaria true. 4 > 5 || 4 == 5 falso pois as duas expresses so falsas. Por ltimo existem os operadores de atribuio, que, como o prprio nome sugere, so utilizados na atribuio de um valor a uma varivel: Exemplo 4 < 5 || 4 > 5 Exemplo 4 < 5 && 4 > 5

--

Operador Funo = Atribui um valor a uma varivel. += Soma o valor atual da varivel com o valor de atribuio. -= Subtrai o valor atual da varivel com o valor de atribuio.

Exemplo var total = 6; var total = 6; total +=6 var total = 11; total -= 3;

Resultado Bom dia 11

*=

Multiplica o valor atual da var total = 2; varivel pelo valor de atribuio. total *= 5; Divide o valor atual da varivel pelo valor de atribuio. var total = 9; total /= 2;

10

/=

4.5

%=

Retorna o resto da diviso var total = 9; do valor atual da varivel pelo valor de atribuio. total %= 2;

Comandos condicionais
Thiago Campos Viana 06/11/2010 10:15

ndice de artigos
1. 2. 3. 4. 5. 6. 7. 8. Introduo ao JavaScript Variveis e tipos de dados Declarao de variveis e palavras reservadas Operadores do JavaScript Comandos condicionais Objetos, propriedades e mtodos Comentrios de Cdigo Isso no tudo

Existem alguns comandos em Java Script que controlam a execuo de uma parte do cdigo de acordo com determinada condio. So os comandos condicionais. Comando if (se) Executa um determinado conjunto de aes se uma determinada condio verdadeira. Ou seja, se (if) determinada condio verdadeira, ento realize as seguintes aes. Sintaxe:

if ( condio ) { Ao1; Ao2; .... AoN; }

Se deseja condicionar a execuo de apenas uma ao ao comando if, no necessrio colocar os {}:
if (condio) Ao;

Exemplo:
var x = 5; function Update () { if ( x==5 ){ print(Verdade); } }

Comando else (seno) Complemento do comando if, funciona como um seno, ou seja, quando usamos o if, dizemos, Se (if) determinada condio verdadeira, ento, realize um determinado conjunto de aes, seno (else), realize outro conjunto de aes. Sintaxe:
if ( condio ) { Ao1; Ao2; .... AoN; } else { Ao1; Ao2; .... AoN;

Tambm possvel condicionar apenas uma ao a uma condio seno, como no if:
if (condio) Ao;

elseAo2; Exemplo:
var x = 5; function Update () { if ( x>100 ){ print(Verdade); } else { print(Mentira); } }

Comando while (enquanto) Executa um conjunto de aes repetidamente enquanto uma determinada condio for verdadeira. Sintaxe:
while ( condio ) { Ao1; Ao2; .... AoN; }

Exemplo:
var x = 0; function Update () { while ( x<100 ){ print(x vale +x); x++; } }

Comando for (para) Um while incorpado, declara a varivel de controle, a condio de parada e o como o incremento da varivel de controle ser feito tudo de uma vez. Sintaxe:
for ( iniciaoDaVarivel; condio; incrementoDaVarivel )

{ Ao1; Ao2; .... AoN;

Exemplo:
function Update () { for (var x=0; x < 100; x++ ){ print(x vale +x); } }

Comando break (interromper) e contine So utilizados dentro de um comando while ou for, o break quebra a repetio e continue executando os cdigos que esto depois do comando while ou for em questo, e o continue volta imediatamente para o inicio da repetio.
function Update () { for (var x=0; x < 100; x++ ){ print(x); if ( x ==50) break; } }

Objetos, propriedades e mtodos


Thiago Campos Viana 06/11/2010 10:15

ndice de artigos
1. 2. 3. 4. 5. 6. 7. 8. Introduo ao JavaScript Variveis e tipos de dados Declarao de variveis e palavras reservadas Operadores do JavaScript Comandos condicionais Objetos, propriedades e mtodos Comentrios de Cdigo Isso no tudo

Todo jogo criado pelo Unity composto por objetos, por hora basta saber que o Unity cria objetos durante a execuo do jogo, por exemplo, quando o jogo iniciado o Unity cria o objeto Time que possui informaes sobre o tempo de jogo. Modelos, a cmera, terrenos, etc. Tambm so considerados objetos, como na vida real, dizemos que tudo que existe so objetos, incluindo ns mesmos. Todo objeto tem propriedades, ou seja atributos, por exemplo, um homem tem olhos. O

objeto Time tem o atributo deltaTime que retorna a diferena de tempo entre uma atualizao e outra do programa. Para fazer referencia a um determinado atributo de um objeto usamos a seguinte sintaxe, objeto ponto atributo: <Objeto>.<Atributo>; No caso, para acessar o atributo deltaTime do objeto Time, faramos: Time.deltaTime; Exemplo:
var x:float = 0; function Update () { x = Time.deltaTime; print(x); }

Objetos tambm possuem funes, ou mtodos, que so acessados de maneira similar aos atributos, ou seja, objeto ponto funo(): <Objeto>.Funo(); Na vida real, os seres vivos tem a funo de se reproduzir entre outras. No Unity, existe um objeto matemtico que tem vrias funes, entre elas uma de retornar o valor da raiz quadrada de um nmero, o objeto o Mathf e a funo Sqrt que tem como parmetro o nmero que desejamos saber a raiz quadrada: Exemplo para calcular a raiz quadrada de 10:
print(Mathf.Sqrt(10));

Para criar uma funo usamos a seguinte sintaxe:


function NomeDaFuno( Parmetros ) { Ao1; Ao2; Ao3; }

Por exemplo, para criar uma funo que multiplica um nmero pelo outro e imprime o valor na tela faramos o seguinte:
function multiplica( numero1, numero2 ) { var resultado = numero1 * numero2; print(resultado); }

Segue um exemplo de um script que cria e usa essa funo:


function multiplica( numero1, numero2 ) {

var resultado = numero1 * numero2; print(resultado); } function Update () { multiplica(10,20); }

Voc tambm pode utilizar funes para atribuir valores a variveis, para isso voc deve especificar que tipo de dado a funo retorna e especificar dentro dela o valor retornado com um comando return, repare nas mudanas do cdigo anterior para o prximo:
function multiplica( numero1, numero2 ):float { var resultado = numero1 * numero2; return resultado; } function Update () { var x = multiplica(6,7); print(x); }

Comentrios de Cdigo
Thiago Campos Viana 06/11/2010 10:15

ndice de artigos
1. 2. 3. 4. 5. 6. 7. 8. Introduo ao JavaScript Variveis e tipos de dados Declarao de variveis e palavras reservadas Operadores do JavaScript Comandos condicionais Objetos, propriedades e mtodos Comentrios de Cdigo Isso no tudo

Existe duas formas de inserir comentrios em seu cdigo no Java Script, o comentrio de uma nica linha que precedido por //, exemplo:
// esse um comentrio de uma linha

Outra forma o comentrio de vrias linhas que comea com /* e termina com */, exemplo:
/* Este comentrio tem vrias linhas A gente escreve, escreve, escreve E quando v j tem comentrio suficiente Encerra os comentrios

*/

Isso no tudo
Thiago Campos Viana 06/11/2010 10:15

ndice de artigos
1. 2. 3. 4. 5. 6. 7. 8. Introduo ao JavaScript Variveis e tipos de dados Declarao de variveis e palavras reservadas Operadores do JavaScript Comandos condicionais Objetos, propriedades e mtodos Comentrios de Cdigo Isso no tudo

Existem mais conceitos em Java Script que os apresentados nesse captulo, tais como criao de classes, modificadores de atributos, etc. Conforme a complexidade de um jogo avana, ser necessrio o leitor pesquisar mais sobre Java Script. Tentarei manter os exemplos desse livro o mais simples possvel para tornar fcil o entendimento de como a Unity funciona, espera-se que o leitor se torne aos poucos mais e mais familiarizado com o Unity e com a programao em Java Script. Espera-se o leitor se torne apto a criar programas mais complexos, ou seja, que usem todos os conceitos apresentados nesse tutorial.

Jogo de Plataforma 3d
Thiago Campos Viana 06/11/2010 19:37

ndice de artigos
1. 2. 3. 4. Jogo de Plataforma 3d Primeiros Passos Preparando a Cena GUI

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
Thiago Campos Viana 06/11/2010 19:37

ndice de artigos
1. 2. 3. 4. Jogo de Plataforma 3d Primeiros Passos Preparando a Cena GUI

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
Thiago Campos Viana 06/11/2010 19:37

ndice de artigos
1. 2. 3. 4. Jogo de Plataforma 3d Primeiros Passos Preparando a Cena GUI

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
Thiago Campos Viana 06/11/2010 19:37

ndice de artigos
1. 2. 3. 4. Jogo de Plataforma 3d Primeiros Passos Preparando a Cena 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.

Criando classes utilizando o php


$user = eZUser::currentUser(); $userID = $user->attribute( 'contentobject_id' ); $class = eZContentClass::create( $userID ); $class->setAttribute( $class->setAttribute( $class->setAttribute( $class->setAttribute( $class->setAttribute( $class->store(); $ClassID = $class->attribute( 'id' ); $ClassVersion = $class->attribute( 'version' ); $ingroup = eZContentClassClassGroup::create( $ClassID, $ClassVersion,1,"Content" ); $ingroup->store(); // Title $DataTypeString = 'ezstring'; $new_attribute = eZContentClassAttribute::create( $ClassID,$DataTypeString ); $new_attribute->setAttribute( 'version', $ClassVersion); 'version', 0); 'name', 'Issue' ); 'identifier', 'issue' ); 'is_container', 1 ); 'contentobject_name', '<title>' );

$new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute(

'name', 'Title' ); 'is_required', 1 ); 'is_searchable', 1 ); 'can_translate', 1 ); 'identifier','title' );

$dataType = $new_attribute->dataType(); $dataType->initializeClassAttribute( $new_attribute ); $new_attribute->store(); // summary $DataTypeString = 'ezxmltext'; $new_attribute = eZContentClassAttribute::create( $ClassID,$DataTypeString ); $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( 'version', $ClassVersion); 'name', 'Summary' ); 'is_required', 1 ); 'is_searchable', 1 ); 'can_translate', 1 ); 'identifier','summary' );

$dataType = $new_attribute->dataType(); $dataType->initializeClassAttribute( $new_attribute ); $new_attribute->store(); // description $DataTypeString = 'ezxmltext'; $new_attribute = eZContentClassAttribute::create( $ClassID,$DataTypeString ); $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( 'version', $ClassVersion); 'name', 'Description' ); 'is_required', 1 ); 'is_searchable', 1 ); 'can_translate', 1 ); 'identifier','description' );

$dataType = $new_attribute->dataType(); $dataType->initializeClassAttribute( $new_attribute ); $new_attribute->store(); // Type $DataTypeString = 'ezinteger'; $new_attribute = eZContentClassAttribute::create( $ClassID,$DataTypeString ); $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( 'version', $ClassVersion); 'name', 'Type' ); 'is_required', 1 ); 'is_searchable', 1 );

$new_attribute->setAttribute( 'identifier','type' ); $dataType = $new_attribute->dataType(); $dataType->initializeClassAttribute( $new_attribute ); $new_attribute->store(); // Status $DataTypeString = 'ezinteger'; $new_attribute = eZContentClassAttribute::create( $ClassID,$DataTypeString ); $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( 'version', $ClassVersion); 'name', 'Status' ); 'is_required', 1 ); 'is_searchable', 1 );

$new_attribute->setAttribute( 'identifier','status' );

$dataType = $new_attribute->dataType(); $dataType->initializeClassAttribute( $new_attribute ); $new_attribute->store(); // Priority $DataTypeString = 'ezinteger'; $new_attribute = eZContentClassAttribute::create( $ClassID,$DataTypeString ); $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( $new_attribute->setAttribute( 'version', $ClassVersion); 'name', 'Priority' ); 'is_required', 1 ); 'is_searchable', 1 );

$new_attribute->setAttribute( 'identifier','priority' ); $dataType = $new_attribute->dataType(); $dataType->initializeClassAttribute( $new_attribute ); $new_attribute->store(); // Screen Shot $DataTypeString = 'ezimage'; $new_attribute = eZContentClassAttribute::create( $ClassID,$DataTypeString ); $new_attribute->setAttribute( 'version', $ClassVersion); $new_attribute->setAttribute( 'name', 'Screen Shot' ); $new_attribute->setAttribute( 'identifier','image' ); $dataType = $new_attribute->dataType(); $dataType->initializeClassAttribute( $new_attribute ); $new_attribute->store();

Desabilitando contas ou excluindo usurios pelo PHP


Esse exemplo desabilita a conta de todos os usurios da classe aluno, a qual possui um campo data chamado termino que especifica a data que a conta deve ser desabilitada:
<?php $currentUnixTimestamp = time(); $node =& eZContentObjectTreeNode::fetch( 12 ); $nodes =& $node->subTree( array( 'Depth' => 2, &nbsp;'AttributeFilter' => array( array( 'aluno/termino', '<=', $currentUnixTimestamp ) ) )); if ( $nodes ) { foreach ( $nodes as $node ) { $object = $node->object(); $dataMap =& $object->attribute( 'data_map' ); $userSetting = eZUserSetting::fetch( $object->attribute( 'id' ) ); if ( ( $dataMap['termino']->attribute('data_int') - $currentUnixTimestamp ) <= 0 and $userSetting->IsEnabled == 1)

{ $userSetting->setAttribute('is_enabled',0); $userSetting->store(); //$cli->output($object->attribute( 'name' )." foi disabilitado" ); //$object->purge(); -- exclui o usurio

} } } ?>

Criando contedo pelo php


A funo a seguir um exemplo de como criar uma pasta atravs do PHP:
<?php function makeFolder( $name, $parentNodeID ){ $user =& eZUser::currentUser(); $user_id =& $user->attribute( 'contentobject_id' ); $class = eZContentClass::fetchByIdentifier('folder'); $parentContentObjectTreeNode = eZContentObjectTreeNode::fetch($parentNodeID); $parentContentObject = $parentContentObjectTreeNode->attribute("object"); $sectionID = $parentContentObject->attribute('section_id'); $contentObject =& $class->instantiate($user_id, $sectionID); $nodeAssignment =& eZNodeAssignment::create(array('contentobject_id' => $contentObject->attribute('id'),'contentobject_version' => $contentObject>attribute('current_version'), 'parent_node' => $parentContentObjectTreeNode>attribute('node_id'),'is_main'=>1)); $nodeAssignment->store(); $contentObject->setAttribute('name', $name); $contentObject->store(); $attribs =& $contentObject->contentObjectAttributes(); $loopLength = count($attribs); for($i=0;$i<$loopLength;$i++){ switch($attribs[$i]->attribute("contentclass_attribute_identifier")){ case 'name': $attribs[$i]->setAttribute('data_text',$name); $attribs[$i]->store(); break; case 'short_name':

$attribs[$i]->setAttribute('data_text',$name); $attribs[$i]->store(); break; } } $contentObject->setAttribute('status',eZContentObject::STATUS_DRAFT); $contentObject->store(); $operationResult = eZOperationHandler::execute('content', 'publish',array('object_id'=>$contentObject->attribute('id'),'version'=>1)); } ?>

Passando variaveis $view_parameters de mdulos para templates


... $uri = eZURI::instance( eZSys::requestURI() ); $viewParameters = $uri->UserParameters(); $tpl->setVariable( 'view_parameters', $viewParameters ); ...

Criando arquivos a partir de templates


<?php

$object = eZContentObject::fetch( 4 ); $node = $object->mainNode(); $parentNode = eZContentObjectTreeNode::fetch($node>attribute('parent_node_id')); $parentObj = $parentNode->attribute('object'); $tpl = eZTemplate::factory(); $tpl->resetVariables(); $res = eZTemplateDesignResource::instance(); $res->setKeys( array( array( 'object', $object->attribute( 'id' ) ), array( 'node', $node->attribute( 'node_id' ) ), array( 'class', $object->attribute( 'contentclass_id' ) ), array( 'class_identifier', $object->contentClassIdentifier() ), array( 'parent_node', $node->attribute( 'parent_node_id' ) ), array( 'parent_class', $parentObj->attribute( 'contentclass_id' ) ), array( 'parent_class_identifier', $parentObj->contentClassIdentifier() ), array( 'depth', $node->attribute( 'depth' ) ), array( 'url_alias', $node->attribute( 'url_alias' ) ) ) );

$tpl->setVariable( 'object', $object ); $result = $tpl->fetch( 'design:pastadedesign/download1.tpl' ); //$result = strip_tags($result); $file = new eZFile(); unlink('arquivo.txt'); $file->create( 'arquivo.txt', false, utf8_decode( $result )); $file->download( 'arquivo.txt',true, false ); eZExecution::cleanExit(); ?>

Settings para desenvolvimento ( site.ini.append.php )


<?php /* #?ini charset="utf-8"? [ContentSettings] ViewCaching=disabled [DebugSettings] Debug=inline DebugOutput=enabled DebugRedirection=disabled [OverrideSettings] Cache=disabled [TemplateSettings] ShowXHTMLCode=disabled ShowUsedTemplates=enabled TemplateCompile=disabled TemplateCache=disabled # Optional, will save you from most cache clearings during development # as modified time on tempaltes are always checked during execution DevelopmentMode=enabled */?>

Ambiente de desenvolvimento no Windows para Integrao contnua ( Rascunho )


Rascunho ( verso 0.1 ) Baixe o XAMMP Lite http://www.apachefriends.org/en/xampp-windows.html Instale em C:\

\apache\conf\httpd.conf Descomente #LoadModule rewrite_module modules/mod_rewrite.so Mude as configuraes no arquivo C:\xampplite\php\php.ini max_execution_time 180 max_input_time 180 memory_limit 128

######################## Painel de controle->Sistema->Avanado->Variveis de ambiente->Variveis de usurio para XXXX Adicione ou mude a varivel PATH com o valor C:\xampplite\php ######################## Baixe o XDebug http://xdebug.org/download.php Renomeio o dll do XDebug para php_xdebug.dll Mova-o para C:\xampplite\php\ext Abra o arquivo C:\xampplite\php\php.ini: # No bloco XDebug adicione: zend_extension = "XAMPP_HOME\php\ext\php_xdebug.dll". # Encontre e descomente a linha: xdebug.remote_host=localhost. Change the value of the setting from localhost to 127.0.0.1. # Encontre e descomente a linha: xdebug.remote_enable = 0. Change 0 to 1. # Encontre e descomente a linha: xdebug.remote_handler = "dbgp". # Encontre e descomente a linha: xdebug.remote_port = 9000. # Salve o arquivo php.ini.

######################## Instale as extenes pear Iniciar->Executar->Digite "cmd" cd C:\xampplite\php pear channel-update pear.php.net pear channel-discover pear.symfony-project.com pear install symfony/YAML

#pear upgrade symfony/YAML pear channel-discover components.ez.no pear install -a ezc/eZComponents #pear upgrade ezc/eZComponents

pear channel-discover pear.phpunit.de pear remote-list -c phpunit pear install phpunit/PHPUnit #pear upgrade phpunit/PHPUnit pear install PhpDocumentor pear install Testing_Selenium-beta pear install PHP_CodeSniffer pear channel-discover pear.xplib.de pear install xplib/PHP_CodeSniffer_Standards_EZC-beta pear install phpunit/PHP_CodeBrowser

pear channel-discover pear.pdepend. pear install pdepend/PHP_Depend-beta pear channel-discover pear.phpmd.org pear install phpmd/PHP_PMD-alpha pear install --alldeps phpunit/phpUnderControl http://sourceforge.net/projects/cruisecontrol/files/ instalar java jdk mudar variaveal JAVA_HOME C:\Arquivos de programas\Java\jdk1.6.0_17 talves seja necessrio copiar jdk_home/lib/tools.jar para jre6_home/lib/ext iniciar pelo menu iniciar o arquivo cruisecontrol.bat phpuc install "C:\Arquivos de programas\CruiseControl"

Feche o prompt do cruisecontrol e v pelo menu iniciar e abra-o novamente. ######################## Faa o download do Netbeans (PHP ou Completo) http://netbeans.org/downloads/index.html Mude o idioma do Netbeans: Pasta_do_Netbeans\etc Abra "netbeans.conf" e encontre a linha netbeans default options netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -JXX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true" Adicione "-J-Duser.language=en -J-Duser.region=US" no final da linha netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -JXX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -JDuser.language=en -J-Duser.region=US" Abra o Netbeans Tools->Options->PHP General PHP 5 Interpreter=C:\xampplite\php\php.exe UnitTesting PHPUnit Script: C:\xampplite\php\phpunit.bat ######################## Download NBGit http://code.google.com/p/nbgit/ Netbeans->Tools->Plugins->Download->Add Plugin Team->Git->Clone other http://github.com/ezsystems/ezpublish.git ( Apenas as pastas benchmark e tests so importantes ) ########################### download netbeans php codesniffer http://github.com/beberlei/netbeans-php-enhancements/downloads/

Tools->options->php->code sniffer->pear ################################# available plugins selenium module for php ################################# php md for netbeans???? http://sourceforge.net/projects/phpmdnb/ Tool->options->misc->phpmd phpmd C:\xampplite\htdocs\ez\kernel\classes\ezaudit.php xml codesize,design,unusedcode,naming --reportfile C:\teste.xml ############################ pdepend --summary-xml=/tmp/summary.xml \ --jdepend-chart=/tmp/jdepend.svg \ --overviewpyramid=/tmp/pyramid.svg \ /usr/local/share/pear/PHP/Depend ############################ Baixe o ez publish http://share.ez.no/download-develop C:\xampplite\htdocs extract ezpublishcommunity-4.4.0-with_ezc-gpl.tar.gz rename the folder ezpublish-4.4.0-with_ezc-gpl to ez .htaccess Options -Indexes DirectoryIndex index.php RewriteEngine On #Clustered setup switch RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f RewriteRule ^var/([^/]+/)?storage/images(-versioned)?/.* /index_image-common.php [L] RewriteCond %{HTTP_HOST} ^webdav\..* RewriteRule ^(.*) webdav.php [L]

RewriteCond %{HTTP_HOST} ^soap\..* RewriteRule ^(.*) soap.php [L]

Rewriterule ^var/static/.* - [L] RewriteRule ^(.*)favicon\.ico - [L] RewriteRule ^robots\.txt - [L] RewriteRule ^sitemap\.xml - [L] RewriteRule ^var/cache/debug.html.* - [L] RewriteRule ^var/[^/]+/cache/debug.html.* - [L] Rewriterule ^var/storage/.* - [L] Rewriterule ^var/[^/]+/storage/.* - [L] RewriteRule ^var/cache/texttoimage/.* - [L] RewriteRule ^var/[^/]+/cache/texttoimage/.* - [L] RewriteRule ^var/([^/]+/)?cache/public/.* - [L] Rewriterule ^design/[^/]+/(stylesheets|images|javascript|flash)/.* - [L] Rewriterule ^share/icons/.* - [L] Rewriterule ^extension/[^/]+/design/[^/]+/(stylesheets|flash|images|lib|javascripts?)/.* - [L] Rewriterule ^packages/styles/.+/(stylesheets|images|javascript)/[^/]+/.* - [L] RewriteRule ^packages/styles/.+/thumbnail/.* - [L] # Uncomment the following lines when using popup style debug. # RewriteRule ^var/cache/debug\.html.* - [L] # RewriteRule ^var/[^/]+/cache/debug\.html.* - [L] RewriteRule .* index.php [L] php_value magic_quotes_gpc "Off" ###### Remover /index.php de todos settings/override/xxxxx/site.ini.append.php [SiteAccessSettings] ForceVirtualHost=true RemoveSiteAccessIfDefaultAccess=enabled ############################ Ignorando pastas do eZ publish no Netbeans: Clique com o boto direito na pasta do projeto->properties->ignored folders var support update doc schemas

############################ Firefox + firebug + selenium IDE

######### running tests: php bin/php/ezpgenerateautoloads.php -e php tests/runtests.php extension/extfolder No caso de testes do bd php tests/runtests.php -D mysql://root@localhost/ezpublish extension/extfolder ############# Crontab # Instruct cron to run the main set of cronjobs # at 6:35am every day 35 6 * * * cd /home/var/www && php runcronjobs.php -q -s site 2>&1 # Instruct cron to run the "infrequent" set of cronjobs # at 5:20am every Monday 20 5 * * 1 cd /home/var/www && php runcronjobs.php infrequent -q -s site 2>&1 # Instruct cron to run the "frequent" set of cronjobs # every 15 minutes 0,15,30,45 * * * * cd /home/var/www && php runcronjobs.php frequent -q -s site 2>&1 # Instruct cron to run the "ezflow" set of cronjobs # every 2 minutes */2 * * * * cd /home/var/www && php runcronjobs.php ezflow -q -s site 2>&1 # Instruct cron to run the "frequent" set of cronjobs # every 15 minutes */5 * * * * cd /home/var/www && php runcronjobs.php ezflow-cleanup -q -s site 2>&1 ##### php.ini hostgator register_globals = Off date.timezone = "America/Sao_Paulo" magic_quotes_gpc = 0 magic_quotes_runtime = 0

Estrutura de diretrios

bin (vrios scripts) design (arquivos relacionados ao design/aparncia) doc (documentao e changelogs) kernel (todos os arquivos do kernel o corao do eZ publish) lib (bibliotecas de uso geral) settings (arquivos de configuraes dinmicas especificos do site) share (arquivos de configuraes estticas) var (arquivos de cache, logs, imagens & arquivos de contedo)

Criando Workflows
Para criar uma extenso do tipo workflow, a extenso deve ter no mnimo os seguintes arquivos: myext\settings\workflow.ini.append.php
<?php /* [EventSettings] ExtensionDirectories[]=myext AvailableEventTypes[]=event_myext */ ?>

myext\eventtypes\event\myext\myexttype.php
<?php include_once( "kernel/classes/ezworkflowtype.php" ); /* incluir mais arquivos necessrios aqui */

class MyExtType extends eZWorkflowEventType { const WORKFLOW_TYPE_STRING = "myext"; function myextType() { $this->eZWorkflowEventType( MyExtType::WORKFLOW_TYPE_STRING, "MyExt" ); /* definir os trigger possiveis para o workflow aqui */ $this->setTriggerTypes( array( 'content' => array( 'publish' => array( 'after' ) ) ) ); } function execute( $process, $event ) { /* aqui vai o cdigo do workflow */

/* verificar quais tipos de status existentes em: kernel/classes/ezworkflowtype.php */ return eZWorkflowType::STATUS_ACCEPTED; }

} eZWorkflowEventType::registerEventType( MyExtType::WORKFLOW_TYPE_STRING, "MyExtType" ); ?>

Como criar aes


Segue um exemplo de uma extenso que cria uma ao para o eZ Publish, foram necessrios os seguintes arquivos: extension/actiontest/settings/site.ini.append.php
<?php /* #?ini charset="utf-8"? * [ExtensionSettings] ActiveExtensions[]=actiontest ?>

extension/actiontest/settings/content.ini.append.php
<?php /* #?ini charset="utf-8"? *

[ActionSettings] ExtensionDirectories[]=actiontest */ ?>

extension/actiontest/actions/content_actionhandler.php
<?php function actiontest_ContentActionHandler(&$module, &$http, &$objectID ) { if ($http->hasPostVariable("hello" ) ) { echo $http->postVariable("hello"); } return;

} ?>

necessrio ativar a extenso na rea administrativa em setup/extensions Para utilizar a ao, necessrio criar um form, como no exemplo:
<form action={"content/action"|ezurl} method="post"> <input name="hello" type="submit" value="Ol mundo!" /> <input name="ContentObjectID" type="hidden" value="50" /> </form>

Mdulo para testar o eZ Components


Para realizar o teste do eZ Components com o eZ Publish 4.3 foi criada uma extenso, ezctest, a qual mostra um grfico feito com o componente Graph. Para isso foram necessrios os seguintes arquivos: extension/ezctest/ezinfo.php
<?php class ezctestInfo { static function info() { return array( 'Name' => 'ezComponents Test', 'Version' => '1.0', 'Copyright' => 'Copyright (C) 1999-' . date('Y') . ' Thiago Campos Viana', 'License' => 'GNU General Public License v2.0' ); } } ?>

extension/ezctest/settings/design.ini.append.php
<?php /* #?ini charset="utf-8"? [ExtensionSettings] DesignExtensions[]=ezctest */?>

extension/ezctest/settings/module.ini.append.php
<?php /* #?ini charset="utf-8"? [ModuleSettings] ExtensionRepositories[]=ezctest ModuleList[]=ezctest */?>

extension/ezctest/settings/site.ini.append.php
<?php /* #?ini charset="utf-8"? [ExtensionSettings] ActiveExtensions[]=ezctest [RoleSettings] PolicyOmitList[]=ezctest/graph */?>

extension/ezctest/modules/ezctest/module.php
<?php $Module = array( "name" => 'ezctest' ); $ViewList = array(); $ViewList['graph'] = array( 'functions' => array( 'graph' ), 'script' => 'graph.php' ); $FunctionList[ 'graph' ] = array(); ?>

extension/ezctest/modules/ezctest/graph.php
<?php

$svg="graph1.svg"; $width=400; $height=150; $code="<object data="\"".eZSys::wwwDir()."/" .$svg."\"" height="\"".$height."\"" type="\"image/svg+xml\"" width="\"".$width. "\""></object>"; $graph = new ezcGraphPieChart(); $graph->title = 'Access statistics'; $graph->data['Access statistics'] = new ezcGraphArrayDataSet( array( 'Mozilla' => 19113, 'Explorer' => 10917, 'Opera' => 1464, 'Safari' => 652, 'Konqueror' => 474, ) ); $graph->data['Access statistics']->highlight['Opera'] = true; $graph->render( $width, $height, $svg ); $tpl = eZTemplate::factory(); $tpl->setVariable('code',$code); $Result = array(); $Result['path'] = array( array( 'url' => false, 'text' => 'eZ Components Test' ), array( 'url' => false, 'text' => 'Graph' ) ); $Result['content']=$tpl->fetch("design:ezctest/graph.tpl"); ?>

extension/ezctest/design/standard/templates/ezctest/graph.tpl {$code} Ative o mdulo na rea administrativa setup/extensions. Para acessar o resultado basta ir no endereo: url_do_site/ezctest/graph

REST API, Basic HTTP Auth e PhoneGap usando jQuery


18/06/2011 18:46 Thiago Campos Viana Tags: android , ez publish Hoje estava testando a REST API do eZ para funcionar com jQuery, por causa de aplicativos para celulares, e consegui fazer algumas coisas. Por padro o a API pede a autentificao usando oAuth, porm como no consegui fazer os

aplicativos em phonegap funcionar utilizando oAuth, testei a API no modo Basic HTTP Auth, para isso fiz os seguintes passos: 1. Mudei o rest.ini settings:
[Authentication] RequireAuthentication=enabled #AuthenticationStyle=ezpRestOauthAuthenticationStyle AuthenticationStyle=ezpRestBasicAuthStyle

2. Fiz um teste local com o jquery:


$.ajax({ url: 'http://localhost/ez_site/api/ezp/content/node/2', otherSettings: 'othervalues', username: 'your_user_name', password: 'your_user_pass', complete: function(data) { //code goes here } });

3. Fiz o teste com o Android usando o jquery mobile r o phonegap ( O cdigo mostrado acima no funcionou, ento tive que mudar ):
var username = 'your_user_name'; var pass = 'your_user_pass'; //10.0.2.2:80 o localhost no emulador do android, a app precisa ter acesso a internet $.get("http://"+username+":"+pass+"@10.0.2.2:80/ez_site/api/ezp/content/node/2", function(data) { //code goes here });

Nota: Se o RequireAuthentication for desabilitado a gente pode fazer apenas o seguinte:


$.ajax({ url: 'http://localhost/ez_site/api/ezp/content/node/2', complete: function(data) { //code goes here } });

PhoneGap:
//10.0.2.2:80 o localhost no emulador do android, a app precisa ter acesso a internet $.get("http://10.0.2.2:80/ez_site/api/ezp/content/node/2", function(data) { //code goes here });

Eu no sei se tem como utilizar o phonegap com oAuth. Tem um post meu no frum do ez que mostra como utilizar o oAuth e a REST API.

Netbeans, Android e o problema do R.layout.main


26/05/2011 20:14 Thiago Campos Viana Tags: Hoje tive uma dor de cabea pois o Netbeans se recusava a compilar. Primeiro ele no reconhecia o arquivo R, a eu dei um fix imports (control+shift+i) e ele reconheceu o R. A ele no reconhecia a varivel R.layout.main, depois de muito quebrar a cabea descobri que bastava comentar a linha: //import android.R; Como diria um certo apresentador: "Loucura, loucura, looooucura"!!!

Netbeans e Android apk - verso release em 5 passos


25/05/2011 0:13 Thiago Campos Viana Tags: android Consegui criar a verso release de um projeto de Android feito no Netbeans, os passos foram: 1. Configure a varivel de ambiente JAVA_HOME para a pasta raiz da jdk ( C:\Arquivos de programas\Java\jdk1.6.0_24 ) 2. Criar uma assinatura, abra o prompt e d primeiro um cd at o c: e faa: keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000 3. Mudar o arquivo build.properties: key.store=C:\\my-release-key.keystore key.alias=alias_name proguard.config=proguard.cfg proguard.enabled=true 4. No AndroidManifest.xml coloque android:debuggable="false" 5. No prompt d um cd at a pasta do projeto e faa: "C:\Arquivos de programas\NetBeans 7.0\java\ant\bin\ant" release Supondo que o ant est neste caminho. Pronto! Na pasta bin aparecer uma verso release j com o cdigo obfuscado.

Usando o proguard para obfuscar projetos em java no Netbeans


24/05/2011 16:04 Thiago Campos Viana

Tags: Hoje eu testei o proguard com o netbeans e muito simples us-lo. Baixe o proguard. Copie o arquivo proguard.jar para a pasta raiz do projeto do netbeans. Altere o arquivo build.xml, colocando o seguinte cdigo dentro do n principal do xml:
<target name="-post-jar"> <property name="proguard.jar.path" value="${basedir}/proguard.jar" /> <property name="java.home.path" value="C:\Arquivos de programas\Java\jre6" /> <taskdef resource="proguard/ant/task.properties" classpath="${proguard.jar.path}" /> <echo message="Obfuscating ${dist.jar}..."/> <mkdir dir="${build.dir}/obfuscated"/> <proguard printmapping="${build.dir}/obfuscated/${application.title}.map" renamesourcefileattribute="SourceFile" ignorewarnings="true"> <!-- Specify the input jars, output jars, and library jars. --> <injar file="${dist.jar}" /> <outjar file="${dist.dir}/obfuscated/${dist.jar}" /> <libraryjar path="${javac.classpath}" /> <libraryjar file="${java.home.path}/lib/rt.jar" /> <!-- Keep some useful attributes. --> <keepattribute <keepattribute <keepattribute <keepattribute <keepattribute <keepattribute name="InnerClasses" /> name="SourceFile" /> name="LineNumberTable" /> name="Deprecated" /> name="*Annotation*" /> name="Signature" />

<!-- Preserve all public classes, and their public and protected fields and methods. --> <keep access="public"> <field access="public protected" /> <method access="public protected" /> </keep> <!-- Preserve all .class method names. --> <keepclassmembernames access="public"> <method type ="java.lang.Class" name ="class$" parameters="java.lang.String" /> <method type ="java.lang.Class" name ="class$" parameters="java.lang.String,boolean" /> </keepclassmembernames> <!-- Preserve all native method names and the names of their classes. --> <keepclasseswithmembernames> <method access="native" /> </keepclasseswithmembernames>

<!-- Preserve the methods that are required in all enumeration classes. --> <keepclassmembers extends="java.lang.Enum"> <method access="public static" type="**[]" name="values" parameters="" /> <method access="public static" type="**" name="valueOf" parameters="java.lang.String" /> </keepclassmembers> <!-- Explicitly preserve all serialization members. The Serializable interface is only a marker interface, so it wouldn't save them. You can comment this out if your library doesn't use serialization. With this code serializable classes will be backward compatible --> <keepnames implements="java.io.Serializable"/> <keepclassmembers implements="java.io.Serializable"> <field access ="final" type ="long" name ="serialVersionUID" /> <field access ="!static !transient" name ="**"/> <field access ="!private" name ="**"/> <method access ="!private" name ="**"/> <method access ="private" type ="void" name ="writeObject" parameters="java.io.ObjectOutputStream" /> <method access ="private" type ="void" name ="readObject" parameters="java.io.ObjectOutputStream" /> <method type ="java.lang.Object" name ="writeReplace" parameters="" /> <method type ="java.lang.Object" name ="readResolve" parameters="" /> </keepclassmembers> <!-- Your application may contain more items that need to be preserved; typically classes that are dynamically created using Class.forName --> </proguard> </target>

Mude a linha:
<property name="java.home.path" value="C:\Arquivos de programas\Java\jre6" />

Substituindo o caminho do jre para o que existe no seu computador.

Potrebbero piacerti anche