‫Olá e bem-vindo de volta.
‫Agora estamos movendo nosso tanque para frente e para trás, mas não temos como realmente dirigir o tanque.
‫Então, neste vídeo, vamos trabalhar para realmente girar o tanque usando algo chamado rotação local.
‫Este é o análogo rotacional para adicionar o deslocamento local do ator.
‫Agora, adicionar o deslocamento local do ator tinha vários parâmetros de entrada e passamos apenas o primeiro, pois os
‫outros três eram opcionais.
‫Mas um desses outros três tinha a ver com varrer.
‫E vamos discutir um pouco sobre varredura antes de continuarmos implementando a rotação.
‫Então, estou de volta na documentação do ADD Actor Local Offset.
‫Então, vamos dar uma olhada nesses parâmetros de entrada mais uma vez.
‫O segundo é chamado B Sweep e é um booleano.
‫Agora, se rolarmos um pouco mais para baixo e lermos as informações aqui para a varredura B, ela
‫diz Se varremos para o local de destino, desencadeando sobreposições ao longo do caminho e parando perto do alvo se
‫for bloqueado por algo.
‫Ele também diz que apenas o componente raiz é varrido e verificado para bloquear a colisão.
‫Os componentes filhos se movem sem varrer.
‫Se a colisão estiver desativada, isso não terá efeito.
‫Então vamos falar sobre o que isso significa agora na programação de jogos, sweeping é uma técnica feita pela engine,
‫desde que sweeping esteja habilitado.
‫Se tivermos um objeto em movimento, como uma esfera representada por esse círculo, cada quadro enquanto essa esfera está
‫se movendo, o mecanismo está realizando verificações de varredura.
‫Isso significa que está verificando se esse movimento para esse quadro específico resultaria em uma sobreposição
‫entre dois objetos.
‫Então eu tenho este bloco aqui representado por este retângulo.
‫Agora vamos apenas considerar que estes são os dois únicos objetos no mundo.
‫Assim, enquanto a varredura está habilitada enquanto a esfera está se movendo em direção ao objeto, o mecanismo está
‫verificando se esses dois objetos estão sobrepostos.
‫Agora, à medida que a esfera continua a se mover, digamos que durante um desses quadros a esfera teria se movido de
‫tal forma que está se sobrepondo ao outro objeto.
‫Agora, o que a varredura habilitada faz é que o mecanismo detecta essa sobreposição e move essa esfera de
‫volta para esse quadro específico, para que ela nunca penetre no objeto.
‫Agora, na verdade, nunca vemos a esfera penetrar no objeto.
‫O mecanismo captura essa sobreposição antes que o movimento seja realmente implementado.
‫Então, o resultado é que vemos que a esfera para pouco antes de se sobrepor.
‫Então, se esse retângulo fosse uma parede, por exemplo, a esfera pararia na superfície da parede.
‫Isso é o que a varredura alcança para nós.
‫Agora, a documentação diz que se a colisão estiver desativada, isso não terá efeito.
‫Portanto, a colisão deve ser ativada para que a varredura funcione.
‫Então, de volta aqui em tanks CP na função move, aqui está nossa chamada para adicionar o deslocamento local do ator
‫e, se quisermos, podemos passar outro parâmetro de entrada aqui, o segundo sendo o booleano de varredura para que possamos
‫passar true aqui.
‫Então, vamos compilar isso e ver o efeito de habilitar a varredura.
‫Agora, se apertarmos o play e tentarmos passar por uma parede, por exemplo, veremos que nos movemos através
‫da parede.
‫Então, algo não está funcionando bem aqui.
‫Agora vamos ver o que é esse componente de rota para o tanque da lagoa BP.
‫Lembre-se, usamos o componente cápsula para a rota.
‫Assim, com os componentes da cápsula selecionados no tanque da lagoa da BP.
‫Vamos para o painel de detalhes e role para baixo e veremos aqui uma seção chamada Colisão.
‫E aqui vemos Presets de Colisão e tem um menu suspenso.
‫Então vamos expandir isso.
‫Agora, as predefinições de colisão podem ser definidas para qualquer número de opções e, por padrão, vemos sobrepor todas as dinâmicas.
‫Agora, dependendo da versão do Unreal Engine que você está usando.
‫Você pode ver algo mais aqui, mas podemos mudar isso.
‫Se selecionarmos o menu suspenso e escolhermos bloquear todos os dinâmicos, as opções acinzentadas abaixo serão alteradas.
‫Lembre-se que estávamos em sobreposição toda dinâmica e aqui vemos três colunas de caixas de seleção.
‫Estas são respostas de colisão e a coluna à esquerda mostra uma lista de tipos de objetos de colisão.
‫Assim, qualquer componente tem seu próprio tipo de objeto de colisão.
‫Observe que podemos ver o tipo de objeto para a cápsula definido como mundo dinâmico.
‫E quando alteramos as predefinições de colisão para bloquear todas as dinâmicas, você verá que as respostas
‫de colisão são todas marcadas para bloquear em resposta a todos os outros tipos de objetos de colisão.
‫Então vamos apertar o play e ver o que acontece quando tentamos passar pelas coisas.
‫Você verá que paramos pouco antes de nos sobrepormos.
‫As outras lagoas.
‫Agora, se eu mover o tanque para que possamos tentar nos sobrepor à parede e contornar as outras
‫lagoas.
‫Agora, se eu apertar play, eu bloqueio a parede também.
‫Portanto, este bloco predefinido de colisão, todo dinâmico, define a resposta de colisão para bloquear todos os outros tipos de objeto.
‫E você sempre pode ver o tipo de objeto de colisão de um componente específico selecionando-o no painel de
‫componentes e rolando para baixo até a seção de colisão no painel de detalhes e abrindo o menu suspenso para
‫Presets de colisão.
‫Eu tenho a malha base selecionada e seu tipo de objeto é dinâmico mundial e está definido para bloquear tudo.
‫Então agora vemos que a varredura está funcionando, pois definimos nossas predefinições de colisão para a composição da cápsula para bloquear
‫todas as dinâmicas.
‫E vimos na documentação que apenas o componente raiz é varrido e verificado para bloqueio de colisão.
‫Portanto, não importa o que os outros componentes estão configurados.
‫Estamos apenas verificando se o componente raiz está bloqueando algo.
‫Agora, um problema que tropeçou em alguns alunos é que eles não podem se mover assim que configurarem a
‫cápsula para bloquear toda a dinâmica.
‫Agora, uma razão para isso pode ser que sua cápsula está se sobrepondo ao chão.
‫Se a cápsula estiver sobreposta ao chão, você não poderá se mover porque o motor
‫não permitirá que seu tanque se mova se o componente da cápsula estiver sobreposto a algo que está definido para bloquear.
‫Portanto, uma solução fácil para isso seria garantir que sua cápsula não se sobreponha ao chão.
‫Agora, você pode entrar em seu tanque de BP e certificar-se de que sua cápsula está logo acima das rodas aqui.
‫Vou entrar na visão ortográfica.
‫E selecione minha malha base e apenas derrube-a.
‫Portanto, as rodas estão logo abaixo do componente da cápsula.
‫Então agora se sua malha está apenas no chão e a cápsula está logo acima da malha.
‫Você deve ser capaz de se movimentar.
‫Então eu vou apertar o play e vamos lá.
‫Então, agora que temos a varredura fora do caminho, é hora de começar a implementar a rotação.
‫Vamos voltar às configurações do nosso projeto.
‫Então vamos editar as configurações do projeto, rolar para baixo até a entrada e na seção de entrada temos nossos mapeamentos de eixo.
‫Agora já cuidamos.
‫Siga em frente.
‫É hora de cuidar do próximo chamado Turn and Turn tem D e A atribuídos a ele onde D tem uma escala
‫de um e A tem uma escala de negativo.
‫Gostaríamos de usar o D e o AX para girar o tanque.
‫Portanto, para vincular uma função ao mapeamento do eixo de giro, precisamos de uma função para vincular.
‫Então, estamos de volta ao código do V e vou entrar no arquivo tank para que possamos criar uma função para vincular a esse
‫mapeamento do eixo de giro.
‫Agora vou chamar essa função void turn e assim como move.
‫Ele precisa de um parâmetro de entrada float e chamaremos esse valor.
‫Então nós declaramos esta função, vamos defini-la e tanque CP e eu vou colocá-la logo abaixo
‫da função move.
‫Então, eu dei a ela um corpo de função e preciso do nome da classe junto com os dois-pontos duplos logo antes do
‫nome da função.
‫Agora temos uma função adequada.
‫Agora, esta não é a única coisa que precisamos fazer.
‫Precisamos ter certeza de que esta função está vinculada ao mapeamento de eixo chamado turn.
‫Fazemos isso no componente de entrada do player de configuração e fazemos exatamente como fizemos o mapeamento do eixo de avanço.
‫Então, vamos dizer componente de entrada do jogador, vamos usar o operador de seta e o eixo de ligação.
‫Agora, o primeiro parâmetro será o nome do mapeamento do eixo envolvido em uma macro de texto.
‫Então, vamos dizer turn, pois esse era o nome do mapeamento do eixo.
‫O próximo é o objeto para o qual estamos vinculando a função.
‫Podemos passar isso e, finalmente, passamos a função que gostaríamos de vincular novamente.
‫Precisamos do endereço do operador e será uma volta de tanque.
‫Então é tão fácil assim.
‫Ligamos a função de giro ao mapeamento do eixo de giro.
‫A única coisa que resta é realmente fazer algo na função turn.
‫Agora vimos que temos o deslocamento local do ator ADD, mas há um análogo rotacional para esta função e
‫é chamado de rotação local do ator ADD.
‫O que isso faz é adicionar uma rotação local ao ator, como o próprio nome sugere, e você verá que
‫existem duas versões diferentes da função, uma que usa um rotador F e outra que usa algo
‫chamado F quad.
‫Vamos usar a versão que leva um rotador F.
‫Chama-se rotação Delta.
‫E, assim como ADD Actor Local Offset, ele também pode receber um parâmetro de varredura e os mesmos outros dois parâmetros de entrada
‫que adicionam o deslocamento local do ator.
‫E esses três últimos parâmetros de entrada são opcionais, assim como adicionar deslocamento local do ator.
‫Então, em vez de um vetor F, vamos passar um rotador F.
‫Agora de volta aqui na função de giro, se criarmos um rotador F e chamamos isso de rotação Delta, veremos que
‫se clicarmos com o botão direito do mouse no rotador F e irmos para definição, somos levados ao rotador e
‫veremos três variáveis de membro público aqui do tipo float.
‫Agora, assim como o rotador F do vetor F tem esses três componentes apenas em vez de X, Y e Z, temos
‫o pitch yaw and roll.
‫Agora, a guinada é o componente em que estamos interessados.
‫Diz rotação em torno do eixo para cima entre parênteses em torno do eixo Z.
‫E esse é o único tipo de rotação com o qual nos preocupamos em girar em torno do eixo Z.
‫É assim que podemos dirigir nosso tanque.
‫Agora, vou apenas apontar para você que existem vários construtores para o rotador F também, e
‫que o padrão novamente diz sem inicialização, assim como com o vetor F.
‫Assim, podemos usar aquele que recebe um único float e todos os componentes serão inicializados com esse
‫valor float.
‫Há um com três valores float e você pode dar uma olhada e ver alguns dos outros.
‫Agora, também direi que existe um rotador zero e, a propósito, este é um rotador zero estático.
‫É por isso que podemos voltar ao tanque CP e dizer algo como igual a F rotator zero rotator zero rotator é uma variável de
‫membro estática e você pode acessar funções de membro estáticas e variáveis como esta especificando o nome da classe
‫com o operador de resolução do escopo e referenciando essa estática variável ou função pelo
‫nome.
‫É isso que estamos fazendo aqui com você.
‫As estáticas de jogabilidade obtêm segundos delta mundiais é uma estática.
‫Function, o que significa que não precisamos de uma instância real da classe estática de jogabilidade do jogo
‫para que possamos acessar essa função estática.
‫Simplesmente já existe.
‫O mesmo com rotador zero e vetor zero.
‫Então eu vou fechar o rotador h e nós temos essa rotação delta e ela é inicializada para um rotador
‫zero.
‫Agora seu tom e papel são zerados assim como X, Y e Z são zerados para o vetor F.
‫Então, vamos precisar alterar esse seu componente.
‫Assim como fiz com nossa localização delta na função MOV, vamos criar um pseudocódigo para rotações
‫delta.
‫Sim, vamos querer que todos tenham um valor escalado pelo tempo Delta, é claro, porque queremos que esse giro seja independente
‫da taxa de quadros, mas também precisamos de algum tipo de velocidade de giro que podemos chamar de
‫taxa de giro.
‫Então, uma vez que tenhamos definido isso, sim, podemos adicionar essa rotação local que vai girar o ator de acordo
‫com o rotador F de cada quadro e que você será dimensionado por valor.
‫Portanto, será zero se não estivermos pressionando nenhuma tecla e terá um valor se estivermos pressionando DX
‫e ax.
‫Então agora você tem um desafio.
‫Isso funcionará como adicionar o deslocamento local do ator.
‫A única diferença é que estamos rodando o ator agora.
‫Então, como precisamos de algum tipo de taxa de giro para girar o ator, você vai criar uma variável de
‫taxa de giro, transformá-la em um float e colocá-la na seção privada ao lado da variável de velocidade.
‫Exponha essa variável com sua propriedade e escolha os novos especificadores de propriedade apropriados.
‫Agora na função turn você vai definir a rotação Delta em particular, nós nos preocupamos com o seu
‫componente definir o valor igual ao valor vezes nossa variável de taxa de giro e também multiplicar pelo tempo delta e então você
‫está pronto para chamar add ator local rotação passando neste rotador f agora para o segundo parâmetro vá em
‫frente e passe true para a entrada de varredura B, pois queremos varrer ao girar, pausar o vídeo e implementar a
‫rotação para o tanque agora.
‫OK.
‫Então isso vai ser bastante simples.
‫Só precisamos de uma variável de taxa de giro.
‫Agora vou entrar no tanque logo abaixo da velocidade e criar uma taxa de giro de flutuação.
‫Agora você provavelmente inicializa isso com algum valor e tudo bem.
‫Se for diferente do que estou escolhendo, vou com 45 F e ver como isso funciona.
‫Mas vamos expor isso aos projetos para que possamos alterá-lo enquanto estamos desenvolvendo.
‫Agora eu gostaria que fosse editado em qualquer lugar e vou colocá-lo na mesma categoria de movimento que velocidade.
‫Então eu vou em frente e roubar esta sua propriedade e colá-la bem aqui acima, vire à direita para que ela fique
‫em qualquer lugar.
‫Movimento da categoria agora e tanque CP.
‫Estou pronto para definir o sim para a rotação Delta.
‫Então vamos dizer rotação Delta.
‫Sim.
‫E vamos defini-lo igual aos tempos de valor, tempos de taxa de giro, tempo delta.
‫E é claro que podemos obter o tempo Delta com as estáticas de jogabilidade U, obter segundos delta mundiais passando isso
‫como o objeto de contexto mundial.
‫Então eu vou colar isso aí.
‫Agora eu sei que meu pseudocódigo não corresponde exatamente.
‫Está na ordem errada.
‫O tempo Delta está no meio aqui.
‫Não importa porque ao multiplicar três valores juntos, você pode multiplicá-los em qualquer ordem e ainda
‫obter o mesmo resultado.
‫Então, caso você esteja se perguntando sobre isso, a matemática ainda será a mesma se você multiplicar esses
‫três valores em uma ordem diferente.
‫Então não se preocupe muito com isso.
‫Agora temos rotação delta.
‫A única coisa que resta a fazer é chamar a rotação local do ator, e estamos passando a rotação Delta e para
‫a segunda entrada vamos passar true para habilitar a varredura ao girar.
‫Então vamos compilar isso.
‫Tudo bem, estamos compilados agora.
‫Você pode notar em alguns dos próximos vídeos que o vetor zero e o rotador zero estão faltando nessas
‫linhas.
‫Isso porque eu comecei com esses inicializados e percebi mais tarde que eles provavelmente deveriam
‫ser inicializados pelo menos com valores zero.
‫Portanto, não se preocupe se você ver essas linhas mais tarde com esta aparência inicializada, mantenha seu vetor zero e seu
‫rotador zero e você verá que eu pego isso em um vídeo futuro próximo.
‫Então não se preocupe.
‫Se você não vir esses de inicialização, eles devem estar lá.
‫E estamos de volta ao editor.
‫Vamos apertar o play e eu vou usar a tecla D e estamos girando e a tecla A me gira de volta para o
‫outro lado e também podemos avançar e voltar.
‫Então, agora que podemos girar e avançar, temos a capacidade de nos mover ao redor do mundo.
‫Este é um grande marco.
‫Agora estou me movendo bem devagar, mas tudo bem porque posso selecionar meu tanque e procurar a
‫categoria de movimento e alterar a taxa de giro para algo mais alto, como 90.
‫Então vamos em frente e aperte o play.
‫E isso é um pouco mais rápido.
‫Agora, se você acha que isso ainda é um pouco lento.
‫Você pode, é claro, ajustá-los.
‫Então eu vou selecionar o -- tanque novamente.
‫E em vez de 400, vamos torná-lo 800.
‫Por que não?
‫Em vez de 90, vamos dizer 120.
‫Agora, se eu apertar play, eu sou um pouco mais rápido.
‫Então isso está parecendo muito, muito bom.
‫Então, olhando para o plano de seção, agora temos um tanque que pode se mover por todo o mundo.
‫Esse primeiro marcador está definitivamente marcado e estamos lidando com o movimento WASD.
‫Ainda não estamos lidando com a entrada do mouse, mas chegaremos a isso.
‫Mas estamos um passo mais perto de tornar este jogo completo.
‫Então, em resumo, aprendemos o que é varredura e como podemos habilitar isso para que nossos objetos não passem um
‫pelo outro.
‫Adicionamos uma rotação local de atores e fizemos isso implementando uma taxa de giro que poderíamos ajustar nos
‫detalhes.
‫Painel no editor para tornar o desenvolvimento um pouco mais fácil.
‫Bom trabalho.
‫Estamos agora movendo o tanque em todo o mundo.
‫Vejo vocês no próximo vídeo.