Você está na página 1de 191
Este trabalho está licenciado sob uma Licença Creative Commons Atribuição-NãoComercial- CompartilhaIgual 4.0

Este trabalho está licenciado sob uma Licença Creative Commons Atribuição-NãoComercial- CompartilhaIgual 4.0 Internacional. Para ver uma cópia desta licença, visite

http://creativecommons.org/licenses/by-nc-sa/4.0/.

Capa: Alexandre Ferreira e Sean Albuquerque Imagem de fundo extraída da Unreal Engine 4, sem qualquer efeito de pós-produção aplicada além dos filtros do motor gráfico.

Brasil novembro de 2016

Unreal 4

Unreal 4

Nota dos Autores

O conteúdo aqui abordado possui teor informativo educacional sem fins lucrativos. Deixamos expressamente claro que está apostila pode ser utilizada tanto em cursos ou salas de aulas como também por qualquer entusiasta individual que queira desbravar um conteúdo em português que envolva a Unreal 4, e a programação visual Blueprints, de forma a sair um pouco do “Abc básicos” que se encontra normalmente nos conteúdos gratuitos em nosso idioma.

Como mencionado anteriormente, está apostila pode ser impressa e tomada como auxilio de qualquer curso voltado a tecnologia abordado aqui, desde que não se cobre nada por ela e que seus autores sejam devidamente mencionados e creditados.

Sumário

Sumário

Configurando Player Character

8

Configurações Iniciais

10

Axis e Action Mappings

17

Animation Blueprint

33

Blend Space 1D

38

Editando Animações

45

Configurando Animação de Pulo

48

Conclusão

51

Configurando Player Character

53

Configurações Iniciais

55

Axis e

Action Mappings

62

Game Mode

66

Configurando Movimento

69

Animation Blueprint

74

Blend Space 1D

79

Editando Animações

85

Configurando Animação de Pulo

89

Conclusão

92

Adicionando Animações

93

Template do projeto

95

Adicionando Animações Com Animation Motage

103

Inteligência Artificial I

113

Template do projeto

115

Configurando a IA

116

Programando a IA

119

Questão:

120

Área de atuação Nav Mesh

120

Conclusão

122

Aguçando a curiosidade

122

Inteligência Artificial II

123

Template do projeto

125

Lista de Passos:

125

Organizando os diretórios

126

Sistema Chave&Porta / Pontuação I

128

Criando a porta

132

O

elevador

134

Controle de estados

135

Programação no Player (Jogador)

136

Sistema Chave Porta / Pontuação II

137

Chaves

137

Portas

137

Elevador

139

Checkpoint

140

Zona da morte

141

O

inimigo (IA)

143

Subindo níveis!

146

Inteligência Artificial III

150

Template do projeto

152

Lista de Passos:

152

Configuração inicial do projeto

152

Game design

155

Qual estado eu início

156

Resumo de funções e variáveis

157

Existe algum player próximo de mim?

158

Onde está o player onde irei me posicionar?

161

A

que distância do player devo ficar em guarda? Ou sair da guarda?

166

Quando que eu posso atacar?

166

Introdução a interface Gráfica

173

Configurações Iniciais

175

GUI

175

Sistema de Health

182

Criando Regenerador de Health

186

Conclusão

190

Referência Bibliográfica

191

Configurando Player Character

Third Person

Configurando Player Character

Third Person

Neste capítulo veremos como configurar um personagem jogável a partir de um projeto Blank da Engine Unreal 4, convertendo o projeto para a jogabilidade Third Person. Iremos definir seus controles de interação bem como suas animações de resposta.

Configurações Iniciais

Como dito anteriormente, este projeto terá como base um template Blank, com isso selecione este template, certifique-se de estar na aba Blueprint, e não C++.

certifique-se de estar na aba Blueprint, e não C++. Após o Unreal Editor ter iniciadocrie uma

Após o Unreal Editor ter iniciadocrie uma pasta para o personagem que você deseja trazer, dentro desta paste crie mais 3 pastas, para Textura, Material e Animação. Feito isso clique no botão Import localizado no menu Content Browser.

no botão Import localizado no menu Content Browser . Traga o modelo 3D do personagem que

Traga o modelo 3D do personagem que deseja configurar. É importante certificar-se que este modelo possua esqueleto, caso contrário não será possível atrelar as animações a ele.

Este painel possui configurações de importação, ele é dividido em 4 abas: Configurações de Mesh;

Este painel possui configurações de importação, ele é dividido em 4 abas:

Configurações de Mesh; Animação; Transformação e Materal. Não faremos alterações neste menu para o nosso personagem, mas caso você queira trazer animações junto do mesh marque Import Animations, para alterar a escala do personagem caso ele venha muito pequeno ou muito grande para Engine reimporte e configure Import Uniform Scale. Caso você prefira configurar o material, do zero, dentro da Unreal, desmarque Import Materials ou Import Textures.

Unreal, desmarque Import Materials ou Import Textures . Além do mesh mais 2 arquivos são importados

Além do mesh mais 2 arquivos são importados Physics Assets e o Skeleton. Caso seu modelo tenha vindo com muitos materiais e texturas soltos organize-os nas pastas correspondentes. Depois do mesh importado e organizado iremos agora criar uma Classe Blueprint do tipo Character. Para isso clique com o botão direito do mouse num espaço vazio dentro da pasta do Player, e escolha a opção Blueprint Class.

Após informar que queremos criar uma nova classe Blueprint devemos agora escolher qual tipo de

Após informar que queremos criar uma nova classe Blueprint devemos agora escolher qual tipo de classe queremos criar. Interagiremos agora com o painel Pick Parent Class, para nosso player devemos escolher Character.

Class , para nosso player devemos escolher Character . Nomeie a nova classe como quiser, uma

Nomeie a nova classe como quiser, uma dica é colocar as siglas BP depois do nome escolhido para identificar com facilidade no futuro, que se trata de uma classe Blueprint.

Vamos agora configurar nosso Player Blueprint, clique duas vezes no seu ícone para abrirmos o

Vamos agora configurar nosso Player Blueprint, clique duas vezes no seu ícone para abrirmos o editor.

Vamos agora configurar nosso Player Blueprint, clique duas vezes no seu ícone para abrirmos o editor.

No painel Components clique na opção Mesh. Agora vá no painel Details (a direita) e na aba Mesh abara as opções clicando na seta ao lado de None. Escolha o modelo 3D do player que você acabou de importar.

Escolha o modelo 3D do player que você acabou de importar. Normalmente ele vem rotacionado de
Escolha o modelo 3D do player que você acabou de importar. Normalmente ele vem rotacionado de

Normalmente ele vem rotacionado de forma diferente das configurações do player, para posicioná-lo de forma correta basta girar o mesh até o lado da frente dele respeitar a direção que o ArrowComponent aponta, -90 graus no eixo Z no nosso exemplo.

Depois disso é interessante fazer o mesh do personagem respeitar a altura da capsula, suba-o

Depois disso é interessante fazer o mesh do personagem respeitar a altura da capsula, suba-o até que seus pés fiquem dentro da base da capsula.

suba-o até que seus pés fiquem dentro da base da capsula. Agora vamos adicionar 2 componentes

Agora vamos adicionar 2 componentes essenciais para nosso Player. Clique no botão verde Add Component, fica no topo do painel Component. Procure por “ApringArme clique nele para adicionar.

verde Add Component , fica no topo do painel Component . Procure por “ ApringArm ”

Agora procure por Camera para adicionar este componente também.

procure por Camera para adicionar este componente também. O SpringArm é responsável por regular a distância

O SpringArm é responsável por regular a distância da câmera para o Player com isso

a câmera deve estar atrelada a ele. Para atrelarmos a câmera aqui devemos torna-la

“Child” do SpringArm, arraste a câmera até o SrpingArm e solte nele para isso. Note

que depois disso a câmera foi sozinha até a outra extremidade do SpringArm.

câmera foi sozinha até a outra extremidade do SpringArm . Feito isso clique em SrpingArm e

Feito isso clique em SrpingArm e no painel Details marque a opção “Use Pawn Control Rotation”. Essa opção nos garantirá um funcionamento correto da rotação do player, depois de empregarmos os devidos códigos de movimento e rotação faremos outras configurações por aqui.

Feito isso definimos a aparência de nosso Player Character, agora precisamos definir seus controles e em seguida configurar as animações.

No Level Editor, clique em Edit e depois em Project Settings.

Axis e Action Mappings Dentro de Project Settings procure do lado esquerdo a opção Input,

Axis e Action Mappings

Dentro de Project Settings procure do lado esquerdo a opção Input, ela é um dos itens pertencentes a aba Engine.

Input, ela é um dos itens pertencentes a aba Engine. Agora na opção Bindings nós definimos

Agora na opção Bindings nós definimos os mecanismos básicos de interação de nosso jogo com as teclas e botões de nossos controles.

O que são AXIS e ACTION MAPPINGS? Toda ação que o nosso player faz, depende

O que são AXIS e ACTION MAPPINGS?

Toda ação que o nosso player faz, depende de interações com botões, nós podemos setar diretamente na Event Graph do Player a Barra de Espaço para pular e o botão W para correr, ou X do controle para atacar, mas como forma de dinamizar as definições e padrões de nossos controles, é possível criar aqui na aba Bindings os comandos gerais, e mais tarde instanciá-los como Nós Blueprints para definirmos os códigos. Isso facilita nossa vida de várias formas, uma delas é caso o nosso game tenha múltiplos players, as definições básicas de movimento e câmera que serão as mesmas para todos podem ser criadas aqui, e nó Event Graph de cada criaríamos apenas interações singulares com outros botões.

O mapeamento de Axis, trabalha interações que dependem de um eixo para ocorrer, como o movimento do personagem e da câmera, permitem entradas que têm um alcance contínuo. Já as interações Actions são para pressionamentos de teclas e lançamentos, ou seja não são continuas.

Clique 1 vez no + ao lado de Axis Mappings, note que surgiu uma seta ao lado esquerdo.

1 vez no + ao lado de Axis Mappings, note que surgiu uma seta ao lado

Clicando nela acessamos um sub menu.

Agora temos um caixa com o texto “NewAxisMapping”, e abaixo dela temos um menu onde

Agora temos um caixa com o texto “NewAxisMapping”, e abaixo dela temos um menu onde é possível escolher teclas para diferentes tipos de interação. Renomeie o texto da caixa para um texto correspondente aos movimentos de “ir para frente e ir para trás” e escolha a tecla do teclado correspondente ao movimento de “frente”.

do teclado correspondente ao movimento de “frente”. A tecla “W” no teclado foi definida como interação

A tecla “W” no teclado foi definida como interação de ir para frente, mas o texto do comando diz “FrenteTras” então precisamos de outra tecla que fará o comando contrário, para atribuirmos outra tecla a este evendo clicamos no símbolo +, dessa vez ao lado da caixa de texto que digitamos “FrenteTrasCMD”.

ao lado da caixa de texto que digitamos “FrenteTrasCMD”. Agora poderemos atribuir mais uma tecla a

Agora poderemos atribuir mais uma tecla a esta função, usaremos o “S” e para garantir que ao apertamos ele o personagem vá para trás deveremos colocar o valor negativo em Scale.

Dessa forma ao apertamos “S” pegaremos os mesmos valores dos futuros códigos que atribuiremos a

Dessa forma ao apertamos “S” pegaremos os mesmos valores dos futuros códigos que atribuiremos a este evento (FrenteTrasCMD) porém esses valores serão negativos. Para adicionar mais Axis Mappings clique mais uma vez no símbolo + ao lado de Axis Mappings. Precisaremos de mais 3 eventos de interação e um Action Mapping.

de mais 3 eventos de interação e um Action Mapping. Conclua repetindo este esquema. Nós acabamos

Conclua repetindo este esquema.

e um Action Mapping. Conclua repetindo este esquema. Nós acabamos de definir Eventos de interação com

Nós acabamos de definir Eventos de interação com os controles do jogo (no caso teclado e mouse) esses eventos serão validados quando fazermos a devida interação

deles com os comandos Blueprints responsáveis pelo deslocamento do personagem. Antes de irmos para esse passo, vamos criar outra Classe Blueprint denominada GameMode.

Game Mode

O GameMode é responsável por algumas definições importantes em nosso projeto, uma delas é justamente a definição de quem é personagem que iremos controlar.

Para criar um novo GameMode clique na opção Blueprints na Toolbar e siga o caminho mostrado na figura abaixo.

na Toolbar e siga o caminho mostrado na figura abaixo. Nomeie o novo GameMode como desejar

Nomeie o novo GameMode como desejar e coloque-o em uma paste adequada nesta etapa da configuração.

No GameMode Editor vá ao painel Detail, mais precisamente a opção Depauf Pawn Class. Após

No GameMode Editor vá ao painel Detail, mais precisamente a opção Depauf Pawn Class.

Detail, mais precisamente a opção Depauf Pawn Class. Após encontrar o nome que você colocou no

Após encontrar o nome que você colocou no seu Player clique nele definindo-o como o “protagonista” do jogo.

Para que este GameMode funcione em sua fase você deve voltar ao Level Editor e ir no Menu World Settings.

Ele fica em outra aba ao lado do painel Details. Na opção GameMode Override, clique

Ele fica em outra aba ao lado do painel Details.

Ele fica em outra aba ao lado do painel Details. Na opção GameMode Override, clique e

Na opção GameMode Override, clique e escolha o GameMode que você acabou de criar.

clique e escolha o GameMode que você acabou de criar. Caso queira que este mesmo GameMod

Caso queira que este mesmo GameMode funcione em todas as fases do seu game de uma vez só, sem precisar ficar fazendo essa configuração no World Settings, vá ao Project Settings e clique em Maps Modes, ele é uma das opções de Projct.

Certifique-se de que o seu GameMode esteja na Aba Defaut GameMode. Agora retorne ao Editor

Certifique-se de que o seu GameMode esteja na Aba Defaut GameMode.

de que o seu GameMode esteja na Aba Defaut GameMode. Agora retorne ao Editor do nosso

Agora retorne ao Editor do nosso PlayerBP. Configurando Movimento

Caso você veja essa expansão de Class Defauts ao abrir a classe Blueprint do Player,

Caso você veja essa expansão de Class Defauts ao abrir a classe Blueprint do Player, e queira voltar a visualizar o Editor da forma padrão, basta clicar no texto azul “Open “Full Blueprint Editor” localizado no topo da aba.

Vamos agora para a Aba Event Graph.

no topo da aba. Vamos agora para a Aba Event Graph. Selecione e delete esses nós

Selecione e delete esses nós nativos. Depois clique com o botão direito e traga os events Axis e Action que criamos, basta digitar o nome que demos a eles.

Vamos configurar primeiro a interação FrenteTrasCMD. Precisaremos de um nó Add Moviment Input, para dizermos

Vamos configurar primeiro a interação FrenteTrasCMD. Precisaremos de um nó Add Moviment Input, para dizermos que este evento agora interagirá com os inputs de movimentação.

evento agora interagirá com os inputs de movimentação. Precisamos de um Vector como retorno de World

Precisamos de um Vector como retorno de World Direction, o nó Get Forward Vector justamente trabalha nas direções correspondente, frente e trás.

Fazemos dele a condição de World Direction . Lembre-se de compilar e salvar. Podemos testar

