Unity Script

Embed Size (px)

Citation preview

Fbio Souza [email protected] Tutorial em Unity3D

1

SumrioIntroduo criao de scripts com Unity .................................................................................................................. 2 1. Objetivos deste tutorial ....................................................................................................................................... 3 2. Pr-requisitos ...................................................................................................................................................... 3 3. Converses do Unity............................................................................................................................................ 3 4. A entrada do jogador .......................................................................................................................................... 3 Nosso primeiro script. ............................................................................................................................................. 4 Colocar o script ................................................................................................................................................... 5 deltaTime ............................................................................................................................................................ 5 5. Conectando Variveis ......................................................................................................................................... 6 6. Acessando Componentes .................................................................................................................................... 7 Faz-lo com o cdigo .......................................................................................................................................... 8 7. Instanciar .......................................................................................................................................................... 10 8. Depurao ......................................................................................................................................................... 11 Log .................................................................................................................................................................... 11 Watch................................................................................................................................................................ 12 9. Tipos comuns de script ...................................................................................................................................... 12 FixedUpdate() ................................................................................................................................................... 13 Awake() ............................................................................................................................................................. 13 Start() ................................................................................................................................................................ 13 OnCollisionEnter() ............................................................................................................................................. 13 OnMouseDown() ............................................................................................................................................... 13 OnMouseOver()................................................................................................................................................. 13

Fbio Souza [email protected] Tutorial em Unity3D

2

Introduo criao de scripts com Unity

Scripting uma parte essencial da Unity que define o comportamento do seu jogo. Este tutorial ir introduzir os fundamentos da programao de scripting utilizando Javascript. No necessrio conhecimento de JavaScript para seguir este tutorial. Tempo para concluir: 2 horas. Autor: Graham McAllister Tradutor: Fbio Souza

Fbio Souza [email protected] Tutorial em Unity3D

3

1. Objetivos deste tutorial

Script define um comportamento de jogos (ou regras) na Unity. A programao recomendada para a Unidade Javascript, C # ou Boo. Este tutorial ir cobrir os fundamentos de scripting na Unity e tambm introduzir elementos chave da Interface (API). Voc pode pensar da API como cdigo que j foi escrito para lhe permite concentrar em seu jogo e tambm acelera o tempo de desenvolvimento. Uma boa compreenso dos princpios bsicos essencial para aproveitar o poder pleno da Unity.2. Pr-requisitos

Este tutorial concentra-se no elemento script da Unity, assumimos que voc j est familiarizado com a interface Unitys. (Se no voc deve ler o tutorial da Interface Unity). A fim de tornar o script mais fcil de entender, prefervel ter um editor de cdigo que tenha uma sintaxe com suporte a JavaScript. Isso significa que so palavras reservadas (sintaxe usada pelo prprio Javascript) com cor diferente da definida pelo usurio. Um desses editor SubEthaEdit. NB: Neste tutorial qualquer texto que seja executado pelo usurio comea com um -.3. Converses do Unity

Antes de comear, vale a pena mencionar algumas convenes na Unity. Variveis - comeam com uma letra minscula. As variveis so usadas para armazenar informaes sobre todos os aspectos de um jogos. Funes - comeam com uma letra maiscula. Funes so blocos de cdigo que so escritos uma vez e pode ser reutilizado quantas vezes for necessrio. Classes - comeam com uma letra maiscula. Estes podem ser pensados como conjuntos de funes. Dica: Ao exemplo de cdigo a leitura ou a API da Unity, prestar muita ateno para a primeira letra das palavras. Isso ajudar voc a compreender melhor a relao entre os objetos.4. A entrada do jogador

O nosso primeiro programa permitia que o usurio se deslocasse no mundo simples. Definindo o cenrio:

Fbio Souza [email protected] Tutorial em Unity3D

4

- Inicia o Unity. Em primeiro lugar, vamos criar uma superfcie para o usurio caminhar. Para criar a superfcie pode ser utilizado uma forma de cubo achatado. - Crie um cubo e sua escala suas dimenses x, y, z para 5, 0.1, 5, respectivamente, ele agora deve assemelhar a um apartamento grande plano. Renomeie esse objeto para Plane na Vista Hierarquia. - Crie um segundo cubo e coloque-o no centro deste plano. Se voc no consegue ver os objetos na Visao do seu jogo alterar a cmara principal para est visvel. Mude o nome do objeto para Cube1. - Voc tambm deve criar um ponto de luz e coloc-lo acima dos cubos de modo que fiquem visvel. - Salve a cena selecionando Arquivo > Salvar como e d um nome ao jogo.Nosso primeiro script.

