segunda-feira, 17 de novembro de 2014

Usando Event Dispatcher em Blueprints

Blueprints possui um recurso chamado "Event Dispatcher" que possibilita uma forma de comunicação entre os Class Blueprints e o Level Blueprint. Neste artigo vamos modificar o exemplo feito no artigo anterior e criar um Blueprint que representará um Detonador que será responsável por iniciar a explosão.

O Blueprint "Detonator" que vamos criar neste artigo possui uma variável "Time" com o tempo que falta para a explosão. Ao encostar no Blueprint "Detonator" ele será ativado e começara a contagem regressiva para a explosão. Quando a variável "Time" for igual a zero, o Blueprint "Detonator" irá gerar um evento chamado "Detonate" usando Event Dispatcher

Com isso encerra a missão do Blueprint "Detonator". A forma como ocorre a explosão não é responsabilidade do Blueprint "Detonator". Desta forma temos um Blueprint que pode ser usado em várias situações.

A explosão será criada no Level Blueprint quando for gerado o evento "Detonate" do Blueprint "Detonator".

Crie um novo Blueprint com o nome "Detonator" baseado na classe Actor. Adicione estas duas variáveis:

- Time: tipo Integer, editável (editable) e com valor default igual a 10.
- Active: tipo Boolean, não editável e com valor default igual a "false" (desmarcado).

Mude para o modo de Componentes. O Blueprint "Detonator" será representado visualmente por dois componentes: um Box e um Text Render. Clique na opção "Add Component" e escolha primeiro o "Box" e depois o "Text Render":


Clique no componente Box que foi criado e desmarque a opção "Hidden in Game" que fica na categoria "Rendering" para que ele seja exibido durante o jogo.

Clique no componente TextRender criado e mude o nome para "Display". Na categoria "Text", na propriedade "Horizontal Alignment" escolha "Center". Na propriedade "Text Render Color" escolha uma cor vermelha, conforme imagem abaixo:


O Blueprint ficará desta forma:


O valor 10 que está sendo exibido foi obtido da variável "Time" no Construction Script:


Mude para o modo de edição do Graph e crie um novo "EventDispatcher" com o nome de "Detonate":


O detonador será ativado quando alguém encostar nele, por isso vamos usar o evento "Actor Begin Overlap". A variável "Active" é usada para que o detonador seja ativado uma única vez. Também é utilizado um Timer e um Evento Customizado que são responsáveis pela contagem regressiva do detonador. O script ficou desta forma:


A função "Set Timer Delegate" é apenas uma variação da função "Set Timer", só que ao invés de escrever o nome do Evento, é usado o pino vermelho do evento customizado para fazer a associação com o parâmetro "Delegate" da função "Set Timer Delegate". O exemplo acima significa apenas que o evento "Clock" será chamado a cada 1 segundo.

O evento "Clock" é responsável por diminuir em 1 a variável "time", atualizar o texto do componente TextRender e verificar se a variável "time" é igual a zero para então limpar o Timer e chamar o Event Dispatcher "Detonate":

Clique para aumentar

A ação "Clear Timer" desativa um Timer. É preciso informar o nome do Custom Event (evento customizado) que está associado ao Timer. No exemplo acima desativamos o Timer para que o contador pare em zero.

A Ação "Call Detonate" gera o Evento "Detonate" que criamos usando o Event Dispatcher. As ações que vão ocorrer devido a este Evento serão criados no Level Blueprint.

Após a compilação do Blueprint "Detonator", ele está pronto para ser adicionado ao Nível. A imagem abaixo mostra o "Detonator" em cima de uma mesa.


Precisamos agora colocar as Ações no Level Blueprints que irão gerar a explosão. Selecione o Blueprint "Detonator" que foi colocado no Nível e depois abra o Level Blueprint. Clique com o botão direito no Graph e escolha a opção "Add Detonate", conforme imagem:


"Detonate" é o evento gerado pelo "Detonator" usando o Event Dispatcher. Adaptando o exemplo do artigo anterior, o script do Level Blueprint fica assim:

Clique para aumentar

Execute o jogo e encoste no "Detonator" para iniciar a contagem regressiva, quando chegar em zero a explosão será gerada:


Usando Event Dispatcher separamos o Blueprint "Detonator" da explosão que é gerada, dessa forma podemos utilizar o "Detonator" em vários Níveis gerando explosões diferentes sem precisar alterar o Blueprint "Detonator".