Fazemos dele a condição de World Direction. Lembre-se de compilar e salvar.

de World Direction . Lembre-se de compilar e salvar. Podemos testar nosso comando agora se quisermos

Podemos testar nosso comando agora se quisermos e ao jogar o player na cena ao apertamos as teclas que escolhemos para FrenteTrasCMD, vamos o personagem se mover para frente e para trás.

Caso não esteja funcionando corretamente retorne ao passe anterior e confira os nomes dos Nós

Caso não esteja funcionando corretamente retorne ao passe anterior e confira os nomes dos Nós e suas Ligações.

Agora voltemos para o Event Graph do nosso Player e vamos configurar os movimentos de esquerda e direita.

e vamos configurar os movimentos de esquerda e direita. Repita o nó Add Moviment Input mas

Repita o nó Add Moviment Input mas dessa vez o Vector trabalhará os valores de esquerda e direita, com isso escolheremos o nó Get Right Vector. Se dermos play na nossa fase agora, além de se mover para a frente e para trás o personagem se moverá para esquerda e direita também.

Mas ele não está girando em seu eixo quando o movemos. Para que ele faça isso devemos clicar no Self do nosso player, que fica no topo do menu Components.

Depois vamos desmarcar Use Control Rotation YAW, no painel Detail. Voltando ao Painel Components, dessa

Depois vamos desmarcar Use Control Rotation YAW, no painel Detail.

vamos desmarcar Use Control Rotation YAW, no painel Detail. Voltando ao Painel Components, dessa vez vamos

Voltando ao Painel Components, dessa vez vamos em CharacterMoviment. Depois de clicar nesta opção procure no painel Details a opção Orient Rotation To Movement e marque.

Details a opção Orient Rotation To Movement e marque. Agora ao dar play no Level nós

Agora ao dar play no Level nós podemos ver que o personagem gira respeitando o caminho que fazemos.

Agora para a câmera Porém há alguma coisa errada com a rotação do player, será

Agora para a câmera

Agora para a câmera Porém há alguma coisa errada com a rotação do player, será que

Porém há alguma coisa errada com a rotação do player, será que você

consegue identificar?

Ao posicionarmos a câmera e apertamos para o player seguir, sua orientação permanece a mesma de quando o Level foi iniciado, ou seja, ele não respeita a orientação da câmera para mudar de direção, isso não deixa a jogabilidade muito atrativa.

Tudo certo

Para concertar isso precisamos unir os dois Vector, que são as funções de retorno de nossos eventos Axis a um Get Control Rotation.

Utilizaremos os nós Make rotation e Break Rotation como intermediários, ligados pela rotação no eixo

Utilizaremos os nós Make rotation e Break Rotation como intermediários, ligados pela rotação no eixo YAW

como intermediários, ligados pela rotação no eixo YAW Vamos agora testar se ao rotacionalrmos a câmera

Vamos agora testar se ao rotacionalrmos a câmera o player segue as novas direções que a câmera determinar como frente, costas e esquerda e direita

Ótimo, agora vamos configurar os comandos do pulo. Basta adicionar o nó Jump e Stop

Ótimo, agora vamos configurar os comandos do pulo. Basta adicionar o nó Jump e Stop jump ao evento que criamos.

Ótimo, agora vamos configurar os comandos do pulo. Basta adicionar o nó Jump e Stop jump
Perfeito! Nosso player se move para todos os lados, pula e sua câmera orienta seu

Perfeito! Nosso player se move para todos os lados, pula e sua câmera orienta seu eixo de movimentação, e também se move bem nos eixos determinados, agora podemos passar pra o próximo passo, configurar as animações.

Animation Blueprint

Importe as animações correspondentes ao seu player, elas têm de ter Idle (animação onde o personagem encontra-se de pé em repouso), andar, correr saltar e caindo.

Na hora de importar a animação marque o Skeleton como o do seu player.

a animação marque o Skeleton como o do seu player. Com as animações em sua devida

Com as animações em sua devida pasta, iremos agora criar um Animation Blueprint.

Para criarmos um Animation Blueprint clique com o botão direito em um espaço vazio do

Para criarmos um Animation Blueprint clique com o botão direito em um espaço vazio do Content Browser e siga o caminho ilustrado abaixo.

vazio do Content Browser e siga o caminho ilustrado abaixo. Nesta próxima opção definimos o esqueleto

Nesta próxima opção definimos o esqueleto do personagem, AnimStance e clicamos em OK.

siga o caminho ilustrado abaixo. Nesta próxima opção definimos o esqueleto do personagem, AnimStance e clicamos

Este é Anim Editor devemos criar um novo Estado de Animação para prosseguirmos. Clique com o botão direito do mouse e digite Add New State Machine.

o botão direito do mouse e digite Add New State Machine. Renomeie o novo State Machine

Renomeie o novo State Machine como achar melhor e faça a ligação demonstrada abaixo.

como achar melhor e faça a ligação demonstrada abaixo. Clique duas vezes no State Machine que

Clique duas vezes no State Machine que você adicionou para entrar em outra camada da edição de animações.

O nó Entry define o estado primário da animação, tudo que ligarmos a ele será

O nó Entry define o estado primário da animação, tudo que ligarmos a ele será imediatamente executado. Vamos fazer um pequeno teste. Note que na aba abaixo denominada Asset Bowser estão listadas todas as animações que importamos para este personagem. Clique em uma delas e arraste até ao lado de Entry.

Agora puxe uma ligação de Entry até o nó que contém a animação que arrastamos.

de Entry até o nó que contém a animação que arrastamos. Para testarmos nosso Animation Blueprint

Para testarmos nosso Animation Blueprint precisamos selecioná-lo no Blueprint de nosso player, então vamos compilar e salvar essa animação e abrir o PlayerBP.

Clique no Mesh do player na aba Components, depois no painel Details procure Anim Class.

Procure na lista que aparece o Animation Blueprint que você criou e clique nele para
Procure na lista que aparece o Animation Blueprint que você criou e clique nele para

Procure na lista que aparece o Animation Blueprint que você criou e clique nele para definí-lo para seu personagem.

Repare que assim que fazemos isso o personagem incorpora automaticamente a animação que ligamos ao nó Entry.

automaticamente a animação que ligamos ao nó Entry. Caso dermos Player em nosso jogo agora, notamos

Caso dermos Player em nosso jogo agora, notamos que, não iporta qual comando dermos o personagem responderá a todos com a mesma animação. Isso não é interessante para nosso projeto, então vamos prosseguir para o próximo passo.

Entendemos agora como funciona a interação de animações com o Entry. Precisamos agora fazer com que o personagem produza animações mais realistas de respostas, como ficar parado quando não o movemos e dobrar os joelhos e impulsionar-se para cima quando apertamos o comando de pular. Para o primeiro exemplo precisamos criar um Blad Space 1D.

Blend Space 1D

Clique com o botão direito no Content Browser e siga mais uma vez a imagem abaixo para criar um Blend Space 1D

Blend Spaces são Assets especiais que permitem um arranjo e mistura de animações com base nos valores de duas entradas. A mistura simples entre duas animações com base em uma única entrada pode ser realizada usando um dos nós de mistura padrão disponíveis em Animation Blueprints. Os Blend Spaces fornecem um meio de fazer misturas mais complexas

entre várias animações baseadas em múltiplos valores.

entre várias animações baseadas em múltiplos valores. Nomeie o BlendSpace levando em conta que haverão
entre várias animações baseadas em múltiplos valores. Nomeie o BlendSpace levando em conta que haverão

Nomeie o BlendSpace levando em conta que haverão trnasições de estados de animação, como Parado, andando e correndo, é sempre bom deixar uma pista no texto que nomamos nossas classes, do que essas se tratam.

Para configurarmos nossa Mistura de animações precisamos colocar uma animção para o estado zero e outra em outro ponto em que o personagem aumente sua velocidade.

Vamos arrastar a animação de Idle do Asset Browser até o marco 0 na linha

Vamos arrastar a animação de Idle do Asset Browser até o marco 0 na linha de transição.

do Asset Browser até o marco 0 na linha de transição. Agora vamos colocar a animação

Agora vamos colocar a animação em que personagem corre no marco 100.

Note que transitar o mouse entre os 2 estados vemos a transição suave dos mesmos.

Note que transitar o mouse entre os 2 estados vemos a transição suave dos mesmos. Agora criamos uma animação de transição, para que o nosso personagem saia do estado repouso para o movimento de forma mais agradável aos nossos olhos.

Precisamos agora voltar ao Animation Blueprint para configurarmos corretamente nosso Blend Space lá. Salve e abra o Animation.

nosso Blend Space lá. Salve e abra o Animation. Delete esse nó que ligamos a Entry

Delete esse nó que ligamos a Entry, como teste. E agora arraste nossa recém-criada Blend Space 1D para essa mesma ligação.

Clique 2 vezes para acessar o nó que contém nosso BlendSpace 1D. Nós vemos agora

Clique 2 vezes para acessar o nó que contém nosso BlendSpace 1D.

Nós vemos agora um nó que representa uma instancia de nosso BlendSpace 1D, ele contém uma condição None, que possui um zero, seguido de uma vírgula e um monte de outros zeros. Vamos entender de que forma essa condição influencia na nossa BlendSpace 1D? lembra que lá colocamos a animação Idle no marco 0 e correr no marco 100? Então veja o que acontece com a figura do seu player quando digitamos 100 na condição None e compilamos.

player quando digitamos 100 na condição None e compilamos. O personagem no topo esquerdo agora corre.

O personagem no topo esquerdo agora corre. Isso acontece pois acabamos de acessar aquela reta da Blend Space 1D. O processo que vamos iniciar agora nos garantirá que essa mesma reta seja acessada por nossos botões de interação.

Crie uma variável Float com o nome “Velocidade” e a arraste pra cena a conectando como condição de nossa BlendSpace1D.

cena a conectando como condição de nossa BlendSpace1D. Agora vamos na aba ao lado EventGraph. Arraste

Agora vamos na aba ao lado EventGraph.

nossa BlendSpace1D. Agora vamos na aba ao lado EventGraph. Arraste a variável, dessa vez como Set,

Arraste a variável, dessa vez como Set, e faça a seguinte ligação.

Para acessarmos os Inputs do personagem precisamos dos nós Get Velocity e Vector Lengh, arraste

Para acessarmos os Inputs do personagem precisamos dos nós Get Velocity e Vector Lengh, arraste uma ligação de Try Get Pawn Owner e chame um nó depois o outro.

arraste uma ligação de Try Get Pawn Owner e chame um nó depois o outro. Vamos

Vamos agora testar no game nosso progresso.

Perfeito! Agora vamos a animação de Pulo. Voltemos para Animation BP.
Perfeito! Agora vamos a animação de Pulo. Voltemos para Animation BP.

Perfeito! Agora vamos a animação de Pulo. Voltemos para Animation BP.

Editando Animações

Editando Animações Precisamos criar um esquema com 3 animação para o pulo, uma animação de início

Precisamos criar um esquema com 3 animação para o pulo, uma animação de início de pulo, outra para quando o personagem estiver em queda e outra com o final do pulo, porém temos no exemplo 2 animações de pulo, uma em que o personagem inicia um pouco antes do salto e termina um pouco depois de pousar no chão, e outra em que o personagem está caindo até que encontra o chão. Nós temos então de editar estas duas animações para funcionarem corretamente dentro de nosso esquema. Para isso vá até a pasta de animações e duplique a animação de Pulo.

até a pasta de animações e duplique a animação de Pulo. Clique 2 vezes para editar

Clique 2 vezes para editar a do início.

Pause a animação para trabalhar melhor. Posicione a barra vermelha manualmente um pouco antes do personagem tirar os pés do chão, pouquíssimos frames antes.

Clique com o botão direito sobre a posição escolhida e apague os frames iniciais. Mova

Clique com o botão direito sobre a posição escolhida e apague os frames iniciais.

sobre a posição escolhida e apague os frames iniciais. Mova manualmente a barrinha vermelha até um

Mova manualmente a barrinha vermelha até um pouco depois que os pés saem do chão, e apague os frames depois da marcação atual.

Salve e pronto temos o início do nosso pulo. Vamos abrir agora a próxima animação,

Salve e pronto temos o início do nosso pulo. Vamos abrir agora a próxima animação, Pulo Final.

Dessa vez mova os frames até antes dos pés retornarem ao chão, e apague os anteriores.

antes dos pés retornarem ao chão, e apague os anteriores. Depois que ele encostar no chão

Depois que ele encostar no chão e dobrar um pouquinho os joelhos apague os frames seguintes.

Salve. Caso a animação de queda precise de edição faça também. Configurando Animação de Pulo

Salve. Caso a animação de queda precise de edição faça também.

Configurando Animação de Pulo

Vamos agora voltar ao Animation Blueprint.

de Pulo Vamos agora voltar ao Animation Blueprint. Arraste as 3 animações para ficarem nesse esquema

Arraste as 3 animações para ficarem nesse esquema mostrado. Agora vamos fazer as ligações entre esses estados, começando do Bland Space 1D para Pulo_inicio e terminando de Pulo_Final a Bland Space 1D.

Note que agora nossas ligações possuem um círculo branco no meio, é ai que definiremos

Note que agora nossas ligações possuem um círculo branco no meio, é ai que definiremos a condição de transição do pulo, e parte do processo de interação com os controladores.

Clique 2 vezes no círculo entre a Bland Space 1D e Pulo_inicio.

2 vezes no círculo entre a Bland Space 1D e Pulo_inicio. Devemos aqui criar uma variável

Devemos aqui criar uma variável Bolean que indique se o pulo é verdadeiro ou falso.

Repita os seguintes esquemas respectivamente para os próximos nós. , Antes de irmos para o

Repita os seguintes esquemas respectivamente para os próximos nós.

,
,
seguintes esquemas respectivamente para os próximos nós. , Antes de irmos para o próximo passo certifique-se
seguintes esquemas respectivamente para os próximos nós. , Antes de irmos para o próximo passo certifique-se
seguintes esquemas respectivamente para os próximos nós. , Antes de irmos para o próximo passo certifique-se
seguintes esquemas respectivamente para os próximos nós. , Antes de irmos para o próximo passo certifique-se
seguintes esquemas respectivamente para os próximos nós. , Antes de irmos para o próximo passo certifique-se

Antes de irmos para o próximo passo certifique-se de que todas as animações não estão em Loop. Clique duas vezes em cada um dos nós das animações da sequência de pulo e desmarque Loop Animator. Repita isso nas 3 animações de pulo.

Conclusão Agora vamos ao EventGraph e fazemos o seguinte esquema para acessarmos a animação de

Conclusão

Agora vamos ao EventGraph e fazemos o seguinte esquema para acessarmos a animação de pulo corretamente ao apertar a Barra de Espaço no game.

seguinte esquema para acessarmos a animação de pulo corretamente ao apertar a Barra de Espaço no

Vamos ao teste.

Perfeito! E assim concluímos nossas configurações básicas para um Player de um prjeto Third Person.

Perfeito!

E assim concluímos nossas configurações básicas para um Player de um prjeto Third Person.

Configurando Player Character

Side Scroller

Configurando Player Character

Side Scroller

Neste capítulo veremos como configurar um personagem jogável a partir de um projeto Blank da Engine Unreal 4, convertendo o projeto para a jogabilidade Side Scroller. Iremos definir seus controles de interação bem como suas animações de resposta.