Est pronto para iniciar a programao de jogos? Vamos permitir que o jogador se mova em todo o mundo do jogo, controlando a posio da cmera principal. Para isso vamos escrever um script que ir ler a entrada do teclado, ento associamos o script cmara principal (mais sobre isso veremos na prxima seo). - Criaremos um script vazio. Selecione o menu Assets > Create > Javascript e renomeie para Move1 no painel Project. - D um duplo clique sobre o script Move1 e ir abrir a funo Update() j inserido (este o comportamento padro), vamos inserir nosso cdigo dentro dessa funo. Qualquer cdigo que voc insere dentro da funo Update() executado a cada frame. Para mover um objeto de jogo na Unity precisamos alterar a posio dos seus Assets nas funes transform , e Translate pertencente ao transformar a vontade vamos fazer isso. A function Translate possui 3 parametros, x, y e z para movimentar. Como queremos controlar o GameObjects cmara principal com as teclas do cursor, simplesmente anexamos o cdigo para determinar se as teclas do cursor esto sendo pressionadas para os respectivos parmetros:

Fbio Souza [email protected] Tutorial em Unity3D

5

function Update () { transform.Translate(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); } A funo Input.GetAxis() retorna valores entre -1 e 1, por exemplo, no eixo horizontal, O cursor para esquerda move a chave mapa -1 e o direito mapa 1. Como no estamos interessados em mover a cmara no eixo y(para cima) ento o parmetro 0. . O eixo horizontal e vertical so pr-definidos nas configuraes de entrada, os nomes e as teclas mapeadas para eles podem ser facilmente alterados em Edit > Project Settings >Input. - Abra o Javascript Move1 e digite o cdigo acima, preste muita ateno nas letras. Salve o script e fecha o editor.Colocar o script

Agora que o nosso primeiro script est escrito, como que podemos dizer para a Unity que nosso GameObjects deve ter este comportamento? Tudo o que temos a fazer anexar o script ao GameObjects que queremos que apresenta esse comportamento. - Para fazer isso, clique sobre o objeto que deseja que tenha este comportamento no script. No nosso caso, esta a cmera principal, e voc pode selecion-lo tanto no painel hierarquia ou na visualizao da cena. - Em seguida clique no menu Components > Scripts > Move1. Isso ir atribui o script para a cmera, voc deve observar que o componente Move1 agora aparece no painel Inspector para a cmara principal. Dica: Voc pode tambm atribuir um script para um objeto do jogo, arrastando o script a partir do painel Project para o Objeto na viso da cena. - Execute o jogo (pressione o cone de reproduo), voc deve ser capaz de mover a cmera principal, com as teclas do cursor ou W, S, A, D. Voc deve ter notado que a cmera se moveu muito rpido, vamos olhar a melhor maneira de. controlar a velocidade da cmera.deltaTime

Como o cdigo anterior est dentro da funo Update a cmera se movia a uma velocidade medida em metros por frame. melhor, entretanto, assegurar que o seu GameObjects move no ritmo mais previsvel de metros por segundo. Para conseguir isso, basta multiplicar o valor retornado da funo Input.GetAxis() pelo Tempo deltaTime e tambm pela velocidade que ns queremos passar por segundo:

Fbio Souza [email protected] Tutorial em Unity3D

6

var velocidade = 5.0; function Update () { var x = Input.GetAxis("Horizontal") * Time.deltaTime * velocidade; var z = Input.GetAxis("Vertical") * Time.deltaTime * velocidade; transform.Translate(x, 0, z); } - Atualize o script Move1 com o cdigo acima. Observe aqui que a varivel velocidade est declarada fora da funo Update(), este uma varivel chamada exposta, ela ir aparecer na rea de inspetor de qualquer GameObjects que o script est anexado (a varivel fica exposta ao GUI Unity). Expor as variveis til quando o valor precisa ser refinado para obter o efeito desejado, isto muito mais fcil do que mudar o cdigo.5. Conectando Variveis

