‫Ei.
‫Bem vindo de volta.
‫Agora sabemos que precisamos obter o resultado do acerto sob o cursor.
‫Vamos falar um pouco mais sobre como isso funciona e o que isso significa neste vídeo.
‫Portanto, nosso objetivo é obter os resultados de acertos sob o cursor e mostrar esse local, e podemos fazer isso
‫desenhando uma esfera de depuração.
‫Vamos aprender a fazer isso também.
‫Então, vamos falar sobre algo chamado resultado de acerto.
‫Em jogos muitas vezes vai querer fazer algo assim.
‫Teremos um ponto no espaço.
‫Chamaremos esse ponto de início e ele tem o vetor do tipo F e teremos uma localização final.
‫Este também será um ponto no espaço do vetor tipo F.
‫Agora digamos que gostaríamos de desenhar uma linha invisível do ponto inicial ao ponto final.
‫E no momento em que desenhamos essa linha, gostaríamos de ver se há algum objeto entre os
‫locais inicial e final.
‫Agora, se houver, então esta linha que estamos desenhando no espaço vai atingir aquele objeto.
‫Na superfície, quando isso acontece, chamamos isso de evento de acerto.
‫Agora, quando desenhamos uma linha invisível como esta, chama-se executar um traço de linha.
‫E quando atingimos algo, dizemos que temos um rastro atingido.
‫Agora, se acertarmos algo e obtivermos um evento de acerto, o acerto de rastreamento armazenará informações em uma estrutura
‫chamada resultado de acerto.
‫Seu tipo é F hit result.
‫Agora, a estrutura F hit results contém variáveis que armazenam informações sobre o evento hit, incluindo
‫a localização do hit como um vetor f no espaço e o ator que atingimos, entre outras informações.
‫Agora, quando executamos um traço de linha, fazemos isso especificando um canal de colisão.
‫Normalmente com traços de linha, escolhemos o canal chamado visibilidade.
‫Existe um enum chamado E Collision Channel, e neste enum há uma constante de enum chamada
‫visibilidade XY.
‫Este é um dos parâmetros que especificamos ao realizar um traço de linha.
‫Agora, se especificarmos o canal de visibilidade, isso significa que os objetos configurados para bloquear o canal de
‫visibilidade em suas configurações de colisão registrarão eventos de ocorrência.
‫Quaisquer objetos que não estejam configurados para bloquear o canal de visibilidade não gerarão eventos de ocorrência.
‫Agora gostaríamos do resultado do rastreamento sob o cursor.
‫Imagine que temos a tela aqui e aqui está o nosso cursor agora.
‫Na ponta do nosso cursor, temos um ponto na tela quando usamos a função para obter o resultado do acerto
‫sob o cursor.
‫O que acontece é que temos nossa câmera e ela pode ver alguns objetos no mundo, como o chão aqui.
‫E estamos realizando um traço de linha da câmera no ponto na tela correspondente à localização do nosso
‫cursor, e estamos filmando o traço de linha diretamente para o mundo.
‫E se atingirmos algo, geraremos um evento de acerto e armazenaremos as informações em uma estrutura de resultado de acerto.
‫Então vamos descobrir como podemos fazer isso.
‫Estou aqui no tanque CP e o que eu gostaria de fazer é obter o resultado de acerto sob o cursor a cada quadro, o que
‫significa que precisamos da função tick.
‫Então, novamente, vamos voltar à base e encontrar nossa função tick aqui.
‫Agora não a estamos usando para nada no peão base, então podemos mover essa função para a classe tanque, assim como
‫fizemos com Begin Play.
‫Então, vou destacar a declaração da função junto com seu comentário e copiá-la.
‫E depois disso eu vou deletar toda esta seção, pública e tudo, e então eu vou voltar para o Tanque H
‫e aqui na seção pública eu vou colar a declaração da função tick.
‫Agora não a estamos usando no peão base, então vou remover a função tick da base pont.
‫CP Agora saiu do peão base.
‫Agora temos aqui a intenção declarada, mas também precisamos definir a função no tanque.
‫CP vou fazer isso aqui no tanque DHCP, logo abaixo do setup player input componente.
‫Então vamos dizer void tick.
‫É preciso um float chamado Delta Time.
‫E lá está o nosso corpo.
‫Agora, novamente, precisamos de um tanque logo antes da função tick, junto com o operador de resolução de escopo.
‫E também precisamos chamar super tick e passar no horário Delta.
‫Então agora temos carrapato na classe tanque.
‫O que queremos fazer é obter os resultados de acertos sob o cursor.
‫Então aqui está como fazemos isso.
‫A função que vamos usar existe no controlador do player chamada get hit result under cursor.
‫Nós temos falado sobre isso.
‫Agora aqui está a sintaxe.
‫É preciso um canal de rastreamento.
‫Lembre-se, precisamos especificar um canal de rastreamento e vamos usar a visibilidade.
‫Agora temos dois parâmetros de entrada adicionais.
‫O primeiro é um bool chamado complexo de traço B.
‫Falaremos sobre o que isso significa em um segundo.
‫E o terceiro parâmetro de entrada é um resultado F hit.
‫Agora vou clicar em F hit result só para ver esse tipo aqui na documentação.
‫E se eu rolar para baixo, veremos algumas das variáveis.
‫Um deles é chamado de ator e sua descrição diz Ator Hit by the Trace.
‫Também temos esse acerto de bloqueio B, que indica se esse acerto foi resultado de uma colisão de bloqueio.
‫Agora, entre as outras variáveis, temos coisas como ponto de impacto.
‫Este é o local no espaço onde realmente batemos em algo.
‫Então, por que não vamos em frente e tentamos chamar essa função?
‫Primeiro queremos nosso jogador, controle e graças ao que fizemos aqui e começamos a jogar, temos
‫jogador, controle, ref.
‫Agora, a primeira coisa que devemos fazer é verificar se a referência do controlador do jogador é válida.
‫Sempre podemos passar um ponteiro para uma instrução if.
‫Ele retornará true se o ponteiro em si não for um ponteiro nulo.
‫Se for um ponteiro nulo, ele retornará false em uma instrução if e nunca alcançaremos o interior da
‫instrução if.
‫É sempre uma boa ideia verificar nossos ponteiros e garantir que eles não sejam nulos antes de usá-los.
‫Agora vamos pegar nosso player, controller ref e vamos usar o operador de seta para
‫chamar a função, obter o resultado de acerto sob o cursor.
‫Agora podemos ver com o pop-up que temos três parâmetros de entrada.
‫O primeiro é o Canal Trace.
‫Vamos usar o EA Collision Channel e se digitarmos dois dois-pontos, obteremos uma lista suspensa que nos mostra todas
‫as diferentes constantes de enum no enum do EA Collision Channel.
‫Queremos usar visibilidade, então vamos digitar visibilidade XY para especificar que estamos usando o canal de
‫visibilidade.
‫Agora o próximo parâmetro é chamado B Trace Complex e vamos passar false para isso.
‫Agora vamos discutir em alguns minutos o que isso significa.
‫Mas por enquanto vamos usar false.
‫Agora, para o terceiro parâmetro, precisamos de um resultado de acerto.
‫Esta é uma estrutura do resultado de acerto do tipo F.
‫Agora, se você passar o mouse sobre isso, verá que o resultado F hit está sendo passado como uma referência, conforme indicado
‫pelo operador de referência que se parece com um e comercial.
‫Agora, geralmente quando você passa algo como referência, é uma referência de custo, o que significa que a
‫função não poderá alterá-la.
‫Mas aqui estamos passando um resultado F hit como uma referência não const.
‫Isso geralmente é uma dica de que a função foi projetada para alterar esse parâmetro de entrada diretamente.
‫O que obter o resultado da ocorrência sob o cursor fará é preencher essas variáveis no resultado da ocorrência com informações sobre
‫o resultado da ocorrência.
‫Isso significa que precisamos passar um desses resultados de f hit.
‫Vamos criar uma variável local aqui no if check do tipo F hit result.
‫E podemos chamar esse resultado de acerto e podemos simplesmente passar esse N como o terceiro parâmetro de entrada.
‫Agora, depois de chamarmos essa função, esse resultado de acerto será preenchido com dados sobre esse traço
‫de linha.
‫Por exemplo, podemos acessar o ator de ponto de resultado de acerto para obter o ator que foi atingido ou o ponto de impacto de ponto para obter
‫o ponto no espaço onde tivemos o evento de acerto.
‫Portanto, o resultado do acerto é o que usaremos para obter informações sobre o traçado da linha.
‫Agora, muitas vezes é bom poder ver o resultado de um traço de linha.
‫Podemos visualizar facilmente o resultado de um traço de linha desenhando uma esfera de depuração.
‫As esferas de depuração são formas simples que desenhamos no espaço e são ótimas para mostrar um local e
‫as usamos durante a depuração.
‫Na verdade, não usamos esferas de depuração em um jogo de turnos.
‫Então vamos ver como podemos desenhar uma dessas esferas de depuração.
‫Agora aqui está a documentação de uma função chamada desenhar esfera de depuração.
‫Existe em auxiliares de depuração de desenho.
‫Assim, podemos copiar este cabeçalho e incluí-lo onde quisermos chamar draw debug sphere.
‫Agora olhe para todos os parâmetros de entrada.
‫Primeiro, leva um mundo dessa maneira, ele sabe em qual mundo desenhar a esfera.
‫Leva um vetor F para o centro da esfera, bem como um flutuador para o raio.
‫Leva um N 32 para o número de segmentos para essa esfera.
‫Quanto mais segmentos, mais redonda a esfera fica com a cor F.
‫Assim ele sabe em qual cor desenhar essa esfera.
‫Ele quer saber se você quer linhas persistentes.
‫Em outras palavras, as linhas devem desaparecer imediatamente ou devem persistir?
‫Se persistirem, ele quer saber o tempo de vida da esfera.
‫Quando ele deve parar de desenhar a esfera?
‫Se você não desenhar linhas persistentes, digamos que você gostaria de desenhá-lo para um único quadro, então você
‫passaria um negativo como o tempo de vida.
‫Agora os dois últimos parâmetros são opcionais, então vamos manter isso simples discutindo apenas os primeiros
‫sete parâmetros.
‫Vamos ver como isso funciona.
‫Vou desenhar uma esfera de depuração agora no topo, vou incluir auxiliares de depuração de desenho.
‫É aí que esta função de esfera de depuração de desenho é declarada.
‫Agora vamos começar a jogar e simplesmente desenhar uma esfera de depuração para ver como isso funciona.
‫Então, vou chamar draw debug sphere e the.
‫O primeiro parâmetro de entrada é um novo mundo.
‫Podemos obter nosso mundo a qualquer momento chamando Get World, Get World Retorna um novo ponteiro de mundo para nosso
‫mundo atual.
‫Então isso satisfará a primeira entrada.
‫Em seguida, precisamos de um vetor f para o centro da esfera.
‫Agora estamos chamando isso e começamos a jogar para que eu possa simplesmente chamar get ator location e isso obterá
‫a localização do nosso tanque.
‫Já que estamos na classe tanque.
‫Agora vou aumentar um pouco a esfera.
‫Então, vou adicionar um vetor F com zero ponto F para o x zero ponto F para o Y e dizer 200 F para o
‫Z.
‫Agora vou colocar esses parâmetros de entrada cada um em sua própria linha.
‫Portanto, está claro o que estamos passando para cada entrada.
‫A segunda entrada está obtendo esta expressão, que é a localização do ator, mais um vetor apontando para cima com
‫um comprimento de 200.
‫A adição desses dois vetores me dará a localização do tanque elevado no eixo Z em 200
‫unidades.
‫Agora o próximo parâmetro de entrada, será o raio da esfera.
‫Eu vou escolher 100 F apenas para que possamos ver como é uma esfera de depuração com um raio de 100.
‫Em seguida é o número de segmentos.
‫Vou escolher 12.
‫Veremos como isso se parece.
‫Agora, para uma cor F, existe uma classe de cores F e tem muitas cores incorporadas, como o vermelho.
‫Agora, para o booleano chamado B linhas persistentes, vou escolher true.
‫E para o próximo parâmetro de entrada temos o aviso vitalício.
‫Tem um valor padrão de um negativo.
‫Isso significa que, por padrão, ele desenhará a esfera de depuração para um único quadro.
‫Mas vou passar em 30 F para que tenhamos a esfera por 30 segundos e posso omitir os dois últimos parâmetros.
‫Então aqui está nossa chamada de função para desenhar a esfera de depuração.
‫Vamos compilar isso e ver como fica.
‫Ok, então estou de volta ao editor.
‫Vou abrir uma segunda janela para que possamos ver isso em tela cheia.
‫Eu posso ir para as portas de visualização da janela e selecionar a Viewport dois e agora vejo esta segunda janela.
‫Pode não ser em tela cheia quando for aberto, mas você sempre pode maximizá-lo.
‫Agora a partir daqui eu posso jogar o jogo com alt p.
‫Agora verifique isso.
‫Aqui está nossa esfera de depuração.
‫Observe que não é perfeitamente redondo.
‫Escolhemos 12 para o número de segmentos.
‫Quanto mais segmentos você escolher, mais linhas serão necessárias para desenhar a esfera.
‫Agora, esta é uma esfera com um raio de 100.
‫É bem grande, e o centro da esfera está no local do tanque, mais 200 unidades no
‫ar.
‫Então é assim que podemos desenhar esferas de depuração.
‫Portanto, seu desafio é desenhar uma esfera de depuração usando o resultado do rastreamento sob nosso cursor.
‫Então desenhe uma esfera de depuração em nossa nova instrução if onde estamos verificando se o controlador do jogador ref não
‫é nulo.
‫Agora, usando nosso resultado de acerto, obtenha o ponto de impacto do resultado de acerto e use isso como o Centro
‫da Esfera.
‫Agora, para o parâmetro de entrada de linhas persistentes, use false e para a duração, use um negativo.
‫E isso resultará no desenho da esfera para um único quadro, o que é bom porque estamos chamando isso
‫de todos os quadros dentro da função tic.
‫Então pause o vídeo e desenhe a esfera de depuração na função tick.
‫OK.
‫Então estou de volta aqui em Tank.
‫Agora eu tenho essa chamada de função de esfera de depuração de desenho aqui e começo a jogar para que eu possa ir
‫em frente e copiá-la e removê-la do início da reprodução e vamos voltar para o tick aqui dentro de nossa instrução if
‫e estou apenas vamos colá-lo aqui e vamos alterar alguns dos parâmetros de entrada.
‫Por um lado, estamos mudando a localização do centro da esfera.
‫Vamos usar o resultado de acerto.
‫Então, eu vou dizer o ponto de impacto do ponto de resultado de acerto.
‫Agora para o raio, eu gostaria de fazer isso um pouco menor.
‫Vamos fazer cerca de 25.
‫Tudo bem.
‫Se você não fez isso, eu só estou fazendo isso.
‫Então a esfera não é tão grande.
‫Agora, o penúltimo parâmetro que estamos passando é para linhas persistentes.
‫Vou passar em falso e pela duração em vez de 30 segundos, vou usar um ponto F
‫negativo.
‫Dessa forma, obteremos uma esfera para um único quadro, o que está bem, novamente, estamos chamando isso na
‫função tick, então chamaremos isso a cada quadro.
‫Vamos em frente e compilar isso.
‫Agora, de volta ao editor.
‫Se eu apertar o play agora, veja isso.
‫Eu tenho uma esfera de depuração e está sendo desenhada no ponto de impacto para o traço de linha sob o cursor.
‫Agora podemos mover isso pelas paredes e em outros objetos e o traço está atingindo esses objetos porque eles estão configurados para
‫bloquear o canal de visibilidade.
‫Muito incrível agora.
‫Prometi que discutiríamos o rastreamento complexo versus o rastreamento simples.
‫Eu vou te mostrar uma coisa enquanto estamos jogando o jogo.
‫Vamos clicar na janela de visualização para que tenhamos controle sobre nossa palma.
‫Agora aperte a tecla til e digite o comando do console show colisão.
‫Agora pode não ser tão fácil de ver na minha tela, mas você pode definitivamente vê-lo na sua tela.
‫Observe a colisão para nossos peões.
‫Não apenas podemos ver a cápsula, mas podemos ver esse volume de colisão em torno de nossas malhas de tanque e torre.
‫Esta é uma simples colisão.
‫Deixe-me mostrar rapidamente onde podemos ver a simples colisão.
‫Vou entrar em ativos e malhas e se eu clicar duas vezes em, digamos, a base do tanque aqui, estamos olhando
‫para a colisão complexa.
‫Se eu clicar neste ícone de exibição aqui na parte superior e selecionar colisão complexa, posso ver todos os
‫polígonos na colisão complexa e há muitos deles.
‫Se eu clicar no ícone show novamente e, desta vez, marcar a caixa de seleção ao lado de Simple Collision, observe que
‫há outro volume de colisão.
‫Isso é chamado de casco de colisão e tem muito menos geometria.
‫Há um número menor de polígonos com este volume de colisão.
‫Isso é o que o mecanismo de física usa para detectar a sobreposição em eventos de acerto.
‫Se estivesse usando a colisão complexa, exigiria muito mais cálculos.
‫É por isso que temos volumes de colisão simples, então é muito melhor para o desempenho sempre que fazer
‫um rastreamento de linha se rastrearmos para uma colisão simples em vez de uma colisão complexa.
‫Então agora temos o resultado de acerto sob o cursor.
‫Demorou algum trabalho para chegar lá, mas agora temos e provamos mostrando este local com uma
‫esfera de depuração.
‫Essa é uma boa maneira de confirmar que nosso hit de rastreamento está funcionando.
‫Agora que sabemos que está funcionando, podemos usar esse local para girar a torre em nosso tanque.
‫E faremos isso no próximo vídeo.
‫Vejo você em breve.