Configurações Iniciais

Como dito anteriormente, este projeto terá como base um template Blank, com isso selecione este template, certifique-se de estar na aba Blueprint, e não C++.

certifique-se de estar na aba Blueprint, e não C++. Após o Unreal Editor ter iniciadocrie uma

Após o Unreal Editor ter iniciadocrie uma pasta para o personagem que você deseja trazer, dentro desta paste crie mais 3 pastas, para Textura, Material e Animação. Feito isso clique no botão Import localizado no menu Content Browser.

no botão Import localizado no menu Content Browser . Traga o modelo 3D do personagem que

Traga o modelo 3D do personagem que deseja configurar. É importante certificar-se que este modelo possua esqueleto, caso contrário não será possível atrelar as animações a ele.

Este painel possui configurações de importação, ele é dividido em 4 abas: Configurações de Mesh;

Este painel possui configurações de importação, ele é dividido em 4 abas:

Configurações de Mesh; Animação; Transformação e Materal. Não faremos alterações neste menu para o nosso personagem, mas caso você queira trazer animações junto do mesh marque Import Animations, para alterar a escala do personagem caso ele venha muito pequeno ou muito grande para Engine reimporte e configure Import Uniform Scale. Caso você prefira configurar o material, do zero, dentro da Unreal, desmarque Import Materials ou Import Textures.

Unreal, desmarque Import Materials ou Import Textures . Além do mesh mais 2 arquivos são importados

Além do mesh mais 2 arquivos são importados Physics Assets e o Skeleton. Caso seu modelo tenha vindo com muitos materiais e texturas soltos organize-os nas pastas correspondentes. Depois do mesh importado e organizado iremos agora criar uma Classe Blueprint do tipo Character. Para isso clique com o botão direito do mouse num espaço vazio dentro da pasta do Player, e escolha a opção Blueprint Class.

Após informar que queremos criar uma nova classe Blueprint devemos agora escolher qual tipo de

Após informar que queremos criar uma nova classe Blueprint devemos agora escolher qual tipo de classe queremos criar. Interagiremos agora com o painel Pick Parent Class, para nosso player devemos escolher Character.

Class , para nosso player devemos escolher Character . Nomeie a nova classe como quiser, uma

Nomeie a nova classe como quiser, uma dica é colocar as siglas BP depois do nome escolhido para identificar com facilidade no futuro, que se trata de uma classe Blueprint.

Vamos agora configurar nosso Player Blueprint, clique duas vezes no seu ícone para abrirmos o

Vamos agora configurar nosso Player Blueprint, clique duas vezes no seu ícone para abrirmos o editor.

Vamos agora configurar nosso Player Blueprint, clique duas vezes no seu ícone para abrirmos o editor.

No painel Components clique na opção Mesh. Agora vá no painel Details (a direita) e na aba Mesh abara as opções clicando na seta ao lado de None. Escolha o modelo 3D do player que você acabou de importar.

Escolha o modelo 3D do player que você acabou de importar. Normalmente ele vem rotacionado de
Escolha o modelo 3D do player que você acabou de importar. Normalmente ele vem rotacionado de

Normalmente ele vem rotacionado de forma diferente das configurações do player, para posicioná-lo de forma correta basta girar o mesh até o lado da frente dele

respeitar a direção que o ArrowComponent aponta, -90 graus no eixo Z no nosso exemplo.

aponta, -90 graus no eixo Z no nosso exemplo. Depois disso é interessante fazer o mesh

Depois disso é interessante fazer o mesh do personagem respeitar a altura da capsula, suba-o até que seus pés fiquem dentro da base da capsula.

suba-o até que seus pés fiquem dentro da base da capsula. Agora vamos adicionar 2 componente

Agora vamos adicionar 2 componente essenciais para nosso Player. Clique no botão verde Add Component, fica no topo do painel Component. Procure por “ApringArme clique nele para adicionar.

Agora procure por Camera para adicionar este componente também. O ApringArm é responsável por regular

Agora procure por Camera para adicionar este componente também.

procure por Camera para adicionar este componente também. O ApringArm é responsável por regular a distância

O ApringArm é responsável por regular a distância da câmera para o Player com isso

a câmera deve estar atrelada a ele. Para atralarmos a câmera aqui devemos torna-la

“Child” do ApringArm, arraste a câmera até o Srping Arm e solte nele para isso. Note que depois disso a câmera foi sozinha até a outra extremidade do ApringArm.

a câmera foi sozinha até a outra extremidade do ApringArm. Feito isso clique em SrpingArm e

Feito isso clique em SrpingArm e no painel Details marque a opção “Use Pawn Control Rotation”. Vamos fazer mais 2 configurações agora. Ainda no painel Detail, vamos inverter a posição da câmera para com o player aumentar a altura do braço, ponha - 500 em Target Arm Length e em target Offset marcamos 150 somente no eixo Z, isso erguerá um pouco o SpringArm.

Agora vamos clicar na Camera, lá no painel Components, para ajustar sua visão do player.

Agora vamos clicar na Camera, lá no painel Components, para ajustar sua visão do player. No seu painel Detail em Rotation eixo y vamos colocar o valor 334, isso fará com que ela se centralize no Player.

Feito isso definimos a aparência de nosso Player Character, agora precisamos definir seus controles e em seguida configurar as animações.

No Level Editor, clique em Edit e depois em Project Settings.

Level Editor, clique em Edit e depois em Project Settings. Axis e Action Mappings Dentro de

Axis e Action Mappings

Dentro de Project Settings procure do lado esquerdo a opção Input, ela é um dos itens pertencentes a aba Engine.

Agora na opção Bindings nós definimos os mecanismos básicos de interação de nosso jogo com

Agora na opção Bindings nós definimos os mecanismos básicos de interação de nosso jogo com as teclas e botões de nossos controles.

de nosso jogo com as teclas e botões de nossos controles. O que são AXIS e

O que são AXIS e ACTION MAPPINGS?

Toda ação que o nosso player faz, depende de interações com botões, nós podemos setar diretamente na Event Graph do Player a Barra de Espaço para pular e o botão W para correr, ou X do controle para atacar, mas como forma de dinamizar as definições e padrões de nossos controles, é possível criar aqui na aba Bindings os comandos gerais, e mais tarde instanciá-los como Nós Blueprints para definirmos os códigos. Isso facilita nossa vida de várias formas, uma delas é caso o nosso game tenha múltiplos players, as definições básicas de movimento e câmera que serão as mesmas para todos podem ser criadas aqui, e nó Event Graph de cada criaríamos apenas interações singulares com outros botões.

O mapeamento de Axis, trabalha interações que dependem de um eixo para ocorrer, como o movimento do personagem e da câmera, permitem entradas que têm um alcance contínuo. Já as interações Actions são para pressionamentos de teclas e lançamentos, ou seja não são continuas.

Clique 1 vez no + ao lado de Axis Mappings, note que surgiu uma seta ao lado esquerdo.

Axis Mappings , note que surgiu uma seta ao lado esquerdo. Clicando nela acessamos um sub

Clicando nela acessamos um sub menu.

seta ao lado esquerdo. Clicando nela acessamos um sub menu. Agora temos um caixa com o

Agora temos um caixa com o texto “NewAxisMapping”, e abaixo dela temos um menu onde é possível escolher teclas para diferentes tipos de interação. Renomeie o texto da caixa para um texto correspondente aos movimentos de “ir para Direita e ir para Esquerda” e escolha a tecla do teclado correspondente ao movimento de “Direita”.

de “ir para Direita e ir para Esquerda ” e escolha a tecla do teclado correspondente

A tecla “D” no teclado foi definida como interação de ir para direita, mas o texto do comando diz “DirEsqMov” então precisamos de outra tecla que fará o comando contrário, para atribuirmos outra tecla a este evendo clicamos no símbolo +, dessa vez ao lado da caixa de texto que digitamos “DirEsqMov”.

ao lado da caixa de texto que digitamos “ DirEsqMov ”. Agora poderemos a tribuir mais

Agora poderemos atribuir mais uma tecla a esta função, usaremos o “A” e para garantir que ao apertamos este botão o personagem vá para esquerda deveremos colocar o valor negativo em Scale.

Dessa forma ao apertamos “A” pegaremos os mesmos valores dos futuros códigos que atribuiremos a este evento (DirEsqMov) porém esses valores serão negativos.

evento (DirEsqMov) porém esses valores serão negativos. Conclua repetindo este esquema. Nós acabamos de definir

Conclua repetindo este esquema.

Nós acabamos de definir Eventos de interação com os controles do jogo (no caso teclado e mouse) esses eventos serão validados quando fazermos a devida interação deles com os comandos Blueprints responsáveis pelo deslocamento do personagem. Antes de irmos para esse passo, vamos criar outra Classe Blueprint denominada GameMode.

Game Mode

O GameMode é responsável por algumas definições importantes em nosso projeto, uma delas é justamente a definição de quem é personagem que iremos controlar.

Para criar um novo GameMode clique na opção Blueprints na Toolbar e siga o caminho mostrado na figura abaixo.

na Toolbar e siga o caminho mostrado na figura abaixo. Nomeie o novo GameMode como desejar

Nomeie o novo GameMode como desejar e coloque-o em uma paste adequada nesta etapa da configuração.

em uma paste adequada nesta etapa da configuração. No GameMode Editor vá ao painel Detail, mais

No GameMode Editor vá ao painel Detail, mais precisamente a opção Depauf Pawn Class.

Após encontrar o nome que você colocou no seu Player clique nele definindo-o como o

Após encontrar o nome que você colocou no seu Player clique nele definindo-o como o “protagonista” do jogo.

Para que este Game Mode funcione em sua fase você deve voltar ao Level Editor e ir no Menu World Settings.

sua fase você deve voltar ao Level Editor e ir no Menu World Settings . Ele

Ele fica em outra aba ao lado do painel Details.

Na opção GameMode Override, clique e escolha o GameMode que você acabou de criar. Caso

Na opção GameMode Override, clique e escolha o GameMode que você acabou de criar.

clique e escolha o GameMode que você acabou de criar. Caso queira que este mesmo GameMode

Caso queira que este mesmo GameMode funcione em todas as fases do seu game de uma vez só, sem precisar ficar fazendo essa configuração no World Settings, vá ao Project Settings e clique em Maps Modes, ele éuma das opções de Projct.

e clique em Maps Modes , ele éuma das opções de Projct. Certifique-se de que o

Certifique-se de que o seu GameMode esteja na Aba Defaut GameMode.

Agora retorne ao Editor do nosso PlayerBP. Configurando Movimento Caso você veja essa expansão de

Agora retorne ao Editor do nosso PlayerBP.

Configurando Movimento

retorne ao Editor do nosso PlayerBP. Configurando Movimento Caso você veja essa expansão de Class Defauts

Caso você veja essa expansão de Class Defauts ao abrir a classe Blueprint do Player, e queira voltar a visualizar o Editor da forma padrão, basta clicar no texto azul “Open “Full Blueprint Editor” localizado no topo da aba.

Vamos agora para a Aba Event Graph.

Selecione e delete esses nós nativos. Depois clique com o botão direito e traga os

Selecione e delete esses nós nativos. Depois clique com o botão direito e traga os events Axis e Action que criamos, basta digitar o nome que demos a eles.

e Action que criamos, basta digitar o nome que demos a eles. Vamos configurar primeiro a

Vamos configurar primeiro a interação DirEsqMov. Precisaremos de um nó Add Moviment Input, para dizermos que este evento agora interagirá com os inputs de movimentação. Em World Direction adicione o valor de - 1.0 a Y.

Podemos testar nosso comando agora se quisermos e ao jogar o player na cena ao
Podemos testar nosso comando agora se quisermos e ao jogar o player na cena ao

Podemos testar nosso comando agora se quisermos e ao jogar o player na cena ao apertamos as teclas que escolhemos para DirEsqMov, vamos o personagem se mover para direita e para esquerda.

Caso não esteja funcionando corretamente retorne ao passe anterior e confira os nomes dos Nós

Caso não esteja funcionando corretamente retorne ao passe anterior e confira os nomes dos Nós e suas Ligações.

Mas ele não está girando em seu eixo quando o movemos. Para que ele faça isso devemos clicar no Self do nosso player, que fica no topo do menu Components.

Self do nosso player, que fica no topo do menu Components. Depois vamos desmarcar Use Control

Depois vamos desmarcar Use Control Rotation YAW, no painel Detail.

vamos desmarcar Use Control Rotation YAW, no painel Detail. Voltando ao Painel Components, dessa vez vamos

Voltando ao Painel Components, dessa vez vamos em CharacterMoviment. Depois de clicar nesta opção procure no painel Details a opção Orient Rotation To Movement e marque.

Agora ao dar play no Level nós podemos ver que o personagem gira respeitando o

Agora ao dar play no Level nós podemos ver que o personagem gira respeitando o caminho que fazemos.

Ótimo, agora vamos configurar os comandos do pulo. Basta adicionar o nó Jump e Stop jump ao evento que criamos.

Ótimo, agora vamos configurar os comandos do pulo. Basta adicionar o nó Jump e Stop jump
Perfeito! Nosso player se move para direita e esquerda e pula! Agora podemos passar para

Perfeito! Nosso player se move para direita e esquerda e pula! Agora podemos passar para o próximo passo, configurar as animações.

Animation Blueprint

Importe as animações correspondentes ao seu player, elas têm de ter Idle (animação onde o personagem encontra-se de pé em repouso), andar, correr saltar e caindo.

Na hora de importar a animação marque o Skeleton como o do seu player.

a animação marque o Skeleton como o do seu player. Com as animações em sua devida

Com as animações em sua devida pasta, iremos agora criar um Animation Blueprint.

Para criarmos um Animation Blueprint clique com o botão direito em um espaço vazio do

Para criarmos um Animation Blueprint clique com o botão direito em um espaço vazio do Content Browser e siga o caminho ilustrado abaixo.

do Content Browser e siga o caminho ilustrado abaixo. Nesta próxima opção definimos o esqueleto do

Nesta próxima opção definimos o esqueleto do personagem, AnimStance e clicamos em OK.

o caminho ilustrado abaixo. Nesta próxima opção definimos o esqueleto do personagem, AnimStance e clicamos em

Este é Anim Editor devemos criar um novo Estado de Animação para prosseguirmos. Clique com o botão direito do mouse e digite Add New State Machine.

o botão direito do mouse e digite Add New State Machine. Renomeie o novo State Machine

Renomeie o novo State Machine como achar melhor e faça a ligação demonstrada abaixo.

como achar melhor e faça a ligação demonstrada abaixo. Clique duas vezes no State Machine que

Clique duas vezes no State Machine que você adicionou para entrar em outra camada da edição de animações.

O nó Entry define o estado primário da animação, tudo que ligarmos a ele será

O nó Entry define o estado primário da animação, tudo que ligarmos a ele será imediatamente executado. Vamos fazer um pequeno teste. Note que na aba abaixo denominada Asset Bowser estão listadas todas as animações que importamos para este personagem. Clique em uma delas e arraste até ao lado de Entry.

Agora puxe uma ligação de Entry até o nó que contém a animação que arrastamos.

de Entry até o nó que contém a animação que arrastamos. Para testarmos nosso Animation Blueprint

Para testarmos nosso Animation Blueprint precisamos selecioná-lo no Blueprint de nosso player, então vamos compilar e salvar essa animação e abrir o PlayerBP.

Clique no Mesh do player na aba Components, depois no painel Details procure Anim Class.

Procure na lista que aparece o Animation Blueprint que você criou e clique nele para
Procure na lista que aparece o Animation Blueprint que você criou e clique nele para

Procure na lista que aparece o Animation Blueprint que você criou e clique nele para definí-lo para seu personagem.

Repare que assim que fazemos isso o personagem incorpora automaticamente a animação que ligamos ao nó Entry.

automaticamente a animação que ligamos ao nó Entry. Caso dermos Player em nosso jogo agora, notamos

Caso dermos Player em nosso jogo agora, notamos que, não iporta qual comando dermos o personagem responderá a todos com a mesma animação. Isso não é interessante para nosso projeto, então vamos prosseguir para o próximo passo.

Entendemos agora como funciona a interação de animações com o Entry. Precisamos agora fazer com que o personagem produza animações mais realistas de respostas, como ficar parado quando não o movemos e dobrar os joelhos e impulsionar-se para cima quando apertamos o comando de pular. Para o primeiro exemplo precisamos criar um Blad Space 1D.

Blend Space 1D

Clique com o botão direito no Content Browser e siga mais uma vez a imagem abaixo para criar um Blend Space 1D

Blend Spaces são Assets especiais que permitem um arranjo e mistura de animações com base nos valores de duas entradas. A mistura simples entre duas animações com base em uma única entrada pode ser realizada usando um dos nós de mistura padrão disponíveis em Animation Blueprints. Os Blend Spaces fornecem um meio de fazer misturas mais complexas

entre várias animações baseadas em múltiplos valores.

entre várias animações baseadas em múltiplos valores. Nomeie o BlendSpace levando em conta que haverão
entre várias animações baseadas em múltiplos valores. Nomeie o BlendSpace levando em conta que haverão

Nomeie o BlendSpace levando em conta que haverão trnasições de estados de animação, como Parado, andando e correndo, é sempre bom deixar uma pista no texto que nomamos nossas classes, do que essas se tratam.

Para configurarmos nossa Mistura de animações precisamos colocar uma animção para o estado zero e outra em outro ponto em que o personagem aumente sua velocidade.

Vamos arrastar a animação de Idle do Asset Browser até o marco 0 na linha

Vamos arrastar a animação de Idle do Asset Browser até o marco 0 na linha de transição.

do Asset Browser até o marco 0 na linha de transição. Agora vamos colocar a animação

Agora vamos colocar a animação em que personagem corre no marco 100.

Note que transitar o mouse entre os 2 estados vemos a transição suave dos mesmos.

Note que transitar o mouse entre os 2 estados vemos a transição suave dos mesmos. Agora criamos uma animação de transição, para que o nosso personagem saia do estado repouso para o movimento de forma mais agradável aos nossos olhos.

Precisamos agora voltar ao Animation Blueprint para configurarmos corretamente nosso Blend Space lá. Salve e abra o Animation.

nosso Blend Space lá. Salve e abra o Animation. Delete esse nó que ligamos a Entry,

Delete esse nó que ligamos a Entry, como teste. E agora arraste nossa recém criada Blend Space 1D para essa mesma ligação.

Clique 2 vezes para acessar o nó que contém nosso BlendSpace 1D. Nós vemos agora

Clique 2 vezes para acessar o nó que contém nosso BlendSpace 1D.

Nós vemos agora um nó que representa uma instancia de nosso BlendSpace 1D, ele contem uma condição None, que possui um zero, seguido de uma vírgula e um monte de outros zeros. Vamos entender de que forma essa condição influencia na nossa BlendSpace 1D? lembra que lá colocamos a animação Idle no marco 0 e correr no marco 100? Então veja o que acontece com a figura do seu player quando digitamos 100 na condição None e compilamos.

player quando digitamos 100 na condição None e compilamos. O personagem no topo esquerdo agora corre.

O personagem no topo esquerdo agora corre. Isso acontece pois acabamos de acessar aquela reta da Blend Space 1D. O processo que vamos iniciar agora nos garantirá que essa mesma reta seja acessada por nosso botões de interação.

Crie uma variável Float com o nome “Velocidade” e a arraste pra cena a conectando como condição de nossa BlendSpace1D.

cena a conectando como condição de nossa BlendSpace1D. Agora vamos na aba ao lado EventGraph. Arraste

Agora vamos na aba ao lado EventGraph.

nossa BlendSpace1D. Agora vamos na aba ao lado EventGraph. Arraste a variável, dessa vez como Set,

Arraste a variável, dessa vez como Set, e faça a seguinte ligação.

Para acessarmos os Inputs do personagem precisamos dos nós Get Velocity e Vector Lengh, arraste

Para acessarmos os Inputs do personagem precisamos dos nós Get Velocity e Vector Lengh, arraste uma ligação de Try Get Pawn Owner e chame um nó depois o outro.

arraste uma ligação de Try Get Pawn Owner e chame um nó depois o outro. Vamos

Vamos agora testar no game nosso progresso.

Perfeito! Agora vamos a animação de Pulo. Voltemos para Animation BP. Editando Animações
Perfeito! Agora vamos a animação de Pulo. Voltemos para Animation BP. Editando Animações

Perfeito! Agora vamos a animação de Pulo. Voltemos para Animation BP.

Editando Animações

Perfeito! Agora vamos a animação de Pulo. Voltemos para Animation BP. Editando Animações

Precisamos criar um esquema com 3 animação para o pulo, uma animação de inicio de pulo, outra para quando o personagem estiver em queda e outra com o final do pulo, porém temos no exemplo 2 animações de pulo, uma em que o personagem incia um pouco antes do salto e termina um pouco depois de pousar no chão, e outra em que o personagem está caindo até que encontra o chão. Nós temos então de editar estas duas animações para funcionarem corretamente dentro de nosso esquema. Para isso vá até a pasta de animações e duplique a animação de Pulo.

até a pasta de animações e duplique a animação de Pulo. Clique 2 vezes para editar

Clique 2 vezes para editar a do início.

Pause a animação para trabalhar melhor. Posicione a barra vermelha manualmente um pouco antes do personagem tirar os pés do chão, pouquíssimos frames antes.

tirar os pés do chão, pouquíssimos frames antes. Clique com o botão direito sobre a posição

Clique com o botão direito sobre a posição escolhida e apague os frames iniciais.

Mova manualmente a barrinha vermelha até um pouco depois que os pés saem do chão,

Mova manualmente a barrinha vermelha até um pouco depois que os pés saem do chão, e apague os frames depois da marcação atual.

do chão, e apague os frames depois da marcação atual. Salve e pronto temos o início

Salve e pronto temos o início do nosso pulo. Vamos abrir agora a próxima animação, Pulo Final.

Dessa vez mova os frames até antes dos pés retornarem ao chão, e apague os anteriores.

Depois que ele encostar no chão e dobrar um pouquinho os joelhos apague os frames

Depois que ele encostar no chão e dobrar um pouquinho os joelhos apague os frames seguintes.

e dobrar um pouquinho os joelhos apague os frames seguintes. Salve. Caso a animação de queda

Salve. Caso a animação de queda precise de edição faça também.

Configurando Animação de Pulo

Vamos agora voltar ao Animation Blueprint.

de Pulo Vamos agora voltar ao Animation Blueprint. Arraste as 3 animações para ficarem nesse esquema

Arraste as 3 animações para ficarem nesse esquema mostrado. Agora vamos fazer as ligações entre esses estados, começando do Bland Space 1D para Pulo_inicio e terminando de Pulo_Final a Bland Space 1D.

Pulo_inicio e terminando de Pulo_Final a Bland Space 1D. Note que agora nossas ligações possuem um

Note que agora nossas ligações possuem um círculo branco no meio, é ai que definiremos a condição de transição do pulo, e parte do processo de interação com os controladores.

Clique 2 vezes no círculo entre a Bland Space 1D e Pulo_inicio.

Devemos aqui criar uma variável Bolean que indique se o pulo é verdadeiro ou falso.

Devemos aqui criar uma variável Bolean que indique se o pulo é verdadeiro ou falso.

Bolean que indique se o pulo é verdadeiro ou falso. Repita os seguintes esquemas respectivamente para

Repita os seguintes esquemas respectivamente para os próximos nós.

,
,
que indique se o pulo é verdadeiro ou falso. Repita os seguintes esquemas respectivamente para os
Antes de irmos para o próximo passo certifique-se de que todas as animações não estão
Antes de irmos para o próximo passo certifique-se de que todas as animações não estão
Antes de irmos para o próximo passo certifique-se de que todas as animações não estão
Antes de irmos para o próximo passo certifique-se de que todas as animações não estão

Antes de irmos para o próximo passo certifique-se de que todas as animações não estão em Loop. Clique duas vezes em cada um dos nós das animações da sequência de pulo e desmarque Loop Animator. Repita isso nas 3 animações de pulo.

cada um dos nós das animações da sequência de pulo e desmarque Loop Animator. Repita isso

Conclusão

Agora vamos ao EventGraph e fazemos o seguinte esquema para acessarmos a animação de pulo corretamente ao apertar a Barra de Espaço no game.

de pulo corretamente ao apertar a Barra de Espaço no game. Vamos ao teste. Perfeito! E

Vamos ao teste.

ao apertar a Barra de Espaço no game. Vamos ao teste. Perfeito! E assim concluímos nossas

Perfeito!

E assim concluímos nossas configurações básicas para um Player de um projeto SideScroller.

Adicionando Animações

Animation Blueprint e Animation Montage

Adicionando Animações no State Machine

Neste capítulo iremos adicionar animações ao nossos game characters, deixando as interações mais dinâmicas e arrojadas. Iremos adicionar direto no State Machine, e também aprenderemos a usar o Animation Montage.

Template do Projeto

Para este projeto precisaremos de um Player já configurado com as animações básicas, como mostrado nos capítulos anteriores, e além dessas outras animações como combate e movimentação diferente, para adicionarmos ao projeto.

e movimentação diferente, para adicionarmos ao projeto. Importe as novas animações que adicionaremos ao nosso

Importe as novas animações que adicionaremos ao nosso Player Character, no exemplo iremos adicionar outra animação de correr, e 3 de combate.

Vamos agora criar um BlendSpace 1D de nosso novo estado de movimentação. (para informações sobre como criar uma BlendSpace 1D vá a página 38)

As animações deste exemplo farão o personagem parecer estar segurando uma tocha, porém você pode usar animações que façam o personagem parecer ferido ou andando sobre um lago, ou coisa parecida.

Coloque no frame 0 o Idle deste novo estado, e no frame correspondente ao MaxWalk

Coloque no frame 0 o Idle deste novo estado, e no frame correspondente ao MaxWalk Speed, aqui é 50, a animação de correspondente ao novo estado correndo.

50, a animação de correspondente ao novo estado correndo. Anim Graph do Animation Blueprint do player,

Anim Graph do Animation Blueprint do player, e entre no State Machine.

Ao abrirmos neste exemplo temos apenas o nó advindo do BlandSpace 1D com as animações

Ao abrirmos neste exemplo temos apenas o nó advindo do BlandSpace 1D com as animações bases do player. Iremos adicionar o novo BlendSpace 1D arrastando-o para o Anim Graph.

o novo BlendSpace 1D arrastando-o para o Anim Graph. Arraste e solte o novo BlendSpace no

Arraste e solte o novo BlendSpace no Anim Graph. Apartir do primeiro nó Blendspace, puxe uma ligação até o novo nó, retorne a partir desse último ao primeiro com outra ligação logo em seguida, como mostra a figura abaixo.

Acessando o novo nó, adicione a variável correspondente a “V e locidade” do player ao

Acessando o novo nó, adicione a variável correspondente a “Velocidade” do player ao nó interno do BlendSpace.

“V e locidade” do player ao nó interno do BlendSpace. Agora devemos clicar 2 vezes nos

Agora devemos clicar 2 vezes nos símbolos redondos que aparecerão entre as ligações para ter acesso a condição.

entre as ligações para ter acesso a condição. Crie uma variável boleana para a condição de

Crie uma variável boleana para a condição de nosso novo estado.

Na condição de ida colocamos a variável direta com o nó nativo Result. Já na

Na condição de ida colocamos a variável direta com o nó nativo Result. Já na condição de volta ao estado anterior, devemos colocar um NOT boleano, entre esses.

anterior, devemos colocar um NOT boleano, entre esses. Devemos agora criar uma comunicação entre essa condição

Devemos agora criar uma comunicação entre essa condição e o player. Abra então o Event Graph do player character e lá crie uma variável boleana, aqui foi criada Tochamodo.

e lá crie uma variável boleana, aqui foi criada Tochamodo. Feito isso, abra novamente o Animation

Feito isso, abra novamente o Animation Blueprint do player e na aba EventGraph,

traga o nó Cast To

Player Blueprint, no caso do exemplo aqui foi Cast To Third Person Character. Não

aparecerão algumas opções, escolha a que segue com o nome do

esqueça de conectar Get Player Character a Object em Cast To.

Arraste uma ligação de As (o nome do seu character) e busque a variável que

Arraste uma ligação de As (o nome do seu character) e busque a variável que acabamos de criar, escolha Get como mostra a figura a cima. Essa variável será a condição da variável ModoTocha que criamos aqui no Animation Blueprint.

variável ModoTocha que criamos aqui no Animation Blueprint. Pronto! Acabamos de determinar que sempre que a

Pronto! Acabamos de determinar que sempre que a variável Tochamodo no Player for verdadeira, a variável ModoTocha no Animation Blueprint também será, e quando isso ocorre o StateMachine trocará de Blendspace do personagem andando de “Normal” para “ComTocha”.

Essa troca de estados pode ocorrer de várias formas diferentes, podemos definir no Event Graph do Player que ao apertar a tecla “F” Tocha modo será verdadeira.

Ou podemos colocar Trigger Volume no level e ativarmos em Open Level Blueprint, a animação
Ou podemos colocar Trigger Volume no level e ativarmos em Open Level Blueprint, a animação

Ou podemos colocar Trigger Volume no level e ativarmos em Open Level Blueprint, a animação de correr com a tocha, somente ao passar nesse Triggler.

Volume no level e ativarmos em Open Level Blueprint, a animação de correr com a tocha,
Adicionando Animações Com Animation Motage Vamos adicionar agora ao mesmo projeto algumas animações de combate

Adicionando Animações Com Animation Motage

Vamos adicionar agora ao mesmo projeto algumas animações de combate com o auxílio do Animation Montage.

Primeiro, Importe as animações de combate. Clique com botão direito sobre cada uma e siga a imagem abaixo para criar o Animation Montage.

uma e siga a imagem abaixo para criar o Animation Montage. Para organizar melhor nossas animações,

Para organizar melhor nossas animações, coloque todas as criadas em uma pasta denominada Animation Montage.

Temos aqui 3 animações de combate. Agora abra o Animation Blueprint do Player. Adicione um

Temos aqui 3 animações de combate. Agora abra o Animation Blueprint do Player. Adicione um Defaut Slot entre o StateMachine e o Final Animation Pose.

Agora abra o Animation Blueprint do Player. Adicione um Defaut Slot entre o StateMachine e o
Clique agora na Lupa, na aba Sethings para nomearmos nosso Slote. No painel “Anim Slot

