‫Bem vindo de volta.
‫Agora, neste vídeo, vamos falar sobre eventos de sucesso.
‫Gostaríamos de detectar quando o projétil atinge algo e dessa forma podemos fazer algo em resposta,
‫como destruir o projétil.
‫E mais tarde vamos lidar com causar danos e causar efeitos de explosão e coisas assim.
‫Então vamos falar um pouco sobre eventos de sucesso agora.
‫Nosso projétil tem um componente de malha.
‫Seu tipo é seu componente de malha estática e seu componente de malha estática é uma classe em uma longa hierarquia
‫de classes e o sistema de mecanismo irreal, um de seus pais, é seu componente primitivo.
‫Aqui está a página de documentação para seu componente primitivo.
‫Ele diz que os componentes primitivos são componentes vistos que contêm ou geram algum tipo de geometria geralmente
‫para ser renderizada ou usada como dados de colisão.
‫Então eles são basicamente componentes de cena com alguns recursos adicionais.
‫E se você rolar para baixo e olhar para a hierarquia, verá que vimos o componente
‫e derivado daquele componente primitivo e você pode continuar rolando para baixo e ver todas as outras classes que
‫derivam de você.
‫Componente primitivo.
‫Agora, a razão pela qual estamos apontando isso é porque seu componente de malha estática herda
‫esses recursos de seu componente primitivo e seu componente primitivo tem a capacidade de gerar eventos de ocorrência.
‫Agora, o que queremos dizer com gerar eventos de sucesso?
‫Bem, digamos que temos alguma geometria em nosso mundo representada pelo retângulo à direita,
‫e temos um objeto com um componente de malha estático representado pelo círculo à esquerda.
‫Agora, se este objeto que tem um componente de malha estática estiver se movendo em direção ao bloco, se este componente estiver
‫configurado para lidar com eventos de acerto, assim que atingir esse bloco, o evento de acerto será
‫gerado na colisão.
‫Agora, um evento de acerto gerará alguns dados relativos a essa colisão, incluindo o componente que foi
‫atingido.
‫Portanto, este bloco aqui pode ter um componente de malha estática.
‫Podemos acessar esse componente ao colidir.
‫Também podemos acessar o ator que foi atingido e o evento head também gera um resultado de acerto EF.
‫Aprendemos um pouco sobre o resultado do hit F e sabemos que ele contém muitas variáveis sobre o evento
‫hit, como o local do hit, que é um vetor F que representa um local no mundo.
‫Então temos nossa malha de projéteis.
‫Esta é uma variável do tipo ponteiro de componente de malha estática.
‫Agora, sempre que esse componente de malha estática atingir algo no mundo, queremos ter algum código
‫que responda a isso.
‫Agora sendo um componente de malha estática, ele herda coisas da sua classe de componentes primitivos.
‫Uma das coisas que ele herda é uma variável chamada no hit do componente.
‫Agora, aqui está a documentação para o hit do componente.
‫É descrito como um evento chamado Quando um componente atinge ou é atingido por algo sólido.
‫Agora, rolando para baixo, vemos que no hit do componente tem a assinatura do hit do componente tipo F.
‫E se clicarmos nele, veremos que a assinatura do hit do componente F é uma estrutura.
‫Agora voltando, podemos ver que a documentação diz um evento chamado quando um componente atinge ou é
‫atingido por algo sólido.
‫Isso pode acontecer devido a coisas como o movimento do personagem usando o local definido com varredura habilitada
‫ou simulação de física para eventos quando objetos se sobrepõem, como caminhar em um gatilho, veja o evento de sobreposição.
‫Portanto, existem eventos de sucesso e eventos de sobreposição.
‫Estamos preocupados com eventos de sucesso.
‫Portanto, sabemos que o hit do componente é descrito na documentação como um evento de hit e sabemos que o hit
‫do componente é uma estrutura da assinatura do hit do componente tipo F.
‫Até agora tudo bem.
‫Agora, esse evento hit no hit do componente também é algo que chamamos de delegado multicast.
‫Um delegado multicast pode ter várias funções vinculadas a ele.
‫Pode haver funções que existem em várias classes.
‫E se essas funções forem vinculadas a esse delegado multicast, elas serão adicionadas a algo chamado
‫lista de invocação.
‫Esta é uma lista de funções a serem chamadas quando este evento de ocorrência diz que todas elas devem ser chamadas.
‫Dizemos que esse evento de acerto ou delegado multicast transmite quando algo acontece.
‫Portanto, caso nossa malha de projéteis atinja algo, o delegado transmitirá para todas as classes que
‫tenham uma função vinculada a esse delegado.
‫Assim que essa transmissão é enviada, todas essas funções vinculadas são chamadas em resposta à
‫transmissão.
‫Este é um recurso muito poderoso do Unreal Engine.
‫Isso nos permite ter uma coisa chamada delegado, que espera por um evento como uma colisão.
‫E depois.
‫E o delegado será transmitido, resultando em todas as funções vinculadas chamadas em resposta à transmissão.
‫Como várias funções podem ser vinculadas a esse delicado, chamamos de multicast.
‫Está transmitindo para várias classes que têm suas funções vinculadas a ele.
‫Agora, como vinculamos uma função a esse delegado?
‫Bem, no componente hit tem uma série de funções que nos permitem fazer isso, uma das quais se
‫chama add dynamic.
‫Então, quando chamamos a função dinâmica ADD, tudo o que precisamos fazer é passar em dois parâmetros o objeto de usuário para o
‫qual podemos usar isso e a função de retorno de chamada, que é o endereço de alguma função em
‫nossa classe.
‫Então, uma vez que acessamos isso no componente, clique em delegate e chame a função add dynamic, podemos passar o objeto de
‫usuário e o retorno de chamada.
‫E isso resultará na adição desse retorno de chamada à lista de invocação de eventos de ocorrência.
‫Agora, no hit do componente, transmitiremos esse delegado, resultando em qualquer função vinculada a ele a ser chamada.
‫Portanto, para vincular a esse delegado, precisamos criar uma função de retorno de chamada.
‫Então aqui está o projétil e gostaríamos de uma função de retorno de chamada para o evento hit.
‫Então, vamos criar uma função privada aqui e ela será nula.
‫E eu vou simplesmente chamar isso de sucesso.
‫Poderíamos chamar isso de qualquer coisa que quisermos, mas parece descritivo o suficiente.
‫Agora, essa função de retorno de chamada precisa ter a assinatura correta para eventos de ocorrência, o que significa
‫que sua lista de parâmetros de entrada precisa ser muito específica.
‫O primeiro parâmetro de entrada deve ser do tipo ponteiro de componente primitivo e é chamado de hit comp.
‫Este é o componente que está fazendo a batida.
‫No nosso caso, teremos nossa malha de projéteis atingindo as coisas.
‫O próximo parâmetro é um ponteiro de ator chamado Outro Ator.
‫Este vai ser o ator que foi atingido.
‫O próximo parâmetro de entrada é outro ponteiro de componente primitivo chamado other comp.
‫Este é o outro componente que foi atingido.
‫Então, se atingirmos o componente de malha estática de algum outro ator, esse seria o componente de malha estática.
‫Em seguida é um vetor F chamado impulso normal.
‫Se estivermos simulando física, o mecanismo de física aplicará um impulso em resposta à colisão.
‫E este vetor f representa a direção e a magnitude desse impulso.
‫E finalmente, temos um parâmetro de entrada do tipo const F hit result e esta é uma referência const e
‫é chamada hit.
‫Assim, quando on hit for chamado, teremos acesso a um resultado de hit que contém ainda mais informações sobre o
‫hit.
‫Agora, como estamos vinculando isso a um delegado, deve ser uma função U.
‫Então, vamos marcar isso com sua função.
‫Agora, você deve estar familiarizado com sua função.
‫É como sua propriedade, apenas para funções e não para variáveis.
‫Tão importante.
‫Nosso retorno de chamada deve ser uma função u para que isso funcione.
‫Agora declaramos a função.
‫Vamos em frente e definir a função.
‫Então, de volta em projéteis.
‫CP Logo abaixo da nossa função tick, vamos definir esta função.
‫Daremos a ela um corpo de função e colocaremos o nome da classe antes do nome da função, e agora temos uma função de
‫retorno de chamada.
‫Portanto, estamos prontos para vincular essa função ao nosso delegado e precisamos fazer isso no início do jogo.
‫Fazer isso no construtor é muito cedo e, às vezes, você pode encontrar problemas como seu delegado
‫não estar vinculado.
‫Então vamos fazer isso aqui e começar a jogar.
‫Então temos nossa malha de projéteis e usaremos o operador de seta para acessar a variável herdada de você.
‫O componente primitivo chamado no hit do componente e no hit do componente tem a função add dynamic.
‫Agora, estranhamente, o preenchimento automático não funcionará para adicionar dinâmico, então você terá que digitar o
‫nome inteiro da função.
‫Esta é a função que usaremos para vincular nosso retorno de chamada ao hit do componente e adicionar essa função à
‫sua lista de invocação.
‫Agora, primeiro, precisamos do objeto de usuário que será isso porque essa é a classe para
‫a qual vinculamos a função e, em seguida, precisamos do endereço da função que será o endereço do hit.
‫Então vamos usar o endereço do operador e a função um projétil ao acertar.
‫E com isso temos nossa função vinculada e estamos prontos para gerar eventos de hit.
‫Agora podemos testar isso com um log UEE e podemos usar o aviso de temperatura do log.
‫E para o texto, podemos simplesmente dizer no hit.
‫E se virmos isso no log de saída, saberemos que nossa função on hit foi chamada, vamos compilar
‫isso.
‫Então eu tenho o log de saída aberto aqui.
‫Vou apertar o play e disparar um projétil e lá está minha mensagem de log no hit sendo chamada.
‫Então isso está funcionando.
‫Agora, apenas uma observação lateral, se entrarmos no projétil BP e selecionarmos a malha do projétil no painel de detalhes, podemos
‫rolar para baixo até a seção de colisão.
‫E aqui vemos que as predefinições de colisão estão definidas para bloquear todas as dinâmicas e que a colisão
‫habilitada está definida para essa configuração de consulta e física habilitada para colisão.
‫Isso é necessário para eventos de sucesso.
‫Precisamos ser capazes de consultar um evento de acerto.
‫E, claro, a física permite que o mecanismo de física atue na malha do projétil.
‫Agora que vinculamos o delegado hit do componente on com nossa função on hit e colocamos um log enorme
‫para garantir que está funcionando, gostaria que você explorasse essa função um pouco mais para que possamos
‫entenda alguns desses parâmetros de entrada em nossa função on hit.
‫Então, na função on hit, adicione mais alguns logs YOUI.
‫Eu gostaria que você imprimisse os nomes de alguns desses parâmetros de entrada usando a função git name.
‫Eu gostaria que você usasse um log YUI para imprimir o nome do hit comp, outro ator e outro comp para que pudéssemos ver
‫os nomes desses objetos que estamos atingindo.
‫Você vai usar o formato percent se, especifique o na macro de texto do log E.
‫E apenas como lembrete, sempre que chamamos get name, temos que usar o asterisco ao passar essa string para a macro de
‫log YUI, por exemplo, para obter o nome de outro ator, chamaríamos outro ator, obteríamos o nome e colocaríamos
‫esse asterisco no início apenas para retornar aquela string de estilo C, que é o que você
‫espera quando você a formata com uma string.
‫Então pause o vídeo e use Yui log em nossa função on hit para imprimir os nomes de hit comp, outro ator
‫e outro comp agora.
‫OK.
‫Então aqui no projétil CP, vou usar você log aqui.
‫Então vou copiar esta linha onde estou usando o log do Yui e para a string vou dizer hit
‫comp percent s e logo após o texto vou chamar hit comp get name e preciso desse asterisco para converter de uma
‫string F para uma string estilo C.
‫Agora vou usar essa mesma linha, só que vou mudar o texto para dizer outro ator e
‫vamos chamar de outro ator dessa vez.
‫E finalmente, vou imprimir outra chamada de comp, pegar nome em outra comp.
‫Então, vamos compilar e voltar aqui no editor, vou seguir em frente e apertar play e atirar um
‫projétil e verificar isso.
‫Vemos que o hit comp é uma malha de projétil.
‫Lembre-se que dissemos que este é o componente que está batendo, que é nosso mash de projéteis
‫e você verá que ele está usando o nome que atribuímos a este componente em create default sub object.
‫Portanto, esta é uma daquelas situações em que esse nome está sendo usado.
‫Agora você verá que ele diz que a falha de outro ator ressalta zero.
‫E isso porque esse ator de malha estática que é a falha tem o nome de falha de sublinhado zero.
‫Às vezes, o mecanismo colocará um número no final de seu nome interno para atores e componentes, e
‫você verá que temos a mesma coisa acontecendo quando imprimimos outras composições.
‫O ator de malha estática de falha tem um componente de malha estática e seu nome é componente de malha estática zero.
‫Então, isso nos dá um pouco mais de informações sobre esses parâmetros de entrada em nossa função de retorno de chamada no hit.
‫E isso é útil porque temos acesso a esses objetos em C++ se quisermos fazer algo em resposta ao
‫evento hit.
‫Então, em resumo, aprendemos sobre eventos de sucesso e como eles são implementados como delegados multicast e aprendemos
‫como eles funcionam.
‫Criamos uma função chamada On Hit and Bound, essa função para o delegado de hit do componente que
‫nossa malha de projétil herdou da classe de componente primitiva.
‫Agora, não destruímos o projétil ao acertar, mas agora sabemos que podemos fazê-lo facilmente porque temos essa
‫função de retorno de chamada e podemos colocar lógica nessa função, como destruir o projétil.
‫Então, vamos lidar com isso em um vídeo futuro.
‫Por enquanto, dê um tapinha nas costas porque essa é uma das áreas mais complexas do Unreal Engine C++ que
‫você aprendeu até agora.
‫Vejo vocês no próximo vídeo.