Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação para jogos 2D Unidade 4 - Projeto de jogo autoral Autor: Vanessa Pereira do Nascimento Revisor técnico: Renato Medeiros Iniciar Introdução O desenvolvimento do jogo de plataforma, iniciado na unidade anterior, trouxe novos desa�os para a programação. Além da já conhecida movimentação para esquerda e para a direita, adicionamos ao nosso personagem a habilidade de pular. A montagem do level também possibilitou o conhecimento de se trabalhar com um tilemap , montando todo o cenário do jogo a partir de diferentes blocos de imagens. A estrutura de um jogo de plataforma apresenta ainda outros elementos presentes na programação de jogos 2D, como por exemplo: inimigos, ataques, coleta de materiais, contagem de vidas e de pontuação. A criação desses scripts será abordada durante esta unidade, e, conforme apresentado na unidade 3, é importante a execução de testes de jogabilidade durante toda a produção do jogo. Durante esta unidade, os exercícios serão exempli�cados por meio da incrementação no projeto do jogo de plataforma. Você será incentivado a modi�car os elementos trabalhados, a �m de trilhar o caminho na produção de seu próprio jogo. Com a intenção de oferecer ferramentas para o desenvolvimento de um game autoral, esta unidade abordará a elaboração da documentação necessária para o desenvolvimento de um projeto, além das especi�cações para exportação do arquivo �nal. Nesta última etapa da disciplina, você entrará em contato com mais elementos essenciais para a programação de jogos 2D. A partir de agora, comece a imaginar como poderá incrementar seu jogo com os seguintes conhecimentos: inserção de sons, adição de inteligência arti�cial e montagem da interface do usuário. Bons estudos! 1. Sonoridade do jogo A presença do som em um game é tão importante quanto seus grá�cos. Você imaginou como seria a experiência de jogar sua versão de Breakout com sons da bola rebatendo, da marcação de pontos e até mesmo do jogo iniciando? Ainda que o jogo possa ser jogado sem qualquer sonoridade, a experiência da jogabilidade é modi�cada com a presença de sons. Nos primeiros games criados nas décadas de 70 e 80, seja para �iperamas ou para consoles, a inserção de sons era limitada pela capacidade tecnológica do hardware envolvido. Com o advento das mídias de CD e DVD, além da tecnologia atual de streaming nos jogos, já não há problema de memória ou execução de sons durante um game. Atualmente, a preocupação com a sonoridade no design de jogos é com a estética, isto é, em como a jogabilidade afeta os sentidos do jogador. Tanto a visão quanto a audição são afetadas por jogos em diferentes plataformas. O tato, apesar de parecer estar mais ligado a jogos não digitais, pode ser afetado, por exemplo, pela vibração de controles. É importante ressaltar que a combinação de elementos de diferentes sentidos contribui para uma maior acessibilidade do jogo. Ao indicar que o jogador entrou em uma área perigosa, podemos modi�car a sonoridade do ambiente, mas também indicar a mudança através de pistas visuais, garantindo, por exemplo, a comunicação com um jogador que tenha de�ciência auditiva. Como a estética pode afetar os jogadores de maneiras diferentes, já que cada um carrega um repertório próprio, é importante conhecer as maneiras de se trabalhar com sons em um jogo, garantindo que outra função dos sons em um jogo seja alcançada: a comunicação. Um som que indica perigo, por exemplo, pode assustar mais ou menos um jogador, mas pode ser importante para a jogabilidade que todos os jogadores identi�quem que há um perigo iminente. A comunicação com o jogador, por meio da sonoridade do game, se dá a todo momento. Os grá�cos de um jogo podem indicar um determinado grau de realismo, mas se os sons remeterem a um universo fantástico, por exemplo, o jogador entenderá o descolamento da realidade. Claro que para isso também devem ser trabalhados os demais elementos da gameplay: montagem dos levels, desa�os, narrativa, etc. Se a sonoridade do jogo parecer descolada de todos os demais elementos, pode ser provocada uma estranheza na jogabilidade, prejudicando a experiência do jogador. Isso acontece porque o jogador é levado a acreditar no universo proposto em um game. Dessa maneira, é possível ensiná-lo, por meio dos sons (assim como ocorre com as imagens), qual o funcionamento desse universo. O jogador identi�ca os sons de uma fonte e pode aprender que naquele ambiente funciona daquela maneira, aquele ser faz determinado ruído, assim como seu pulo determinado som. Uma possibilidade da utilização de sons a partir dessa aprendizagem, por exemplo, é a execução de um som no momento em que o personagem coleta um item. A sonoridade pode parecer positiva e a pista visual pode ser o desaparecimento do item e a soma de pontos no placar. Ao obter esse retorno sonoro algumas vezes, o jogador relaciona a coleta do item à escuta desse som. Quando ele estiver em um ambiente onde não consiga visualizar o item - como dentro de uma sala escura ou atrás de uma parede -, mas ouvir o mesmo som, saberá que ali havia aquele item já conhecido. A pista visual nesse caso poderá ser apenas a soma da pontuação. Isso ensinará mais ao jogador sobre a coleta de itens no jogo, o que o levará a percorrer o ambiente de maneira diferente, procurando também onde não se vê. 1.1 Música, ambientação e efeitos sonoros A sonoridade em uma game pode ser dividida em: trilha musical, sons de ambientação e efeitos sonoros. As três categorias coexistem durante a jogabilidade, e, assim como em obras audiovisuais, podem ser classi�cadas em sons diegéticos e não diegéticos. A diegese está relacionada com o universo �ccional proposto, dessa maneira, todos os sons que podem ser ouvidos pelos personagens ali representados são diegéticos, como são os efeitos ambientais e sonoros por exemplo. A trilha musical costuma ser um tipo de som não diegético, já que é ouvida apenas pelo jogador, não estando integrada ao espaço de seu personagem na tela. Apesar desse Você quer ler Com um capítulo dedicado à sonoridade nos games, o livro Level UP : um guia para o design de grandes jogos, de Scott Rogers, é uma espécie de manual para os desenvolvedores. Por meio de uma linguagem acessível, o autor apresenta não somente o universo sonoro, mas todas as etapas do design de games. Criação de personagens, level design , documentação necessária e todos os demais elementos da gameplay são abordados durante o livro. padrão é possível, por exemplo, que uma música seja utilizada como som diegético, ao ser tocada no ambiente do próprio personagem. A escolha de uma música de fundo normalmente está relacionada com o level criado, podendo sofrer modi�cações de acordo com o momento da jogabilidade: aviso, situação de combate, exploração, vitória, etc. Para estimular o jogador a continuar, é importante que a música seja mais dinâmica do que a ação que ocorre na tela. Isso não signi�ca que não deva existir silêncio na trilha, mas que esse deve ser explorado no momento certo, como para causar uma apreensão por exemplo. As decisões estéticas relacionadas com a musicalidade do jogo costumam ser atribuídas a um diretor musical, que poderá escolher entre a produção de músicas originais ou licenciar alguma preexistente. Os efeitos ambientais e sonoros são classi�cados ainda em on e o� screen, quando sua fonte é identi�cada na tela ou não, respectivamente. É importante ressaltar que em um game há elementos que são visíveis no jogo mas não produzem sons, assim como podem haver sons de fontes que não estão visíveis. Isso varia muito nos games, já que apresentam um ambiente de navegação não-linear, modi�cando o que aparece na tela de acordo com a movimentação do jogador. Por isso os sons são disparados em determinadas áreas ou situações do jogo, ao invés de serem disparados após passado algum tempo de jogo, como em um �lme linear, por exemplo. Os sons de ambientação podem estar o� screen, já que tem como objetivo situaro jogador naquele universo. Já os efeitos sonoros estão ligados à narrativa, aos objetos, pessoas e coisas. Os efeitos sonoros podem incluir som diegéticos como o ataque de um personagem, como também não diegéticos, como a coleta de pontos. Eles ainda podem indicar as conquistas e derrotas do personagem, as interações do jogador, dentre tantos outros estados possíveis da jogabilidade. Em um projeto de jogo podemos utilizar sons oriundos de bibliotecas pagas, como também de repositórios livre na internet. Em um projeto maior é comum a participação de um designer de sons, pro�ssional responsável por criar novos efeitos sonoros. 1.2 Programando sons na Unity A partir das informações sobre a inserção de sons em um game, planeje como você poderá sonorizar o projeto de jogo de plataforma iniciado na unidade anterior. Neste tópico, será abordada a programação necessária para executar um som relacionado a um evento do jogo, como a coleta de um item, e uma trilha musical em looping, isto é, que se repete após ser concluída. Com as orientações apresentadas nesta aula você estará apto a adicionar diferentes sons em todo seu projeto, trilhando o caminho para a criação de um game autoral. Assim como �zemos para inserir grá�cos no jogo, foi escolhido o site Open Game Art (disponível em https://opengameart.org /) como fonte de materiais livres de direitos autorais padrão, isto é, com diferentes licenças de utilização, incluindo até mesmo a possibilidade de reaproveitamento de sons para �nalidade comercial. Na game engine Unity é possível importar diversos tipos de arquivos de áudio, incluindo os mais populares: .mp3, .wav, .ogg, .aif, dentre outros. Faça download de ao menos uma música e um efeito sonoro para inserção no seu jogo. Após baixar os arquivos, abra o projeto de jogo de plataforma na Unity e insira os arquivos de áudio em uma pasta especí�ca, para melhor organização. Primeiro vamos adicionar a música de fundo, já que para isso não há necessidade de inserir programação em script. Arraste seu asset , correspondente a trilha musical, para o painel Hierarchy. Na janela Inspector , observe que um dos componentes desse Game Object criado é o Audio Source. No campo AudioClip desse componente, automaticamente foi associado o arquivo de música que originou a criação do objeto. Isso acontece devido ao asset já se tratar de um arquivo de som. Para associarmos um som a qualquer Game object que não seja o próprio som, devemos adicionar o componente Audio Source no painel Inspector . Faremos esse exercício mais adiante ainda neste tópico. Ainda na janela Inspector do objeto da sua trilha musical, marque a opção Play on Awake, para que o som seja executado no momento que o objeto for criado na cena. Nesse caso, o objeto é criado logo que a cena é iniciada, já que está presente em sua hierarquia. Marque também a opção Loop, para que a música seja repetida logo após ser concluída. Pronto, seu jogo já toca uma música de fundo. 1.2.1 Efeitos sonoros: input do jogador Agora vamos adicionar um efeito sonoro que será associado a uma interação do jogador. Para este exercício incluiremos um som para o pulo do personagem, logo após a tecla de espaço ter sido pressionada. Antes de incluir o código no script Jogador, adicione o componente Audio Source ao seu objeto Jogador na cena. Para associar o asset correspondente, arraste o efeito sonoro escolhido para o campo AudioClip do componente Audio Source . Abra o script Jogador e logo antes do método Start , após as variáveis já criadas, declare esta nova variável: public AudioSource somPulo; https://opengameart.org/ A expressão indica que a variável nomeada de somPulo recebe um objeto da classe AudioSource . Dessa maneira, podemos utilizá-la como um atributo de Jogador para acessar os métodos da classe AudioSource , como Play (tocar), por exemplo. Esse método deverá ser chamado dentro da condicional que veri�ca o momento que a tecla de espaço é pressionada. A expressão que vamos adicionar é a seguinte: somPulo.Play(); Sendo somPulo a variável criada do tipo AudioSource e Play seu método invocado. O código �nal do método puloJogador, criado na unidade anterior, deverá ter �cado dessa maneira: Agora seu personagem emitirá o som escolhido no momento do seu pulo. Para o último exercício de inserção de sons, vamos adicionar elementos coletáveis que irão emitir um som ao serem coletados e desaparecer logo depois. 1.2.2 Efeitos sonoros: interação entre objetos Caso ainda não tenha feito, insira ao menos um novo objeto em seu game que possa ser coletado pelo personagem. No pacote de grá�cos utilizado na unidade anterior, por exemplo, há uma pasta chamada Items, com diversas opções. Caso você queira espalhar várias unidades de um mesmo item, considere a possibilidade de criar um prefab, facilitando assim a edição em massa. Dessa vez o script criado servirá para executar sons de maneira independente a seus objetos. Isso será feito para garantir que o efeito sonoro de um item sendo coletado seja tocado até o �m, independentemente do item já ter desaparecido da tela. Para a colisão com o personagem e sua destruição logo após esse evento, utilizaremos o método Destroy(this.gameObject). Para que a colisão seja identi�cada, não esqueça de adicionar um componente Collider em seu item. Agora crie um prefab do efeito sonoro escolhido. Lembre-se que para isso você deverá arrastá-lo para a janela Hierarchy e logo depois, dessa janela para uma pasta do painel Project. O prefab pode ser arrastado para qualquer pasta, mas é recomendado manter a organização do projeto. Caso ainda não tenha, você pode adicionar uma pasta chamada Prefabs, por exemplo. Antes de programar o script do item em si, vamos criar um gerenciador do jogo, para tocar o som de maneira independente ao objeto item. Crie um script chamado GameManager e o associe a um GameObject vazio. dentro desse script vamos programar a criação de um objeto do tipo prefab do som escolhido, dentro de um novo método. Será criada uma variável do tipo GameObject, já que trata-se de um prefab, não mais de um AudioSource. O código do GameManager para essa inserção de som deverá ser o seguinte: Antes do método Start, você pode ver a declaração da variável prefabItem. Ela é utilizada dentro do método criado, o somItem. Localizado logo abaixo do método Update, o somItem cria uma instância do prefabItem na mesma posição que for chamado, nesse caso ele será invocado por um script próprio do objeto Item. Selecione o Game Object vazio, que foi associado ao script GameManager e no campo Prefab Item, relacionado à variável criada, insira o prefab do áudio, diretamente dos assets no painel Project. Agora precisamos invocar o método somItem, a partir do seu objeto escolhido como item. Crie um script para esse objeto e não esqueça de associá-lo como um de seus componentes. No painel Inspector do seu item, marque a opção Is Trigger, para que seu Collider funcione como disparador de um evento, não como uma barreira física para nosso Jogador. No script do item adicione o seguinte método, dentro das chaves da classe mas abaixo e fora do método Update: Dessa maneira, utilizamos expressões já conhecidas para assim que os objetos colidirem, no caso Item com Jogador, um som ser tocado e o objeto ser destruído. Observe que o método somItem é invocado a partir do script GameManager, assim garantimos que o som tocará até o �nal, pois não é um atributo do objeto Item, mas sim outro objeto instanciado na cena. Logo após a invocação do método, o objeto Item é destruído. Apesar de terem sido incluídos apenas três sons durante esta aula, com os métodos abordados você poderá adicionar sons a partir de diferentes interações do game. 2. Inteligência artificial Inteligência arti�cial (IA) é o ramo de pesquisa que desenvolve soluções que simulam a inteligência humana. Por meio de dispositivos tecnológicos que envolvem hardware e software, a IA em games está presente mesmo nas formas maissimpli�cadas. Qualquer personagem não jogável, também chamado pelo acrônimo NPC (do inglês, non-player character), pode apresentar movimentação própria e reagir ao ambiente de determinada maneira. Para que isso seja possível, é necessário inserir alguma programação de IA nesse personagem. Observe que não consideramos aqui questões especí�cas como o que é inteligência, ou qual grau de inteligência está envolvido. De maneira geral, a IA está presente nos jogos digitais por meio de três categorias: modelagem de personagens (NPCs); geração de conteúdo procedural (PCG); e jogando o jogo (game playing). A programação de NPCs é a categoria mais presente nos jogos, sendo possível ser adicionada com pouca experiência em uma linguagem de programação. Já a geração de conteúdo procedural, do inglês procedural content generation (PCG), requer maior conhecimento de programação para ser feita. Ela é utilizada para criar automaticamente e aleatoriamente levels, inimigos, itens coletáveis, dentre outros objetos presentes no game. Essa geração de conteúdo ocorre em tempo real, durante a jogabilidade, portanto, se difere da exibição de conteúdo randômico, que apenas é sorteado quando e onde será exibido, dentro de um número limitado de possibilidades. A última categoria, a game playing, envolve conhecimento avançado de programação, já que está mais próxima do comportamento humano. Nessa categoria estão as experiências com IA que são capazes de jogar os jogos, muitas vezes aprendendo a cada nova execução. Para os estudos desta disciplina, nos limitaremos a programar as formas simples de inteligência arti�cal: os NPCs. 2.1 Inimigos Vamos programar uma movimentação de NPC que pode ser aproveitada em diversas áreas de um jogo. Adicione um novo objeto para ser o inimigo. Não esqueça de adicionar um Collider e um componente RigidBody 2D. Crie um novo script para ele e associe ao Game Object criado. Para veri�car a direção que o personagem se movimenta e então indicar sua mudança, insira dois Game Objects vazios. Eles servirão apenas como identi�cadores de colisão, assim como o objeto que inserimos para veri�car se o Jogador encosta no chão. Adicione um collider em cada um deles. Posicione-os nos locais correspondentes aos limites de movimentação de seu inimigo, como por exemplo, um à sua esquerda e outra à sua direita. Dessa maneira, faremos com que nosso objeto mude de direção no momento que tocar em um de seus limitadores. Figura 1- Limitadores de movimento do inimigo. Foi adicionado um ícone visível somente no painel Scene, para exempli�cação. Fonte: a autora, 2020. Selecione a opção Is Trigger em ambos os objetos vazios que foram criados. Ainda no painel Inspector, adicione também uma Tag chamada Sentido para ambos os Game Objects. No script do inimigo, vamos criar variáveis para sua velocidade, sua direção e a opção de inverter seu sprite. Figura 2 - Script do inimigo. Fonte: a autora, 2020. Observe que na linha 20 o método movimentaInimigo é invocado dentro do Update. Esse método, entre as linhas 22 e 34, é responsável por: movimentar o inimigo para direita ou para a esquerda e inverter seu sprite quando necessário. A variável do tipo booleana, que indica verdadeiro ou falso, foi chamada de direita. Nesse caso, se ela for verdadeira, o inimigo deverá se movimentar para a direita. Como o sprite utilizado é virado para a esquerda por padrão, ele será invertido caso a variável direita seja verdadeira. O que determina o valor dessa variável é o método entre as linhas 36 e 42. Já utilizado anteriormente durante esta disciplina, ele veri�ca se a colisão ocorreu entre um objeto com uma determinada Tag, nesse caso a Tag Sentido. Caso essa condição seja verdadeira, ele irá alterar o valor da variável direita. Observe que na linha 40 temos uma notação que ainda não utilizamos: ! direita O ponto de exclamação, antes do nome da variável, indica que seu valor será sempre o oposto do atual. Portanto, caso a variável seja true, ao encostar se tornará false, e vice versa. Para que o inimigo seja derrotado, vamos adicionar ao Jogador a capacidade de pular em cima dele. Crie novamente um Game Object vazio, mas agora como �lho do Jogador, dentro do painel Hierarchy. Adicione a ele um Circle Collider 2D com um pequeno raio, como 0.1. Crie uma Tag chamada Arma, por exemplo. Dessa maneira, toda vez que um objeto utilizar essa Tag o inimigo será derrotado. Adicione uma nova condicional dentro do método OnTriggerEnter2D, no script do inimigo: Para testar essa nova habilidade, você pode modi�car as con�gurações de pulo do Jogador na variável Pulo e na opção Gravity Scale do componente Rigidbody 2D. Teste, por exemplo, com os valores 10 e 2, respectivamente. 3. HUD - Heads-up display A interface do usuário (User Interface - UI) em um game se refere a toda mediação existente entre o jogador e o próprio jogo. Formada por hardware, tanto aquele responsável pelo processamento quanto seus periféricos, e software, a interface do usuário (UI) é composta também pela GUI (Graphical User Interface), a interface grá�ca do usuário. A GUI é especi�camente a parte da interface que comunica com o jogador por meio de elementos grá�cos. A tela de início, pausa, game over, créditos, dentre outras, fazem parte da interface grá�ca do jogo. Já as informações que são dispostas durante a jogabilidade compõem o HUD (Heads-up display). Também formado por elementos grá�cos com a �nalidade de comunicar ao jogador, o HUD, sendo parte da GUI, é assim chamado pela sua semelhança com as telas de navegação de aeronaves, nas quais as informações aparecem �xas na tela, enquanto o mapa se modi�ca de acordo com sua movimentação. Em um game, o HUD pode �xar na tela do jogador informações úteis enquanto ele navega pelo espaço. Ainda que ele possa ocultar parte ou todas as informações, ela é atualizada em tempo real e permite a visualização do jogo. O HUD pode apresentar informações mais ou menos cruciais para a jogabilidade, podendo oferecer ao jogador a possibilidade de ocultá-las, liberando assim o espaço da tela. Portanto, para que o HUD não acabe obstruindo a jogabilidade, é importante que seus elementos façam parte da composição da tela do jogo, ou �quem visíveis somente quando necessário. Para o caso de um menu, é recomendado oferecer opções para facilitar o acesso do jogador, fazendo com que a escolha de opções seja feita da maneira mais rápida possível. Isso se deve ao fato do jogador precisar focar seu tempo na jogabilidade em si, não na procura de opções de menu. A facilidade de navegação no HUD está associada à utilização de elementos reconhecíveis no universo dos games, como por exemplo, ícone de coração para indicar vida, de caveira para indicar perigo ou ainda de moeda para indicar recompensa. Claro que assim como vimos sobre a inserção de sons, a escolha de grá�cos para um jogo está relacionada a toda a jogabilidade proposta, podendo ser apreendida pelo jogador. A localização dos ícones na tela também podem ajudar o jogador a entender o HUD, como por exemplo, o padrão de exibir a quantidade de vidas restantes no canto superior esquerdo da tela. O conhecimento desses padrões pode ser adquirido por meio de estudos em game design e com a observação de diferentes HUDs. Não somente a localização dos ícones, mas seu tamanho, alinhamento, contraste e legibilidade das fontes, devem ser estudados para a criação de HUDs que comuniquem com o jogador da melhor maneira possível em seu jogo. Agora que você tem mais informações sobre a interface do usuário em um jogo, pense em como e quais elementos poderão ser exibidos em seu projeto. Considere dispor na tela informação contextual de uma área especí�ca do jogo, como por exemplo, um ícone que só aparece quando o personagem se aproxima de algo. Pense também na inserção de ícones fundamentais para esse jogo de plataforma, como a contagem de vidas e de pontuação. No HUD ainda podem ser adicionadas informações sobre a coletade determinados itens, o carregamento de um poder especial, a escolha de armas e munição, dentre tantas outras possibilidades nos games. Você quer ver O BIG Festival ( Brazil's Independent Games Festival) é um importante festival de jogos independentes. Com grande destaque em toda a América Latina, o BIG Festival atua como 3.1 Programação da HUD Para exempli�car a criação da HUD retomaremos uma construção feita na unidade 2 desta disciplina. Durante a criação do jogo Breakout , exibimos a pontuação do jogador e a quantidade de tentativas. Desta vez, utilizaremos uma variável para contar as vidas perdidas e assim indicar o game over. Primeiro vamos inserir a programação já conhecida, aquela da soma de pontos. Clique no menu GameObject > UI > Text . Altere as propriedades do seu texto na janela Inspector . Lembre-se que as dimensões do Canvas são diferentes das da sua cena. Para visualizar o posicionamento dos elementos da HUD, utilize o painel Game . Para a programação da HUD utilizaremos o script GameManager. Para trabalhar com classes e métodos relacionados ao Canvas, associe o script com a área da Unity que trabalha com a interface do usuário, inserindo no topo do código, logo abaixo de UnityEngine, a expressão: using UnityEngine.UI; Agora que podemos modi�car o objeto texto, você precisará criar duas variáveis: uma que contará os pontos e outra que exibirá a informação textual no HUD. Assim como na HUD do jogo Breakout , nesse projeto a variável Placar, que é da classe Text , exibirá a contagem somada pela variável pontos. Segue a estrutura da declaração das variáveis e do novo método: um ponto de encontro entre desenvolvedores, produtores, �nanciadores e jogadores. No site o�cial, você pode conferir a programação dos eventos, além da gameplay de cada um dos games indicados e premiados nas diversas categorias do festival. Disponível em: < www.bigfestival.com.br >. http://www.bigfestival.com.br/ O método Pontua, somará um valor ao placar cada vez que for executado, exibindo na sequência seu resultado no Placar. Esse método deverá ser invocado nos momentos de pontuação do seu jogo. Nesse exemplo, ele foi incluído no script Inimigo, dentro da colisão entre o Inimigo e a arma do Jogador, através da expressão: FindObjectOfType<gamemanager>().Pontua();</gamemanager> Segue o código atualizado da colisão entre os dois objetos: O mesmo método também foi invocado no momento da colisão dos itens com o Jogador, dentro do script Item : Para exibir a informação sobre as vidas disponíveis, utilizaremos outro tipo de elemento. Clique no menu GameObject > UI > Image . Selecione esse novo Game Object no painel de hierarquia. Na janela Inspector , adicione um asset do tipo sprite no campo Image. No exemplo da �gura 3, foi adicionado o ícone do coração, correspondente a quantidade de vidas disponíveis. Ajuste as dimensões de seu ícone na tela, sempre veri�cando seu posicionamento �nal no painel Game . No painel de hierarquia, clique com o botão direito do mouse sobre o Game Object Image e clique em Duplicate. Dessa maneira, você criará um cópia já com as dimensões atualizadas de seu ícone. Repita esse processo quantas vezes forem necessárias, adicionando a quantidade de vidas disponíveis em seu jogo. Posicione cada um dos novos elementos, utilizando a Move Tool. Figura 3 - HUD informando a quantidade de vidas disponíveis e a pontuação do jogador. Fonte: a autora, 2020. Abra o script GameManager para iniciarmos a programação da contagem de vidas. Logo abaixo da declaração das demais variáveis do código, insira: public int contagemVidas; public Image[] imagemVidas; A primeira variável será utilizada para subtrair a quantidade de vidas disponíveis. A segunda variável é da classe Image e é do tipo array, isto é, um conjunto de dados, ao invés de somente um valor. Nesse caso, nosso conjunto de dados é a quantidade de ícones de coração. Retorne para a interface da Unity e dê o valor correspondente para primeira variável, disponível no painel Inspector do Game Object associado ao script GameManager. Em nosso exemplo, foi inserido o número 3, indicando que o jogo iniciará com 3 vidas. Ainda no painel Inspector, con�gure a variável imagemVidas, indicando seu comprimento (Size), também para 3. De�na seus elementos (Element 0, 1 e 2) arrastando cada um dos ícones correspondentes, a partir do painel Hierarchy. Em um array, a contagem dos seus elementos inicia no 0, por esse motivo nossos 3 ícones são associados dessa maneira. Retorne para o script GameManager e adicione um novo método: Figura 4: Trecho do script GameManager contendo o método que calcula e exibe as vidas disponíveis. Fonte: a autora, 2020. Nesse novo método foi utilizado o laço for, responsável por condições que acontecem repetidas vezes, cada vez com uma iteração diferente. Um iterador permite que a lista do array seja percorrida e veri�cada a cada execução do laço. Dentro dos parênteses do laço for, temos 3 argumentos. O primeiro (int i = 0;), indica que o iterador é uma variável, do tipo número inteiro, e que seu valor inicial é 0. O segundo argumento (i < imagemVidas.Length;), indica a condição que determinará se o laço será ou não executado. Nesse caso, o laço só será executado se o valor do iterador for menor do que o comprimento do array imagemVidas, que nesse caso é 3 (elementos 0, 1 e 2). O terceiro argumento (i++), acrescenta um ao valor do iterador após cada execução do laço. Isso signi�ca que após a primeira execução, o iterador será 1, assim sucessivamente até chegar ao número 3. Quando o iterador tiver esse valor, a condição do laço não será mais verdadeira, impedindo sua execução. Dentro do laço for, temos a condicional que veri�ca se o valor do iterador é menor do que a variável contagemVidas. Essa variável é alterada na linha 39 da �gura 4, e será executada a cada invocação do método Vidas. Podemos invocar o método Vidas por meio da expressão: FindObjectOfType <gamemanager>().Vidas();</gamemanager> Ele poderá ser invocado dentro de um método de colisão entre o Jogador e o Inimigo, por exemplo, ou onde mais o personagem perder vidas. Caso o valor do iterador seja menor que a variável contagemVidas, a visibilidade da variável imagemVidas (que é o array dos ícones) será habilitada, e terá o mesmo comprimento indicado pelo iterador. Dessa maneira, se o iterador for 0, 1 ou 2, o laço será executado. Caso o jogador tenha 1, 2 ou 3 vidas, os ícones de coração correspondentes serão exibidos na tela. 3.2 Programação da GUI Para que o jogo possa ser jogado novamente, vamos adicionar uma tela de game over com um botão de reinício do jogo. Clique no menu Assets > Create > Scene e renomeie para GameOver. Não esqueça de manter organizadas as pastas do painel Project. Nessa nova cena, insira um novo GameObject > UI > Button. Como um elemento da HUD, ele será adicionado junto a um Canvas. Você poderá adicionar outros elementos para compor sua cena, como um texto Game Over ou um background. Aproveite também para editar as propriedades desses elementos no painel Inspector, alterando suas dimensões, cores e posicionamento na tela. Para inserirmos a programação do botão crie um novo GameObject vazio. Crie um script chamado Menu e associe a esse novo objeto. Dessa maneira, caso você tenha mais botões poderá inserir todas as ações nesse mesmo script. Dentro do script Menu, indique que trabalharemos com gerenciamento de cenas nesse código. Para isso, insira antes da classe Button a expressão: using UnityEngine.SceneManagement; Assim como foi feito no projeto Breakout , adicionaremos o carregamento de uma nova cena a partir do método LoadScene . Para isso, crie um novo método chamado Reinicia: Com o método programado, precisamos associá-lo ao clique do botão. No painel Inspector do objeto Button, encontre o componente Button. No campo On Click, clique em + para adicionar um novo método. Arraste o Game Object vazio que contém o script Menu no campo None (Object).Clique no campo No Function > Menu para associar o método Reinicia que foi criado. A partir de agora seu botão invocará o método Reinicia quando for clicado. Vamos adicionar o mesmo método LoadScene para carregar a cena Game Over, isso quando o jogador perder a última vida. No script GameManager, na linha 40 da �gura 4, adicione: Para que nosso Jogador de fato perca uma vida ao encostar no inimigo, adicione uma Tag Inimigo nesse objeto. Agora insira o seguinte código no script do Jogador: Pronto, agora o método Vidas será invocado cada vez que nosso personagem encostar no inimigo. Ele também será colocado de volta à sua posição inicial no jogo, nesse caso, -5 no eixo x e -3 em y. 4. Planejamento de um jogo autoral Durante esta disciplina, você praticou a programação para jogos 2D através de pequenos exercícios na Unity. Executados em menor escala, tais exercícios não formaram um jogo completo de plataforma, porém, você poderá aplicar cada ponto que foi aqui abordado na criação de um novo jogo. Com o conhecimento de adicionar novas cenas e transitar entre elas, é possível criar várias fases para um jogo, adicionando diversos inimigos. Os pontos abordados na criação do HUD poderão ser aproveitados para criar uma tela de menu com mais opções, ou ainda mais elementos grá�cos transmitindo informações para o jogador. A criação de métodos e a declaração de variáveis, por exemplo, podem ser aplicadas para as mais diversas interações entre objetos. Assim como a veri�cação de colisões, que durante as aulas foi utilizada para: derrotar o inimigo, identi�car se o jogador está no chão, coletar itens, modi�car a direção do inimigo, pontuar e perder vidas. Antes de estruturar os códigos que deverão ser inseridos nos scripts de um jogo autoral, ou até mesmo antes de pesquisar grá�cos e sons para inserir em um jogo, é preciso saber o que será utilizado e como cada elemento contribuirá com a gameplay. Esse planejamento no design de jogos é estruturado em um documento chamado de Game Design Document, mais conhecido pela sigla GDD. 4.1 GDD - Game Design Document O GDD apresenta todas as informações do jogo, do conceito às especi�cações técnicas, é criado antes do desenvolvimento de qualquer jogo. Esse documento é utilizado como referência durante toda a produção do jogo. A organização de seus tópicos pode variar, mas é fundamental que apresente os seguintes tópicos: • Apresentação geral: título, contato do desenvolvedor, conceito, público alvo, resumo; • Gameplay : objetivos, desa�o e �uxo do jogo; • Mecânica: movimentações, ações e física; • História e narrativa: história central do jogo, desenvolvimento dos personagens e descrição do universo proposto; • Levels : mapas, descrição da física envolvida e objetivos especí�cos; • Interface: parte grá�ca, sonora e os controles de interação; • Inteligência arti�cial: NPCs inimigos ou não, detecção de colisões; • Especi�cações técnicas: engine, hardware e softwares envolvidos; • Arte do jogo: arte conceitual, descrição dos personagens e ambientações; • Gerenciamento do projeto de jogo: cronograma de desenvolvimento, orçamento e etapa de testes; • Concorrência: análise de mercado para lançamento do jogo. Ao preencher o GDD de seu projeto, você poderá se organizar melhor para o desenvolvimento e até mesmo se inspirar durante a criação, já que será levado a re�etir sobre cada etapa do jogo. 4.2 Fechando o jogo Após o desenvolvimento do jogo, é necessário criar uma versão executável, a build . Apesar de ser possível jogar uma prévia do game na própria engine, somente com a build que teremos certeza de que todas as funcionalidades do game estão ou não, de acordo com o planejado. Por esse motivo, vimos no capítulo sobre os testes que estes são realizados com a veri�cação de builds, ao longo de todo o desenvolvimento do jogo. Para fechar o jogo na Unity , é necessário ter instalado um módulo correspondente a plataforma desejada. No Unity Hub , clique em Installs > menu da versão utilizada > Add Modules. Você poderá escolher dentre as diversas plataformas sejam de consoles ou sistemas operacionais de desktops e dispositivos móveis. Escolha o sistema operacional de seu computador para poder testar o jogo facilmente. Na Unity, clique em File > Build Settings > Add Open Scenes. Após adicionar as cenas que serão fechadas na build , clique na plataforma desejada e em Switch Platform > Build And Run . Parabéns! Você concluiu seu projeto e executou sua primeira build ! Continue desenvolvendo novos jogos com base no que pôde aprender durante esta disciplina. Você quer ler Podemos encontrar diversos modelos de GDD na internet. O Template General Game Design Document , compartilhado pelo desenvolvedor Alex Pizzini e disponível para qualquer pessoa localizar e acessar, é um modelo completo, com todos os tópicos a serem preenchidos pela equipe envolvida em um projeto de jogo. Disponível em: < https://docs.google.com/document/d/1K8JKFPtEA08EutfHK3U_3wDDn2SWvJdpue0rmjiX4a0/edit > Para traduzir o documento, faça download e utilize a opção de tradução de documentos do Google Tradutor. Disponível em: < https://translate.google.com.br/?hl=pt- BR#view=home&op=docs&sl=en&tl=pt > https://docs.google.com/document/d/1K8JKFPtEA08EutfHK3U_3wDDn2SWvJdpue0rmjiX4a0/edit https://translate.google.com.br/?hl=pt-BR#view=home&op=docs&sl=en&tl=pt Síntese A programação para jogos 2D envolve diferentes áreas do conhecimento em design de games. Ainda que o foco seja a criação de scripts, é importante conhecer as possibilidades de se trabalhar com elementos grá�cos, sons, interface do usuário e até mesmo produção de um documento de game design, o GDD. Ao identi�car as possibilidades de criação em jogos 2D, o programador pode contribuir mais ativamente em uma equipe de desenvolvedores. A Unity, como é comum em uma game engine, facilita o próprio processo de codi�cação, já que oferece classes prontas, com a física embutida e outros recursos úteis ao desenvolvimento de games. Durante os estudos para esta disciplina, você foi introduzido à Programação Orientada a Objetos, desde seus conceitos à aplicação em projetos de jogos. A game engine escolhida, a Unity, proporcionou exercitar a codi�cação em C#, ao mesmo tempo em que permitiu a montagem dos demais elementos necessários na criação de jogos, como a inserção de grá�cos e sons. Por meio dos projetos de jogos desenvolvidos, foram exempli�cadas diversas etapas da criação de jogos 2D. Já que a movimentação de personagens, adição de física, montagem de level e veri�cação de bugs, por exemplo, são fundamentais nesse processo. Nesta unidade, completamos seus estudos em programação de jogos 2D com a abordagem dos seguintes tópicos: • Inserção de sons; • inteligência arti�cial; • interface do usuário; • Documento de Game Design; • Fechamento do jogo. Download do PDF da unidade Bibliografia PEREIRA, Venita. Learning Unity 2D Game Development by Example. UK: Packt Publishing, 2014. ROGERS, Scott. Level UP : um guia para o design de grandes jogos. São Paulo: Blucher, 2012. Disponível em Laureate Digital. SANTAELLA, Lucia; FEITOZA, Mirna. Org. Mapa do Jogo : A diversidade cultural dos games. São Paulo: Cengage Learning, 2009. https://docs.unity3d.com (Documentação da Unity) https://docs.unity3d.com/
Compartilhar