Clique agora na Lupa, na aba Sethings para nomearmos nosso Slote.

agora na Lupa, na aba Sethings para nomearmos nosso Slote. No painel “Anim Slot Manager” clique

No painel “Anim Slot Manager” clique na pasta com o texto Add Slot, e nomeie de acordo com o tipo de animação que você deseja chamar, no caso do exemplo está nomeada como Combate.

chamar, no caso do exemplo está nomeada como Combate. Agora volte ao Anim Graph e em

Agora volte ao Anim Graph e em Slot Name mude o nome do slot para o nome que acabou de criar.

Definimos com isso um Slot dentro de Animation BLueprint que “Puchará” filtrará as montagens de
Definimos com isso um Slot dentro de Animation BLueprint que “Puchará” filtrará as montagens de

Definimos com isso um Slot dentro de Animation BLueprint que “Puchará” filtrará as montagens de animações, desde que elas estejam configuradas adequadamente para pertencerem a este Slot, é o que faremos no próximo passo.

Abra o Editor de cada Animation Montage criada e mude DefautGrup como mostra a figura abaixo:

faremos no próximo passo. Abra o Editor de cada Animation Montage criada e mude DefautGrup como
Você deve fazer isso em todos os Animations Montage que queira “puxar” do nó combate.

Você deve fazer isso em todos os Animations Montage que queira “puxar” do nó combate.

Agora no Event Graph do Player Blueprint, chame o Nó Play Anim Montage, e atribua um botão para ativá-lo.

Nó Play Anim Montage , e atribua um botão para ativá-lo. Na opção Anim Montage ,

Na opção Anim Montage, escolha uma das animações da lista. Tem de ser uma das que você acabou de configurar.

Após compilar podemos conferir que ao Apertamos o botão correspondente ao evento, o personagem desferirá
Após compilar podemos conferir que ao Apertamos o botão correspondente ao evento, o personagem desferirá

Após compilar podemos conferir que ao Apertamos o botão correspondente ao evento, o personagem desferirá o golpe.

Vamos deixar sua luta mais dinâmica agora. Conforme a imagem abaixo arraste uma ligação de

Vamos deixar sua luta mais dinâmica agora. Conforme a imagem abaixo arraste uma ligação de Anim Montage e solte em um local vazio, escolha a opção “Promote to a Variable”.

local vazio, escolha a opção “Promote to a Variable”. Criamos assim uma animação. variável capas de

Criamos assim uma animação.

variável capas de carregar nela uma

das

montagens

de

Para darmos vários golpes apertando o mesmo botão devemos atribuir entre o evento e a

Para darmos vários golpes apertando o mesmo botão devemos atribuir entre o evento e a função um nó chamado Switch on Int.

entre o evento e a função um nó chamado Switch on Int. Esse nó permite criarmos

Esse nó permite criarmos nele múltiplos Pins de saídas (output) clicando em Add Pin. Como temos 3 animações de golpe vamos adicionar mais 2 Pins.

Vamos agora arrastar nossa variável “Anim Mont” e escolher Set, depois criar 2 cópias da

Vamos agora arrastar nossa variável “Anim Mont” e escolher Set, depois criar 2 cópias da mesma.

Mont” e escolher Set, depois criar 2 cópias da mesma. Como fizemos com Play Anim Montage,

Como fizemos com Play Anim Montage, vamos adicionar as animações de combate direto nas variáveis.

Atrinua agora a função Randim Integer in Rage ao nó Switch para que possamos carregar as animações com um clique de forma randômica.

Atenção a configuração da função Random Integer, onde Min e Max setam a quantidade de

Atenção a configuração da função Random Integer, onde Min e Max setam a quantidade de Pins que possuem o Switch a ele ligado.

Vamos testar nosso código?

possuem o Switch a ele ligado. Vamos testar nosso código? Pronto! Agora podemos transitar entre as

Pronto! Agora podemos transitar entre as 3 animações de luta de forma randômica com o mesmo comando.

Inteligência Artificial I

Perseguição

Inteligência Artificial I

Projeto Perseguição

Neste capitulo estaremos aprendendo conceitos básicos sobre inteligência artificial dentro da ferramenta Unreal Engine 4, aprenderemos desde tópicos até a implementação de um sistema de perseguição.

Template do projeto

Precisaremos de um template para iniciarmos nossos estudos. Optei por utilizarmos template em terceira pessoa, pois não precisaremos nos preocupar com a implementações básica de controle do jogador que já fora visto, bem como a construção de um mapa para possíveis testes.

Lista de Passos:

Executar o Laucher

Criar um projeto em Blueprint

Definir as configurações iniciais

Primeiramente

execute

o

Launcher

da

Epic

Games

e

em

seguida

clique

em

Inicializar.

Games e em seguida clique em Inicializar. Em seguida surgira uma nova janela. Nela iremos definir

Em seguida surgira uma nova janela. Nela iremos definir as configurações básicas do nosso projeto.

Escolheremos Novo projeto e escolheremos faze-lo em Blueprint, definiremos que o template a ser usado será o de terceira pessoa e então escolheremos o local onde será salvo e seu respectivo nome.

Configurando a IA Com o projeto já criado podemos então começar a desenvolver nosso inimigo.

Configurando a IA

Com o projeto já criado podemos então começar a desenvolver nosso inimigo. Deveremos criar um Character que seja nosso inimigo e então atribuir a ele um AIController que irá controlar nosso inimigo, em seguida precisaremos definir uma área de atuação e então colocar o nosso inimigo na cena para que comece a seguir nosso jogador.

inimigo na cena para que comece a seguir nosso jogador. Como já vimos, quando criamos um

Como já vimos, quando criamos um Character, que nada mais é que um Pawn com algumas funcionalidades características de player, estamos definindo um personagem, porém não é nele que definimos como iremos controla-lo e sim em seu PlayerController.

O mesmo ocorre com a inteligência artificial, precisaremos de um AIController que irá definir como nosso inimigo será controlado, será nele que iremos programar as decisões e ações a serem tomadas.

que iremos programar as decisões e ações a serem tomadas.  Criar um novo Character “

Criar um novo Character “CH_IA1

Fazer Configurações básicas

Criar um novo AIController “AIC_AI1

Atribuir AIC_AI1 para CH_IA1

Agora criaremos uma nova pasta dentro de Content chamada IA1 e nela iremos criar um novo Blueprint do tipo Character e definiremos seu nome como CH_IA1, este será o nosso inimigo.

Abra o Blueprint que acabamos de criar selecione o componente Mesh na aba “Components” e

Abra o Blueprint que acabamos de criar selecione o componente Mesh na aba “Components” e defina qual o Skeletal Mesh que será usado, neste caso irei usar o padrão.

Mesh que será usado, neste caso irei usar o padrão. Defina o “Anim Class” como ThirdPerson_AnimBP

Defina o “Anim Class” como ThirdPerson_AnimBP, e posicione seu personagem como na imagem.

Até o momento definimos nosso personagem, mas ainda não definimos quem irá controla-lo, como este

Até o momento definimos nosso personagem, mas ainda não definimos quem irá controla-lo, como este será um inimigo, não será controlado pelo jogador e então não poderemos usar o PlayerController, neste caso iremos definir que ele será controlado por uma inteligência artificial, ou seja, iremos criar um AIController e atribuiremos ao personagem este controlador.

Crie um novo Blueprint, mas agora pesquise em All Classes o tipo AIController e defina seu nome para AIC_IA1.

o tipo AIController e defina seu nome para AIC_IA1 . Ficaremos então com a seguinte configuração

Ficaremos então com a seguinte configuração de arquivos.

O próximo passo é definir o controlador do nosso CH_IA1 para AIC_IA1. Para isso devemos

O próximo passo é definir o controlador do nosso CH_IA1 para AIC_IA1. Para isso devemos abrir o CH_IA1 selecionar em Components o componente self e então na aba details altera o valor de AI Controller Class para IAC_IA1.

altera o valor de AI Controller Class para IAC_IA1 . Pronto com isso nossa configuração da

Pronto com isso nossa configuração da inteligência artificial está pronta, pois criamos um personagem e definimos que ele será controlado pelo controlador de inteligência artificial que criamos.

Programando a IA

Agora que temos nosso inimigo configurado vamos programar a IA, ou seja, como ele irá atuar sobre o local onde está, em nosso caso iremos fazer com que o inimigo sempre encontre o player e comece a segui-lo para sempre.

Como este é um comportamento de controle sobre o inimigo, vamos ter que definir a programação no AIController que criamos, abra então o IAC_IA1.

Na aba Event Grath iremos realizar uma pesquisa procurando o Character do jogador, e em seguida iremos nos mover até ele.

Questão: Em algumas situações especificas este código pode gerar um erro. Você sabe qual é?

Questão:

Em algumas situações especificas este código pode gerar um erro. Você sabe qual é? Questione com seus colegas como resolve-lo.

Área de atuação Nav Mesh

Nosso inimigo está configurado e sua inteligência definida. Podemos arrasta-lo para

a cena e dar play, porém ele nada irá fazer pois ele não sabe que ele está em um

mundo e muito menos sabe que pode andar nele. Para que ele saiba de tudo isso e possa encontrar nosso player devemos informa-lo que está em um mundo e fazemos

isso com o Nav Mesh.

O Nav Mesh é uma malha de navegação que irá definir por onde nossa a IA irá se

mover, delimitando assim seu percurso e evitando obstáculos que entejam entre o inimigo e o seu objetivo. Quando uma Nav Mesh está em cena ela irá pintar as

possíveis áreas de locomoção para que no futuro uma IA saiba por onde andar.

Vamos então criar uma Nav Mesh. Na aba principal do projeto vá para a sub aba Modes em Place pesquise Nav Mesh. Arraste ela para a cena como na imagem. A área verde em destaque é onde a IA pode andar.

Por padrão a área verde não fica amostra. Devemos habilitá-la clicando em Show na própria

Por padrão a área verde não fica amostra. Devemos habilitá-la clicando em Show na própria View Port e então clicar em Navigation como na imagem abaixo.

Port e então clicar em Navigation como na imagem abaixo. Sabendo que a área verde é

Sabendo que a área verde é onde a IA poderá se locomover, podemos perceber que ela nunca irá encontrar ou chegar até nosso player, devemos então redimensionar o Nav Mesh para que ocupe toda a nossa cena como na imagem abaixo.

Pronto! Podemos agora executar o jogo e ver nosso inimigo perseguindo o player para onde quer que ela vá.

Conclusão Trabalhamos apenas com Blueprints, porém, existem ferramentas especificas para a programação de IA como

Conclusão

Trabalhamos apenas com Blueprints, porém, existem ferramentas especificas para a programação de IA como BalckBoards, BehaviorTree, mas falaremos disso mais adiante.

Aguçando a curiosidade

Conseguimos então criar um inimigo com uma inteligência artificial bem simples, ele inicia encontrando o player e começa a segui-lo. Seria mais interessante que ele começasse a segui-lo apenas se chegássemos muito próximo dele, como faríamos isso?

Podemos ver ainda que existe uma área verde nas escadas levando até um nível mais alto, mas se não existisse essa escada ele não subiria, você consegue corrigir isso? Na próxima apostila falaremos sobre esses problemas e suas soluções. Até lá.

Inteligência Artificial II

çã
çã

Inteligência Artificial II

Projeto Perseguição II

Nesta apostila estaremos aprendendo mais sobre inteligência artificial dentro da ferramenta Unreal Engine 4, iremos construir um sistema de chave & porta para passarmos de nível bem como checkpoints, iremos ainda nos aprofundar na criação de um sistema inteligente.

O Curso consiste em três apostilas sendo que está conterá os tópicos medianos sobre inteligência artificial em jogos digitais. Continuaremos trabalhando com Blueprints para que na Inteligência artificial III você consiga perceber o porquê de utilizar o sistema de IA da Unreal engine 4 ao invés de Blueprint puro;

Template do projeto

Precisaremos de um template para iniciarmos nossos estudos. Optei por utilizarmos template em Side Scroller, pois não precisaremos nos preocupar com a implementação básica de controle do jogador que já fora visto, bem como a construção de um mapa para possíveis testes.

Lista de Passos:

Executar o Laucher

Criar um projeto em Blueprint

Definir as configurações iniciais

Primeiramente

execute

o

Launcher

da

Epic

Games

e

em

seguida

clique

em

Inicializar.

Games e em seguida clique em Inicializar. Em seguida surgirá uma nova janela. Nela iremos definir

Em seguida surgirá uma nova janela. Nela iremos definir as configurações básicas do nosso projeto.

Escolhemos Novo projeto e escolhemos fazê-lo em Blueprint, definiremos que o template a ser usado será o de Side Scroller e então escolhemos o local onde será salvo e seu respectivo nome, incorpore o StarterContent ao projeto.

Organizando os diretórios Com o projeto já criado podemos então começar organizando nosso diretório, devemos

Organizando os diretórios

Com o projeto já criado podemos então começar organizando nosso diretório, devemos criar uma pasta chamada AI2 na raiz do Content logo em seguida mova o mapa padrão do projeto para esta pasta. Faça o mesmo para SideScrollerCharacter e retomei-o para Jogador.

para SideScrollerCharacter e retomei-o para Jogador . Vamos alterar as configurações de mapa, pois como mudamos

Vamos alterar as configurações de mapa, pois como mudamos de local quando abrirmos a Unreal Engine novamente ela não irá carregar automaticamente o mapa atual. Para isso vá em Edit ->Project Setting -> Maps & Mode de defina o mapa atual como padrão.

Vamos iniciar o desenvolver nosso cenário para que possamos testar toda a nossa programação como

Vamos iniciar o desenvolver nosso cenário para que possamos testar toda a nossa programação como sistema Chave&Porta, inteligência artificial, elevadores entre outros.

Na imagem abaixo podemos ver como ficou o layout do mapa, utilizando e duplicando apenas os próprios blocos que já estão na cena, recomendamos que não crie um layout novo, mas sim replique este para que não haja obstáculos inesperados em nosso aprendizado, depois podem ficar à vontade em criar os seus aliás fica atividade extra trazer mapas diferentes com o que aprender nesta apostila.

ficar à vontade em criar os seus aliás fica atividade extra trazer mapas diferentes com o

Sistema Chave&Porta / Pontuação I

Neste sistema o jogador deverá achar e coletar uma chave para uma determinada porta, o mecanismo poderia ser usado para outros fins como pegar uma armadura aprova de fogo para então poder lutar contra um dragão.

Podemos perceber que tanto as moedas como as chaves serão coletadas certo? Temos então duas opções:

Opção 1

o Criar uma Blueprint Actor para cada uma delas e programar se o player as tocou e então executar a soma de pontos ou guardar a chave consigo.

Opção 2

o Criar uma classe Actor base que determine se o player tocou aquele objeto, e criar mais duas classes que implementam apenas as respectivas ações.

Se formos analisar na opção 2 temos 3 arquivos enquanto na opção 1 teremos apenas 2, você pode pensar “Para que criar 3 arquivos se 2 já dão conta do recado?

Realmente para este exemplo não parece que seria vantajoso, mas se formos analisar todo o projeto dessa apostila veremos que existe coisas em comuns entre Chave, Porta, Checkpoint, Moedas, Zona de morte, Trigger

Para cada um deles teremos de inserir um BoxCollider e detectar o evento de BeginOverlap e EndOverlap que são os eventos que determinam se alguma coisa tocou neles ou se deixou de tocar, logo para não termos de reconfigurar todo o Blueprint toda vez que criarmos algo, basta utilizar este objeto base, a isso chamamos de Herança.

Vamos então pela opção 2 para treinarmos esse novo conceito já que a opção 1, vocês já sabem como fazer.

Crie um Actor chamado A_ObjetoBase, adicione uma “Box Collision” chame-o de Detector e defina como root da cena, este servira para nos avisar se alguém tocou neste objeto.

Vamos então realizar algumas tarefas, 1. Acione o BeginOverlap do Detector. 2. Na aba EventGraph

Vamos então realizar algumas tarefas,

1. Acione o BeginOverlap do Detector.

2. Na aba EventGraph crie um CustomEvent chamado “Jogador Detectadocom uma variável de entrada chamada Jogador, este evento será chamado quando um player for detectado.

3. Cri outro CustomEvent da mesma forma e renomeei para “Jogador Perdido

4. Na sequência do BeginOverlap na aba EventGraph faça um Cast do variável jogador confirmando se realmente é um jogador, caso seja execute o evento Jogador Detectado.

5. Na sequência do EndOverlap na aba EventGraph faça um Cast do variável jogador confirmando se realmente é um jogador, caso seja execute o evento Jogador Perdido.

Tudo deverá ficar como na imagem abaixo.

Tudo deverá ficar como na imagem abaixo. Agora poderemos criar nossos Blueprints que herdaram este objeto,

Agora poderemos criar nossos Blueprints que herdaram este objeto, o que precisaremos fazer depois é apenas especificar o que vai ser executado quando Jogador Detectado e jogador Perdido forem executados, resumindo não precisaremos criar tudo de novo a cada novo ator da cena.

Agora crie um ator que irá herdar a classe A_ObjetoBase e chame-o de A_Chave da seguinte forma:

novo ator da cena. Agora crie um ator que irá herdar a classe A_ObjetoBase e chame-o

No EventGraph deste arquivo crie um novo CustomEvent e coloque o mesmo nome

e entradas que definimos para o A_ObjetoBase Faça isso para o “Jogador Detectado”

e defina uma nova ação que será executada apenas para a chave, isso irá substituir

a ação da classe pai.

Veja como ficou para a Chave:

a ação da classe pai. Veja como ficou para a Chave: Perceba quecomo utilizamos Herança, nosso

Perceba quecomo utilizamos Herança, nosso ator A_Chave já tem um Box Collider bem como os eventos de detecção, o que precisamos fazer é Recriar o CustomEvent com o mesmo nome e parametros, para que este ator tenha uma execuao diferente dos outros.

Repita esses passos criando agora o ator A_Moeda:

outros. Repita esses passos criando agora o ator A_Moeda: Antes de colocarmos a chave e moeda

Antes de colocarmos a chave e moeda em cena para testar vamos adicionar seus respectivos ícones.

Cri uma pasta chamada Ícones dentro de IA2 e importe as imagens do curso, escolha

a imagem Icone_Chave clique sobre ela com o botão direito do mouse em Create Sprite. Faça o mesmo processo para as outras imagens ao final teremos esta configuração.

Volte para o A_ObjetoBase e adicione o componente Arrow e faça com que ele seja

Volte para o A_ObjetoBase e adicione o componente Arrow e faça com que ele seja o root da hierarquia veja que esse mesmo componente apareceu para a chave e a moeda.

Volte para a A_Chave e adicione um novo componente chamado PaperSprite informe o Sprite correspondente e remova a colisão. Faça o mesmo para a moeda.

e remova a colisão. Faça o mesmo para a moeda. Criando a porta Vamos agora criar

Criando a porta

Vamos agora criar a porta para nossa chave, para isso crie um novo Actor com o nome A_Porta herdando de A_ObjetoBase e siga os passos:

Adicione uma StaticMesh para o actor, defina o mesh SM_Door para este componente reposicione e escale o Detector para quando o Jogador chegar aquele local a porta verifique se ele tem a chave certa.

Sobre escreva o CustomEvent Jogador Detectado criando este evento na aba EventGraph da mesma forma

Sobre escreva o CustomEvent Jogador Detectado criando este evento na aba EventGraph da mesma forma que fizemos com a chave e moeda.

Crie uma variável pública com o nome MinhaChave do tipo A_Chave, esta será a chave da porta e no fim tudo deverá ficar da seguinte forma.

com o nome MinhaChave do tipo A_Chave , esta será a chave da porta e no

Agora posicone varias moedas na cena, uma porta e uma chave, estamoa usando apenas uma chave mas voce podera usar quantas portas e chaves desejar.

Posicione uma chave na cena bem como várias moedas espalhadas:

uma chave na cena bem como várias moedas espalhadas: O elevador Vendo a imagem acima chegamos

O elevador

Vendo a imagem acima chegamos a um ponto no cenário que não conseguimos chegar ao patamar de cima, para conseguirmos vamos construir um elevador, vamos aos passos então.

1. Crie um novo ator e de o nome de A_Elevador herdando A_ObjetoBase

2. Adicione um StaticMesh, e defina a mesh como 1M_Cube

3. Reposicione e redimensione o Detector

4. Realize a sobre escrita do CustomEvent Jogador Detectado

a mesh como 1M_Cube 3. Reposicione e redimensione o Detector 4. Realize a sobre escrita do

Controle de estados

Quando nosso player morrer devemos diferenciar se ele morreu na queda ou se morreu pelo inimigo, mas como faríamos isso?

Poderíamos usar uma variável do tipo integer e dizer que caso o valor seja 0 significa que o player morre pelo inimigo, e caso seja 1 ele morreu pela queda, porém essa solução não é interessante pois pode gerar dúvidas e muitos problemas conforme o projeto comece a ficar maior, imagine 100 estados diferentes sendo definido dessa forma entre diversas classes!

Para isso temos o Enum, nele podemos organizar nossos estados de forma mais clara e organizada.

organizar nossos estados de forma mais clara e organizada. Com o Enum criado defina seu nome

Com o Enum criado defina seu nome para E_Estados e abra este arquivo criando três estados.

Vivo

o Estado em que o player ainda está vivo

MortoPeloInimigo

o Estado informa que o player morre pelo inimigo

MortoPorAreaPerigosa

o Estado informa que o player morreu por entrar em uma área de perigo, podemos pensar como sendo Lava, área radioativa

Programação no Player (Jogador) Até o momento construímos a cena e os itens que usaremos

Programação no Player (Jogador)

Até o momento construímos a cena e os itens que usaremos no jogo, mas nada de

programação

Vamos iniciar a programação criando o inventario do Jogador, onde guardaremos todas as chaves e o número de moedas que pegamos durante a fase.

Crie uma variável do tipo A_Chave chamada Chaves e marque-a como lista de A_Chave clicando no quadriculado ao lado do tipo de variável.

Crie também uma variável do tipo integer chamada Moedas, a usaremos para contar quantas moedas pegamos na cena.

Precisaremos ainda do estado do player então crie uma variável do tipo E_Estados e chame de EstadoAtual.

E por fim teremos um sistema de Checkpoint logo devemos guardar a posição em que ele se encontra para isso vamos criar uma variável do tipo Vector e chamada de CheckPointEncontrado.

bem isso acaba por aqui vamos programar!

isso vamos criar uma variável do tipo Vector e chamada de CheckPointEncontrado. bem isso acaba por

Sistema Chave Porta / Pontuação II

Vamos voltar nossa atenção agora para o cenário, nele deixamos já configurado uma porta e uma chave, assim como várias moedas e o elevador pelo uso de herança agora só precisamos definir para cada ator o que seu evento Jogador Detectado deve fazer.

cada ator o que seu evento Jogador Detectado deve fazer. Abra o arquivo A_Moeda encontre o

Abra o arquivo A_Moeda encontre o CustomEvent Jogador Detectado que criamos e altere sua lógica.

Pegue a variável moedas do nosso jogador e realize o incremento e imprima o novo valor na tela depois destrua o objeto.

e imprima o novo valor na tela depois destrua o objeto. Chaves Abra o arquivo A_Chave

Chaves

Abra o arquivo A_Chave encontre o CustomEvent Jogador Detectado que criamos e altere sua lógica.

Pegue a variável Chaves que é uma lista e adicione a própria moeda a essa lista depois mova ela para fora da vista do jogador.

a essa lista depois mova ela para fora da vista do jogador. Portas Abra o arquivo

Portas

Abra o arquivo A_Porta encontre o BeginOverlap que criamos e altere sua lógica.

No evento Jogador detectado procure MinhaChave dentro da variável Chaves do caso exista iremos abria a porta.

Adicione uma TimeLine que irá variar de 0 a 90 o nome da variável de saída será AnguloAtual, ela deve ter 2 segundos de duração, clique com o shift pressionadora

criar dois pontos, clique no primeiro ponto de defina o tempo e valor para zero, clique no segundo ponto e defina seu tempo para 2 e seu valor para 90.

segundo ponto e defina seu tempo para 2 e seu valor para 90. Defina a rotação

Defina a rotação da porta para ser igual ao valor de saída da TimeLine um Doonce para que seja feita apenas uma vez a ação tudo deverá ficar como na imagem.

apenas uma vez a ação tudo deverá ficar como na imagem. Temos ainda que definir qual

Temos ainda que definir qual chave pertence a nossa porta, para que ela seja aberta caso o jogador tenha a chave.

Selecione a porta que está na cena, vá para o painel de detalhes e no campo default você verá a variável MinhaChave, clique no conta gotas e depois clique na chave que está na cena assim a chave será atribuída àquele objeto.

Elevador Ainda não conseguimos chegar até a porta pois o player na pula tão alto,

Elevador

Ainda não conseguimos chegar até a porta pois o player na pula tão alto, por isso criamos o elevador e iremos programa-lo agora.

Para o evento Jogador Detectado crie uma nova Timeline chamada Subir, que terá duração de dois segundos, crie uma variável com nome Altitude e dois pontos, o primeiro em time e valor igual a zero e o segundo time igual a 2 e valor igual a 7, para mim esses valores foram suficientes para que o elevador subisse até o topo adapte para o seu projeto.

igual a 7, para mim esses valores foram suficientes para que o elevador subisse até o
Agora para o elevador descer use o evento Jogador Perdido, duplique a TimeLine e multiplique

Agora para o elevador descer use o evento Jogador Perdido, duplique a TimeLine e multiplique a altitude por menos um, assim o elevador começara a descer logo que o player sair dele.

o elevador começara a descer logo que o player sair dele. Checkpoint Vamos brincar com o

Checkpoint

Vamos brincar com o Checkpoint, para isso vamos usar a mesma lógica que usamos para a chave, você se lembra como fizemos?

Crie um novo ator que herde de A_ObjetoBase, defina o ícone Icone_CheckPoint_Sprite que criamos a partir do Icone_CheckPoint como fizemos coma moeda e chave lembre-se de remover a colisão do ícone, realize a sobre escrita do evento Jogador Detectado, quando este evento ocorrer pegue a posição do checkpoint e defina para a variável CheckPointEncontrado do jogador.

Além disso devemos definir a posição inicial do jogador para a variável CheckPointEncontrado pois caso

Além disso devemos definir a posição inicial do jogador para a variável CheckPointEncontrado pois caso ele morra sem encontrar um checkpoint esse será colocado na posição (0,0,0), para isso vamos para o Jogador e no evento Beginplayer definimos o valor da variável como sendo a posição que o player iniciou.

da variável como sendo a posição que o player iniciou. Posicione alguns checkpoints pela cena. Zona

Posicione alguns checkpoints pela cena.

Zona da morte

Para usarmos o nosso sistema de checkpoint temos que morrer primeiro né? Então crie um novo ator chamado A_AreaPerigosa herdando de A_ObjetoBase assim como no checkpoint adicione um PaperSprite e coloque o ícone Icone_lancas_Sprite remova a colisão do Sprite.

E vamos repetir o mesmo processo do checkpoint porem agora iremos trocar o estado do

E vamos repetir o mesmo processo do checkpoint porem agora iremos trocar o estado do player para MortoPorAreaPerigosa e após um delay de 2 segundos vamos chamar o CustomEvent Jogador Morreu que criaremos no Jogador logo abaixo.

Jogador Morreu que criaremos no Jogador logo abaixo . No Blueprint do Jogador crie este CustomEvent

No Blueprint do Jogador crie este CustomEvent que chamamos a variável de entrada

é do tipo E_Estados, troque o estado a atual para o estado que foi passado no

parâmetro e depois de 2 segundos reposicione o player para a posição do checkpoint

e traga o de volta a vida.

no parâmetro e depois de 2 segundos reposicione o player para a posição do checkpoint e

Assim já mudamos o estado do jogador para morto e podemos trocar a animação dele por uma animação de morte.

Adicione este ator a cena para que o player possa começar a morrer, vejamos como ficou agora.

o player possa começar a morrer, vejamos como ficou agora. O inimigo (IA) Todo o jogo

O inimigo (IA)

Todo o jogo já está funcionando, pegamos moedas, conseguimos abrir portas morrermos em áreas perigosas temos o nosso inventario.

Vamos então começar a trabalhar nossa inteligência artificial, ela irá perseguir o nosso jogador e matá-lo caso o toque.

Primeiramente vamos repetir o passo da apostila anterior inserindo na cena um Nav Mesh Bounds Volume” na tab Modes.

na cena um “ Nav Mesh Bounds Volume ” na tab Modes. Redimensione o volume para

Redimensione o volume para que ocupe toda a área do mapa.

Você se lembra que onde fica verde, para ver o verde clique em Show e

Você se lembra que onde fica verde, para ver o verde clique em Show e Navigation,

é onde o inimigo poderá andar né? Então já percebeu que nos blocos que o jogador

está não existe uma área verde né? Isso acontece, pois, o NavMesh precisa de uma certa largura para ser criado na mesh, e para resolver este problema só precisamos

aumentar a largura dos blocos.

este problema só precisamos aumentar a largura dos blocos. O terreno para o inimigo está pronto,

O terreno para o inimigo está pronto, mas ainda não temos o inimigo, crie então um

novo “BluePrint Character” e de o nome de CH_Inimigo e configure seu SkeletalMesh

e sua AniamationBlueprint igual ao do Jogador.

Crie outro Blueprint do tipo AIcontroller, você pode encontra-lo em All Classes no popup de

Crie outro Blueprint do tipo AIcontroller, você pode encontra-lo em All Classes no popup de novo Blueprint, chamado AIC_Inimigo este será a inteligência artificial do nosso inimigo. Defina-o como controlador padrão do CH_Inimigo.

inimigo. Defina-o como controlador padrão do CH_Inimigo. Neste controlador faça com que o inimigo logo que

Neste controlador faça com que o inimigo logo que entrar em cena, guarde a posição dele em uma variável do tipo Vector chamada Posição inicial

em uma variável do tipo Vector chamada Posição inicial E a cada evento Tick ele veja

E a cada evento Tick ele veja se tem algum player na cena, caso tenha e esteja vivo persiga-o, caso não esteja vivo ele volta para a posição inicial dele.

Mas ainda temos de fazer a mudança de estado do player quando ele for tocado

Mas ainda temos de fazer a mudança de estado do player quando ele for tocado pelo inimigo, para isso crie um SphereCollider no CH_Inimigo faça o Cast para o jogador e então mude o estado chamando a função Jogador Morreu e passando como parâmetro MortoPeloInimigo.

Morreu e passando como parâmetro MortoPeloInimigo . Prontinho! Nosso inimigo já está fazendo tudo que tem

Prontinho! Nosso inimigo já está fazendo tudo que tem de fazer porem se você começar a subir nos blocos e elevador e outros níveis diferentes do chão poderá perceber que ele não soube níveis algum, essa é uma questão que deixamos na apostila anterior e que agora iremos resolver.

Subindo níveis!

Nosso inimigo segue o player apenas no NavMesh verde que é gerado, quando existe uma descontinuidade desse NavMesh o inimigo não com segue ir até lá, na verdade ele nem sabe que pode existir uma NavMesh em outro lugar que não seja a dele.

Para avisarmos a ele que existe outros lugares que ele pode andar, precisamos usar o “Nav Link Proxy”, ele existira dois PointLinks que iremos posicionar na cena informando de onde para onde o inimigo pode ir.

Porem precisamos posicionar os PointLinks de forma que surja uma linha verde ligando os dois,

Porem precisamos posicionar os PointLinks de forma que surja uma linha verde ligando os dois, abaixo terá as imagens mostrando a forma errada e a correta.

uma linha verde ligando os dois, abaixo terá as imagens mostrando a forma errada e a

Corrigindo a posição:

uma linha verde ligando os dois, abaixo terá as imagens mostrando a forma errada e a

Posicione outros desses nas áreas que precisam ser escaladas pelo inimigo da seguinte forma.

que precisam ser escaladas pelo inimigo da seguinte forma. De o play no game e veja

De o play no game e veja que o inimigo agora sabe que naqueles pontos ele poderia ir para o andar de cima, mas não consegue ir pois os PointLinks apenas avisam locais para o inimigo.

Vamos então criar um novo actor chamado A_Pular, mas dessa vez não iremos herdar de A_ObjetoBase, que irá avisar que ele deve fazer algo quando chegar ali deverá pular conseguindo assim subir no bloco, neste ponto você pode usar animações para fazer com que ele escale a parede, ou faze-lo teleransortar isso vai de sua decisão.

você pode usar animações para fazer com que ele escale a parede, ou faze-lo teleransortar isso

Posicione então este novo ator próximo aos PointLinks para que quando a IA chegue naquele local ela pule.

para que quando a IA chegue naquele local ela pule. Com isso nosso inimigo consegue subir

Com isso nosso inimigo consegue subir e descer nos níveis da fase, experimente fazer alguns destes testes e ajuste as suas necessidades.

Inteligência Artificial III

Confronto I

Inteligência Artificial III Projeto Confronto I

Nesta apostila estaremos trabalhando com conceitos de confronto entre player e a IA, teremos de lidar com comunicação entre os inimigos ou entidades bem como o próprio player.

O Curso consiste em três apostilas sendo que está conterá os tópicos medianos sobre inteligência artificial em jogos digitais.

Template do Projeto

Precisaremos de um template para iniciarmos nossos estudos. Optei por utilizarmos template em Third person, pois não precisaremos nos preocupar com a implementação básica de controle do jogador que já fora visto, bem como a construção de um mapa para possíveis testes.

Lista de Passos:

Executar o Laucher

Criar um projeto em Blueprint

Definir as configurações iniciais

Primeiramente

execute

o

Launcher

da

Epic

Games

e

em

seguida

clique

em

Inicializar.

Games e em seguida clique em Inicializar. Em seguida surgirá uma nova janela. Nela iremos definir

Em seguida surgirá uma nova janela. Nela iremos definir as configurações básicas do nosso projeto.

Escolhemos Novo projeto e escolhemos fazê-lo em Blueprint, definiremos que o template a ser usado será o de Third person e então escolhemos o local onde será salvo e seu respectivo nome.

Configuração inicial do projeto

Em seguida cria uma pasta Chamada IA3 e mova para dentro dela os Character e Mapa padrão do projeto.

Vamos criar agora nossa ia, a ideia aqui é replicar de forma simples uma ia

Vamos criar agora nossa ia, a ideia aqui é replicar de forma simples uma ia no estilo circular, similar ao sistema de ao usado em Assassin’s Creed e Batman: Arkham. Ainda usaremos o sistema de blueprint para vermos como pensar, pois, muitas das implementações ficam implícitas quando usamos os sistemas de Behavior Tree Blackboard.

Crie então o Character para a IA e IAController nomeando-os para CH_IA3 e IAC_IA3, informe a Mesh, Animation Blueprint bem como o IAController para o CH_IA3.

Animation Blueprint bem como o IAController para o CH_IA3. Vamos então definir o navmesh e em

Vamos então definir o navmesh e em seguida posicionar quatro de nossos inimigos em cena.

Abra o ThirdPersonCharacter e altere o CameraBoom setando o valor de “ Do Collision Test

Abra o ThirdPersonCharacter e altere o CameraBoom setando o valor de “Do Collision Test” para false, para que assim a câmera não aproxime do player caso algo fique entre ela e o player. Caso queira afastar a câmera um pouco para que tenhamos uma visualização mais abrangente.

.
.

Game design

Como a inteligência artificial do inimigo será semelhante ao Batman: Arkham nosso inimigo tentará que obedecer alguns protocolos ou regras para que o gameplay se desenrole, isso é definido no design da inteligência artificial.

Neste jogo o player não irá poder atacar os inimigos, irá apenas andar e se defender seguindo a sabedoria dos antigos mestres de kung fu.

Vamos então criar o IA Design:

O inimigo terá os seguintes estados

o

Patrol

Estado em que ainda não encontrou o jogador

o

Following

Se posicionando

o

OnGuard

Esperando para poder atacar

o

Fighting

Está lutando com o jogador

O inimigo quando avistar o player ira se posicionar para ataque e ira persegui lo

Quando perto do player ele devera circundar o jogador

O ataque será realizado em turnos, ou seja, quando um inimigo estiver atacando todos os outros não estarão.

O turno só acaba quando o player acaba de receber um ataque ou quando ele acabar de bloquear.

A escolha de quem irá atacar é randômica.

Imagine-se sendo o inimigo que vamos programar, quais seriam suas primeiras ações com relação ao que foi descrito acima? Você sabe que tem de ir aí o player, mas onde até o player ou quando? Pense nisso e liste o passo a passo, quando mais detalhado melhor.

Abaixo uma possível lista de ações:

1. Qual estado eu início?

2. Existe algum player próximo a mim?

3. Onde está o player onde irei me posicionar?

4. A que distância do player devo ficar em guarda? Ou sair da guarda?

5. Como irei me afastar do player caso ele se aproxime de mim?

6. Quando que eu posso atacar?

caso ele se aproxime de mim? 6. Quando que eu posso atacar? Agora que já definimos

Agora que já definimos como o inimigo irá agir podemos iniciar a programação respondendo as questões da lista acima.

Qual estado eu início

Como no mundo real ninguém fica lutando sozinho, o mais lógico seria esperar um inimigo surgir para então nós preparamos e depois ver se precisamos lutar. Então vamos fazer com que a nossa uma se inicie em Patrol.

Crie um enum chamado E_IAState e defina os estados listados no ia design: Patrol, Following,OnGuard, Fighting.

no ia design: Patrol , Following , OnGuard , Fighting . Logo em seguida crie uma

Logo em seguida crie uma variável no IAC_IA3 chamada state do tipo E_IAState e defina seu valor default para Patrol.

Logo em seguida crie uma variável no IAC_IA3 chamada state do tipo E_IAState e defina seu

Resumo de funções e variáveis

Como ira existir muita comunicação entre os blueprints, achamos que seria melhor listar aqui todas as funções e variáveis que devem ser criadas, mas a frente explicaremos cada uma delas.

1. ThirdPersonCharacter

o

Variáveis Globais

 

MaxAround

 

Variável

do

tipo

integer

responsável

por

definir

 

quantos inimigos podem ficar a uma certa distância.

 

CountAround

 
 

Variável do tipo integer responsável por informar

 

quantos inimigos estão me cercando.

 
 

MinRadius

 
 

Variável do tipo integer responsável por determinar a

 

distância

mínima

que

os

inimigos

devem

ficar do

player.

 

PrepareForDefence

 
 

Variável do tipo boolean responsável por informar que

 

o

jogador está sendo atacado.

 
 

InFight

 
 

Variável do tipo boolean responsável por informar que

 

o

player e o inimigo estão lutando.

 
 

InDamage

 
 

Variável do tipo boolean responsável por informar que

 

player está sofrendo um dano do inimigo por não ter contra-atacado atempo.

o

o

Funções

GetPoint

Retorna um ponto ao redor do player

GetRaioAngle

Responsável por determinar a distância e a posição em que o inimigo ira se posicionar.

GetOffset

Pega o offset da posição retornada pelo GetRaioAngle.

AlertPrepareForDefence

Realiza a sinalização visual e lógica de que o player está para ser atacado.

2. IAC_IA3

o Variáveis

state

Variável do tipo enum E_IAState, indicará em que estado nosso inimigo se encontra.

BestOffSetPoint

Variável do tipo vector2d que irá guardar o offset para somarmos a posição atual do player e sempre termos um posicionamento certo.

AreaOfAttack

Variável do tipo booleana que informará se o inimigo está próximo o suficiente para atacar.

o Funções

ToFollowing

Altera o estado para perseguição

ToOnGuard

Altera o estado para modo de batalha

GetPointToMove

Retorna um vector3d baseado na posição atual do player e no offset.

LookToPlayer

Faz com que o inimigo olhe para o player

PositionInCircle

Determina uma posição ao redor do player

3.

CH_IA3

o Funções

ToOnGuard

ToFollowing

EnterAreaOfAttack



Existe algum player próximo de mim?

Para respondermos essa pergunta podemos criar uma Sphere Collision de raio 400 no ThirdPersonCharacter e ative o evento BeginOverlap e EndOverlap para verificar se o um inimigo no caso CH_IA3 está próximo.

Coloque também um outra Sphere Collision de raio 250, esta iremos usar mais tarde.

Sphere Collision de raio 250, esta iremos usar mais tarde. Quando o evento for acionado faremos

Quando o evento for acionado faremos o cast para CH_IA3 verificando assim se realmente é um inimigo logo em seguida iremos chamar a função “ToOnGuard” e “ToFollowing”, que já deve ser criada no CH_IA3 e chamada respectivamente em BeginOverlap e EndOverlap do player para o trigger.

Crie as mesmas funções também no IAC_IA3.

Crie as mesmas funções também no IAC_IA3. Para a função ToOnGuard vamos pegar a referência do

Para a função ToOnGuard vamos pegar a referência do IAController e chamar a função ToOnGuard do controlador.

Agora vamos começar a controlar o estado do nosso inimigo por meio de enum. Crie

Agora vamos começar a controlar o estado do nosso inimigo por meio de enum. Crie um novo enum chamado E_IAState e no IAC_IA3 crie uma variável deste tipo E_IAState chamada state.

Ainda no IAC_IA3 vamos chamar o evento Tick e executaremos um switch para a variável state assim conseguiremos controlar as ações dependendo de qual estado estivermos.

controlar as ações dependendo de qual estado estivermos. Perceba agora que para cada estado podemos tomar

Perceba agora que para cada estado podemos tomar um caminho diferente.

Agora só falta alterar os estados do inimigo, fazemos isso pela funções “ToOnGuard” e “ToFollowing” que são chamadas quando o player detecta o inimigo e quando ele o perde de vista, quando detectado vamos fazer com que o

inimigo

se

posicione

em

guarda.

inimigo se posicione em guarda. e quando sair da área do trigger ele ficará no estado

e quando sair da área do trigger ele ficará no estado de perseguição.

da área do trigger ele ficará no estado de perseguição. Onde está o player onde irei

Onde está o player onde irei me posicionar?

Agora que sabemos que existe um player, o próximo passo é saber nos posicionar, vamos começar pelo estado Following.

Para ele só precisaremos pegar a referência do player e chamar a função “Move to Actor” da seguinte forma.

Agora vamos brincar com o Onguard, nele vamos fazer o inimigo olhar para o player,

Agora vamos brincar com o Onguard, nele vamos fazer o inimigo olhar para o player, se posicionar e tentar atacá-lo.

Crie uma função chamada “PositionInCircle” ela devera atualizar o BestOffSetPoint, vamos então realizar o cast do player e pedir para ele o offset, pois em nossa lógica deixaremos apenas 4 inimigos a um raio de 200 cm e os próximos 4 inimigos com o dobro do raio e assim por diante.

Teremos ainda de encontrar uma posição ao redor do player para que nosso inimigo começa a cercar o jogador, está matemática de posicionamento é a principal função deste game play, pois é nele de toda a inteligência estará, quando mais casos serem tratados melhor será nosso inimigo.

quando mais casos serem tratados melhor será nosso inimigo. Agora vamos para o ThirdPersonCharacter , pois

Agora vamos para o ThirdPersonCharacter, pois é ele que saberá quantos inimigos estão te perseguindo.

Crie a função “GetOffset” sela ira retornar um offset, mas para isso precisamos escolher uma posição ao redor do player certo? E ainda a cada 4 inimigos vamos dobrar a distância que ficaram do player.

Aqui criaremos uma função chamada “GetRaioAngle” que será responsável por calcular a distância que os

Aqui criaremos uma função chamada “GetRaioAngle” que será responsável por calcular a distância que os inimigos ficaram do player dependendo de quantos inimigos já estão perseguindo, e ainda o ângulo ao redor do player de 0 a 360 estamos usando um valor integer para evitar valores como 12.7678.

Nele dividimos o número de inimigos redor pelo número máximo permitido, em nosso caso será 4, mas você pode escolher outros valores, a distância mínima do inimigo ao player será de 200 cm.

a distância mínima do inimigo ao player será de 200 cm. Com isso temos o ângulo

Com isso temos o ângulo ao redor do player e uma distância dele, mas ainda precisamos calcular com essas informações o ponto ao redor do player para então calcular o offset, para isso criamos a função “GetPoint”

Primeiro calculamos um vetor direção normalizado pois este será nosso ponto angulo zero.

Logo em seguida multiplicamos este vetor pela distância passada por parâmetro que encontramos no passo

Logo em seguida multiplicamos este vetor pela distância passada por parâmetro que encontramos no passo anterior encontrando assim um ponto com ângulo 0 redores do player, porém queremos um ponto com o ângulo do parâmetro então realizamos a rotação deste vetor com a função “Rotate Vector Around Axis”.

vetor com a função “Rotate Vector Around Axis” . Com isso voltamos para a função GetOffset

Com isso voltamos para a função GetOffset com o ponto correto, calculamos offset pela diferença deste ponto com a posição do player e atualizamos a variável BestOffSetPoint da função PositionInCircle la do nosso IAC_IA3 … ufa sobrevivemos.

Agora a parte fácil é só colocarmos isso para funcionar no estado de Onguard, mas antes vamos criar a fundação que irá fazer com que fiquemos olhando para o player quando estivermos em guarda, chamaremos ela de “LookToPlayer” .

Nele teremos de pegar a posição de inimigo e do player para calcularmos a rotação utilizando a função “Find Look At Rotation” e vamos corrigir para que quando o player pular os inimigos não girem em torno de y pois ficaria bem estranho.

