Primeiras aulas do curso Unreal Engine parte 6: balística com mecânica de tiro ao alvo

Unreal Engine parte 6: balística com mecânica de tiro ao alvo

Preparando chute pro alvo - Introdução

Bem-vindos ao curso Unreal - parte 06 - Balística com mecânica de tiro ao alvo. Esse curso é a continuação da parte 05. Então, se você não fez, volta lá e faz, para não ficar mais perdido do que marinheiro na Bolívia, que não tem oceano, né?

Vamos começar, vendo como ativar um gatilho de animação com o overlap vídeos, tá? A bola vai ser lançada por um sensor de aproximação e não mais pela perna do chutador em si. Para isso, vamos aprender como calcular um vetor entre dois pontos e adicionar uma força de impulso que lance a bola na direção que a gente mirar.

Em seguida, vamos ajustar a massa da bola para a medida correta em gramadas e ver um pouco do sistema de unidades da Unreal. A força aplicada também vai ser equalizada para não somar a força do vetor calculado ao nosso chute a gol.

Depois, vamos criar uma mecânica de tiro ao alvo, usando o line trace, para conferir, se estamos olhando para a área de chute e devolver a localização do alvo para a gente. Essa área vai ser um plano em volta da trave, tá? Que só vai ser visível para o line trace, se não aparece no Play, no Game mode aí. [01:3] Para refinar um pouco, vamos excluir o goleiro dessa mecânica, usando as opções de colisão customizadas e seletiva no line trace e vamos trocar o objeto proxy do alvo em todos blueprints, que estiverem usando ele por um crosshair mais bonitinho e gerar uma rotação contínua.

