Baixe o app para aproveitar ainda mais
Prévia do material em texto
introdução Introdução Em um jogo, um bom ambiente 3D mantém um estilo visual consistente. Para isso, é possível utilizar uma variedade de superfícies: metal, madeira, borracha, plástico, vidro, artefatos luminosos e, assim, por diante. Para simular essas superfícies, o Unity utiliza, especi�camente, o Standard Shader , um conjunto de recursos para criar, manipular e renderizar objetos do mundo real com alta qualidade, como madeira, pedras, plástico, vidro, metal e papel. O recurso permite combinar vários tipos de texturas, sombreamento e iluminação em objetos. Nas próximas subseções, será descrito o GAME ENGINEGAME ENGINE CRIAÇÃO E MANIPULAÇÃO DECRIAÇÃO E MANIPULAÇÃO DE SISTEMAS NO SISTEMAS NO UNITY3DUNITY3D Autor: Me. George Santiago Alves Revisor : I van Dimitry R Zyr ianof f IN IC IAR conceito e o funcionamento da renderização no Unity . Diante disso, estudaremos o relacionamento entre Materials , Shaders e Textures . Além do mais, discutiremos o funcionamento do sistema de partículas no Unity , navegação, criação de níveis e terrenos. Antes de tudo, o que é renderização? De maneira simpli�cada, a renderização tridimensional é o processo de gerar uma imagem baseada em dados armazenados em um sistema. Por meio da computação grá�ca, a renderização transforma dados tridimensionais em imagens bidimensionais, com efeitos 3D. Para isso, usa-se programas de computador para manipular, editar e criar modelos com três dimensões. Na realidade, o objeto �nal produzido pelo processo de renderização não possui três dimensões. Durante o processo de construção de modelos 3D, o usuário manipula as três dimensões para criar estruturas especí�cas, como uma cadeira, uma espada, uma personagem, dentre outros. Isso signi�ca que o objeto �nal de um modelo 3D é, na verdade, uma imagem bidimensional, que foi desenvolvida por um processo de renderização, com base em um modelo tridimensional. Simpli�cando, é um processo pelo qual são utilizados programas de computador para converter modelos 3D (respectivamente, suas texturas, cores, iluminação, posição, dentre outros) em informações combinadas sobre o valor de cada pixel em uma imagem bidimensional. Assim, com a visualização daquele jogo em alta de�nição, com paisagens deslumbrantes e efeitos especiais de última geração, ao �nal, ainda teremos uma sequência de imagens bidimensionais. Materiais e EfeitosMateriais e Efeitos Discutimos o conceito básico de renderização. Agora, iremos examinar alguns conceitos sobre Materials, Shaders e Textures . Vamos lá? Os materiais de�nem as propriedades da superfície de um objeto informando como esta deve ser renderizada. Para isso, a engine usa, como referência, as texturas que o objeto utiliza. As texturas são, basicamente, uma imagem formada por pixels ou bitmap . Para formar essa imagem, a engine utiliza as propriedades do material como referência, para que o shader possa usá-las para calcular as informações da superfície de um objeto, por exemplo, a sua cor, re�etividade e rugosidade. Um pouco confuso? Em outras palavras, uma textura é uma imagem bidimensional que contém informações sobre os pixels. Isso permite que você possa identi�cá-la e distingui-la de outras texturas. Já o material contém informações para mapear e converter uma textura bidimensional em um modelo tridimensional, ou seja, um material pode ter várias texturas, pois, no Unity , é possível aplicar texturas de maneiras diferentes. Ademais, é possível criar aparências realistas ou surreais em um objeto, por exemplo, artefatos brilhantes, foscos, transparentes, luminosos, salientes, dentre outros. Portanto, em um jogo 3D, você precisa criar a forma geométrica de um objeto, comumente, utilizando um software de modelagem 3D. Após criá-lo ou utilizar um ativo pronto, é preciso de�nir as con�gurações desejadas do material, como o sombreamento e as texturas que vão de�nir a estética da superfície do objeto. Por �m, aplicamos o material ao componente de renderização do objeto. Um shader é um script contendo diversos cálculos matemáticos, para criar a visualização da superfície de um objeto. Em modelos 3D, por padrão, o shader do Unity realiza cálculo de iluminação e sombreamento. Mas, por suas propriedades, é possível de�nir cores, texturas, modos de renderização, dentre outros. O saiba mais Saiba mais Os atuais processadores x86-64 suportam os cálculos necessários para processar, conectar e criar uma imagem �nal de um objeto tridimensional. Isso signi�ca que qualquer CPU moderna de um computador pode calcular e visualizar imagens em alta qualidade. Existem, ainda, partes dedicadas de sua arquitetura para esse tipo de processamento. No entanto, o processo de renderização envolve diversos cálculos matemáticos, o que exige uma quantidade considerável de processamento paralelo. Diante disso, foram criados componentes dedicados para esse tipo de trabalho, os chamados GPUs ou unidades de processamento grá�co. Para demonstrar isso, o Unity desenvolveu um curta-metragem, renderizado em tempo real, para apresentar o poder da engine . O curta é executado em Quad HD (1440p), utilizando uma GTX980 GeForce. Saiba mais sobre a demonstração do Unity Adam no link a seguir. ACESSAR https://unity3d.com/pages/adam diagrama a seguir (Figura 3.1) demonstra o relacionamento entre as três entidades discutidas. Cada uma desempenha um papel no �uxo de trabalho de renderização. Os modelos 3D são, em sua essência, um conjunto de coordenadas tridimensionais chamadas vértices. Os vértices são conectados para formar triângulos. Cada conexão pode conter informações, como a posição, direção e coordenadas, para mapear texturas nos vértices. Para um modelo 3D ser renderizado, é necessário um material. Os materiais são revestimentos que contém um shader e valores para suas propriedades. Diferentes tipos de materiais podem compartilhar o mesmo shader , porém com valores diferentes. A engine suporta, atualmente, dois tipos diferentes de shaders : de superfície e de vértice. O shader de superfície é utilizado para simular superfícies afetadas pela luz, enquanto que o shader de vértice renderiza imagens sem considerar o comportamento da luz. Para um melhor entendimento sobre os conceitos abordados, criaremos e usaremos um novo material dentro da engine . Para criar um novo material, com o Unity aberto, acesse o menu superior > Assets > Create > Material . Após adicionar, é possível de�nir o nome para o material criado, mas, por enquanto, vamos deixar com o nome padrão ( New Material ). Após a criação do material, é possível aplicá-lo a um objeto em cena, facilitando a visualização dos ajustes de suas propriedades. Para esse �m, crie um novo objeto ( Sphere ). Agora, arraste o material para o Mesh renderer do GameObject criado (Figura 3.2). Por padrão, um novo material recebe um shader com propriedades vazias ( Standard ). Após criar o material e anexá-lo a um objeto, vamos de�nir o shader a este. Para isso, basta selecionar o material criado e, no inspector, expandir a opção shader . Observe que existe um menu suspenso, contendo vários tipos distintos de shaders . Cada um desses determinará as propriedades Figura 3.1 - Fluxo de trabalho de renderização do Unity Fonte: Elaborada pelo autor. Figura 3.2 - New Material Fonte: Elaborada pelo autor. disponíveis para alterações. As alterações podem ser visualizadas em tempo real no objeto que o material foi aplicado. Os principais tipos de shaders no Unity são: mobile : otimizados para dispositivos móveis, por exemplo, tablets e smartphones; nature : para árvores e terrenos; UI : para a criação de objetos grá�cos da interface do usuário; particles : para trabalhar com sistemas de partículas; skybox : efeitos para renderizar planos de fundo. Ambientes por trás de toda a geometria do objeto; unlit : usado para ignorar luz e sombra; FX : usado para efeitos de iluminação; sprites : usado em sistemas de sprites 2D. Observe que o 3D object criado anteriormente( Sphere ) é da cor branca. Por padrão, todos os objetos criados recebem o material da cor branca. Mesmo após adicionarmos um material ao nosso objeto, nenhuma mudança visual é notada. Por quê? Para responder a esta pergunta, precisaremos entender as propriedades do shader (Figura 3.3). A primeira propriedade é um menu suspenso, com modos de renderização ( Rendering Modes ). O shader padrão ( standard ) vem com quatro modos distintos de renderização: opaque : de�ne a opacidade de um objeto, ou seja, sem qualquer claridade. É o valor padrão para renderizar objetos sólidos, sem qualquer transparência; cutout : permite de�nir valores para renderizar objetos com partes transparentes ou totalmente opacas. As áreas de�nidas pelo shaders são 100% opacas. Por exemplo, materiais contendo furos ou áreas com aberturas; fade : nesse modo, é possível alterar os valores de transparência para esmaecer ou desbotar um objeto. Diferente do modo transparent , este altera os re�exos e a iluminação; transparent : utilizado para renderizar objetos transparentes, como plásticos ou vidro, automaticamente, serão atribuídos valores transparentes para o material. Entretanto, os re�exos e efeitos de iluminação permanecerão visíveis. Agora, altere os modos de renderização previamente apresentados. Você pode observar que as alterações na esfera (Figura 3.2) não são claramente visíveis. Apenas quando escolhemos Fade e Transparent podemos notar a opacidade do objeto. Isso ocorre porque o modo de renderização depende de outras con�gurações, como o parâmetro Albedo . O Albedo de�ne a cor e a transparência do material. É possível de�nir a cor de um material utilizando o seletor de cores que, por consequência, afetará todo o objeto, ou atribuir uma textura ao parâmetro Albedo . A textura Figura 3.3 - Propriedades do Shader Fonte: Elaborada pelo autor. de�nirá os valores de cor e transparência ao material. O próximo parâmetro do shader é o Metallic , a propriedade responsável por de�nir a quantidade de luz re�etida pelo material. Observe que é possível alterar o valor do parâmetro e, quanto mais próximo de 1 (valor máximo), mais o objeto re�etirá luz. Além disso, é possível atribuir uma textura ao parâmetro metallic . Fazendo isso, os controles deslizantes desaparecem. Antes de darmos prosseguimento aos próximos parâmetros, vamos testar o funcionamento daqueles anteriormente estudados. Para isso, vamos importar, da Asset store , o ativo Free sample materials e Star�eld Skybox . Após importar, atribuiremos materiais aos parâmetros Albedo e Metallic . Observe a Figura 3.4. Essa cena foi criada com os recursos do Unity e implementada com os ativos importados anteriormente. Em apenas poucos minutos, é possível criar ambientes com alta qualidade e validar protótipos na engine . Agora, como criamos uma cena assim? Primeiramente, precisamos entender o conceito de skybox , que é um tipo de shader , o qual pode ser aplicado à cena para mudar a atmosfera geral do jogo. O funcionamento é similar àqueles estudados anteriormente. É possível de�nir a opacidade, cor, transparência e modi�car valores para criar efeitos únicos. Para criar um novo skybox , é preciso criar um novo material. Após isso, de�nir o tipo de tipos de shader para skybox . Além disso, é possível importar shaders do tipo skybox da loja do Unity . Agora que importamos os ativos da loja do Unity , vamos modi�car o skybox . Para isso, acesse o menu da engine > window > rendering > lighting settings . A janela de con�gurações de iluminação será aberta. Na opção scene , selecione skybox (ativo importado da loja do Unity ). Mudamos a atmosfera do jogo e, agora, precisamos con�gurar a nosso objeto principal, que chamaremos de earth one (Figura 3.5). Figura 3.5 - Earth one Fonte: Elaborada pelo autor. Figura 3.4 - Recursos do Unity Fonte: Elaborada pelo autor. Lembra do material que criamos anteriormente e anexamos a uma esfera? É o mesmo material, apenas com os parâmetros modi�cados. Para os próximos conceitos abordados, utilize a Figura 3.6 como parâmetro para observar o comportamento das propriedades de um material. Acesse o material da esfera e, em Albedo , atribua o material wood_1_baseColor a este. Observe que a superfície da esfera mudou. No exemplo mostrado, foi utilizado um planeta com coloração azulada. Para isso, acesse o seletor de cores no Albedo . O valor hexadecimal da cor usada foi #0012FF. Tente testar outras cores e observe o resultado na cena. O próximo passo é atribuir o material snow_steel_metallic no parâmetro Metallic . O valor usado na propriedade smoothness foi de 0.46. Essa propriedade de�ne a suavidade do material. Apenas com essas con�gurações, foi possível criar um planeta simples. A engine permite modi�car parâmetros para criar experiências únicas. Criamos nosso planeta e, agora, precisamos criar as luas. Podemos criar um novo 3D object ( sphere ) ou selecionar a sphere ( earth one ) criada anteriormente e pressionar, simultaneamente, as teclas Ctrl+D. Esse atalho duplica os GameObjects selecionados. Para a nossa cena, criaremos duas luas, que chamaremos de MoonOne e MoonTwo . Selecione a primeira lua e modi�que a escala do objeto. Para isso, é possível editar as propriedades no Inspector ou usar a ferramenta Rect tool , localizada na barra de ferramentas da interface da engine . O usuário pode modi�car os valores para criar tamanhos diferentes no objeto. A escala (XYZ), utilizada para a primeira lua do exemplo, foi de 0.3588144, bem como 0.2534 para a segunda lua. Feito isso, quais são os próximos passos? Alterar a posição dos objetos! Quando você duplica um objeto, este estará na mesma posição do objeto original, além de herdar todos os seus componentes, propriedades e valores. De�na novas posições para as luas criadas. No exemplo, a posição (XYZ) da primeira lua é: -1.5313, 0.3207 e -1.118; para a segunda, temos 0.926, 1.251 e -1.118. Contudo, de�na valores diferentes, para criar novos parâmetros à cena. Por �m, precisamos alterar os parâmetros das luas. Os valores foram: MoonOne : textura usada no Albedo foi dirt_steel_2_baseColor. Para o metallic , atribuímos a textura dirt_steel_2_metallic. Para o aspecto amarelado do planeta, de�nimos o valor hexadecimal em #E8FF00. Observe, na Figura 3.7, como �cou a superfície da primeira lua; Figura 3.6 - Propriedades de um material Fonte: Adaptada de Unity... (on-line). MoonTwo : textura usada no Albedo foi rust_steel_1_baseColor. Para o metallic , atribuímos a textura rust_steel_1_specularLevel. Para a cor, utilizamos o branco. O valor hexadecimal foi #FFFFFF. Observe, na Figura 3.8, como �cou a superfície da segunda lua. Figura 3.8 - MoonTwo Fonte: Elaborada pelo autor. Até agora, trabalhamos com objetos tridimensionais, que são representados por malhas poligonais, enquanto que, em um jogo bidimensional, são utilizados sprites para a sua representação. Ambos, malhas e sprites , são utilizados em objetos sólidos, com formas de�nidas; no mundo real, seriam objetos tangíveis. Porém, existem outros elementos em um jogo que precisam ser representados e não são objetos sólidos. Você pode imaginar que elementos são esses? São elementos �uidos e intangíveis por natureza, como líquidos, nuvens, fumaça ou efeitos especiais para representar áureas, feitiços, poderes, dentre outros. Para essa �nalidade, o Unity utiliza o sistema de partículas, que são pequenas e numerosas imagens ou malhas movidas por um sistema especial na engine . Por exemplo, em um líquido, cada partícula é uma pequena textura de água semelhante a uma gota. Agora, o que acontece se juntarmos diversas gotas de água em um copo? Um copo cheio de água, pois o volume é de�nido pelo número de partículas (gotas) em um recipiente. Para que entendamos a dinâmica das partículas, é peciso implementar, em cena, um Particle System . Para isso, é possível adicionar um Particle System como um componente em um GameObject (Inspector > Add component > digitar “ Particle System”) ou colocar um sistema de partículas como um GameObject pré-fabricado em cena. Para isso, basta acessar o menu do Unity > GameObject > E�ects > Particle System . Vamos aproveitar o nosso projeto anterior (planetas) e adicionar um sistema de partículas para gerar um efeito especial na nossa cena. Vamos começar?! Figura 3.7 - MoonOne Fonte: Elaborada pelo autor. Primeiro, adicione um GameObject pré-fabricado do Particle System à nossa cena. Chamaremos o sistema de “ galaxy ”. Após adicionar, é preciso garantir que a emissão de partículas esteja na mesma posição do objeto “ EarthOne ”. Os valores do Position para o galaxy são: XYZ (0,0,0). Veja como �cou a nossa cena (Figura 3.9). Observe que o Particle System é complexo, pois são diversos componentes divididos em várias subseções recolhíveis. A versão 2019.2 consta com 22 módulos para o sistema de partículas. Cada subseção contém propriedades relacionadas à uma área especí�ca, por exemplo, Emission , que é o módulo responsável por controlar a emissão de partículas. O usuário pode de�nir o número de partículas emitidas por uma taxa �xa de tempo, a distância máxima para as partículas, o intervalo de emissão, dentre outros. Para o nosso efeito especial, utilizaremos alguns módulos especí�cos. O primeiro será o Renderer , módulo responsável pelas propriedades que determinam como a partícula renderizada é produzida a partir de uma imagem ou mesh (malha). O usuário pode de�nir o comportamento geral da partícula. Observe que existe o Min Particle Size (tamanho mínimo de partícula) e o Max Particle Size (tamanho máximo de partícula). O sistema faz a emissão de partículas com tamanhos variados. Para o nosso projeto, de�na os valores de 0 para mínimo e 0.1 para máximo. Agora, vamos para o módulo shape , que de�ne as dimensões e formas da partícula, como direção, volume e superfície. Para cada forma escolhida, as propriedades do módulo variam. Por padrão, a emissão de partículas utiliza a forma de cone, emitindo partículas da base de um corpo até formar um cone. Vamos mudar a forma para um circle , ou seja, as partículas movem-se apenas no plano de um círculo. Ainda no módulo shape , acesse as propriedades Spread e Randomize Position . O spread controla os intervalos das partículas com base no arco de emissão. Esse arco é a base que gera as partículas. Um valor próximo de 0 permite que as partículas sejam geradas em qualquer lugar ao redor do centro de emissão (arco), e o valor 1 (máximo) permite gerar partículas em apenas uma direção. Vamos de�nir o valor de 0.5 para o spread . por consequência, as partículas serão geradas em linha reta (duas direções). Observe o comportamento das partículas na Figura 3.10. Figura 3.9 - Particle System Fonte: Elaborada pelo autor. Figura 3.10 - Particle system: Spread Fonte: Elaborada pelo autor. Após o Spread , temos o Randomize Position , que é responsável pelo movimento aleatório das partículas. O valor 0 para esta con�guração não tem efeito sobre as partículas, mas qualquer outro valor de�nirá aleatoriedade às posições de geração das partículas. Para essa propriedade, de�niremos o valor para 0.1, assim, teremos o mínimo de aleatoriedade na geração dessas partículas. Como exercício, aumente o valor dessa propriedade para observar o comportamento das partículas. Um valor próximo a 50 já seria su�ciente para termos um efeito especial em cena. O próximo módulo será o Particle System Main Module . O primeiro parâmetro a ser alterado é o Start Lifetime , que de�ne a vida útil das partículas. De�niremos o valor para 10 (segundos), ou seja, a vida útil de cada partícula será de 10 segundos. O próximo a ser a alterado é o Start Speed , propriedade responsável pela velocidade inicial de cada partícula (na direção de�nida anteriormente). Por �m, temos o Start Size e o Max Particles . O Start Size de�ne o tamanho inicial de cada partícula. Vamos de�nir o valor para 0.2. O Max Particles de�ne o número máximo de partículas no sistema de uma só vez. Vamos de�nir o valor para 10.000. Agora, acesse o módulo Emission , que foi visto anteriormente. Vamos alterar o parâmetro Rate Over Time para 200, ou seja, o número de partículas emitidas por segundo. O próximo passo é habilitar e acessar o Velocity Over Lifetime Module , que é responsável por controlar a velocidade das partículas durante a sua vida útil. O primeiro parâmetro a ser alterado é o Orbital X, Y, Z. O parâmetro de�ne a velocidade orbital das partículas ao redor dos eixos X, Y e Z. Vamos alterar o valor do eixo Z para 2. Com esse valor, o comportamento das partículas será próximo a uma rotação orbital. Como a posição do sistema de partículas ( galaxy ) é o mesmo do nosso GameObject ( EarthOne ), teremos um efeito próximo aos anéis de Saturno (Figura. 3.11), mas esse não é efeito que queremos. Ainda, no módulo Velocity Over Lifetime , altere o valor do parâmetro Radial para 3, o qual de�ne a velocidade radial das partículas, afastando-se da posição central de emissão. Observe, agora, a Figura 3.12. Figura 3.12 - Particle System: EarthOne 2 Fonte: Elaborada pelo autor. Criamos um efeito de galáxia para a nossa cena. Agora, o que podemos melhorar nesta cena? São diversas as possibilidades, por exemplo, desabilitar o EarthOne , ou criar um novo material para um objeto que represente o Sol. Nada impede de criarmos um buraco negro, o centro da galáxia, a terra explodindo, en�m, são diversas as possibilidades. Veja a Figura 3.13 com implementações realizadas no nosso projeto. Figura 3.13 - Projeto Galaxy Fonte: Elaborada pelo autor. Figura 3.11 - Particle System: EarthOne Fonte: Elaborada pelo autor. Todos os efeitos presentes nas cenas da Figura 3.13 foram desenvolvidos utilizando materials, shaders, textures e Particle System . Agora, utilizando os conceitos estudados ao longo do tópico 1, tente implementar o sistema solar, que é um conjunto formado por nove planetas (estamos considerando o planeta anão, Plutão) que giram em torno do sol. praticar Vamos Praticar Leia o excerto a seguir. "O Unity 3D opera baseado em cenas, internamente denominadas Scenes. Dentro das cenas, há os Game Objects , que são quaisquer objetos inseridos dentro da cena. Câmeras, personagens, terreno, os modelos, luzes, todos são classi�cados como Game Objects . Os modelos grá�cos são criados utilizando materials , textures e shaders . Os materiais são baseados em texturas e shaders . O texture determina o que será desenhado na superfície do material, enquanto os shaders de�nem como será desenhado" (TORRES, 2015, p. 32). TORRES, R. D. Desenvolvendo um jogo para ensinar física com Unity 3D . 2016. Monogra�a (Graduação em Sistemas de Informação) – Instituto de Ciências Exatas e Aplicadas, Universidade Federal de Ouro Preto, João Monlevade, 2016. Com base no texto e nos conhecimentos acerca de materials, textures e shaders , analise as a�rmativas a seguir. I. Os materiais de�nem as propriedades da superfície de um objeto, informando como esta deve ser renderizada. II. Só é possível anexar um material em um objeto tridimensional. III. A textura contém informações para mapear e converter um material bidimensional em um modelo tridimensional. IV. Um shader é um script contendo diversos cálculos matemáticos para criar a visualização da superfície de um objeto. Está correto o que se a�rma em: a) I e IV, apenas. b) I e III, apenas. c) II e III, apenas. d) III e IV, apenas. e) IV, apenas. Path�nding ou, literalmente, a busca de caminhos consiste em uma área amplamente estudada e implementada em jogos digitais. Praticamente quase todos os jogos utilizam algum sistema de algoritmos, o qual permite que um agente encontre um determinado caminho no nível do jogo. De maneira simpli�cada, uma entidade, por exemplo, uma personagem não jogável (NPC), precisa encontrar um caminho de um ponto A a um ponto B em determinado nível. Para isso, a personagem precisa contornar obstáculos e calcular a melhor trajetóriapossível. Quando falamos em melhor, referimo-nos às diversas opções que vão desde o menor caminho até o mais seguro, aquele que representa um determinado desa�o, a busca por um objeto, en�m, depende do contexto. Durante a trajetória, a personagem precisa realizar diversos cálculos. Além da busca pelo melhor caminho, a entidade pode procurar e analisar outras entidades, detectar colisões, analisar o ambiente ou realizar uma ação especí�ca. Por exemplo, antes de ir ao ponto B, a personagem pode alterar sua rota e buscar um determinado objeto. Existem diversos algoritmos de busca que podem ser utilizados na navegação de personagens. Contudo, o algoritmo A* (A-estrela) é, de longe, o mais utilizado em jogos eletrônicos. Existem inúmeros trabalhos publicados que explicam o funcionamento do A*, mas iremos abordar o seu conceito utilizando os fundamentos básicos. Vamos lá? Primeiramente, precisamos assumir que uma entidade precisa ir do ponto A (azul) ao ponto B (vermelho) e que existe um obstáculo que separa os dois pontos (Figura 3.14). O primeiro passo na busca por caminhos ( path�nding ) é de�nir a área de busca. Em nosso exemplo, a área está dividida por uma grade, facilitando a área de procura a uma matriz bidimensional. Cada quadrado pode assumir, inicialmente, dois estados (passável ou não-passável, aberto ou fechado). Isto é, a personagem calcula o melhor caminho entre o ponto A e o ponto B. Para isso, o movimento é feito entre o centro de um quadrado a outro, até chegar ao objetivo. Navegação e Navegação e Path�ndingPath�nding Figura 3.14 - Ponto A ao ponto B Fonte: Elaborada pelo autor. O centro de cada quadrado é chamado de nó. Para achar o caminho mais curto, é preciso analisar os quadrados adjacentes e o custo para movimentar-se até o destino. Como fazemos isso? Primeiramente, analisamos quais quadrados são passáveis ou não-passáveis. Em nosso exemplo, quais quadrados adjacentes são passáveis? Todos, pois a entidade azul pode movimentar-se para qualquer quadrado adjacente. Observe a Figura 3.15 para visualizar os possíveis locais de movimento. Lembre-se que a personagem só pode movimentar-se de um centro de um quadrado para outro. Identi�camos quais são os centros para movimentar a nossa personagem e, agora, como escolhemos o destino? O centro do quadrado com menor custo de F. A equação básica do A* para procurar o melhor caminho é: Em que: G: é o custo do movimento para ir do ponto de origem até o quadrado de destino, ou seja, G + G do nó atual + custo até o nó adjacente; H: é o custo estimado da distância do quadrado adjacente até o destino. É comum relacionar o H a uma heurística, pois não sabemos a distância real entre os nós até o caminho �nal. Por que? Lembre-se que, durante o caminho, podem existir obstáculos e outros eventos que di�cultam o movimento até o objetivo �nal. Figura 3.15 - Quadrados adjacentes Fonte: Elaborada pelo autor. Para cada movimento realizado entre quadrados, é preciso retirar o nó com o menor F da lista aberta (passável) e adicionar à lista fechada (não-passável). Para calcular o F, é preciso encontrar o G. Para o nosso exemplo, vamos atribuir pesos (valores) para cada quadrado adjacente à nossa F = G+H personagem (Figura 3.16). O G é um valor baseado na posição atual (valor 0) + o custo de movimento até o quadrado adjacente. Observe que o valor de movimento, para mover-se a quadrados diagonais, é 14 e todos os nós ortogonais são 10. Mas você sabia que esses valores, 10 e 14, não são arbitrários? Em jogos, precisamos calcular o menor caminho entre dois pontos, por isso, precisamos ter uma noção de distância entre os nós. Cada movimento entre um nó tem um custo, que depende do contexto, podendo ser qualquer tipo de medida. Você pode imaginar algum exemplo do mundo real aplicado a jogos? Para um veículo movimentar-se de um ponto �xo a outro, é necessário calcular o menor caminho, com base no combustível. Contudo, é possível que a personagem precise chegar a um determinado ponto em um tempo �xo. Esse é um exemplo do mundo real aplicado a um jogo. Para o nosso exemplo, estamos utilizando a distância como uma unidade de medida. Cada célula da nossa matriz é quadrada, ou seja, o custo dos movimentos em diagonal é maior do que os custos dos movimentos ortogonais. Vamos considerar as nossas células (quadrados) com o valor de 1. Aplicando o Teorema de Pitágoras, temos que a hipotenusa (diagonal) tem tamanho 1,414213562, que é maior do que as arestas de tamanho 1. Diante disso, podemos a�rmar que o custo para movimentos em diagonal é maior do que em movimentos ortogonais. Figura 3.17 - Teorema de Pitágoras Fonte: Elaborada pelo autor. Sabemos que o custo de movimentação ortogonal é mais baixo do que o de movimentação diagonal. Mas e os valores 10 e 14? Em um algoritmo, quando trabalhamos com cálculos matemáticos sucessíveis em um loop , é uma boa prática evitar valores de pontos �utuantes. Assim, o recomendado é trabalhar com números inteiros. Se alterarmos os valores das nossas células para 10, temos que o valor aproximado da nossa diagonal é 14, um número inteiro. Lembre-se que o custo de movimento ortogonal é 10 e o custo de movimento diagonal é 14. Agora, voltamos para o Figura 3.16 - Quadrados adjacentes Fonte: Elaborada pelo autor. nosso exemplo anterior. Vamos calcular o movimento da nossa entidade. Para calcularmos H, estimamos a distância até o objetivo �nal utilizando o método de Manhattan, que é a soma das distâncias entre os nós e suas respectivas posições ou, simplesmente, contamos o número de nós horizontais e verticais, ignoramos os obstáculos diagonais e multiplicamos o valor encontrado por 10. Se observarmos o nosso exemplo, notaremos que o destino �nal está a 4 quadrados de distância. Multiplicando por 10, temos que H = 40. Dos 9 quadrados iniciais, temos 8 na lista aberta, pois o quadrado da personagem foi colocado na lista fechada. E agora, qual o menor caminho? Vamos observar a Figura 3.18. Para calcular o H, contamos o número de nós até o destino �nal e multiplicamos por 10. Após isso, calculamos o valor de F. Para isso, basta somar G (custo de movimento) + H. Este foi um exemplo simpli�cado do funcionamento do algoritmo A*. Entretanto, estamos ignorando os obstáculos. Diante disso, não é garantido que o menor caminho seja encontrado em todas as circunstâncias. O método Manhattan ignora as diagonais. Mas como funciona o sistema de navegação do Unity ? Quando o usuário deseja mover uma personagem de forma estratégica no jogo, este precisa levar dois fatores em consideração: como estabelecer o destino do agente e qual caminho escolher para chegar lá. Para sanar os dois problemas, é preciso compreender que ambos são conectados, mas de naturezas diferentes. O primeiro é global e estático, pois o agente precisa analisar toda a cena. Como assim? O comportamento de uma personagem, geralmente, é baseado em estados. Pode ser um estado Figura 3.18 - Menor caminho Fonte: Elaborada pelo autor. saiba mais Saiba mais Os algoritmos de busca são amplamente utilizados em jogos digitais. É comum usar grades bidimensionais para representar os níveis. Por exemplo, temos jogos de estratégia em tempo real (RTS), como Age of Empires , que usam grades. Cada célula é marcada como aberta ou fechada. É importante compreender o funcionamento de algoritmos de busca. ACESSAR https://www.researchgate.net/publication/265215573_Algoritmos_de_busca_em_tempo_real_aplicados_a_jogos_digitais estático, dinâmico ou, dependendo do contexto, ambos. Um agente �xo em um mapa pode ter o objetivo de apenas informar a personagem principal. Logo, o comportamento da personagem será estático, pois permanecerá o mesmo na cena. Contudo, é possível alterar esse comportamento, para que o NPC transite entre certas distâncias. Além disso, a personagem pode assumir um papel mais ativo no jogo, percorrendo determinado caminho em busca de um artefato. Independente da situação, a personagem precisade informações sobre a cena ou de todo o jogo. O segundo problema é local e dinâmico. Digamos que a personagem precise cumprir determinado objetivo, necessitando calcular o melhor trajeto para alcançar o destino. Para isso, é preciso que o agente evite colisões com pontos estáticos (casas, portas, arvores, pedras, etc.) ou dinâmicos (outros agentes) no mapa. O sistema de navegação do Unity representa os elementos em cena usando a geometria. Os agentes são descritos como cilindros, e as áreas de movimento são testadas e construídas automaticamente, a partir dos locais onde o agente possa �car. Após isso, a engine cria uma superfície com as áreas estabelecidas, criando uma conexão entre estas. A superfície é chamada de NavMesh ou malha de navegação. reflita Re�ita O Algoritmo A* foi descrito, em 1968, pelos cientistas da computação, Peter Hart, Nils Nilsson, e Bertram Raphael. Sua aplicação vai desde a busca por rotas de linhas ferroviárias até a trajetórias de agentes em videogames . O algoritmo consiste em buscar o melhor trajeto entre dois pontos. Dentre os algoritmos de path�nding , o algoritmo A* é um dos mais utilizados, seja por sua e�ciência ou mesmo pela facilidade de implementá-lo em cenários distintos. Levando em consideração os assuntos abordados ao longo da unidade sobre o Unity , re�ita como implementar um sistema de partículas com comportamento baseado no algoritmo A*. Observe que é semelhante à movimentação da nossa personagem exempli�cada no algoritmo A*. Todas as células são conectadas, desde os quadrados que a personagem pode movimentar-se, até os obstáculos que evitam o movimento. Podemos dizer que as células da Figura 3.15 são conectadas e formam uma malha. Para um melhor entendimento do funcionamento do sistema de navegação no Unity , nada melhor do que implementá-lo em um projeto. Para isso, abra o Unity e crie um 3D object " Plane ". Após isso, vamos aumentar a escala para torná-lo um pouco maior. De�na o valor 3 para scale (X, Y e Z) e 0 para position (X, Y e Z). Agora, vamos criar um NavMesh para a nossa superfície. Primeiro, precisamos habilitar a guia de navegação, contendo propriedades gerais que in�uenciarão o comportamento de um agente. Vá para o menu > Window > UI > Navigation (Figura 3.19). Observe que, na janela de navegação, existem quatro guias. Vejamos cada uma destas. Agents : guia que permite de�nir as propriedades de um tipo especí�co de agente. Por padrão, o Unity cria o tipo humanoide. Podemos personalizar suas dimensões, bem como o seu comportamento de movimento; Áreas : são tags especí�cas para de�nir partes da superfície da nossa cena. É possível atribuir pesos ou custos para cada tag (area). Isso permite criar um ambiente contendo partes mais difíceis de atravessar, como a água ou a areia, sendo similar ao sistema de navegação ortogonal e diagonal no algoritmo A*; Bake : de�nem-se as con�gurações de mapeamento de navegação do ambiente; Object : guia importante para o nosso sistema de navegação. Permite con�gurar partes do ambiente em um sistema de hierarquia, identi�cando áreas do ambiente onde o agente possa mover-se. Além do mais, de�ne quais são as áreas com obstáculos. Pronto para criar uma malha de navegação? Então, selecione o nosso plano e acesse o guia object na janela de navegação. No inspector , habilite a opção navigation static . Estamos dizendo à engine que o plano não mudará de posição (estático). Na guia bake , deixaremos as propriedades padrões do Unity . No entanto, é possível de�nir se uma determinada área é mais difícil ou não para um agente navegar. Contudo, a nossa área de navegação é livre. Clique no botão Bake . Se tudo correu conforme o passo a passo, será possível notar um quadrado azulado desenhado em nosso plano. Esse quadrado é um NavMesh (Figura 3.20). Figura 3.20 - NavMesh Fonte: Elaborada pelo autor. Figura 3.19 - Navigation Fonte: Elaborada pelo autor. Após criar o NavMesh , precisamos criar o nosso agente. Um agente é um objeto que pode mover-se pela superfície usando malhas de navegação. Para o nosso exemplo, vamos criar um simples cubo e transformá-lo em um agente. Então, crie um novo cubo em nossa cena. Após isso, coloque-o no centro do plano e garanta que o cubo esteja ligeiramente acima do solo (para isso, em position , use os valores 0, 1, 0 para X, Y e Z ). Vamos renomear o cubo para NPC. Agora, criaremos um material e anexaremos este ao cubo, o que o diferenciará do nosso plano que, por padrão, tem a mesma cor. Crie um novo material e renomeie para NPC, anexando ao cubo. Em Albedo , de�na o valor hexadecimal para 112CF3 (azul-escuro). Se preferir, escolha uma cor diferente. Agora, vamos adicionar o componente Nav Mesh Agent ao nosso cubo. Para isso, você pode selecionar o cubo, acessar o Menu > Component > Navigation > Nav Mesh Agent . Ou, no inspector, na barra de pesquisa, digite Nav Mesh Agent . Pronto, nosso cubo é um agente de navegação. Precisamos apenas de�nir o comportamento de movimento. Como fazemos isso? É simples, basta chamar o componente Nav Mesh Agent em um script e dizer para ele fazer alguma coisa. Vamos criar um novo script e chamá-lo de NPCMovement . Uma vez criado o script , abra o editor de código e escreva o código a seguir. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class NPCMovement : MonoBehaviour { [SerializeField] Transform _destination; NavMeshAgent _navMeshagent; public void Start() { _navMeshagent = this.GetComponent <NavMeshAgent>(); if (_navMeshagent == null ) { Debug. LogError ("O componente Nav Mesh Agent não foi encontrado em " + gameObject. name ); } else { SetDestination(); } } private void SetDestination() { if (_destination != null) { Vector3 targetVector = _destination.transform.position; _navMeshagent.SetDestination(targetVector); } } } Agora, vamos analisar o código. Primeiro, estamos declarando uma variável transform para o destino do nosso agente. SerializeField permite editar o valor da nossa variável privada no inspector. O método Start está pegando, como referência, o componente Nav Mesh Agent em nosso agente. Além disso, estamos executando uma veri�cação para garantir que o componente encontrado não seja nulo. Caso o agente seja encontrado com êxito, de�nimos o destino. O destino é baseado na posição do transform do alvo que estamos buscando. Após de�nido o objetivo, o agente vai até o destino. Pronto, compile o código e volte para o Unity . Agora, adicione o script NPCMovement ao nosso agente. O próximo passo é de�nir o seu destino. Para isso, precisamos criar um novo 3D Object . Em nosso exemplo, utilizaremos um novo cubo, de�niremos um local no plano para este, criaremos um material e escolheremos uma cor. Na cena do exemplo, o novo cubo foi renomeado para NPC2, o valor hexadecimal do material do NPC2 foi de FF2700, a escola em X = 1, Y = 1 e Z = 1 e, por �m, os parâmetros da posição foram X = -10, Y = 1 e Z= 0. Por �m, clique no NPC e arraste o objeto NPC2 para a variável Destination (Figura 3.21). Figura 3.21 - Destination Fonte: Elaborada pelo autor. Pronto, agora, clique em play . O nosso agente move-se até sobrepor o NPC2. Interessante, não é? Mas você pode pensar que o movimento linear é fácil. Realmente, precisamos de obstáculos. Não apenas isso, precisamos de�nir o movimento da personagem para percorrer os obstáculos. Vamos lá? Então, vamos criar um novo cubo e renomear para obstacle . O objetivo é criar um obstáculo entre o nosso NPC e o seu destino. Você pode criar um material e anexar ao nosso GameObject obstacle . A escala para esse novo objeto foi de 5, 5 e 10 (X, Y e Z). Observe como �cou a nossa cena (Figura 3.22). Figura 3.22 - Obstacle Fonte: Elaborada pelo autor. Agora, se dermos play , o que acontece? A personagem vai mover-se até o destino, passando pelo nosso obstáculo. Precisamos adicionar um RigidBody ao nosso NPC. Adicione o RigidBody ao NPC e dê playnovamente. Observe que o cubo colidirá com o obstáculo. Mas o sistema de navegação do Unity não está reconhecendo o nosso obstáculo como parte de nossa malha. Para contornar essa situação, precisamos que o NavMesh reconheça o objeto (obstáculo). Selecione o objeto obstáculo e vá ao painel de navegação, na interface, e acesse a guia Object . Habilite o nosso obstáculo como estático e not walkable (não pode ser percorrido). Agora, precisamos refazer a nossa malha. Ainda na interface da janela de navegação, na guia Bake , clique no botão Bake . Pronto, você já pode observar que a malha de navegação foi quebrada ao redor do nosso obstáculo (Figura 3.23). Pressione play e observe que o nosso agente está andando ao redor do cubo até chegar ao local de destino. Podemos personalizar o tamanho da quebra de malha ao redor do nosso obstáculo. Assim, o agente pode mover-se ao redor deste sem estar muito próximo do obstáculo. Para isso, o Unity utiliza um componente chamado Nav Mesh Obstacle . Adicione o componente ao nosso obstáculo (Menu > Component > Navigation > Nav Mesh Obstacle ). Pronto, agora, basta selecionar o obstáculo, acessar a interface, em NavMeshObstacle , e habilitar " carve ". Assim, o sistema de navegação usa os limites do obstáculo de�nidos pelo usuário. Você pode alterar os valores de “ size ” para mudar o tamanho do obstáculo. Para o nosso exemplo, vamos utilizar os valores 2, 1 e 2 (X, Y e Z). Pressione o play e observe como �cou a nossa cena (Figura 3.24). Figura 3.23 - Obstacle Fonte: Elaborada pelo autor. Figura 3.24 - Nav Mesh Obstacle Fonte: Elaborada pelo autor. Agora, brinque com essa cena, crie novos obstáculos e de�na valores diferentes para o seu tamanho. Não esqueça de refazer a malha toda vez que adicionar um novo objeto à nossa cena. Como exercício, busque materiais e texturas na loja de ativos e personalize a cena. Unity permite adicionar, editar e manipular paisagens em um jogo. Para isso, precisamos adicionar um 3D Object Terrain à nossa cena. Com o Unity aberto, acesse o menu > 3D Object > Terrain . Como sugestão, você pode utilizar a cena de navegação para criar um terreno ao nosso agente. Selecione terrain , na janela de hierarquia, e, em inspector , observe que a janela de terrenos fornece diversas ferramentas e recursos para criar paisagens. A barra de ferramentas fornece cinco opções para manipular o terreno. A primeira delas é o Create Neighbor Terrains , uma ferramenta para criar terrenos adjacentes que se conectam automaticamente. Acesse o inspector e clique no ícone de criar terrenos vizinhos. Quando o usuário seleciona a ferramenta, automaticamente, a engine destaca as áreas subjacentes do bloco de terreno selecionado. Clicando sobre um novo quadrado, o mapa é preenchido com um novo terreno (Figura 3.25). Outra ferramenta amplamente utilizada é o Raise or Lower Terrain , que permite alterar o relevo do terreno. Em terrain , na barra de ferramentas, selecione o pincel ( Raise or Lower Terrain ). Agora, na janela scene , clique no terreno para aumentar o seu relevo e, para diminuir, mantenha pressionada a tecla Shift . É possível alterar o tamanho do pincel para criar terrenos variados. Para isso, acesse a barra de ferramentas e altere o controle deslizante em Brush Size . Veja a alteração no relevo na Figura 3.26. TerrenosTerrenos Figura 3.25 - Terrain Fonte: Elaborada pelo autor. Se você observar, não existe textura em nosso relevo. Para isso, vamos adicionar terrain layers , mas, antes, importaremos, da loja de ativos do Unity , o pacote Yughues Free Ground Materials , produzido por Nobiax / Yughues. Agora, em terrain , acesse a interface > Terrain Layers > Edit Terrain Layers > Create Layers . Neste momento, precisamos de�nir a textura para o nosso terreno. Escolha “ Grass ”. Após isso, você poderá selecionar a textura escolhida e desenhar o mapa diretamente no terreno. É possível adicionar várias texturas, criando ambiente únicos. Veja a Figura 3.27 para observar os detalhes do terreno utilizando a textura Grass e Rock . Além disso, na barra de ferramentas, é possível de�nir o tamanho, a opacidade e a forma do pincel. Figura 3.27 - Terrain Editor Paint Fonte: Elaborada pelo autor. O Unity possui diversos recursos extras para trabalhar com a construção de elementos em ambientes. Por exemplo, temos o SpeedTree , um ativo da IDV inc recomendado pelo Unity para a criação de árvores. O ativo possui diversos modelos pré-fabricados de árvores, além da possibilidade de criar novos modelos. Outro ativo recomendado pelo Unity é o Polybrush , que permite misturar texturas para criar novos efeitos para o terreno. A ferramenta oferece um editor de design de terrenos para esculpir formas complexas diretamente do editor. Além disso, o Polybrush conta com modelos pré-fabricados de pedras, gramas, detritos, árvores e outros detalhes que podem ser adicionados em cena. Agora, com a ferramenta terrain aberta, crie um pequeno terreno para a nossa cena de navegação. Figura 3.26 - Terrain Editor Fonte: Elaborada pelo autor. Antes de falarmos de níveis, precisamos entender o conceito de progressão. Para isso, vamos analisar o jogo Angry Birds , que é eletrônico de puzzles, ou quebra-cabeças, desenvolvido pela Rovio Entertainment . A primeira versão do jogo foi lançada em 11 de dezembro de 2009, com uma estimativa de 732 níveis. Sua continuação tinha, aproximadamente, 2180 níveis. Veja que, em jogos eletrônicos, é comum propor uma di�culdade crescente, mas como construir níveis progressivos? O que é progressão? Para responder a essas questões, vamos estudar o básico sobre design de níveis. Digamos que a cena inicial do nosso jogo seja a mesma da navegação do nosso agente, bem como que controlamos o cubo 2 (NPC2). O nosso objetivo é buscar uma chave para abrir uma porta e desbloquear o nível seguinte. Se, durante os próximos 10 ou 15 níveis, os puzzles e elementos do cenário seguirem inalterados, com as mesmas condições para atravessá-los, então, provavelmente, esse jogo se tornará monótono. Portanto, cada nível precisa ser trabalhado separadamente, com o objetivo de criar experiências únicas. Em seguida, é preciso de�nir a progressão, para não criar repetição. O(a) jogador(a) precisa de um objetivo a longo prazo, por exemplo, em Angry Birds , os pássaros precisam salvar os ovos roubados pelos porcos verdes. A cada nível, novos elementos são adicionados e a di�culdade é aumentada. Outro exemplo seria um jogo que, no primeiro nível, a personagem precisa eliminar três inimigos com apenas dois acertos, assim como no segundo, terceiro e quarto níveis. No quinto nível, o(a) jogador(a) é experiente, consegue eliminar monstros com apenas um golpe. Inicialmente, o sistema pode parecer e�ciente, o(a) jogador(a) evoluiu, mas, na prática, se o jogo não acrescentar elementos diferentes ao nível, trará apenas repetição. Por consequência, é provável que o(a) jogador(a) não tenha nenhum prazer com o jogo. Trabalhar com a complexidade em jogos é um ponto essencial para construir níveis progressivos, considerando que esta é diretamente ligada à jogabilidade. Se alterarmos, rapidamente, os primeiros níveis do nosso exemplo anterior, poderíamos implementar um número crescente de inimigos, personagens com habilidades distintas, exigências de itens, puzzles , inimigos inteligentes, aleatoriedade, etc. Quando criamos níveis, precisamos de�nir a progressão ou criaremos fases ou níveis sem nenhum objetivo. Além disso, é preciso levar em consideração o balanceamento e a curva de aprendizado em um jogo, pois cada nível precisa ser equilibrado, para que o(a) jogador(a) sinta-se motivado a progredir. NíveisNíveis Para criar progressão, é preciso desenvolver presença e imersão em um jogo. Como assim? O(a) jogador(a) precisa querer progredir, sentir-se motivado e desa�ado constantemente. E como criamos níveis com desa�os constantes? Para isso, vamos utilizar o estado de Flow , ou �uxo, proposto pelo psicólogoMihaly Csikszentmihalyi. O conceito de Flow é similar a uma máquina de estados que, de maneira sucinta, é um modelo matemático usado em softwares ou lógica digital. Os estados são representados usando um diagrama de estado e cada estado desempenha um papel distinto em um sistema, em que cada indivíduo passa por estados emocionais ao longo de sua rotina diária. O Flow é um estado mental proporcionado por alguma tarefa ou atividade que o indivíduo realiza e tende a eliminar distrações ao seu redor. Na prática, a atividade realizada gera um grande prazer. Entrar em um estado de �uxo signi�ca estar completamente envolvido em atividades que trazem prazer, ignorando o tempo e, até mesmo, suprimindo as necessidades �siológicas. O desenvolvedor precisa guiar o(a) jogador(a) ao estado de �uxo, por isso, a progressão de níveis é fundamental. A linha de aprendizado precisa seguir essa progressão. Se a mecânica do jogo é difícil de entender intuitivamente, é preciso adicionar um tutorial ou treinamento ao longo dos primeiros níveis do jogo. Angry Birds utiliza tutoriais durante todo o jogo, sempre que uma nova habilidade é demonstrada para o(a) jogador(a). Em alguns jogos, é comum obrigar o(a) jogador(a) a realizar um treinamento, explicando os principais recursos para o usuário e introduzindo, brevemente, o universo do jogo. saiba mais Saiba mais A geração automática de conteúdo baseia-se no uso de algoritmos para criar, dinamicamente, elementos dentro do jogo, desde os elementos audiovisuais até a arquitetura de níveis. Esta abordagem é amplamente utilizada há mais de 30 anos, na área de jogos eletrônicos, sendo um recurso importante para criar níveis diversi�cados. ACESSAR http://artefactum.rafrom.com.br/index.php/artefactum/article/view/1772?v=1675036738 O design de níveis é amplamente estudado e discutido na indústria de jogos, mas, como qualquer conceito, é necessário ser implementado e validado de maneira prática em um jogo. Por isso, iremos implementar uma transição entre níveis, utilizando a nossa cena de navegação do agente. Para isso, vamos utilizar o método SceneManager.LoadScene , que permite mudar de Scene , passando o seu nome ou index no Build do jogo. Mas, antes, com o Unity aberto na janela de projetos, crie uma pasta chamada Scene . Selecione a nossa Scene atual, renomeie para Level 1 e arraste para a pasta scene . Agora, crie uma nova Scene e renomeie como Level 2 . Após isso, acesse o menu do Unity > Build Settings e arraste as Scenes Level 1 e 2 para Scenes in Build (Figura 3.28). Por padrão, o Unity só compila as cenas que você adicionou ao seu projeto no editor. Após criar as duas cenas, crie um novo script , chamado Transition . Anexe o script no nosso NPC2. Abra o editor de códigos e escreva o código a seguir. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; saiba mais Saiba mais A jornada do herói ou monomito é um conceito cíclico amplamente utilizado em jogos eletrônicos. Esse conceito foi cunhado pelo antropólogo Joseph Campbell. Compreender o termo proposto por Campbell é fundamental para construir níveis progressivos, utilizando- se de uma narrativa memorável. ASS IST IR Figura 3.28 - Scenes in Build Fonte: Elaborada pelo autor. public class Transition : MonoBehaviour { void OnTriggerEnter(Collider TransitionLevel) { if (TransitionLevel.gameObject.tag == "Player") { SceneManager.LoadScene(2); } } } Para usar as funções de transição, precisamos chamar o using UnityEngine.SceneManagement no início do script . O void OnTriggerEnter é chamado quando um objeto colide com outro. Se o objeto possuir a tag “ Player ”, é chamada a função SceneManager.LoadScene (2). Isto é, estamos chamando a nossa scene Leve2 . O index ou número segue a hierarquia de cenas na Scenes in Build . Poderíamos substituir o SceneManager.LoadScene (2) por SceneManager.LoadScene (" Level2 "). Agora, salve o código e retorne ao Unity . Dê play e veja o que acontece. Você vai perceber que nada acontece, pois a personagem apenas percorre a trajetória até o NPC2, mas não muda de cena. Você sabe o porquê disso? Lembra-se de que utilizamos um método Trigger ? Precisamos habilitar o isTrigger no Box collider do NPC2. Além disso, garantimos que a transição só ocorra caso o objeto tenha a tag “ Player ”. Basta selecionar o NPC > Inspector > Tag > Player . Execute o jogo novamente. A personagem percorre a trajetória e, após a colisão com o NPC2, é chamada uma nova scene ( Level2 ). indicações Material Complementar LIVRO Introdução ao Desenvolvimento de Games - Volume 3: Criação e Produção Audiovisual Editora : Cengage Learning Autor : Steve Rabin Ano : 2012 ISBN -10: 8522111456 ISBN -13: 978-8522111459 Comentário : um livro-texto aplicado à área de desenvolvimento de jogos, que tem, como objetivo, utilizar abordagens práticas para explicar conceitos de modelagem tridimensional, linguagem audiovisual, efeitos especiais, sistemas de partículas, design de níveis, dentre outros. A obra traz informações valiosas sobre elementos fundamentais da estrutura de um jogo, focando em aspectos práticos do processo de criação. conclusão Conclusão Criar um jogo não é uma tarefa trivial, mesmo utilizando uma game engine para auxiliar no processo de produção. É preciso, independente da área, conhecer as ferramentas de desenvolvimento. Jogos são sistemas complexos, formados por conjuntos de outros sistemas complexos. Cada elemento em um jogo pode, inicialmente, parecer simples, mas, quando agregado a outros elementos, forma o que chamamos de jogo. São todos os elementos interagindo, formando um grande sistema. Portanto, um jogo é uma tarefa técnica que exige que o usuário familiarize-se com os recursos do mecanismo escolhido. O Unity contém inúmeros recursos e, para dominá-los, é preciso de prática. Por isso, o segredo para criar jogos fantásticos é apenas fazer jogos. Não se esqueça de praticar sempre. Implemente jogos simples, faça novos níveis para jogos conhecidos, mude as regras, en�m, use a criatividade para criar experiências fantásticas. referências Referências Bibliográ�cas POZZEBON, E.; SANTOS, J. P. dos.; JUSTINA, R. F. D. Geração Automática de Conteúdo: Uma Revisão Sistemática da Literatura Computacional. Artefactum - Revista de Estudos em Linguagem e Tecnologia , n. 1, 2019. Disponível em: http://artefactum.rafrom.com.br/index.php/artefactum/article/view/1772?v=1675036738 . Acesso em: 27 dez. 2019. TRINDADE, E.; FERREIRA, R. P. M.; FANTINI, E. P. C.; PAULA, H. B. de. Algoritmos de busca em tempo real aplicados a jogos digitais. VII SBGames , Belo Horizonte, nov., 2008. Disponível em: https://www.researchgate.net/publication/265215573_Algoritmos_de_busca_em_tempo_real_aplicados_a_jogos_d . Acesso em: 22 dez. 2019. TORRES, R. D. Desenvolvendo um jogo para ensinar física com Unity 3D . 2016. Monogra�a (Graduação em Sistemas de Informação) – Instituto de Ciências Exatas e Aplicadas, Universidade Federal de Ouro Preto, João Monlevade, 2016. UNITY User Manual. Unity 3D . Disponível em: https://docs.unity3d.com/2020.1/Documentation/Manual/ . Acesso em: 06 jan. 2020. http://artefactum.rafrom.com.br/index.php/artefactum/article/view/1772?v=1675036738 https://www.researchgate.net/publication/265215573_Algoritmos_de_busca_em_tempo_real_aplicados_a_jogos_digitais https://docs.unity3d.com/2020.1/Documentation/Manual/
Compartilhar