Agora só precisamos calcular a posição que devemos seguir baseado no offset que adquirimos quando

Agora só precisamos calcular a posição que devemos seguir baseado no offset que adquirimos quando entramos em guarda e achar o ponto que temos de seguir ao redor do player, fazemos isso com a função GetPointToMove que definimos como PURA.

com a função GetPointToMove que definimos como PURA. Agora para fechar com chave de ouro usamos

Agora para fechar com chave de ouro usamos tudo isso para realizar o MoveTo:

GetPointToMove que definimos como PURA. Agora para fechar com chave de ouro usamos tudo isso para

A que distância do player devo ficar em guarda? Ou sair da guarda?

Neste ponto temos então uma posição para o inimigo seguir e ficar sempre ao redor

com esse ponto a nossa inimiga irá se afastar quando o

player se aproximar dele, e ira perseguir quando o player se afastar.

Se percebermos la no início fizemos com que o ocorra o EndOverlap o estado mude para perseguição, portanto caso o jogador saia correndo para longe do inimigo esta ira sair do modo guarda e entrar em modo perseguição com isso controlamos como ele irá agir mudando apenas o estado dele legal né :)

do player certo? Bem

Quando que eu posso atacar?

Agora vamos atacar a última pergunta :P, lembra aquela outra Sphere de raio 200 com que criamos ? Então agora que iremos usá-la.

Ela servirá para determinar se o inimigo está próximo o suficiente para atacar ou não o nosso jogador.

Primeiramente ative o BeginOverLap e EndOverlap para chamarmos a função EnterAreaOfAttack” do CH_IA3.

chamarmos a função “ EnterAreaOfAttack ” do CH_IA3. em seguida implemente essa função para que altere

em seguida implemente essa função para que altere a variável AreaOfAttack no controlador da ia da seguinte forma.

Faça a mesma coisa para o EndOverlap, porém definindo a variável para false. Agora nossa

Faça a mesma coisa para o EndOverlap, porém definindo a variável para false.

para o EndOverlap, porém definindo a variável para false. Agora nossa ia sabe se pode ou

Agora nossa ia sabe se pode ou não atacar o player.

Vamos agora criar o input para que o player consiga se defender do ataque do inimigo, indo em Edit->Project Setting->Input onde iremos definir um novo action mapping chamado Defence.

onde iremos definir um novo action mapping chamado Defence. Logo em seguida vamos definir as mudanças

Logo em seguida vamos definir as mudanças de estado das variáveis quando está recebendo dano usando um custom event.

As mudanças serão feitas com o término das animações por isso estamos usando os delay pois já iremos trabalhamos com elas.

Vamos ver agora a lógica da IA para o ataque pois ela já sabe que

Vamos ver agora a lógica da IA para o ataque pois ela já sabe que pode atacar.

Para ela atacar vamos fazer com que no estado de OnGuard a cada um certo tempo a ia tente atacar o player somente se estiver na área de ataque.

tente atacar o player somente se estiver na área de ataque. Caso ela seja apta a

Caso ela seja apta a atacar vamos chamar o nosso custom evento “TryAttack” que irá validar mais algumas condições de ataque que são:

Não posso atacar se PrepareForDefence for True pois alguém já está atacando o jogador.

Também não posso InFight for true pois ele está lutando com alguém.

E muito menos posso atacar caso alguém esteja batendo dele pois InDamage essa true nessa hora.

Caso tudo esteja liberado posso atacar e, portanto, irei avisar o player que eu estou

Caso tudo esteja liberado posso atacar e, portanto, irei avisar o player que eu estou atacando e irei mudar para o estado Fighting

que eu estou atacando e irei mudar para o estado Fighting Vamos agora ver como trabalhar

Vamos agora ver como trabalhar com o estado de luta, nele vamos fazer com que o inimigo ande até próximo do player no caso 2 segundos, que também é o tempo que ele terá para se defender.

Caso o jogador não clique com o botão direito do mouse neste tempo a variável InFight estará como false então poderemos aplicar dano ao player.

Neste momento iremos executar a animação e como feedback mudamos de estado quando ela terminasse,

Neste momento iremos executar a animação e como feedback mudamos de estado quando ela terminasse, mas como isso será feito logo mais vamos usar um delay para simular o tempo da animação e recolocar o estado do inimigo para OnGuard dando assim chance de outro inimigo atacar. Temos de fazer essa mudança de estados também quando o player conseguir se defender bem como resetar as variáveis de controle.

se defender bem como resetar as variáveis de controle. A função damage que chamamos aqui na

A função damage que chamamos aqui na verdade é o Custom event e que fizemos logo acima.

Nossa configuração final ficou então desta forma, com poucos arquivos, e uma lógica simples conseguimos fazer um sistema bem interessante em que você pode melhorar as verificações, dando mais liberdades para a inteligência artificial e deixando assim seu jogo mais dinâmico e divertido.

Experimente agora dar o play no jogo e ver ele funcionando com as mensagens.

Experimente agora dar o play no jogo e ver ele funcionando com as mensagens.

Experimente agora dar o play no jogo e ver ele funcionando com as mensagens.

Introdução a interface Gráfica

Wedgets

Introdução a Interface Gráfica Widgets

Neste capítulo veremos como configurar a interface gráfica de nossos projetos através da criação e edição do Widget Blueprint.

Configurações Iniciais

Para

anteriormente.

este

exemplo

poderemos

ter

como

base

um

dos

projetos

iniciados

GUI

A Interface gráfica de um game tem a missão de comunicar ao jogador sobre sua

estrutura, através de menus interativos, e como essa mesma estrutura pode ser explorada, conquistando achievements, abrindo pontos para os próximos upgrades, expandindo os itens do inventário e assim por diante. É muito comum ao vermos informações sobre a parte artística de produção de games ouvirmos o termo GUI, trata-se da abreviação de “Graphical User Interface”.

A Engine Unreal 4 possui uma ferramenta exclusiva para a criação e dição de GUI,

chama-se Widget Blueprint.

a criação e dição de GUI, chama-se Widget Blueprint . Para criar uma nova Widget, clique

Para criar uma nova Widget, clique com o botão direito do mouse em algum espaço vazio de uma das pastas no Content Browser e siga o caminho indicado na imagem

a cima. Para o nosso exemplo iremos nomear a Widget como “GUI01”.

A baixo vemos Widget editor, nele nós temos 2 abas principais para trabalhar:

Design e Graph, ambas podem ser acessadas na parte superior direita do editor.

Vamos voltar a aba Design. Esse espaço retangular no centro da tela nos indica nossa
Vamos voltar a aba Design. Esse espaço retangular no centro da tela nos indica nossa
Vamos voltar a aba Design. Esse espaço retangular no centro da tela nos indica nossa

Vamos voltar a aba Design. Esse espaço retangular no centro da tela nos indica nossa área de canvas, do lado esquerdo nós temos a aba Palette, esta possui diversos elementos que podemos arrastar para a nossa área de canvas. Entre os elementos dentro de Palette nós temos: bordas, botões, imagens, barras progressivas, textos etc.

Vamos arrastar um botão para o canvas. Ao fazê-lo notamos que o painel Detail agora

Vamos arrastar um botão para o canvas.

Vamos arrastar um botão para o canvas. Ao fazê-lo notamos que o painel Detail agora possui

Ao fazê-lo notamos que o painel Detail agora possui informações da propriedade deste elemento gráfico.

Vamos fazer um pequeno teste para habilitar alguns elementos gráficos em nosso gameplay. Aumente um pouco o tamanho do botão que está no canvas e ponha sobre o mesmo um texto “HUD Funcionando”.

Vá agora ao Event Graph do Open Level Blueprint, no Level Editor, e lá chame

Vá agora ao Event Graph do Open Level Blueprint, no Level Editor, e lá chame o nó “Create Widget”.

no Level Editor, e lá chame o nó “Create Widget”. Nele iremos selecionar o Widget que

Nele iremos selecionar o Widget que acabamos de criar.

O nó “Add To Viewport” fará com que a interface seja reproduzida enquanto jogamos. Ótimo,

O nó “Add To Viewport” fará com que a interface seja reproduzida enquanto jogamos.

com que a interface seja reproduzida enquanto jogamos. Ótimo, o nosso Widget está funcionando perfeitamente,

Ótimo, o nosso Widget está funcionando perfeitamente, porém já que definimos a programação do mesmo no Open Level Blueprint, ele funcionará apenas nessa fase, mas e se o nosso projeto possuir várias fases? Para que não precisemos reproduzir os códigos em todos os Open Level Blueprints de todas as fases devemos criar agora uma nova classe Blueprint denominada HUD.

Iremos denomina- la como “HUD_BP”. Clique duas vezes no ícone da nova HUD. Reproduza o
Iremos denomina- la como “HUD_BP”. Clique duas vezes no ícone da nova HUD. Reproduza o

Iremos denomina-la como “HUD_BP”. Clique duas vezes no ícone da nova HUD.

como “HUD_BP”. Clique duas vezes no ícone da nova HUD. Reproduza o mesmo código que havia

Reproduza o mesmo código que havia sido feito anteriormente no Open Level Blueprint, tenha certeza que este último não possua mais o mesmo código, deixando apenas no HUD_BP. Pronto, isso garantirá que o Widget seja lido pelo HUD, porém

para que ela funcione em todos os levels devemos acessar nosso GameMode e lá dizermos que a HUD do game será nossa HUD_BP.

Abra agora Project Sethings e acesse HUD Class.

HUD_BP . Abra agora Project Sethings e acesse HUD Class. Selecione ai nossa HUD_BP. Dessa maneira
HUD_BP . Abra agora Project Sethings e acesse HUD Class. Selecione ai nossa HUD_BP. Dessa maneira

Selecione ai nossa HUD_BP.

Dessa maneira a HUD funcionará em todas as fases de nosso game, pois adicionando ao nosso Game Mode, definimos como regra de todas as fases que usarem esse GameMode.

Sistema de Health Vamos agora demonstrar como é a programação do Widget, criando uma barra

Sistema de Health

Vamos agora demonstrar como é a programação do Widget, criando uma barra de vida e um sistema de dano.

Continuando de onde paramos no exemplo anterior, entre na classe blueprint do Player, no Event Graph, crie 1 variáveis Float, chamada de Current Health, depois monte o esquema a seguir.

de Current Health , depois monte o esquema a seguir. Neste esquema dizemos que qualquer coisa

Neste esquema dizemos que qualquer coisa que cause dano no nosso player

o denominado GUI01.

reduzirá

Widget,

valor

da

variável

Current

Health.

Agora

vamos

ao

nosso

Arraste uma Progressive Bar para o canvas, clique no símbolo que parece uma rosa e

Arraste uma Progressive Bar para o canvas, clique no símbolo que parece uma rosa e com ele selecionado vá no painel Detail e escolha o modelo superior central em Anchors:

Detail e escolha o modelo superior central em Anchors: Para que nosso Health fique no centro

Para que nosso Health fique no centro exato, va no eixo X de Aligment e ponha 0.5.

o modelo superior central em Anchors: Para que nosso Health fique no centro exato, va no

Agora com a barra selecionada clique em Binding no painel Detail isso criará uma função para interagirmos com Percent.

isso criará uma função para interagirmos com Percent. Dentro do novo Binding criado monte o seguinte

Dentro do novo Binding criado monte o seguinte esquema:

Dentro do novo Binding criado monte o seguinte esquema: O código ai incerido estabelece a condição

O código ai incerido estabelece a condição da propriedade “Percent” ser alterada, é ela que fará a barra descer ou subir. Estamos determinando que o que retornará o velor de Percent será a variável Current Health (criada no player) dividida por 100 (para encontrar o nó Float / Float na busca por nós digite apenas a barra “/”).

Feito isso agora vamos para a View Port criar um agente que tire dano de nosso player. No painel Modes aba Volumes há um desses que se chama “Pain Causing Volume”, arraste-o para o level.

chama “Pain Causing Volume”, arraste -o para o level. Podemos configurar esse volume diretamente no painel

Podemos configurar esse volume diretamente no painel Detail para que tire dano de nosso player. Na aba Pain Causing já 2 opções que usaremos:

Damage Per Sec: essa determina quanto o Health de nosso player Descerá a cada intervalo de tempo definido por Pain Interval.

Pain Interval: determina o intervalo de tempo que o dano ocorrerá, por exemplo, caso escolhamos aqui 1.0 e em Damage Per Sec 0.3, isso significa que a cada 1 segundo a vida descerá 3 pontos, dentro da área do Volume.

Este volume aparecerá invisível no game quando dermos play, por isso para identifica-lo vamos colocar

Este volume aparecerá invisível no game quando dermos play, por isso para identifica-lo vamos colocar a partícula de fogo no seu centro.

vamos colocar a partícula de fogo no seu centro. Ao entrarmos no modo game e entrarmos

Ao entrarmos no modo game e entrarmos na área correspondente ao Volume notamos nosso Health descendo.

Quando saímos da área a barra permanece baixa. Vamos criar agora uma classe blueprint que

Quando saímos da área a barra permanece baixa. Vamos criar agora uma classe blueprint que usaremos como um Kit Médico, ou algo do tipo, para aumentar novamente nosso Life.

Criando Regenerador de Health

Ponha um Mesh da aba Basics em nosso Level para ser o nosso regenerador de vida. Atribua a ele um material do seu agrado.

de vida. Atribua a ele um material do seu agrado. Transforme o retângulo em uma classe

Transforme o retângulo em uma classe Blueprint e vá até sua viewport. Adicione um Box Collision em sua composição clicando em Add Components.

Vá OnCompenteBeginOverlap. para agora o seu Event Graph e com o Box selecionado chame o

OnCompenteBeginOverlap.

para

agora

o

seu

Event

Graph

e

com

o

Box

selecionado

chame

o

agora o seu Event Graph e com o Box selecionado chame o nó Depois chame o

Depois chame o “Cast to” correspondente ao seu player traga a variável “Current Health” tanto Get como Set. Coloque condição de Current Health Set o nó float + float e monte o esquema da seguinte maneira.

Ao colidir com o Box Collider Current Health receberá 10 pontos de Life e este

Ao colidir com o Box Collider Current Health receberá 10 pontos de Life e este objeto será destruído.

Espalhe algumas Classes Life pela fase.

será destruído. Espalhe algumas Classes Life pela fase. Ao darmos play e ficarmos na área do

Ao darmos play e ficarmos na área do fogo notamos nossa vida descendo, porém ao sairmos e encontrarmos um dos retângulos, quando encostamos nos mesmos nossa barra de vida sobe um pouco e o retângulo desaparece.

E assim concluímos o nosso sistema de perda e recuperação de Health.
E assim concluímos o nosso sistema de perda e recuperação de Health.

E assim concluímos o nosso sistema de perda e recuperação de Health.

Conclusão

esperamos que você tenha aprendido muito conosco.

Quando criamos a apostila pensamos em uma forma de passar tanto conhecimentos técnico da ferramenta, como a resolução de problemas e otimizações no projeto mostrando formas de fazer e o porquê de fazer deste ou daquele jeito. Um abraço e nos vemos na indústria de jogos digitais!

E aqui chegamos ao fim

Referência Bibliográfica

Unreal Engine 4 Documentation - https://docs.unrealengine.com/latest/INT/