[`01:52] Para ele também não ficar lá paradão. Finalmente, vamos aprender a interromper o fluxo da linha de execução do event tick, que é constante, com o switch e uma variável integral. E vamos travar o alvo na mira, ativando uma animação de escala e cor, para finalizar esse nosso exercício de balística avançada.

Então é isso, arregaça as mangas e mão na massa, vamos lá?

Preparando chute pro alvo - Preparando chute para o alvo

Estamos começando aqui o nosso curso, para quem não fez o anterior pegam aqui no Chutebol_p2, arquivos do curso, tá? Baixem aí o Chutebol p2 unr e eu coloquei na minha pasta C, cursos, Chutebol_p2, que é essa pastinha aqui, tá? Para quem já tiver, pode continua na anterior.

Então, vamos abrir aqui e executar o project dele, que é o Chutebol_p2, vamos lá. Pronto, estamos de volta, para quem fez anterior a gente tinha feito o chute do chutador aqui, né? E o goleiro tentando defender com física. Então, a animação, vamos dar um play para relembrar.

Quando a gente clicava, olha a animação do chutador, vai rolar e quando ele encosta na bola, dá o impulso para o gol, o gol furado por enquanto e ele comemora. Então, o que a gente vai fazer agora? É chato, dar um chute pela física, né? Sendo que você tem que ter uma animação perfeita....

Para aquele chute ir para a direção que você quer. Então, como a gente vai fazer para poder controlar a direção desse chute e a força, né? Então, vou fazer o seguinte. Primeiro, vamos pegar a nossa bola que está aqui, ó. Bola, que era só uma estática e mexe, tá? Simples com física.

Que caia quando a gente dava play, para ela ser chutada não era nada, e vamos transformar ela num actor, tá? Como ela é uma espera simples, eu vou deletar isso daqui, tá? E vou vou criar um actor novo aqui na raiz, clica com o direito, vamos lá no Blueprint Class.

E o actor. Vamos chamar ele de bola, bolaBP vamos deixar esse BP, com um padrãozinho, para saber o que tem blueprint, que nem o chutador e o goleiro aqui. E dentro dela não tem nada, então vamos colocar alguma coisa dentro dela. Vamos colocar aqui para ficar maior.

Só tem aí o Default Scene Root, então colocar uma esfera aqui no add component, sphere, como a gente já viu, uma esfera simples, desse tamanho mesmo, bola exatamente do tamanho original e vamos pôr o material bola, que está aqui na pasta materiais.

Então temos aqui o m_bola, aí, a gente volta com ele selecionado aqui, a gente vai no bolaBP e aqui no materiais, a gente coloca essa setinha, que aplica o modelo da bola. Pronto. Temos agora um actor com uma bola, mas para que um actor, se já tínhamos um staticmesh para a gente aplicar os nossos grouprints de impulso.

Então, vamos lá, vamos no nosso bola, aqui, e vamos no nosso Event Graph, pode tirar tudo isso aqui, que está aqui, a gente vai começar um evento novo, chamado do Event Actor Begin Overlap. O que o Begin Overlap faz? Quando começar a dar um overlap, que é uma sobreposição de algum outro objeto, que tem a colisão nela.

Ela vai dar um trigger aqui, vai dar um gatilho para alguma, tá? E essa alguma coisa que a gente vai colocar é um impulso. Então, vou puxar daqui, ó, add impulse, tá? Ele já pede o objeto. Então a espera que a gente tem ali... Eu vou colocar: add impulse, sphere.

E vamos mudar o nome da nossa espera para bola, né? Porque só espera, não fica legal. Então, bola, temos aqui o nosso bola e temos o impulso com uma direção que está a 000, vamos ver o que acontece aqui, vamos dar o compile, que no meu aqui é o “q” de queijo, como a gente viu nos outros...

Eu fiz o atalho, mas é a mesma coisa que o compile, eu aperto o “q” aqui e vamos dar o play e ver o que acontece, não acontece nada, né? O actor nem está na cena, então, vamos arrastar ele para a cena aqui e vamos colocar ele no... ops o material. Ctrl + z. Vamos colocar a nossa bolaBP aqui, tá?

E vamos zerar primeiro a location dela 000, pronto, fica mais fácil para centralizar com o gol, com o goleiro e o chutador e subir um pouco aqui, tá? Deixa eu ver, a escala dela está muito grande, vamos colocar 0.5 e 0.5. Pronto, agora, ela está uma bolinha melhor, né?

Esse tamanho está bom, ela vai cair daí, se ela tiver física. Então, vamos colocar física nela aqui, bola inherited, e vamos colocar física, simular física, tá? Só que não dá para por aqui, porque agora é um actor. Então, a gente tem ir lá dentro do bolaBP.

E fazer na viewport, clicando aqui, porque ela não é mais um (staticmesh) solto e vamos no physics aqui, simular a física, tá? Então, a gravidade habilitada, colisão, yes, yes, ok. Physics Actor. Vou dar o compile no save e ver se ela está caindo aí no nosso mundinho. Então, play.

Pronto. Está caindo até o infinito, ela não está com colisão. Então, vamos voltar aqui e vamos colocar aqui no colisão, ó, estava no Physics Actor, vamos colocar um BlockAll, tá? Vamos bloquear tudo aí, compile, save e vamos ver se ela agora bate no piso. Pronto. Exatamente onde estava a outra.

Ela está no mesmo lugarzinho lá, zerado, mas vamos ela um pouquinho mais... deixa eu ver aqui... vou descer... “f” de faca, vou colocar ela, ela está aqui, ó, vou colocar mais ou menos para, está no meio, porque o pé dele tem que pegar. Então, vamos ver o play. Pronto.

Não caiu, tem que estar um pouco acima caiu lá de baixo, agora vamos no play aqui, pronto, a bola está no lugarzinho para ser chutada. Então, se a gente clicar, ó, ele vai lá e chuta a bola normalmente, tá? Porque ela tem física, que nem a outra.

Só que a gente não quer mais esse chute feito... baseado na física da animação, porque só dá um chute para frente e não dá para selecionar a direção, né? Se a gente quiser chutar aqui, aqui, embaixo ou para fora do gol mesmo. Então, vamos fazer isso lá no nosso bolaBP.

O nosso impulso não está funcionando, por quê? O impulso precisa de uma direção e de onde vai ser essa direção? Essa direção vai ser da própria bola onde ela está parada, em direção ao ponto que a gente quer que ela vá, tá? Isso vai gerar um vetor.

Então, a gente vai criar um novo actor aqui, para fazer o cálculo da direção da bola original e ela ganhar o impulso no momento que o pé do ovo chutador chegar, ela vai ter o impulso, com a força que a gente vai definir, tá? Para a direção que a gente colocar.

Então, eu vou criar um actor aqui aqui chamado planodamiraBP, por que plano da mira? Porque depois a gente vai ter um plano para poder selecionar aonde vai estar, senão eu colocaria só mira. O que vai ter dentro dele? Vamos colocar um objeto aqui, dentro desse actor, vamos colocar um cone.

Um cone simples, vamos chamar ele de alvo cone, vamos colocar ele de cabeça para baixo, então, eu vou deixar ele assim, mais ou menos. Pronto, não precisa ser exato. Eu estou sem o (snap) aqui, se a gente tivesse com o snap, ele ia certinho em graus aqui.

Vamos dar um compile e vamos colocar isso na cena também. Então, temos o plano da minha aqui, ó, é um conezinho e aqui o location dele, a gente vai usar para calcular a direção do nosso impulso. Então, vamos colocar aqui... aqui, mais ou menos é o centro, tá?

Vamos colocar assim, vamos ver se a bola vai para essa direção. Então, agora, o que a gente tem que fazer? A gente tem que pegar esse actor, que é o plano da mira, lá no nosso bolaBP, vamos dar um save geral? Save geral aqui, nosso materialzinho mexido. E vamos no bola BP.

E agora, a gente precisa puxar o location do nosso plano da mira, tá? A gente pode fazer de duas maneiras. Eu prefiro fazer agora no Construction Script, para ficar mais limpo aqui, eu crio uma variável. Então, como a gente viu no primeiro curso, vamos criar uma variável aqui Construction Script.

Então, puxar aqui, Get All Actors Of Class, vamos selecionar a classe dele que é plano da mira. Aí, a gente tem que pegar o get aqui, uma cópia, né? Uma cópia dele com o index zero, que é o que está lá na cena, que a gente já colocou, tá? Esse aqui, ó, o planodamiraBP.

Se tivesse planodamiraBP2 ou 3, ia ser o index 2 ou 3 também. E vamos puxar agora uma variável aqui, clica com direito e promover a variável, tá? Promote to Variable, vamos chamar ela de alvo, tá? Então, a gente vai dar uma definição aqui, citamos essa variável. Vamos dar um compile.

E agora, ele já vai puxar isso, gerando uma variável, que eu posso jogar aqui, tá? Então, vamos puxar essa variável, alvo, está aqui e vamos pegar a variável. Está o alvo, a gente não vai mais setar, já foi setada. Agora, eu preciso do world location da bola.

Então, get world location, já está o bola aqui, ó, então a gente pode substituir esse aqui, deleta e puxa ele para cá, tá? O target aqui, vai ser a própria bola, mas a gente precisa da direção dela no get world location. E agora, precisamos do world location do alvo, então, get world location aqui, tá?

Vamos colocar um simples e o target dele vai ser o alvo, porque o alvo é onde está lá na cena, o algo aqui, tá? Então, vai ser daqui da bola, onde ela estiver, para cá, a gente vai tirar um vetor, vai colocar uma força aqui, para a bola... naquela direção. Então vamos voltar aqui...

E vamos juntar esses dois, para tirar o vetor, a gente vai usar o get unit direction vector, tá? Ele vai pegar um vetor, ó, from, daqui do bola, que está parada, onde ela estiver na cena, para o alvo, que é aonde a gente deixou o alvo lá. Então, daqui para cá, a gente tem um vetor.

E esse vetor pode ser colocado aqui, amarelinho com amarelinha. Então, vamos por ele direto aqui, na verdade tem um truque, mas vou direto para a gente ver que já funciona assim. Então, vamos dar um save e vamos dar um play aqui. Nada acontece direito, por quê?

Porque ele precisa de um overlap, né? Ele, não vai ser mais com a física desse objeto aqui. Então, vamos fazer isso no próximo vídeo, vamos dar um save aqui. Já está feito aqui o nosso... o começo nosso grouprint, tá? Então, vamos dar um save all na cena.

E no próximo a gente vai ver como fazer um impulso para a direção correta.

Overlap, Massa e Força - Overlap, Massa e Força

Voltando aqui ao porquê da nossa bola não ter ido na direção certa, né? Vamos dar um play só para só para relembrar, a agente clica aqui e ela chuta normal, vai reto, até bateu no goleiro por acaso, mas não está indo para direção que a gente quer, que é esse alvo aqui.

Então, como fazer para habilitar isso, né? Lá no nosso bolaBP, a gente tem o blueprint... actor begin overlap, só que eles tem que habilitar o begin overlap, né? E como habilitar begin overlap? A gente, pode vir aqui, ó, no chutador e vamos no skeletal mesh dele, que ele é quem vai encostar.

E aqui no collision dele, tem que generate overlap events, tá? Se não habilitar isso aqui, ele não causa o evento de overlap, tá? Então, vamos colocar isso aqui, e eu não quero mais que ele bloqueie todos os dinâmicos. Então, eu não quero que o chutador realmente chute a bola.

Eu só quero que ele faça o overlap, que é uma sobreposição de um objeto no outro, quando um objeto cruza com outro, ele ativo o overlap aqui. Então, eu vou por aqui collision presets dele, um overlap all, tá? Overlap all é, ele atravessa tudo, ele não bloqueia nada, mas ele gera o overlap events aqui.

Então, vamos checar aqui, ok. Eu tinha posto errado um actor location aqui, é world location, é o get world location do alvo cone, tá? Que é um elemento dentro do actor alvo, tá? Então, ele tem que ter esse alvo cone aqui e agora, sim, get actor location. Então, vamos dar o compile, save.

E vamos testar, se está funcionando o nosso chute para a direção certa. Então, vamos lá, clicou, correu e nada acontece novamente, por quê? Porque não temos força aplicada à bola, a direção está certa, mas não tem força nenhuma. Por que não tem força?

Porque não está multiplicado por nada. Então, aqui, ó, no get unit direction vector, a gente tem que puxar um multiply vector por float, tá? Então, temos amarelinho lá, que é o vetor e vamos multiplicar por um float. Que float é esse? Quanto de valor a gente vai por aqui?

Vamos, por exemplo, cem, só para mostrar para vocês, mil, o que vai acontecer com esse mil aqui. Outra coisa, quando a gente puxar um vetor do get unit Direction vector, ele pode vir com algum valor daqui, tá? Pelo tamanho do vetor, pela distância entre os dois.

Então, para normalizar isso, tem que colocar aqui, ó, um normalize, que o normalize faz o quê? Ele pega o vetor que pode ter um cumprimento daqui até aqui, qualquer, na direção certa, né? E transforma isso para o valor um. E aí, sim, a gente multiplica daqui para cá.

Então, ó, vamos deixar aqui, para não ficar confuso, ó, a gente o get unit direction vector desse aqui, tá? O alvo era o actor e do actor tem o elemento, alvo cone. Pego o world location dele. Geramos aqui o traço que seria o vetor para onde vai a bola lá para o... que vem daqui, até aqui, tá?

E para esse traço não ter um valor, que é a distância, dele para transformar ele para um, a gente coloca o normalize, que ele vira um. E aí, sim, do 01, eu posso multiplicar esse vetor por um valor... eu vou deixar mil aqui, para mostrar para vocês que mil não é suficiente e o porquê.

Então, eu vou dar um play ou espaço, é o meu atalho aqui, espaço, clicou, vamos lá, chutou a bola. Olha, a bola saiu do lugar, parece que ela tomou um sobrinho, né? Por que que a bola só foi soprada? Se a gente colocar, por exemplo, aqui dez mil... no compile, “q” de queijo no meu atalho aqui.

A gente vai ter uma... um impulso maior, tá? Então, aqui, ó, essa bolinha está pesada hein? Por que, isso? Porque a gente tem o valor que não é aleatório, tá? As unidades da Unreal aqui, são em centímetros por segundo, então, dez de dez mil centímetros por segundo, mas depende da massa da bola.

Então, a gente tem que definir a massa da bola, porque o padrão é calculado automaticamente, tá? Então, aqui no bola, que a gente não consegue estar aqui por aqui, ó, no físico dele, tem o massa por quilo. Então, a gente vem aqui, ó, no Bola, no elemento bola, no staticmesh aqui.

E vamos no physics dele. Aqui no physics dele, não está habilitado massa por aquilo, então está 184 quilos, está uma bola com 184 quilos, é uma bola de concreto, né? Então, vamos colocar aqui, ó, habilitar isso e agora, 100 quilos, não. Eu vi aqui que a bola tem uns 450 gramas, 420 gramas, 450 gramas.

Eu vou para uma bolinha mais pesada 450 gramas de um quilo. Então, agora a gente tem uma bola de 450 gramas e a força que está sendo aplicada aqui dez mil é muito. Então voltar lá para o nosso new, tá? E vamos ver o que que dá aqui.... vamos dar um play, espaço, teclado atalho.

Então, chutou para direção, olha mas ela tá meio fraquinha, né? Não está sendo suficiente, vou dar um outro espaço aqui, o goleiro até defendeu clicou. Vai lá, ó, está indo na direção certa, mas, está fraca, porque agora a gente nosso multiplicador, depois do nosso normalize.

Então, vamos colocar aqui uns três mil, então, um chute super rápido e vamos ver se não vai... Muito forte, foi muito forte, mais ou menos uns 200 quilômetros por hora. Então vai dar uns dois mil aqui, tá? Dizem que os jogadores chutam... tem gente que chuta até 220, 150 varia...

Então, vou deixar uns 200 quilômetros por hora aqui e o chutão forte... e ver se fica razoável visualmente aqui para a gente. Então, pronto. Agora está indo na direção certa, não tão forte, nem tão fraco, mas ela deveria até colidir com isso aqui, né? Por que que ela não está nem colidindo?

Porque não temos o CCD aplicado, lembra do CCD? Então, vamos no nosso bola aqui, ó, nosso physics da bola e vamos collision, Use CCD, tá? Se não tiver aberto para vocês aqui, ó, abre, aqui no collision, tá? Abre esse setinha no show advanced e Used Continuous Collision Detection.

Porque aí, ele vai a cada microframe lá, ele vai calcular a colisão e ela, em teoria, deve bater agora no cone, que a gente não quer também, ela bate e vai para baixo, está vendo? Ela bate e vai para baixo. Eu vou clicar de novo, ó, porque a colisão está continua.

Então, ela está batendo no cone, a gente nem quer que bata no cone. Então, se a gente quiser que bata no cone, a gente vai nesse cone aqui da mira e desabilita a colisão total dele, então BlockAll, a gente pode por: NoCollision, tá? A gente só quer o location dele, a gente não quer a colisão, no caso aqui.

Então, vamos checar, checou agora a bola de 450 gramas, opa temos um probleminha aqui qual é este problema aqui, qual é esse problema? Esse problema, ele tá dizendo que aqui no BolaBP, não consegue acessar a propriedade do alvo, porque ela serve para quando ele está parado agora. Agora que a gente atualizou o bolaBP, a gente não vai mais conseguir construction script aqui. Então, eu vou deletar isso daqui, tá? A gente pode só deletar a variável e eu vou gerar ele logo que o begin overlap acontece.

Então, quando begin overlap acontecer lá, que o chutador encostar perto da bola, ele vai pegar o actor aqui,ó, puxando daqui de cima, tá? Não de baixo, get all actor of class, que vai ser o nosso plano da mira, planodamiraBP. E dele a gente vai tirar uma cópia e agora, sim, eu vou entrar por ela aqui, ó.

A gente vai tirar essa variável daqui, tá? E vamos puxar o alvo com direto daqui. Então, get world location, de quem? Do alvo cone, o único que sobra, né? Então, a gente pode substituir ele daqui, ó, o get word location. Tira esse daqui, deleta. E aqui, ele já puxou o elemento do cone, tá?

E a gente, vai ter agora, funcional... em teoria, tudo isso aqui, vamos deixar a bola aqui, ó, get world location, tá? vamos deixar mais apertado, para cá. Pronto. Daqui, temos um get unit direction vetor da bola, vamos deixar esse get aqui e vamos compilar e testar. Então, espaço. Atalho. Chutou.

E a bola foi para o lugar certo, com impulso certo de força, está com a massa da bola de 450g. Então, está tudo funcionando, né? Só que agora, a gente tem uma direção fixa, né? Só dá para chutar aqui? Tanto faz, ficar chutando fixo, não é tão legal.

A gente tem que conseguir escolher o lugar do chute que chutador vai ter, então ele pode ser pé esquerdo, pé direito, para cima, para baixo. Com a direção aqui, a gente vai conseguir determinar o ponto na hora do chute. Então, vamos fazer isso no próximo.

Por esse aqui está bom, vamos dar um save. Então, save all. Até o próximo e tchau, tchau.

Sobre o curso Unreal Engine parte 6: balística com mecânica de tiro ao alvo

O curso Unreal Engine parte 6: balística com mecânica de tiro ao alvo possui 62 minutos de vídeos, em um total de 28 atividades. Gostou? Conheça nossos outros cursos de Engine em UX & Design, ou leia nossos artigos de UX & Design.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Engine acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas