Prévia do material em texto
GAME ENGINEGAME ENGINE INTRODUÇÃO AOINTRODUÇÃO AO DESENVOLVIMENTO DEDESENVOLVIMENTO DE GAMES COM UNITY3DGAMES COM UNITY3D Autor: Me. George Santiago Revisor : I van Dimitry R . Zyr ianof f IN IC IAR introdução Introdução Os motores de jogos ou game engines são sistemas que fornecem ferramentas para auxiliar no processo de desenvolvimento de jogos, podendo serem utilizados por equipes independentes ou até mesmo grandes empresas. Em resumo, essas ferramentas oferecem diversas funcionalidades para as diversas etapas na criação de um jogo. O Unity Editor é considerado um dos melhores game engines da atualidade, seja pela sua interface intuitiva, vasta documentação, loja de ativos ou versão gratuita. Permite a criação de jogos bidimensionais, tridimensionais ou híbridos (2.5D), além de ofertar inúmeras funcionalidades para a criação de ambientes em realidade virtual e aumentada. Neste capítulo, abordaremos os componentes básicos contidos no Unity que ajudaram a criar os nossos protótipos, bem como a sua loja de Assets . Discutiremos o papel das animações e recursos audiovisuais, além da sua in�uência na progressão do jogo. Iremos abordar os conceitos iniciais da criação de um protótipo, bem como os desa�os propostos ao jogador, além de conhecer as estruturas-base de criação desses projetos. Como parte �nal dos estudos desta unidade, você terá oportunidade de assistir uma aula na prática de como desenvolver a estrutura básica de um jogo. A prática permitirá explorar os conceitos expostos ao longo da unidade. O Unity é um sistema para o desenvolvimento de jogos e aplicativos com interação bidimensional, tridimensional e até 2.5D. O Unity permite que o usuário opere não apenas utilizando código, mas também com componentes visuais. Possibilita adicionar diversos assets especí�cos de acordo com o projeto de maneira intuitiva na sua interface . Para instalar o Unity Editor , utilizaremos o Hub . O Hub é uma ferramenta para gerenciamento de projetos e controle de versões do Unity . Permite gerenciar várias instalações do Unity (com versões diferentes), juntamente com os componentes do projeto. Para instalar o Unity Hub para o Windows , Mac OS e Linux visite a página o�cial do Unity . Para realizar a instalação do Unity Editor , você deve criar uma conta na Unity Developer Network (UDN). Após realizar o cadastro, entre com o login e a senha na aplicação Hub e, escolha a licença Personal , versão gratuita do Unity para usuários e empresas com receita bruta anual inferior a 100 mil dólares. Prossiga para a instalação do Unity Editor . Para realizar o cadastro de novo usuário, acesse o site do Unity . Introdução à Game EngineIntrodução à Game Engine UnityUnity Após realizar a instalação do Hub e do Unity Editor em seu sistema, você vai se deparar com a tela do Unity Hub (Figura 1.1). Vejamos a descrição dos principais componentes na tela: 1. Projects: essa aba é responsável por gerenciar os diversos projetos do usuário. 2. Learn: aba com diversos projetos e tutoriais em diferentes níveis de aprendizado (iniciante, intermediário e avançado) para o usuário familiarizar- se com a plataforma. 3. Installs: aqui é possível instalar, desinstalar e adicionar módulos à versão atual do Unity , sendo os principais: Android, IOS, Linux, Mac e Windows build support. 4. ADD: o Unity Hub possibilita que o usuário trabalhe com diversas versões do Unity Editor ; aqui, você pode adicionar versões com lançamento o�cial mais recente e as versões alpha (em pré-lançamento). 5. NEW: criação de um novo projeto. Dominar um software leva tempo, é preciso de prática e aprofundamento para conhecer as suas principais funcionalidades, além de um estudo com outros Figura 1.1 - Unity Hub Fonte: Elaborada pelo autor softwares de desenvolvimento para: comparar, testar e analisar qual atende as suas necessidades como desenvolvedor. O Unity tem uma comunidade bem ativa, com diversos tutoriais desenvolvidos pela empresa e pelos próprios usuários. No site do Unity você encontra tutoriais dos mais diversos projetos, com níveis de di�culdades para iniciantes, intermediários e avançados, bem como tópicos sobre as melhores práticas de programação, interface, otimização de performance , física etc. O Unity tem uma documentação vasta que pode ser acessada pelo site principal da engine . Lembre-se de que o Unity recebe atualizações constantes, desde a melhoria de performance até mudanças na sua interface. Algumas vezes, códigos ou ferramentas tornam-se obsoletos nas atualizações do Unity . Criando o Projeto Vamos começar um novo projeto? 1. Abra o Unity Hub, faça login com sua conta Unity . 2. Clique no botão new no canto superior direito, digite o nome do projeto - vamos chamá-lo de "3D Project". 3. De�na a versão do Unity - versão utilizada no tutorial “2019.3.0a4”. 4. Escolha a pasta onde deseja salvar seu projeto. 5. Veri�que se o template está de�nido para 3D. 6. Clique em create para iniciar o projeto. Veja as con�gurações salvas, na Figura 1.2: Interface do Unity Editor Após a criação do projeto, você vai se deparar com a interface do Unity editor (Figura 1.3). Os principais componentes da interface são: Inspector window, Hierarchy window, Project window, Toolbar e Scene view. Nas próximas subseções será descrito cada um desses componentes. Project Window Figura 1.2 - Create a new Project Fonte: Elaborada pelo autor Figura 1.3 - Interface do Unity Fonte: Elaborada pelo autor Esses diretórios incluem todos os recursos usados no seu projeto, como as imagens, modelos 3D, sons, scripts e outros arquivos. Esses arquivos são conhecidos como assets . O painel esquerdo do Project window mostra a estrutura de pastas como uma lista hierárquica. Quando uma pasta é selecionada, o seu conteúdo será mostrado no painel à direita. Os assets individuais no painel direito são mostrados como ícones que indicam o seu tipo (subpasta, material, textura, script etc). Hierarchy Window A janela Hierarquia contém uma lista de objetos presentes na cena atual, por exemplo, os personagens, cenários, áudio, scripts, dentre outros. No Unity , os jogos são compostos de cenas. Cada cena pode representar um nível ou um ambiente diferente no seu jogo. Os objetos dentro da aba Hierarchy são chamados de GameObjects. Scene View e Game Window A janela de visualização exibe todos os elementos da cena atual, ou seja, todos os GameObjects, da Hierarchy window. Você usará essa aba para selecionar e posicionar os elementos na cena atual, por exemplo, os personagens, luzes, câmeras e todos os objetos do cenário. O Unity possui um conjunto de controles para auxiliar na manipulação e navegação de cenas. O Scene Gizmo é uma ferramenta localizada no canto superior direito da Scene view . Isso permite modi�car o ângulo de visão e o modo de projeção da cena. O Scene Gizmo contém um braço em forma de cone para cada lado do cubo. Os cones são rotulados X, Y e Z. Ao clicar em qualquer cone do eixo pode-se rotacionar a câmera. Clicando no botão direito do mouse em cima do Scene Gizmo e, respectivamente em Free, o ângulo de visão retorna aos valores- padrão. O Game window ou janela do jogo, é uma aba oculta, localizada ao lado do Scene view . Enquanto a janela de visualização permite manipular os GameObjects em cena, a janela de jogo exibe o que o jogador verá quando jogar o jogo. Lembre-se: essa exibição é determinada pelo que a câmera da sua cena está exibindo. Inspector Window Ao selecionar um GameObject em uma janela, o inspector window exibe informações detalhadas sobre esse objeto, incluindo todos os componentes e propriedades relacionados ao GameObject . Pelo inspector é possível visualizar e editar as propriedades dos componentes vinculados ao objeto, além de adicionar novos componentes ao objeto selecionado. Isso inclui componentes de física, áudio, scripts , iluminação, dentre outros. Todos os GameObjects no Unity começam com um componente Transform, que especi�ca a posição e rotação do objeto em cena. Os outros componentes são opcionais e você pode adicionar conforme as necessidades do projeto. ToolBar A barra de ferramentas consiste em controles relacionados a diferentes partes do Unity editor. Esses controles são úteis para ajudá-lo a mover, manipular e testar o seu jogo. Dentre os principais controles no toolbar, temos os play buttons ( play , pause e step ), responsáveis por testar a cena atual carregada na Hierarchy window . O play permite visualizar o jogo em tempo real, pause é responsável por pausar a janela do jogo para identi�car possíveis problemas visuais. O step é utilizado para percorrer a cena pausado, frame a frame, além de visualizar o comportamento de determinado GameObject em cena, uma vez que, em diversas situações é difícil visualizar as modi�cações dos objetos em tempo real. Além dos controles de reprodução, temos os manipuladores de objetos, esses controladores movem e manipulam os GameObjetcs na janela Scene. Layouts Você pode ir personalizando sua área de trabalho de várias maneiras, é possível arrastar as janelas nas subseções anteriores para vários locais da interface do Unity . As janelas também podem ser desanexadas e organizadas em suas próprias janelas �utuantes. Por padrão o Unity disponibiliza os seguintes layouts : 2 by 3, 4 Split, Tall, Wide e Default. Para alternar entre layouts, selecione no menu a opção Windows> Layouts. O layout 4 Split é recomendado para a visualização de modelos 3D em diferentes ângulos. O Tall con�gura as janelas Scene e Game para uma melhor visualização, além de �xar as janelas Inspector, Project e Hierarchy nas colunas à direita. O layout Wide �xa as janelas Hierarchy, Project e Inspector para a parte inferior do Unity editor. Por �m, temos o Default, que centraliza a exibição das janelas scene e game , os outros componentes são �xados em ambos os lados, além da parte inferior. O layout do Unity Editor depende da preferência pessoal do usuário. Criando e Usando Scripts Os scripts no Unity são utilizados para controlar o comportamento dos objetos ligados a eles, sem scripts , os objetos não teriam nenhum comportamento. O Unity permite que você crie seus próprios scripts para modi�car as propriedades de componentes vinculados ao objeto, ative determinados eventos durante o jogo, responda aos comandos de entrada do usuário, dentre outros. Nativamente o Unity suporta a linguagem de programação C#, linguagem semelhante ao java e C++. Os scripts são criados diretamente na interface do Unity. Você pode criar um novo script indo na janela Project> Assets> Create> C# script, ou você pode selecionar um GameObject na janela Hierarchy> Inspector> Add component> digitar new script> de�nir um nome para o script> Create and Add. Caso o usuário não tenha criado o script em um diretório especí�co, por padrão o script será criado na pasta Assets . Após clicar duas vezes em um script no Unity Editor , o mesmo será aberto em um editor de texto, por padrão, o Unity utiliza o Visual Studio. A estrutura básica de um script pode ser vista na Figura 1.4: É no script que trabalhamos com a programação do jogo, sendo responsável por inúmeras funções na jogabilidade, por exemplo, quando o usuário aperta um determinado botão, ele irá executar a ação correspondente. Além disso, podemos via script controlar quando uma animação de personagem será ativada ou controlar a pontuação do jogo. A programação é responsável por dar vida a quase todos os elementos do jogo. A seguir, serão descritos os componentes da estrutura de script da Figura 1.4. As linhas 1 a 3 mostram as bibliotecas utilizadas no projeto, a linha 3 ( UnityEngine ) adiciona a biblioteca do Unity para a linguagem C# reconhecer todos os comandos do motor do jogo; A linha 5 contém o nome do script “Test”, indica que ele é uma classe que herda características em comum com MonoBehaviour . O MonoBehaviour é a classe base da qual derivam os scripts do Unity . O nosso script herda as características em comuns do MonoBehaviour , que nada mais é do que outro script que já tem seus métodos de�nidos. Na programação é comum usar algo chamado orientação a objetos, na qual o mesmo herda características em comum de um elemento e reunimos em um único script chamando de classe pai. Outros scripts vão herdar as características dessa classe, facilitando assim o desenvolvimento de diversas funções dentro do jogo (posteriormente discutiremos sobre esse tópico); Figura 1.4 - Script base no Unity Fonte: Elaborada pelo autor A linha 8 chama o método Start que é executado uma única vez dentro do tempo de vida útil do script; A linha 13 chama o método Update a cada frame renderizado do jogo, a função depende da taxa de quadros. A taxa de quadros pode variar mais do que uma vez por segundo, pois o intervalo de tempo para chamar o Update não é �xo, isso depende de quanto tempo é necessário para concluir o frame individualmente. Por exemplo, a capacidade de processamento pode alterar o tempo de renderização de frames, ou quando determinada Scene tenha uma quantidade expressiva de objetos a serem renderizados, como objetos com muitos polígonos. Ainda, existem outros métodos que são herdados do MonoBehaviour como o FixedUpdate, LateUpdate, OnGUI, OnDisable e OnEnable que iremos discutir mais à frente. Inicialmente, focaremos as duas funções de�nidas por padrão no script, start e update. Dentro da função Update , iremos colocar os códigos que manipularam a atualização dos frames para o GameObject, isso inclui movimento, resposta a determinadas ações de entrada do usuário e praticamente qualquer coisa que precise ser tratada ao longo do tempo durante o jogo. A função Start será chamada antes do jogo começar, antes mesmo da função Update , é o local ideal para inicializar as propriedades de uma variável. Para demonstrar o funcionamento do Start e Update, iremos inicialmente adicionar o seguinte código na função Start: void Start() { Debug.Log("Start Test"); } O Debug.Log é um comando que imprime uma mensagem na saída do console do Unity. A janela de console é responsável por mostrar os avisos e erros que o jogo está produzindo. O console fornece informações úteis durante o desenvolvimento dos jogos, sendo possível identi�car erros ao longo do projeto. Por padrão, a janela console �ca ao lado da janela de projeto. Mas, você pode ativar no menu do Unity> Window> General> Console. Agora, salve o script (ctrl+s) para podermos testar o script. Voltando ao Unity Editor, clique em Play, localizado no menu superior do Toolbox. Aparentemente, não obtivemos nenhum comportamento diferente na tela do Unity , mas, na parte inferior do Unity e na janela do console podemos visualizar a mensagem exibida pelo nosso código (Figura 1.5). Perceba que a mensagem foi enviada uma única vez, pois a função Start é executada uma única vez. Após o teste inicial, voltamos ao Visual Studio. Faremos o teste na função Update, retire o código “Debug.Log("Start Test")” da função Start e coloque na função Update, observe como �cou: void Update () { Debug.Log("Start Test"); Figura 1.5 - Debug.Log Fonte: Elaborada pelo autor. } Agora, salve o script (ctrl+s) para podermos testá-lo. Voltando ao Unity Editor, clique em Play. Observe que o código é chamado a cada frame, pois o Update é chamado a cada frame renderizado do jogo. saiba mais Saiba mais O Unity é um motor de jogo que disponibiliza diversas funcionalidades para a criação de jogos. A engine possui uma interface intuitiva, documentação extensa disponível no site da empresa, fórum de discussões dedicado à plataforma, versão gratuita, milhares de assentes prontos para a implementação em um projeto, além da possibilidade de criar jogos em 2D e 3D. Veja o vídeo de alguns jogos 2D desenvolvidos utilizando o Unity: ACESSAR Posteriormente, falaremos sobre a ordem de execução para funções no Unity , o mesmo possui uma ordem predeterminada.https://www.youtube.com/watch?v=NMUr2yNALhU atividade Atividade Leia o excerto a seguir: “ Unity 3D possui uma interface simples que facilita a manipulação e a organização dos arquivos e componentes do jogo. A área de trabalho é formada por várias janelas, cada uma com uma �nalidade especí�ca, que podem ser organizadas de acordo com a preferência do usuário”. TEOTÔNIO, W.; ARAÚJO, A. Desenvolvimento de Jogos para Dispositivos Móveis utilizando o Motor de Jogo Unity 3D: um Estudo de Caso. 2017. Disponível em: https://bit.ly/2SpzHV9 . Acesso em: 9 jan. 2020. Com base no texto, analise as seguintes a�rmações: I. O inspector é responsável por exibir as con�gurações de um GameObject, bem como os seus componentes. II. O Unity possui um conjunto de controles para auxiliar na manipulação e navegação de cenas. III. Os Scripts são componentes pré-compilados para controlar o comportamento de um objeto dentro do jogo. O unity não permite criar os seus próprios scripts. IV. O Scene Gizmo é uma ferramenta localizada no canto inferior direito da Scene Game. Está correto o que se a�rma em: a) I, II e III, apenas. b) I e II, apenas. c) II, III e IV, apenas. d) I, III e IV, apenas. e) I, II, III e IV. https://www.researchgate.net/publication/320273327_Desenvolvimento_de_Jogos_para_Dispositivos_Moveis_utilizando_o_Motor_de_Jogo_Unity_3D_um_Estudo_de_Caso O Unity tem uma loja de ativos própria, chamada Unity Store , contendo milhares de Assets . Mas o que são Assets ? No Unity , um recurso é um objeto que o usuário pode usar em seu projeto. Esses objetos podem vir de um arquivo criado fora do Unity , como um arquivo de áudio, uma imagem, um modelo 3D, scripts ou qualquer outro tipo de objeto compatível com Unity . Além dos recursos criados dentro do Unity , como um Render texture ou um Animator Controller . A loja de ativos oferece milhares de recursos gratuitos ou de baixo custo, são recursos adicionais utilizados para o seu jogo. A Asset store é organizada de acordo com os diferentes tipos de ativos disponíveis, sendo os principais: Recursos 3D, Recursos 2D, Adds-ons (funções que você pode importar para o projeto, sendo as mais populares, Unity Ads , Analytics e IAP - compras no aplicativo), Áudio, Templates, Ferramentas e VFX. Navegar na Unity Asset Store Você pode acessar o Unity store através da Game Engine ou do site da Asset Store . Comandos de Entrada eComandos de Entrada e AssetsAssets Para acessar pela Interface do Unity , abra seu projeto no Unity e no menu superior vá para Window> Asset Store. Isso irá abrir uma nova janela na interface do editor, ao lado das janelas scene , game e console. Veja a asset store aberta no editor do Unity (Figura 1.6). Figura 1.6 - Interface do Unity Fonte: Elaborada pelo autor Percorra a página da asset store para encontrar diversos recursos, em seções organizadas descritas anteriormente. No lado esquerdo da página existem diferentes categorias, clicando em uma delas é possível ver apenas os recursos dessa seção. Na parte superior da página é possível pesquisar utilizando a barra de pesquisa. Vamos fazer o download de um recurso na loja de ativos? Abra a loja de ativos pelo editor do Unity . No painel direito em All Categories marque o �ltro 3D> environments> Sci-Fi (Figura 1.7). Precisamos localizar um ativo gratuito, na aba superior direita é possível �ltrar o resultado pelo preço dos itens. No menu superior da loja de ativos, vá em Sort by Price e selecione a opção Low to High . Usaremos o pacote Snaps Prototype | Sci-Fi / Industrial. Esse pacote é oferecido gratuitamente pela Unity . Após localizar o ativo lembre-se que é possível pesquisar o nome do recurso na barra de pesquisa, de um duplo clique e faça download do arquivo (Figura 1.8). Figura 1.8 - Asset store: Snaps Prototype Fonte: Elaborada pelo autor 1.7 - Asset store Fonte: Elaborada pelo autor Depois de fazer o download de um recurso na Asset Store através de Unity Engine , o botão Download mudará para um botão Import . Clique nesse botão para importar o recurso para o seu projeto Unity aberto. Após importar o arquivo uma lista de veri�cação solicita permissão para importar os recursos para o seu projeto. Clique no botão Import (Figura 1.9) e veja os recursos em sua pasta. Figura 1.9 - Asset store: Snaps Prototype Fonte: Elaborada pelo autor Após importar o arquivo para dentro do projeto, iremos abrir uma cena de amostra contida no pacote. Para isso, vá à janela Project> pasta Assets> AssetStoreOriginals> _SNAPS_PrototypingAssets> SciFi_Industrial> SampleScenes. No painel direito, dê um duplo clique no arquivo SciFi_Industrial_SampleLayout (Figura 1.10). Figura 1.10 – Asset store: Snaps Prototype Fonte: Elaborada pelo autor Já é possível visualizar os objetos do recurso importando na janela Scene , Game e Hierarchy . Clique em Play e veja a cena na janela Game. Dentro do Unity Store existem diversas categorias que você pode explorar, procurar recursos visuais para os mais diversos projetos. Na aba 3D temos: animations , characters , environments , props , vegetation e vehicles . No 2D: characters , environments , fonts , GUI , textures e materials . Você pode utilizar diversos recursos na asset store livremente nos seus jogos, a loja da Unity contém inúmeros recursos, para os mais diversos projetos. saiba mais Saiba mais O Unity disponibiliza gratuitamente um 2D Game Kit, contendo uma coleção de ferramentas, mecânicas, sistemas e ativos para que o usuário compreenda como esses elementos podem ser utilizados dentro de um jogo "pronto". ACESSAR https://assetstore.unity.com/packages/essentials/tutorial-projects/2d-game-kit-107098 De maneira geral, é necessário um entendimento sólido dos fundamentos de programação para programar jogos digitais no unity . As estruturas fundamentais de dados são similares para qualquer outro tipo de software ou programa. O unity utiliza nativamente o C#, mas, mesmo com o entendimento dessa linguagem de programação, o usuário ainda precisa aprender as estruturas básicas ao programar no unity , pois algumas estruturas são diferentes. O primeiro passo é compreender a estrutura do script , visto de forma introdutória no tópico 1 desta unidade. O script é um roteiro, que dirá qual comportamento um GameObject terá. A estrutura básica de um script é composta de classes, funções e variáveis. As variáveis começam com a letra minúscula e mantêm valores como parâmetros a outros objetos. As funções começam com uma letra maiúscula e são estruturas utilizadas para organizar códigos para reutilização em diferentes partes do jogo. As funções são rotinas para processar uma sequência de passos, podendo ou não retornar um objeto. Uma classe é um agrupamento de variáveis e funções para criar uma referência ou modelo que de�na os atributos (propriedades) de um objeto. Os vários tipos de variáveis (int, �oat, bool, string etc.) podem ser públicas ( public ) ou privadas ( private ), posteriormente discutiremos sobre outros Programação na GameProgramação na Game EngineEngine modi�cadores ( protected , abstract e internal ). O public permite que o seu valor seja acessado por qualquer outro script, podendo ser referenciados por outras classes. Já o private, de maneira geral, são atributos que o usuário não deseja que seja alterado por outros scripts. As variáveis devem ser privadas e os métodos públicos. O acesso às variáveis deve ser feito por meio de métodos setters and getters . Especi�camente na Unity , os campos públicos são visualizados no Inspector, enquanto variáveis privadas não. Ou seja, é possível editar valores de atributos públicos no inspector. No entanto, é possível que um campo privado seja visível ou um campo público seja oculto no inspector. Para esse propósito, temos [SerializeField] e [HideInInspector]. O [SerializeField] é adicionado antes de um campo privado para torná-lo visível no inspector. Já o [HideInInspector] é utilizado antes de um campopúblico para ocultá-lo no inspector. Anteriormente, utilizamos o Debug.log para estudar os métodos Update e Start . Nas próximas subseções serão descritos outros métodos importantes do MonoBehaviour, que é a classe principal do Unity. Input A classe é responsável pelo sistema de Inputs no jogo, contendo vários métodos para detectar essas entradas. O Unity suporta Input de teclado, joystick e gamepad. Além de multi-touch/accelerometer de dispositivos mobile. O unity utiliza botões padrões, para visualizar ou adicionar novos é preciso ir ao menu principal do Unity Editor> Edit > Project Settings > Input. Os eixos "Horizontal" e "Vertical" são mapeados pelas teclas A, W e S ou as teclas de seta. O "Fire1", "Fire2" "Fire3" são mapeados por left ctrl, left alt e left shift ou pelo Mouse0 (botão esquerdo do mouse), Mouse1 (botão secundário/direito do mouse) e Mouse2 (botão do meio do mouse). GetButtonDown: ativada uma única vez após um botão ser pressionado. Exemplo: if (Input.GetButtonDown ("Fire1")) { // detecta o Input do botão esquerdo do mouse ou a tecla ctrl Debug.Log("Botao Atirar foi Pressionado"); // imprime a mensagem no console após usuário pressionar a tecla ctrl ou botão esquerdo do mouse } GetButtonUp: ativa após o botão deixar de ser pressionado. Exemplo: if (Input.GetButtonUp ("Fire1")) { // detecta o Input do botão esquerdo do mouse ou a tecla ctrl Debug.Log("Botao Atirar deixou de ser Pressionado"); // imprime a mensagem no console após usuário pressionar a tecla ctrl ou botão esquerdo do mouse } GetKeyDown: ativada uma única vez após um botão especí�co ser pressionado. Exemplo: if (Input.GetKeyDown ("q")) { // detecta o Input do botão Q Debug.Log("Botao Q foi Pressionado"); // imprime a mensagem no console após usuário pressionar a tecla Q do teclado. } GetKey: ativada continuamente enquanto a tecla for pressionada. Exemplo: if (Input.GetKey ("q")) { // detecta o Input do botão Q Debug.Log("Botão Q está sendo pressionado"); // imprime a mensagem no console após usuário pressionar a tecla Q do teclado. } Input do Mouse: similar ao mapeamento de teclas do teclado, o GetMouseButton é responsável pelo input do botão esquerdo (0), direito (1) e botão do meio (2) do mouse, o GetMouseButtonDown é ativado continuamente e o GetMouseButtonUp é ativado quando usuário deixar de pressioná-lo. Exemplo: if (Input.GetMouseButton (0)) { Debug.Log(" Foi pressionado o botão esquerdo do mouse"); } if (Input.GetMouseButtonUp (1)) { Debug.Log("Está pressionado o botão direito do mouse"); } if (Input.GetMouseButtonDown (0)) { Debug.Log("Deixou de pressionar o botão do meio do mouse"); } Invoke O método invoke permite o agendamento de um método para ser invocado posteriormente. Ou seja, é responsável por invocar uma função dentro de um tempo especí�co (x). Exemplo, após o jogo ser iniciado, quero que após 3 segundos a mensagem “Test” seja exibida no console. Veja o código abaixo com os seus respectivos comentários, o que estiver à frente do // (barra- barra) é ignorado pelo compilador. void Start( ) { Invoke("MessageTest", 3f); // após 3 segundos o método invoke chamará a função MessageTest( ) . } void MessageTest( ) Função responsável por imprimir a mensagem no console do Unity. { Debug.Log("Test"); } } Além do Invoke, temos o InvokeRepeating e o CancelInvoke. O InvokeRepeating é responsável por chamar uma função mais de uma vez em um tempo �xo. O CancelInvoke cancela todas as chamadas invocadas ou repetidas no script. Vejamos o código abaixo como exemplo. void Start( ) { InvokeRepeating("MessageTest", 3f , 2f); // após 3 segundos o método InvokeRepeating chamará a função MessageTest( ), após a chamada inicial de 3 segundos, a função MessageTest( ) será invocada a cada 2 segundos. Ou seja, X segundos a cada Y segundos. } void Update () { if (Input.anyKey) { // Detecta se alguma tecla ou mouse foi pressionada, se o retorno foi positivo, cancela todas as chamadas invocadas. CancelInvoke(); } } void MessageTest( ) Função responsável por imprimir a mensagem no console do Unity. { Debug.Log("Test"); } } Instantiate Essa função é usada para instanciar um objeto, na posição (Vector3 (X,Y,Z)) e na rotação (Vector3(X,Y,Z)) que é informado. A função faz uma cópia (clone) de um GameObject, todas as propriedades são mantidas do objeto original. Como exemplo temos o projétil de uma arma, onde para cada disparo uma bala é instanciada, na mesma posição e rotação da arma. Veja abaixo a declaração do método Instantiante e sua respectiva descrição dos parâmetros. Instantiate(GameObject); // responsável por instanciar o clone de um objeto. Instantiate(GameObject, Transform parent); // responsável por instanciar o clone de um objeto na posição original do objeto pai (onde estará o script). Instantiate(GameObject original, Vector3 position, Quaternion rotation); // responsavel por instanciar o clone de um objeto , de�nir a posição e orientação para o novo objeto. Destroy O Destroy é o contrário do Instantiate, é um método para remover um GameObject/componente ativo. Ou seja, após ser chamado, o objeto será destruído. É possível atribuir um parâmetro para que objeto seja eliminado após x segundos. Veja o código abaixo com métodos utilizados pelo Destroy. void DestroyGameObject() { Destroy(gameObject); // o objeto é destruído imediatamente. } void DestroyScriptInstance() { Destroy(this); // destrói a instância atual, "this" refere-se ao próprio script. Ou seja, destruirá o script que chama essa função. } void DestroyComponent() { Destroy(GetComponent<Rigidbody>()); // Remove o rigidbody do GameObject } void DestroyObjectDelayed() { Destroy(gameObject, 3f); // Após 3 segundos o GameObject é eliminado. } FixedUpdate e LateUpdate O FixedUpdate é uma função que exerce papel similar ao Update, executando constantemente. A diferença é que ele não depende do número de frames por segundos, usando um intervalo de tempo �xo. É uma função recomendada para cálculos de física, que discutiremos posteriormente. Similar ao Update, o LateUpdate é atualizada a cada Frame por segundo, após o Update ser chamado. A ordem de execução das funções Update são FixedUpdate > Update > LateUpdate. saiba mais Saiba mais O Unity disponibiliza gratuitamente um 2D Game Kit , contendo uma coleção de ferramentas, mecânicas, sistemas e ativos para que o usuário compreenda como esses elementos podem ser utilizados dentro de um jogo pronto. ACESSAR https://assetstore.unity.com/packages/essentials/tutorial-projects/2d-game-kit-107098 O Unity contém diversos recursos de animação, seja para jogos 2d ou 3d, sendo possível animar diferentes partes do corpo de um objeto (um personagem por exemplo), gerenciamento visual das interações entre as partes de um objeto, �uxo de trabalho intuitivo e simpli�cado, suporte para clipes, vídeos e animações prontas importadas de outros softwares , dentre outros. A Animation window (você pode habilitar essa janela indo no menu do Window > Animation > Animation) é responsável por animar os GameObjects usando a técnica tradicional de animação quadro a quadro. Os chamados quadro-chaves são marcações realizadas pelo usuário em um linha de tempo, essa linha contém os dados do GameObject de acordo com o loop da animação. Esses pontos indicam as alterações que o GameObject precisa realizar para modi�car a sua estrutura, logo, produzir uma animação. A engine interpreta esses pontos, interpola as informações do quadro-chave para o próximo ponto reproduzir a animação de acordo com os parâmetros da linha do tempo. AnimaçãoAnimação Vamos analisar o comportamento de uma animação no Unity? Para isso, você deve habilitar a janela Animation window, acessar a asset store e importar para o Unity o ativo "Animated 2D Coins", produzido por Allsstar. Após importar o recurso, crie uma nova scene (janela Project > " + " > Scene). Na janela Project> Asset > Animated 2D Coins > Sprite Sheet. Dentro da pasta Sprite Sheet, expanda o ativo EUR_6x4 e arraste a primeira fatia EUR_6x4_0 para a janela hierarchy (Figura 1.11). Arrastando as fatias para a janela de hierarchy , o Unity cria automaticamente uma nova animação, você precisa criar ou escolher uma pasta para pôr esses arquivos, sugerimos criar uma pasta para animações, e dentro dela uma pasta para cada objeto animado em cena (personagem, inimigos, HUD etc.). Vamos criar a nossa animação? Na janela Animation, clique em Create e de�na o nome para Coins. E agora? Volte à janela Project > Sprite Sheet e arraste todas as fatias do ativo EUR_6x4 para a janela Animation (Figura 1.12). Figura 1.11 - Animação Fonte: Elaborada pelo autor A linha branca na linha do tempo na janela de animação é chamada de reprodução, indica os pontos-chaves presentes na animação. Para movê-lo, clique com o botão esquerdo e arraste ao longo da linha de animação. Você vai perceber que ao mover a linha branca, a moeda vai rotacionar. Basta observar na janela Scene. É possível adicionar novos pontos-chaves e alterar a velocidade de rotação. Para adicionar um novo ponto-chave e gravar é preciso habilitar o Keyframing, um botão na janela Animation, ao lado da opção "preview", quando habilitado, qualquer alteração na animação será aplicada ao GameObject. O Keyframing realiza uma gravação dos novos parâmetros em cena, seja adicionar um quadro-chave, alterar a velocidade de movimento, a cor, a posição, dentre outras con�gurações. Figura 1.12 - Animação Fonte: Elaborada pelo autor Quando arrastamos as fatias da moeda para a janela de animação, automaticamente, o Unity interpola as informações de um quadro-chave para outro. Quando o usuário movimenta a linha branca, está alternando entre um quadro-chave para outro. Mas essa é uma con�guração padrão, cada animação exige parâmetros próprios, de acordo com a cena e o tipo de movimento que o desenvolvedor espera da animação. Como exemplo, vamos imaginar a criação de uma animação de corrida, o usuário dá input para o personagem sair da inércia e começar a correr, logo, exige três quadros-chave para a posição da animação. O primeiro quadro-chave representa o personagem inerte, sem movimentação de andar, correr ou pular. O segundo representa o personagem em sua velocidade máxima de corrida, por �m, o terceiro é o personagem em seu estado padrão. Esses pontos-chaves são responsáveis pelas alterações de estágios da animação. Automaticamente, o Unity interpola esses pontos, em um intervalo de tempo �xo. Da maneira que descrevemos o objeto apenas vai de um ponto a outro, sem alterações suaves. Lembra-se que o ponto-chave do meio é responsável pela velocidade máxima de movimento? O personagem precisa de um progressão para chegar a essa velocidade máxima, além da desaceleração para voltar à inércia. Para realizar essas alterações, o Unity disponibiliza as modi�cações de animações usando curvas. Na parte inferior da janela Animation, clique em Curves (Figura 1.13). reflita Re�ita Levando em consideração os assuntos abordados ao longo da unidade sobre o Unity, re�ita como uma Game Engine pode in�uenciar no desenvolvimento de um jogo eletrônico. De forma automática, o Unity criará as propriedades básicas (Position.x, Position.y e Position.z) do objeto. Expanda a opção Position e veja a curva atual da animação de moeda. Selecionando o quadro-chave é possível alterar a curva da animação, o efeito é usado para modi�car a trajetória da animação do GameObject. Por exemplo, é possível acelerar o movimento de rotação da moeda em determinado quadro-chave. Observe a Figura 1.14, na janela de animação, existem três linhas: vermelha, verde e azul. A linha vermelha é responsável pelo eixo horizontal (Position.x), alterando esse valor, a moeda vai rotacionar ao mesmo tempo que se movimenta pelo eixo horizontal. A linha verde representa as alterações do eixo vertical (Position.Y), o que signi�ca? Por exemplo, permite que a moeda suba e desça, podendo, criar uma animação de pulo. Alterando os valores da linha verde é possível perceber que em determinado ponto a moeda vai desaparecer. O eixo z é responsável pela profundidade, ao mover a linha, a moeda ultrapassa os limites da câmera. Posteriormente, estudaremos projeção ortográ�ca e perspectiva da câmera 2d e 3d. Esses valores (x, y e z) localizam o objeto no espaço tridimensional. Como exercício simples, altere as curvas e de animação e veja como o comportamento de movimentação da moeda. Figura 1.13 - Curves Fonte: Elaborada pelo autor Animator Controller O Animator Controller é uma ferramenta para organizar as transições das animações associadas a um objeto. Por exemplo, qual a transição da animação da moeda? Aparentemente nenhuma, mas, antes de analisar essa a�rmação, vamos abrir o animator? No Unity , acesse o menu Window > Animation > Animator. Observe a Figura 1.15. Figura 1.14 – Curves Fonte: Elaborada pelo autor Figura 1.15 – Curves Fonte: Elaborada pelo autor A estrutura do Animator Controller permite organizar um conjunto de animações e suas respectivas transições associadas a um objeto. O funcionamento do controlador é baseado em uma máquina de estado, que de maneira simples, pode ser conceituado como um diagrama. Observe que a ideia básica de uma máquina de estados é projetar uma estrutura de controle sobre as ações de um objeto. Tais ações dependem de uma série de fatores, que vai desde a jogabilidade, mecânica ou as regras que de�nem o comportamento dos elementos do jogo. Essas ações são chamadas de estados, por exemplo, o objeto, ou melhor, um personagem, está em um "estado" de inércia, ou seja, está ocioso, mas, pode mudar imediatamente para outro estado, como saltar, andar, correr ou realizar uma ação especí�ca. Portanto, o animator controller fornece uma visão geral de todas as transições do objeto. Permite que o usuário de�na os gatilhos para disparar diferentes animações. Com a janela Animator aberta, pressione a tecla A para centralizar e visualizar todos os estados de transição do objeto. O any state , ou qualquer estado, é um estado especial que está sempre presente na janela do animator controller . Sua funcionalidade é permitir a transição para um estado especí�co, independentemente do estado atual do objeto. Os valores dos parâmetros das transições podem ser controlados por scripts, que podem ser vistos na demonstração no �nal desta unidade. atividade Atividade Leia o excerto a seguir: “A produção de jogos digitais era menos complicada 30 anos atrás. Em apenas seis semanas, uma pessoa criava o design, escrevia o código, gerava os recursos grá�cos e testava a funcionalidade de um jogo. Naquela época, alguns personagens constituídos de blocos e uma ótima jogabilidade entretinham os jogadores por horas, o que tornava fácil para uma só pessoa executar todas as tarefas de desenvolvimento do jogo”. CHANDLER, H. M. Manual de Produção de Jogos Digitais. [S.l.]: Bookman, 2012. Atualmente, para desenvolver um jogo, é preciso levar em consideração inúmeros fatores, desde a de�nição de uma ideia central, da jogabilidade, mecânica, roteiro, gerenciamento de projetos, entre outros. Portanto, é necessário considerar a natureza multidisciplinar de um jogo eletrônico. Diante disso, analise as alternativas a seguir. I.O Unity 3D contém diversos recursos de animação para jogos tridimensionais. Para jogos bidimensionais é necessário importar ativos de terceiros da Unity Store. II. A janela de animação é responsável por animar os GameObjects usando a técnica tradicional de animação quadro a quadro. III. Os chamados quadro-chaves são marcações realizadas exclusivamente pelo Unity em uma linha de tempo. IV. Para habilitar a Animation window, basta acessar menu do Unity > Window > Animation > Animation. Está correto o que se a�rma em: a) II e IV, apenas. b) I e II, apenas. c) II e III, apenas. d) I e IV, apenas.e) IV, apenas. indicações Material Complementar LIVRO Manual de produção de jogos digitais Editora: Bookman Autor: Heather M. Chandler ISBN: 978-8540701830 Comentário: um guia completo da produção de jogos digitais, mas do ponto de vista do produtor, do líder do projeto, o que está atrás das cortinas do projeto? Apresenta tópicos gerais que vão da pré-produção, testes, marketing, além de mostrar em detalhe um projeto na prática. FILME Indie game: the movie Ano: 2012 Comentário: um documentário sobre o quão difícil é a produção de jogos independentes. O �lme aborda a perspectiva dos desenvolvedores por trás dos jogos de sucesso; Braid, Super Meat Boy e Fez. O documentário é sobre a linha tênue entre a paixão e o sacrifício entre realizar o sonho de desenvolver um jogo. TRA ILER conclusão Conclusão Um estágio importante no desenvolvimento de qualquer jogo é a escolha ideal das ferramentas de criação. O desenvolvimento de jogos é uma área multidisciplinar, que na maioria das vezes exige empatia, criatividade, inovação e persistência. Ou seja, um jogo é desenvolvido para os jogadores e, seu processo de desenvolvimento precisa ser centrado no usuário. A ferramenta correta pode auxiliar no teste de hipóteses especí�cas de um projeto, auxiliando no desenvolvimento de uma ideia. Desenvolver um jogo não é uma tarefa trivial, exige um enorme esforço e um profundo conhecimento em diversas áreas, o Unity é uma ferramenta com diversas funcionalidades para facilitar o processo de criação. Lembre-se de que a prática é o melhor caminho para se familiarizar com os métodos básicos de qualquer ferramenta de criação. referências Referências Bibliográ�cas CHANDLER, H. M. Manual de Produção de Jogos Digitais . [S.l.]: Bookman, 2012. POPOLIN NETO, M. A multiprojeção de ambientes virtuais gerados por motores de jogo: o histórico e o design de uma solução genérica aplicado no motor de jogo Unity. 77 f. Dissertação (Mestrado) – Instituto de Biociências, Letras e Ciências Exatas Universidade Estadual Paulista Júlio de Mesquita Filho, 2015. Disponível em: http://hdl.handle.net/11449/138457 . Acesso em: 9 jan. 2020. SALEN, K.; ZIMMERMAN, E. Rules of play: game design fundamentals. Cambridge, Massachusetts: The MIT Press, 2004. TEOTÔNIO, W.; ARAÚJO, A. Desenvolvimento de Jogos para Dispositivos Móveis utilizando o Motor de Jogo Unity 3D: um Estudo de Caso. 2017. Disponível em: https://bit.ly/39dubvx . Acesso em: 9 jan. 2020. UNITY User Manual (2019.2). Unity , [2019]. Disponível em: www.unity3d.com/support/documentation/Manual . Acesso em: 1º de dez. 2019. http://hdl.handle.net/11449/138457 https://www.researchgate.net/publication/320273327_Desenvolvimento_de_Jogos_para_Dispositivos_Moveis_utilizando_o_Motor_de_Jogo_Unity_3D_um_Estudo_de_Caso http://www.unity3d.com/support/documentation/Manual