Conectando variveis atravs do GUI Unity muito poderoso pois ele permite que as variveis normalmente atribudo no cdigo seja feito atravs de arrastar e soltar na GUI Unity. Isto permite uma rpida e fcil prototipagem de idias. Como variveis de ligao feita atravs do GUI da Unity, sabemos que temos sempre necessidade de expor uma varivel em nosso cdigo de script para que possamos atribuir o parmetro na View Inspector. Vamos demonstrar o conceito de ligao de variveis atravs da criao de uma luz spot que seguir o jogador (Cmara principal) enquanto movemos. - Adicione um spotlight para a cena. Mova se necessrio para prximo da cmara principal, e renomeie para LuzSpot. - Adicione um novo Javascript e renomeie para Seguir. Vamos pensar o que queremos fazer. Queremos que a LuzSpot sigua a nossa cmara principal, ou seja estar sempre iluminando onde a cmara estiver olhando. H uma funo na Unity para fazer isso, que a transform.LookAt(). Se voc estava comeando a pensar como fazer, e j imaginando um monte de cdigo, ento basta lembrar sempre de verificar a API da Unity para uma funo que j existe. Poderamos tambm fazer um bom palpite em olhar na seo de transform da API, como estava interessado em alterar a posio ou rotao de um objeto de jogo.

Fbio Souza [email protected] Tutorial em Unity3D

7

Agora chegamos seco variveis de ligao, o que usamos como parmetro para LookAt()? Poderamos codificar um objeto de jogo, mas sabemos que queremos atribuir a varivel atravs do GUI, para usar apenas uma varivel de exposio (do tipo Transform). Nossa script Seguir.js deve ficar assim: var alvo : Transform; function Update () { transform.LookAt(alvo); } - Coloque o script para a LuzSpot e observe que o componente adicionado, e a varivel alvo exposto. - Com a LuzSpot selecionada, arraste a cmara principal do painel hierarquia para cima da varivel alvo, fazendo com que a LuzSpot siga a cmara principal, ou seja, a LuzSpot agora seguir a cmara principal. Se quisssemos que o foco seguisse um Objeto diferente, poderia simplesmente arrastar o Objeto diferente para cima da varivel alvo (desde que o Objeto seja do tipo Transform). - Rode o jogo. Se voc assistir ao visualizar a cena, voc dever ver uma luz ao redor da Cmara principal. Voc pode mudar a posio da LuzSpot para melhorar o efeito.6. Acessando Componentes

Como um objeto de jogo pode ter vrios scripts (ou outros componentes) ligados a ele, s vezes necessrio acessar os componentes de outras funes ou variveis. A unity permite fazer isto com a funo GetComponent(). Vamos agora criar uma luz para iluminar o Cubo1 sempre que se pressionar a tecla espao e pressionando a tecla Ctrl do lado esquerdo a luz volta a acompanhar a cmera. Para fazer isso primeiramente devemos saber o que queremos: 1. Detectar quando a tecla espao for pressionada. 2. Quando espao foi pressionado iluminar o Cube1. Como fazemos isso? Bem, no script Seguir criado anteriormente, contm uma varivel chamada "alvo", cujo valor determina qual objeto deve ser iluminado. Precisamos definir um novo valor para este parmetro. Ns podemos codificar o valor para o cubo (veja como fazer isso mais tarde), sabemos que atribuir direto a varivel utilizando GUI mais fcil. - Crie um novo Javascript e renomeie para Mudar. Adicione o seguinte cdigo para o script Mudar.js:

Fbio Souza [email protected] Tutorial em Unity3D

8

var mudarObjetivo : Transform; //Varivel para adicionar o Cubo1 var mudarObjetivo1: Transform; //Varivel para adicionar a Cmera function Update () { if (Input.GetButtonDown("Jump")) GetComponent(Seguir).alvo = mudarObjetivo; if (Input.GetButtonDown("Fire1")) GetComponent(Seguir).alvo = mudarObjetivo1; }

Jump: foi definido pelo Unity para ser a tecla Espao. Fire1: foi definido para ser a tecla Ctrl esquerda. Veja como foi definido estes nomes no menu EDIT > PROJECT SETTINGS > INPUT veja no painel Inspector. Seguir: o nome do Script anterior Alvo: o nome da varivel pertencente ao script.

Observe em particular como Seguir o parmetro para GetComponent(), que retorna uma referncia ao script criado anteriormente de nome Seguir onde podemos usar para acessar a sua varivel "alvo". - Adicione o script Mudar para a LuzSpot e atribua o Cubo1 ao MudarObjetivo e Camera para o MudarObjetivo1, no painel Inspector. - Execute o jogo. Movimente-se e verifique se a luz te segue como de costume, em seguida, pressione a barra de espao e a luz deve concentrar-se no Cube1, em seguida pressione Ctrl esquerdo e verifique.Faz-lo com o cdigo

Anteriormente no tutorial, mencionei que seria possvel atribuir as variveis atravs do cdigo (ao contrrio do GUI da Unity), vamos dar uma olhada como voc faria isso. Lembre-se que isto s para comparao, atribuir variveis atravs da interface grfica a abordagem recomendada. O problema que estavam interessados em como foi feito anteriormente, ento vamos direcionar a luz para o Cube1 quando a tecla de espao for pressionada. Nossa soluo foi expor uma varivel no script Mudar, em seguida atribuido a tecla espao para o Cube1 a partir da GUI Unity. Existem duas maneiras principais de fazer isso no cdigo:

Fbio Souza [email protected] Tutorial em Unity3D

9

1. Use o nome do objeto de jogo. 2. Use a tag do objeto de jogo.1. Usando nome do GameObjects

Um GameObjects podem ser renomeado e vistos no modo de hierarquia. Para usar este nome com o cdigo devemos us-lo como um parmetro na GameObject. Funo Find(). Portanto, se queremos o boto de ESPAO para mudar o foco principal da cmera para Cubo1. Crie um novo Script e renomeie para Move1, o cdigo a seguinte: function Update(){ if (Input.GetButtonDown(Jump)) { var novoAlvo = GameObject.Find(Cubo1).transform; GetComponent(Seguir).alvo = novoAlvo; } }

Siga o mesmo procedimento anterior, adicione o Script Move1 para a LuzSpot. Clicando na LuzSpot arraste o script para o painel Inspector da LuzSpot. Veja que nenhuma varivel est exposta, pois nomeamos diretamente no cdigo. Para mais informaes de como utilizar a funo Find() veja o API.2. tag do GameObjects

Uma tag do GameObjects uma string que pode ser usada para identificar um componente. Para ver as tags embutidas clique no boto Tag no Inspector, voc tambm pode criar sua prpria tag. A funo para localizar um componente com uma tag especfica GameObject.FindWithTag() que recebe uma string como parmetro. Nosso cdigo completo para fazer isto : function Update(){ if (Input.GetButtonDown(Jump)) { var novoAlvo = GameObject.FindWithTag(Cubo).transform; GetComponent(Seguir).alvo = novoAlvo; } }

Creio que esta tag (Cubo) no est definida no Inspector. Portanto vamos cria-la. Selecione o GameObject Cubo1 e no painel Inspector clique no boto da tag, clique add Tag..., no painel seguinte digite o novo nome em nosso caso Cubo d enter, selecione novamente o Cubo1 e mude para tag Cubo, nesta sequncia.

Fbio Souza [email protected] Tutorial em Unity3D

10

1)

2)

3)

Remova o script anterior da LuzSpot e adicione este novo script. Roda o jogo e veja que quando pressionamos a tecla enter a Luz direcionada para o Cubo1.7. Instanciar

Muitas vezes necessrio criar objetos em tempo de execuo (quando o jogo est sendo jogado). Para fazer isso, usamos a funo Instantiate function. Vamos mostrar como funciona. Para instanciar (criar) um novo GameObject cada vez que o usurio pressionar o boto de disparo (ou o boto esquerdo do mouse ou CTRL esquerdo no teclado, por padro). Ento o que queremos fazer? Queremos que o usurio possa movimentar como de costume, e quando pressionar o boto de disparo, instanciar um novo objeto. Existe algo a pensar: 1. Qual objeto que vamos instanciar? 2. Onde que vamos instanci-lo? Quanto a qual objeto instanciar, a melhor maneira de resolver isso expor uma varivel. Isso significa que podemos indicar qual objeto instanciar usando arrastar e soltar para atribuir um objeto do jogo para essa varivel. Quanto a onde instanci-lo, queremos criar o GameObject onde a Cmara principal est localizado no momento, sempre que o boto de disparo for pressionado. A funo Instanciar utiliza trs parmetros: (1) o objeto que queremos criar, (2) a posio do objeto3D e (3) a rotao do objeto. O cdigo completo para fazer isso a seguinte (Criar.js):

Fbio Souza [email protected] Tutorial em Unity3D

11

var novoObjeto : Transform; function Update() { if (Input.GetButtonDown(Fire1)) { Instantiate(novoObjeto, transform.position, transform.rotation); } } No esquea que transform.position e transform.rotation so a posio e rotao da transformao que o script est associado, no nosso caso, esta ser a cmara principal. No entanto, quando um objeto instanciado, usual que esse objeto seja um prfabricado. Ento vamos tornar o Cube1 em um Prefab. - Em primeiro lugar, vamos criar um Prefab vazio. Selecione Assets > Create > Prefab. Renomeie esse Prefab para PCubo. - Arraste o Cube1 do painel Hierarquia para o Prefab PCube do painel Project. Observe o cone do prefab. Agora podemos criar o nosso cdigo Javascript. - Se no criou crie o cdigo Javascript acima e renomeie para Criar. - Coloque este script para a cmera principal e atribua o Prefab PCubo para a varivel novoObjeto. - Jogue o jogo e movimenta-se como de costume. Clique com o boto esquerdo do mouse ou pressione Ctrl esquerdo,voc deve notar um novo cubo aparecendo.8. Depurao

A depurao a habilidade de encontrar e corrigir os erros comuns em seu cdigo (ok, vamos cham-los de erros!). Unity oferece ajuda atravs da depurao da classe, utilizando a funo Debug.log ().Log

A funo Log () permite ao usurio enviar uma mensagem para o console do Unity. Isto serve para: 1. Provar que uma determinada parte do cdigo ser alcanada em tempo de execuo. 2. Relatar o status de uma varivel. Vamos ento usar a funo Log() para enviar uma mensagem para o console da Unity quando o usurio clicar no boto de fogo.

Fbio Souza [email protected] Tutorial em Unity3D

12

- Abra o script Criar e adicione a seguinte linha aps o cdigo de instanciar dentro do bloco if: Debug.Log("Cubo Criado!"); - Execute o jogo e clique no boto de fogo, voc deve ver uma linha aparecem na parte inferior da Unity dizendo "Cubo criado", voc pode clicar no link para examinar o Console do Unity.Watch

Outro recurso til para a depurao est expondo uma varivel privada. Isso torna uma varivel visvel no painel Inspector quando o modo Debug selecionada, mas no pode ser editado. Para demonstrar isso, vamos expor uma varivel privada para contar o nmero de cubos que foram instanciado. - Abra o script Criar novamente e adicione duas linhas: (1) Adicione uma varivel privada chamada contarCubo. (2) Incremente essa varivel sempre que um cubo for instanciado. O cdigo completo o seguinte (Create.js): var novoObjeto : Transform; public var contarCubo = 0; function Update() { if (Input.GetButtonDown(Fire1)) { Instantiate(novoObjeto, transform.position, transform.rotation); Debug.Log(Cubo Criado!); contarCubo ++; } } - Selecione a cmera e execute o jogo. Clique no boto de fogo para criar alguns cubos. Observe no Inspector e veja como a varivel contarCubo incrementado sempre que um novo cubo instanciado.9. Tipos comuns de script

Sempre que um Javascript novo criado, por padro, ele contm uma funo Update(). Esta seo ir discutir outras opes mais comuns disponveis, basta substituir o nome da funo Update () por um da lista abaixo.

Fbio Souza [email protected] Tutorial em Unity3D

13

FixedUpdate()

Cdigo colocado dentro dessa funo executada em intervalos regulares (um framerate fixo). Esse tipo de funo usado na aplicao de foras para um Rigidbody. / / Aplicar uma fora para cima para o corpo rgido de todos os quadros function FixedUpdate () { rigidbody.AddForce (Vector3.up); }Awake()

Cdigo que estiver aqui dentro chamado quando o script inicializado.Start()

Isso chamado antes de qualquer funo Update(), mas depois de Awake (). A diferena entre as funes Start () e Awake() que a funo start () s chamado se o script est habilitado (se sua opo for ativada no painel Inspector).OnCollisionEnter()

Cdigo aqui dentro executado quando o objeto do jogo deve colidir com outro objeto de jogo.OnMouseDown()

Cdigo aqui dentro executado quando o usurio move o mouse sobre um objeto de jogo que contm uma GUIElement ou Collider e executa um clique. / / Carrega o nvel chamado "SomeLevel" como uma resposta / / Para o usurio clicar sobre o objeto function OnMouseDown () { Application.LoadLevel ("SomeLevel"); }OnMouseOver()

Cdigo aqui dentro executado quando o mouse passa sobre um objeto de jogo, que contm um GUIElement ou Collider. // Fades o componente vermelho do material a zero // Quando o mouse est sobre a malha function OnMouseOver () { renderer.material.color.r -= 0.1 * Time.deltaTime ; } Verifique a API da Unity para obter mais informaes sobre todas essas funes.