Motor Unreal 5 : Introdução aos Blueprints | Defuse Studios | Skillshare

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Motor Unreal 5 : Introdução aos Blueprints

teacher avatar Defuse Studios

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Intro (pré-visualização do curso)

      2:29

    • 2.

      Intro (visão geral)

      3:05

    • 3.

      Intro (criação de blueprints)

      12:29

    • 4.

      Intro (fluxo do evento)

      7:58

    • 5.

      Variáveis (geral)

      6:03

    • 6.

      Variáveis (booleanos)

      9:56

    • 7.

      Variáveis (inteiros e flutuadores)

      18:18

    • 8.

      Variáveis (nomes, textos e cordas)

      14:40

    • 9.

      Variáveis (vetores, rotadores e transformações)

      25:05

    • 10.

      Variáveis (atores e objetos)

      12:55

    • 11.

      Variáveis (matrizes e loops)

      21:40

    • 12.

      Basics (Funções)

      18:04

    • 13.

      Noções básicas (Macros)

      10:10

    • 14.

      Noções básicas (estruturas e acessórios)

      17:40

    • 15.

      Noções básicas (eventos)

      9:51

    • 16.

      Noções básicas (Herança de Blueprint)

      11:51

    • 17.

      Noções básicas (fundição)

      17:15

    • 18.

      Noções básicas (distribuidores de eventos)

      17:07

    • 19.

      Básico (Interfaces)

      11:02

    • 20.

      Noções básicas (componentes)

      17:06

    • 21.

      Noções básicas (controlador de jogadores)

      14:58

    • 22.

      Noções básicas (GameMode)

      8:16

    • 23.

      Noções básicas (nós de utilidade)

      9:44

    • 24.

      Noções básicas (instância de jogo)

      10:31

    • 25.

      Aulas adicionais (traços)

      20:09

    • 26.

      Aulas adicionais (tabelas de dados)

      17:54

    • 27.

      Aulas adicionais (códigos de sobreposição)

      6:31

    • 28.

      Aulas adicionais (entrada)

      12:57

    • 29.

      Aulas adicionais (entradas aprimoradas)

      24:32

    • 30.

      Aulas adicionais (etiquetas)

      8:46

    • 31.

      Aulas adicionais (atores de geração de gerações)

      10:45

    • 32.

      Aulas adicionais (organização do código)

      11:08

    • 33.

      Aulas adicionais (ferramentas de depuração)

      15:57

    • 34.

      Aulas adicionais (cronogramas)

      21:34

    • 35.

      Aulas adicionais (socos)

      19:26

    • 36.

      Aulas adicionais (componente de movimento)

      14:47

    • 37.

      Aulas adicionais (efeitos de áudio)

      24:47

    • 38.

      Aulas adicionais (efeitos de partículas)

      13:56

    • 39.

      Widgets (geral)

      10:09

    • 40.

      Widgets (layouts)

      19:46

    • 41.

      Widgets (criando widgets)

      18:38

    • 42.

      Widgets (vinculativas)

      9:58

    • 43.

      Widgets (bordas, sobreposições e grelhas)

      15:11

    • 44.

      Widgets (arrastar e soltar)

      18:55

    • 45.

      Blueprints de animação (visão geral)

      15:18

    • 46.

      Blueprints de animação (Montagens)

      18:30

    • 47.

      Blueprints de animação (códigos de mistura)

      15:13

    • 48.

      Blueprints de animação (Notifies)

      16:41

    • 49.

      Blueprints de animação (Estados)

      15:12

    • 50.

      Blueprints de animação (espaços de mistura)

      14:28

    • 51.

      Blueprints de animação (offsets)

      18:19

    • 52.

      Blueprints de animação (curvas e metadados)

      10:37

    • 53.

      Sistemas de jogabilidade (interação)

      24:40

    • 54.

      Sistemas de jogabilidade (danos)

      32:19

    • 55.

      Sistemas de jogabilidade (barra de saúde)

      9:42

    • 56.

      Sistemas de jogabilidade (Respawning)

      18:36

    • 57.

      Sistemas de jogabilidade (crouching)

      14:16

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

1.047

Estudantes

--

Projeto

Sobre este curso

Começar com Blueprints

Neste curso, vamos começar com os conceitos básicos como o que são os planos e como navegar no editor de plantas do Unreal Engine 5, mesmo para criar sistemas de jogo e aprender a usar muitas das principais características dos planos.

O objetivo deste curso é fornecer informações e conhecimentos úteis para que seu próprio projeto e seus próprios sistemas de jogabilidade para seu futuro e leia outros projetos que realmente podem ajudar a acelerar o processo de aprendizagem. Nenhum conhecimento de programação prévio é necessário!

O que você aprenderá?

  • O que são plantas
  • Como navegar na interface do modelo Unreal Engine 5
  • Quais variáveis são e como usá-las
  • Como usar funções, macros e eventos para manter seu projeto limpo e eficiente
  • As diferenças entre tipos de blueprints como personagens, modos de jogo e atores
  • Comunicação de Blueprints, incluindo fundição, interfaces e despachantes de eventos
  • Como configurar as entradas do jogador incluindo as novas entradas aprimoradas
  • Como criar e configurar a interface do usuário do widget em uma tela de jogadores
  • Os fundamentos dos planos de animação
  • Atores, partículas e efeitos sonoros de geração incluindo o novo MetaSounds
  • Como criar sistemas de jogo de saúde, interação, reabertura e danos aos jogos
  • Organização de código

Conheça seu professor

Teacher Profile Image

Defuse Studios

Professor

Hello, I'm James also known as Defuse Studios. I have been a full time Unreal marketplace creator for the last 5 years, and during that time I have provided support to hundreds of beginners learning UE4.

This has helped me gain insight into some of the things people struggle with when learning game development. I hope to use that knowledge in my future course to provide people with the best information possible, in an easy to follow way to help you on your path to creating the next big indie game or get your dream job!

Visualizar o perfil completo

Level: Beginner

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Intro (pré-visualização do curso): Olá a todos, e bem-vindos ao curso Unreal Engine Five, Primeiros passos com projetos. Meu nome é James, também conhecido como os poucos estúdios. E eu tenho sido um criativo de mercado nos últimos seis anos. E durante esse tempo, forneci suporte para centenas de iniciantes no Unreal Engine. E por causa disso, aprendi algumas das coisas comuns com as quais as pessoas tendem a ter dificuldades ao tentar aprender desenvolvimento de jogos. Estou arruinado. Jing é um dos motores de jogos mais populares do mundo e os projetos são sua poderosa linguagem de programação visual integrada. blueprints nos dão a capacidade de codificar sistemas simples ou incrivelmente complexos de dentro do mecanismo, sem precisar escrever nenhum código baseado em texto. E é uma ótima maneira de começar no mundo do desenvolvimento de jogos. No início deste curso, começaremos com as variáveis básicas. Eles são usados para armazenar informações como a localização, a saúde ou a resistência do jogador, aprenderão sobre os diferentes tipos de variáveis e também como manipulá-las durante o jogo. Em seguida, passaremos para funções, macros e eventos. Eles são usados para manter seu projeto organizado e eficiente e facilitar a modificação posterior no desenvolvimento do projeto. Em seguida, passaremos para diferentes tipos de Projeto, prováveis projetos de Ator, Peão, personagem e Modo de Jogo. Cada um desses projetos vem com diferentes funcionalidades integradas que vêm com o mecanismo que podemos usar para criar nossos jogos. Também abordaremos coisas como projéteis, que são frequentemente usados para balas de armas, traços que são frequentemente usados para sistemas de interação e às vezes até sistemas Meli. E abordaremos as entradas do Player , incluindo o novo sistema de entrada aprimorado. E é isso que nos permite pressionar um botão do teclado ou do mouse e executar código, dependendo da tecla que realmente pressionamos. Também abordaremos widgets agora, que é como criamos elementos de interface do usuário dentro deles. mecanismo de regras aprenderá como criar novos widgets e como adicioná-los à tela do jogador, bem como alterar o layout e anexar o comportamento dos widgets, duas variáveis, funções ou eventos diferentes, para que possamos controlar nossos widgets de fato. Por fim, usaremos todo o conhecimento que adquirimos durante o curso para criar alguns sistemas de jogo comuns. Isso inclui um sistema de interação que permite que nosso jogador interaja com outros objetos. Um sistema danificado que permitirá que nossos personagens recebam e enviem danos. Um HUD que podemos usar para exibir informações na tela de nossos jogadores. Vamos configurar um sistema de resposta e um sistema de agachamento também. O objetivo deste curso é fornecer informações detalhadas sobre os diferentes recursos que estão incluídos nos projetos. Para que, ao final deste curso, você possa planejar e criar seus próprios sistemas de jogo. Obrigado por ouvir, e eu realmente espero que você goste do curso. 2. Intro (visão geral): Olá pessoal, e bem-vindos à primeira aula deste curso. Nesta lição, que apresentaremos uma visão geral rápida do que são os projetos, para que eles podem ser usados e algumas frases comuns que usaremos ao longo do curso. Então, para começar, o que são projetos? Blueprints são uma linguagem de programação visual integrada ao Unreal Engine. Eles costumam ser usados para definir coisas como personagem, arma ou até mesmo um MPC. Os blueprints permitem que você codifique no mecanismo conectando diferentes tipos de nós que juntos, criam novas funcionalidades. O resultado disso pode ser uma porta abrindo e fechando, ou pode ser um sistema de inventário complexo ou sistema de combate. O mecanismo inclui alguns modelos que começam com código existente útil, como, por exemplo, nosso blueprint de personagem, que se eu trouxer para o nível aqui, você pode ver na mão direita lado da tela, ele inclui componentes integrados, como, por exemplo, o componente Movimento do personagem, que controla o movimento do personagem. Um componente de malha que permite que nosso modelo de personagem seja visível no jogo. Um componente de câmera, que quando um jogador assume o controle desse personagem, permite que ele veja. Ao começar com os projetos. Alguns termos comuns que você ouvirá são Blueprint Classes. Objetos de blueprint, ou blueprint atuam como um exemplo de uma classe de blueprint é nosso ThirdPersonCharacter aqui embaixo. Agora, se passarmos o mouse sobre ele, você pode realmente ver que diz Classe Blueprint. Mas se o arrastarmos para o nosso nível, você pode ver que ele cria um novo objeto de blueprint e podemos realmente arrastar vários da mesma classe para o nosso nível. Agora, esses são dois objetos independentes do Blueprint. Se tivéssemos vários jogadores, cada jogador poderia estar controlando um projeto de personagem diferente e fazendo coisas diferentes. Mas todos esses projetos ainda estão usando a mesma classe Blueprint, que é nossa classe ThirdPersonCharacter. Se alguma alteração for feita nossa classe ThirdPersonCharacter Blueprint, isso afetará todos os nossos objetos Blueprint usando nossa classe. Então, por exemplo, se eu abrir meu ThirdPersonCharacter Blueprint, vá para Viewport e eu apenas giro nossa malha, digamos 90 graus dessa maneira. Clique em Compilar, volte para o nosso mapa. Você pode ver que nossos personagens agora estão voltados para uma direção diferente. E se eu voltar e girar volta para a direção correta, clique em Compilar. Você pode ver como, novamente, atualizados, alguns objetos Blueprint não existem no nível do jogo, mas são executados em segundo plano, armazenando informações e executando funcionalidades importantes. Por exemplo, o blueprint da instância do jogo, que é usado para armazenar informações entre os níveis de um como o Modo de Jogo, existe no nível, mas é completamente invisível para o jogador. O Modo de Jogo controla coisas como qual classe de projeto de personagem é criada quando um novo jogador entra no jogo. E o que acontece quando um jogador sai do jogo. Os Planos gráficos são uma ferramenta incrivelmente poderosa que permite um desenvolvimento mais rápido, depuração e um processo muito fácil de usar. Nas próximas lições, abordarei algumas das noções básicas para você começar. Assim, você pode criar algumas de suas próprias funcionalidades, bem como ler os planos de outras pessoas, o que pode realmente ajudar a acelerar seu aprendizado. 3. Intro (criação de blueprints): Olá pessoal. Nesta lição, vou mostrar a você como criar novas classes de blueprint. Também vamos dar uma olhada no editor do Blueprint. Antes de começarmos, vou mostrar como encaixar o navegador de conteúdo em nossa tela. Por padrão, temos que clicar neste desenho de conteúdo para abri-lo. Pessoalmente, prefiro bloqueá-lo na tela. Então, vou clicar neste documento no botão de layout aqui. E agora temos o bloqueio do navegador de conteúdo em nossa tela. Essa é uma preferência pessoal. Você pode ter sua configuração como quiser, mas é assim que a minha será pelo resto do curso. Existem algumas maneiras de criar blueprints e nosso navegador de conteúdo, podemos clicar com o botão direito do mouse e selecionar Blueprint Class aqui. Também pode ir até as plantas, aparecer e selecionar a opção Classe de Blueprint aqui embaixo. Essas aulas adicionais incríveis aqui, mas não as abordaremos nesta lição. Isso será em uma lição futura. Outra maneira de criar projetos é acessar nosso botão Adicionar aqui no lado esquerdo da tela. E você pode ver que temos nosso mesmo menu. Podemos selecionar a classe Blueprint, ou podemos ir para blueprints e selecionar Blueprint Class aqui também. Então, vou clicar em Blueprint Class para abrir nossa janela de seleção de classe. Aqui podemos selecionar o tipo de projeto que queremos criar. Nos dá algumas das seleções mais comuns. Então, no topo aqui. Então, para começar, temos ator. Um ator é basicamente qualquer projeto que exista em um nível. Então temos **** que determinou que o jogador pode realmente assumir o controle de um personagem, que também é um ****. Mas ele tinha algumas funcionalidades estendidas para que ele pudesse andar por aí e definir um modelo de personagem. Nós temos o controle do jogador. Este é o projeto que diz ao nosso personagem ou a um **** o que nosso jogador quer que eles façam. Modo de jogo, que é como definimos com que tipo de controlador de jogador ou personagem queremos que nossos jogadores comecem. E então temos alguns componentes aqui embaixo, que abordarei em uma lição futura. Mas, essencialmente, os componentes podem ser adicionados a outros projetos para dar a eles funcionalidade adicional. E então aqui em baixo temos todas as nossas aulas. E isso basicamente nos permite selecionar qualquer outro blueprint ou classe C plus plus e fazer com que nosso novo blueprint os use como um modelo. Então, para começar, vamos criar um ator simples para criar um ator simples que eu possa mostrar algumas das interfaces de usuário do blueprint. Começará com apenas renomear esse projeto. Vou chamar meus projetos de vídeo. E vamos clicar duas vezes nisso para abri-lo. E começaremos na janela de exibição. Aqui é onde podemos definir nossos locais para novos componentes em nosso projeto. Então, por exemplo, se eu for para nossa guia de componentes aqui e clicar em Adicionar, basta procurar por cubo e adicionaremos um cubo. Agora, podemos definir a posição dos nossos cubos. Se eu pressionar W, isso nos dá controles de movimento. Se eu pressionar E, podemos girá-lo, ou se eu pressionar R, podemos redimensioná-lo. Essas opções também estão disponíveis aqui. Então, se você quiser usar esses botões, você pode. E, se quiséssemos, poderíamos adicionar componentes adicionais e configurar sua localização em nosso projeto também. Agora, se eu apenas compilar este projeto e arrastá-lo para o mundo, você pode ver que o centro dos meus projetos neste ponto aqui, mas meu cubo está aqui. Isso porque o posicionamos naquele local a partir do centro, mais distante. Você pode ver que ele também é atualizado no mundo. Isso só lhe dá uma ideia básica de como usar a janela de visualização. Para que é usado, vou excluir meu cubo por enquanto, porque vamos passar para a próxima parte da interface do usuário, que é o painel Meu Blueprint. Agora vamos usar muito isso onde minha codificação. Então, começando do início, temos nossos gráficos. Eu acho que gráfico. Se eu clicar duas vezes nisso, ele nos levará ao nosso gráfico de eventos principais. É aqui que vamos fazer muita codificação, pelo menos para começar, antes de começarmos a entrar em funções e coisas assim. Mas você se familiarizará com isso à medida que o tempo passar. Tudo começa com alguns nós básicos. Eu vou falar sobre isso em uma lição futura que você não precise se preocupar muito com isso agora. Mas você também pode ver que, em nosso gráfico, ele nos diz quais eventos estão nesse gráfico. Você pode ver que temos esses quatro eventos aqui. Eles também estão listados em nosso gráfico de eventos. Então, se eu dissesse que clique duas vezes na sobreposição de início ativo, isso realmente nos levará a esse evento, o que pode ser útil se você estiver tentando encontrar coisas. Em seguida, temos nossas funções, macros, variáveis e despachantes de eventos. Agora, cada um deles terá suas próprias lições porque são terá suas próprias lições sistemas muito grandes e nós os usaremos muito. Mas é aqui que serão listados. Todas as funções que existem neste blueprint serão listadas em funções. O mesmo acontece com macros e despachantes e variáveis de eventos. Se você quiser criar novos, podemos clicar no pequeno botão de adição ao lado das funções aqui. Podemos fazer o mesmo com macros, variáveis e despachantes de eventos também podem clicar neste pequeno botão Adicionar aqui. Podemos selecionar se você deseja criar uma nova variável, uma função de macro e assim por diante, podemos criar novos gráficos. E isso é útil apenas para organizar as coisas. Digamos que você tinha um personagem e queria ter um gráfico para movimento, e um gráfico para suas armas, e um gráfico para saúde, por exemplo. Você poderia fazer isso e isso apenas fornece gráficos adicionais nos quais você pode organizar as coisas. Funções primordiais. Abordaremos isso no vídeo de funções. Portanto, não se preocupe muito com isso. Mas se você quiser substituir uma função, você pode encontrar essas opções aqui. A seguir está a barra de pesquisa. Podemos usar isso apenas para pesquisar as funções, variáveis e macros para uma palavra específica. É sempre uma boa ideia incluir palavras-chave em seus nomes de variáveis e funções. Dessa forma, se, por exemplo, estivéssemos criando um sistema de saúde, poderíamos apenas procurar por saúde. E isso mostrará todas as nossas funções, variáveis que têm a palavra saúde em seu nome. Em seguida, vamos cobrir a barra superior. Então, para começar, temos que compilar. Isso basicamente nos diz, nosso plano de jogo está pronto? Então, agora ele tem um pequeno tique, o que significa que está tudo bem. Estamos todos bem. Mas se eu dissesse, arraste e adicione uma string impressa aqui e veja que agora precisamos compilá-la. E isso basicamente permite que os motores verifiquem o código, tenham certeza de que não há problemas. Se houvesse um problema e nos dê um pequeno ponto de exclamação vermelho. Provavelmente também nos dá alguns erros de compilador nos dizendo qual é o problema. Então temos nosso salvamento que apenas salva um projeto. Se clicarmos em Salvar e vermos que o pequeno ponto desapareceu ao lado do nome do blueprint porque ele foi salvo. Temos um navegador. Se clicarmos nisso, ele nos levará ao local onde está o blueprint e ao nosso navegador de conteúdo. Então temos diff, isso é para controle de origem. Eu não vou entrar nisso porque controle de fontes é um tópico bastante importante. Então, vamos pular isso por enquanto. Nós temos que encontrar. Isso nos dá a janela de pesquisa onde podemos pesquisar, digamos, por exemplo, um nó. Então, se eu pesquisar por string de impressão aqui, vai realmente nos dizer, ei, há um nó de string de impressão no gráfico. Então, se eu clicar duas vezes nisso, ele realmente nos levará a isso. Isso é muito útil. Se suas plantas ficarem muito grandes, você pode esquecer onde colocou as coisas. Então você pode simplesmente pesquisar palavras-chave para descobrir onde as coisas estão. Oi, não relacionado apenas esconde conexões que não são importantes naquele momento. Normalmente eu só recomendo deixar isso de fora, mas você pode brincar com isso, se quiser. Em seguida, temos as configurações de aula. Essas são como as configurações básicas do nosso projeto. Você provavelmente não vai fazer muito aqui. A maioria dos projetos terá configurações de classe muito semelhantes. Você também pode ajustar o ângulo da miniatura. Assim, você pode alterar o ângulo da câmera para a miniatura quando o Navegador de conteúdo, se o seu tiver um telefone. Agora, também podemos adicionar interfaces que serão um vídeo totalmente separado que será inserido. Mas se você quiser encontrar as interfaces que estão nas configurações de classe aqui. Em seguida, temos padrões de classe. Agora é aqui que todas as nossas configurações de plantas estão. Então, como começamos com um ator, os atores têm um monte de configurações extras que eles vêm com. Quatro replicações multijogador para nossa tecnologia, que é o nosso techno aqui em baixo, que executa todos os quadros, podemos fazer alguns ajustes nisso. Temos configurações de colisão, configurações de renderização e assim por diante. Vamos falar sobre isso um pouco mais em vídeos futuros. Se você quiser saber se um pouco mais de detalhes, o que as coisas fazem, você sempre pode passar o mouse sobre o nome e isso nos dá uma sensação. Se fôssemos criar uma nova variável, digamos que eu vá adicionar e eu simplesmente não fiz uma nova variável. Vamos chamar isso de teste. Se agora formos para os padrões de classe, encontramos o, oh, precisamos compilar primeiro porque ele não aparecerá até que possamos extrair seus padrões de classe. Vamos rolar de volta até o topo. Você pode ver no padrão que agora temos nossa variável de teste. E é aí que podemos ver todos os valores padrão de nossas variáveis. E esses são os valores com os quais o blueprint começará quando for criado. Então eu posso ligar e desligar isso aqui também. Também temos uma barra de pesquisa na parte superior, o que é muito útil, especialmente se você tiver muitas variáveis em seu projeto ou estiver usando o plano de outra pessoa, você está tentando encontrar um configuração. Você pode pesquisar por palavras-chave aqui para encontrar a opção que você precisa. Então temos os botões de simulação e reprodução. Basicamente, eles apenas iniciam o modo play an editor. Se eu apertar o botão play, você pode ver que ele abriu a janela do editor de planos. Em seguida, temos a depuração suspensa. Agora, esse é um recurso muito legal dos projetos. Terei um vídeo inteiro que vai para a depuração e alguns dos recursos que o mecanismo vem com. Mas só para dar a vocês um exemplo do que isso faz, se eu conectar minha corda impressa aqui à tecnologia. Agora, isso executa todos os quadros que o jogo executa. Então, se eu for para o nosso mapa, vou apenas arrastar o projeto do vídeo M. Eu clico em play. Você pode ver que o halo está correndo repetidamente para cada quadro desenhado. E se eu for para o projeto de vídeo, porque eu tenho projetos de vídeo selecionados aqui. Você pode ver que ele está me mostrando o código que está sendo executado. Está tudo destacado. Isso está me dizendo que a nota técnica está funcionando e está executando a string impressa. E isso pode ser muito útil quando você tem planos grandes, você pode ver exatamente qual código está sendo executado. Por enquanto, vamos apenas fazer uma pausa que excluirá nossa impressão de uma string aqui. E isso também removerá nossos projetos de vídeo do nosso nível. Só para termos um começo limpo e voltaremos ao nosso projeto. Outra coisa que eu queria mencionar sobre os resultados da descoberta, na verdade, se voltarmos para encontrar, você pode ver que ainda temos nossa janela aberta aqui. Se clicarmos neste pequeno botão aqui, procuraremos em todas as plantas e nosso projeto por nossa frase de pesquisa. Então, se eu clicar aqui, você pode ver que ele está realmente encontrando muitas telas de impressão. Sinto muito, nós Print String em torno de nossos projetos. E essas são, na verdade, plantas que vêm embutidas no motor. Assim, você pode ver que ele pesquisou todos os projetos e está nos dizendo exatamente onde as strings de impressão estão sendo usadas em todo o nosso projeto. Isso pode ser muito útil se você estiver tentando rastrear algo novamente. Você pode pesquisar todos os seus projetos de uma só vez. Em seguida, vamos dar uma olhada no roteiro da construção. Se eu fechar minha janela de descoberta de plantas e pudermos ir para funções, você deve ter notado o script de construção que está lá por padrão, está embutido no ator. Então, clicamos duas vezes que nos levará ao nosso script de construção. E aqui podemos adicionar código que será executado quando arrastarmos nosso blueprint pela primeira vez para o nível. Então, isso é ótimo para se você estiver construindo um tipo de ferramentas de design de nível e coisas assim, talvez você queira aleatorizar a cor de algo para cada vez que você arrastá-lo para o nível. O roteiro de construção é muito útil para isso. Agora, se alguma dessas janelas desaparecer ou disser que você as fecha por acidente, não é um problema. Você sempre pode simplesmente ir até o menu suspenso de janelas aqui. E aqui você pode assumir qualquer um desses painéis que estamos vendo hoje. Então você pode desligar. Então, por exemplo, se eu fechar meus componentes, eu posso ir e eu posso simplesmente reabrir o painel Componentes e eu simplesmente vou aparecer de volta. Agora, a última coisa que eu queria apontar é a barra de endereço que está aqui em cima. Isso sempre dirá qual planta de urina, estou usando aquela planta que você é. Isso é realmente útil se você estiver acompanhando tutoriais ou capturas de tela ou qualquer coisa assim, sempre vale a pena dar uma olhada, certificando-se de que você está no plano certo e também dizer o nome da função ou o nome do Gráfico de Eventos. Então, se eu for ao Event Graph, digamos gráfico de eventos, que dirá exatamente onde você está ou se você está acompanhando um vídeo ou uma imagem, você pode ver exatamente onde eles estão nesses vídeos. Então isso vai ser tudo para esta lição. Espero que você tenha uma compreensão básica agora de onde os pensadores e o editor do Blueprint. 4. Intro (fluxo do evento): Olá pessoal, Nesta lição mostrarei como os nós do Blueprint são executados e a ordem em que são executados. Para começar. Eu configurei alguns exemplos aqui em nosso ThirdPersonCharacter Blueprint. E eu vou falar com você sobre isso e explicar o que cada um faz. Então, para começar, o evento começa a ser reproduzido. Agora, este é um evento embutido no mecanismo e será executado sempre que nosso jogo começar ou quando o blueprint for criado. O que vai acontecer aqui é que temos o nosso evento começar a jogar que vai dizer ao nosso jogador uma jogada, tocar um som agora para correr. Agora, este é um evento personalizado que eu mesmo criei. E se formos até aqui, você pode realmente ver que temos o som do play player. Então vou começar a jogar ou x ao cubo. Ele executará nossa reprodução, tocará um nó de som e executará nosso som de reprodução no local. E o som que tocará será onde quer que nossa entrada de som esteja aqui. Então esse será o som inicial. Em seguida, ele reproduzirá esse som no local que estamos fornecendo. Então essa é a localização do ator, que será a localização do nosso personagem. Então, uma vez que o som é reproduzido, nossa saída de nossa peça, toca um som. Legal. Vamos correr. Isso acontecerá sempre que a cadeia de execução aqui em baixo não tiver mais nós para executar. Então, o que isso fará é definir nosso valor de saúde para qualquer que seja nosso valor inicial já que o código é executado da esquerda para a direita normalmente. E se atingirmos um evento, legal, executaremos o código que está conectado a esse evento. E então vamos retomar a execução do código com nosso evento original. Em seguida, temos a nota técnica do evento. Agora, esse é um nó muito usado por iniciantes. E o motivo é porque ele executa todos os quadros do seu jogo. Então, toda vez que sua placa gráfica desenhar um quadro, esse evento será executado. Agora, o problema com isso é que as pessoas tendem a anexar muito código a esse nó. E isso pode começar a desacelerar seu projeto muito rapidamente, porque geralmente, a maioria dos códigos não precisa ser feita a cada quadro. Queremos usar coisas como entradas do Player, temporizadores e várias outras formas de executar esse código. Em vez de apenas cada quadro, nós o executamos, porque é assim que você obtém um desempenho ruim em seu jogo. Mas para este exemplo, acabei de pegar um código muito simples. Eu tenho um valor numérico. E então estamos plotando um para esse valor numérico e, em seguida, definindo esse valor numérico. Toda vez que um quadro é desenhado do nosso jogo, aumentamos nosso valor numérico em um. E então eu só tenho que imprimir nó string aqui. Então isso vai pegar o valor numérico, ele o converte em uma string, que é basicamente texto. E então imprimimos esse valor na tela do player. Entrarei em mais detalhes sobre esses eventos quando criarmos alguns exemplos. Mas, por enquanto, eu só quero explicar os diferentes tipos de eventos e como eles executam o código. Então, a seguir, temos o salto de ação de entrada. Agora, este é um nó que será executado sempre que nosso jogador pressionar a entrada de salto. Então, por padrão, essa é a chave de espaço. E a razão disso é porque se formos para editar e ir para Configurações do projeto, então eu vou para Entrada aqui em baixo. Vamos para Mapeamentos de ação. Você pode ver que temos um mapeamento de ação aqui que diz salto. Se eu clicar na seta para baixo, você pode ver que a barra de espaço está definida aqui. Portanto, essa é uma entrada padrão para o projeto ThirdPersonCharacter. É por isso que isso já está aqui para nós. Então, quando eu volto ao nosso ThirdPersonCharacter Blueprint, É por isso que ele diz que o salto de ação de entrada é porque as entradas já foram configuradas em nossos mapeamentos de ação. E o que isso basicamente faz é quando eu pressiono Espaço, pressiono will, will, will run, e isso fará com que nosso personagem pule. E então, quando eu solto, isso esfria o stop jumping. Agora, as ações de entrada são essencialmente como você pega a entrada de um jogador e podemos executar o código usando essa entrada que abordará mais as impactações em uma lição futura. Há também um novo sistema de entrada aprimorado que vem com o Unreal Engine five. Então, também analisaremos isso. Outra maneira de executar o código por meio das entradas do Player é usando os nós de eventos de entrada. Então, se eu clicar com o botão direito do mouse e pesquisar um nome de teclado, diga Enter. E podemos percorrer esses e, em eventos de teclado, podemos encontrar o Enter. Agora, isso é semelhante à nossa ação de entrada Jump. Temos Oprimido, que executará o código conectado a ele quando a tecla Enter for pressionada e liberada quando o código for executado, quando a tecla for liberada. Agora, isso é mais para depuração e prototipagem rápida. Nós os usaremos um pouco mais tarde no curso só porque eles são rápidos em si do que as configurações do nosso projeto. Mas normalmente você não usaria esses nós. Ao configurar as combinações de teclas finais de um jogo, você usaria as ações de entrada que eu mostrei antes. Em seguida, temos o, qualquer nó de dano, que está aqui em cima. E esse evento está embutido no motor. E isso nos permite dizer ao nosso ThirdPersonCharacter que ele sofreu danos de outros projetos. E esses outros projetos também podem fornecer um valor danificado, semelhante ao que chamamos nosso play play de um evento sonoro aqui, e fornecemos um som inicial. Então nossa peça, toca um evento sonoro aqui embaixo, usa esse som inicial e reproduz um som em um local. Isso é semelhante, pois o outro projeto pode chamar o inimigo de qualquer dano de m, pode fornecer um valor danificado. E agora, em nosso ThirdPersonCharacter Blueprint, podemos usar esse valor de dano para subtrair da nossa saúde atual. Agora, qualquer evento de dano está chamando uma função chamada diminuir a saúde. Agora, eu mesmo criei essa função. E não se preocupe se você não souber o que é uma função, falaremos sobre isso em uma lição futura. Mas, essencialmente, uma função é um nó que contém outros nós e esse nó é reutilizável. Assim, podemos reutilizar esse código em vários lugares e em nosso projeto. Então, se eu clicar duas vezes, essa função realmente nos levará para a própria função. E você pode ver que essa função contém todos esses nós. Agora, isso será executado de forma semelhante ao nosso gráfico de eventos. Então, ele será executado da esquerda para a direita. E então, quando chegar ao fim, o nó será concluído. Então, para começar, pegaremos nosso valor atual de Saúde e subtrairá o valor de dano que recebemos de qualquer dano causado por eles. Em seguida, definirá nosso novo vale da saúde atual. E então estamos definindo, ou desculpe, estamos verificando, nossa saúde atual é menor ou igual a 0? Se for menor que 0 ou igual a 0, então executamos o nó Play play sound e estamos dizendo a ele para executar o som surdo. Então, como você pode ver, estamos reutilizando nossa peça, tocando um nó de som. E desta vez estamos dizendo que queremos tocar o som surdo. Depois que nosso som foi tocado, dizemos ao ator que se destrua, o que basicamente diz ao ator para se retirar completamente do nível. Ou se eu espero que seja maior que 0, estamos dizendo, estamos girando nossa peça, tocamos um nó de som para tocar o som hertz em vez do som surdo. Agora, se nosso nó Destroy Actor for executado ou se nosso jogo, reproduzir um som com o som hertz, você pode ver que eles não têm mais saídas. Então, o que acontecerá é que nossa função está terminada. Então, se tivéssemos um código adicional conectado à saída de nossa função, isso seria executado. Nós não temos. Portanto, essa cadeia de execução acabou agora com a diminuição da função de saúde. Isso vai ser tudo para esta aula. Espero que agora você entenda o que faz com que o código do blueprint seja executado e a ordem em que as coisas geralmente são executadas. Não se preocupe muito se você ainda não entender completamente as funções ou eventos, nós os abordaremos em lições separadas no futuro. Isso estava apenas pegando o jeito de como o código realmente é executado e o que faz com que ele seja executado. 5. Variáveis (geral): Olá pessoal, Nesta lição, vou explicar o que são variáveis e para que são usadas. As variáveis são basicamente apenas uma forma de armazenar informações. E há muitos tipos diferentes de informações, então existem alguns tipos diferentes de variáveis. Nas próximas lições, vou mostrar algumas das variáveis mais usadas. Aprenderemos como mudar seus valores. E também abordaremos alguns exemplos básicos de coisas comuns para as quais serão usadas. Então, para começar, criaremos uma nova variável. E para fazer isso, vamos ao nosso novo painel Blueprint. E há algumas maneiras de fazer isso. Podemos clicar no pequeno botão de adição ao lado da guia de variáveis e criar uma nova variável dessa forma. Ou podemos ir até o botão Adicionar aqui e selecionar o botão variável aqui, o que criará uma nova variável também. Agora, depois de criarmos uma nova variável, poderemos renomeá-la. Então, para essa variável, vou chamá-la de nova variável. Aqui. Também podemos definir nossos tipos de variáveis. Portanto, o padrão é um booleano. Um booleano é apenas uma variável verdadeira ou falsa, portanto, ele armazena um valor verdadeiro ou falso. Agora, com nossa variável selecionada, podemos adicionar ao painel Detalhes. Se você não tiver o painel de detalhes, sempre poderá acessá-lo acessando o Windows e selecionando o painel Detalhes. Então, durante a noite, no painel Detalhes, temos nossos nomes de variáveis para que possamos renomear nossa variável sempre que quisermos. Podemos definir o tipo de variável. Agora, se eu selecionar a seta para baixo aqui, você verá alguns dos tipos de variáveis mais comumente usados que veremos em lições futuras. Existem alguns adicionais e menus suspensos. Não cobriremos esses no curso porque há muitos e muitos deles. Mas vou explicar o que são e para que serão usados em uma lição futura. Agora, temos um valor padrão aqui embaixo. Esse é basicamente o valor inicial da nossa variável. Agora, no momento, ele não tem nenhuma opção aqui. Ele apenas diz, por favor, compile o projeto. Isso porque é uma nova variável para que a configuração apareça, temos que compilar. Então, eu vou compilar aqui. Você pode ver que agora temos essa caixa de seleção que podemos ativar e desativar. E isso porque um booleano é um valor verdadeiro ou falso. Assim, podemos definir onde essa variável começa com um valor verdadeiro ou um valor falso. Agora também havia algumas configurações adicionais aqui. Não se preocupe muito com isso no momento, abordaremos alguns deles em uma lição futura. Agora, uma grande parte das variáveis é que podemos realmente ter as informações armazenadas nelas quando estamos escrevendo código e podemos alterá-las. Portanto, há algumas maneiras diferentes de obter seus dados de variáveis. Então, podemos simplesmente arrastá-lo diretamente para o nosso gráfico de eventos a partir do meu painel de blueprint e obtemos uma opção para obter uma nova variável ou definir uma nova variável. Portanto, podemos fazer uma lacuna que nos dará esse nó get aqui. Usando esse nó, podemos obter o valor atual para o qual nossa nova variável está definida. Agora também podemos arrastar e definir, e isso nos permite alterar o valor atual de nossa variável. Agora, essas notas às vezes terão uma aparência diferente dependendo do tipo de variável. Então, como isso é um booleano, ele tem uma pequena caixa de seleção aqui. Podemos ligar e desligar. Mas digamos que se essa fosse uma variável que estamos armazenando um número, não teríamos a caixa de seleção lá. Agora, outra maneira de fazer isso é quando arrastamos nossa nova variável, se eu pressionar Control no meu teclado e soltar o botão esquerdo do mouse, basta criar instantaneamente um nó para nós. E também podemos arrastar e segurar o botão Alt e soltar. E isso nos dará um conjunto de nós. Então, em vez de ter que usar esse pequeno menu, você pode usar alguns atalhos de teclado lá também. Outra maneira de criar as variáveis em nosso Gráfico de Eventos é que podemos simplesmente clicar com o botão direito do mouse e procurar por uma nova variável e pressionar enter. E temos nosso nó get e podemos fazer a mesma coisa com o SAP. Então, eu posso apenas pesquisar por uma nova variável definida. E você pode ver que isso está lá em cima e nós podemos criar isso também. Portanto, não importa qual maneira você usa para criar suas variáveis no Gráfico de Eventos, o que for mais confortável para você, você pode simplesmente usar isso. Agora, dependendo de quanto tempo você já passou no mecanismo, você pode ou não saber quais variáveis podem se conectar a outras variáveis. Então, por exemplo, se eu criar uma nova variável aqui, vou chamar essa variável. E eu vou deixar isso como um booleano, lutar, arrastar isso para o nosso gráfico de eventos e eu vou conseguir. Na verdade, posso conectar essa outra variável ao meu novo nó de conjunto de variáveis. E eu vou tirar esse do caminho. E o que isso fará é pegar o que quer que seja de um valor variável e dirá à nossa nova variável para ser esse valor. Então, se tivéssemos esse nó rodando, digamos, em Beginning play, então eu vou começar a jogar Notre. Conecte isso. Agora, quando o jogo começar, nossa nova variável será definida como qualquer outro valor para o qual outra variável esteja definida. Então, se eu selecionar minha outra variável, você pode ver que eu preciso compilar meu blueprint, então eu farei isso. Então, se eu definir as outras variáveis, o padrão é true, e se eu for para minha nova variável, seu padrão é false. Agora, o que isso fará é dizer que nossa nova variável agora é verdadeira. E podemos verificar isso se eu adicionar uma string de impressão rapidamente, conectar a saída do meu novo nó de conjunto de variáveis na entrada da string. E essa saída é basicamente a mesma que um nó. Então, apenas para manter seu código limpo ou você pode usá-lo em vez de ter que criar um novo nó. Então, agora, quando o jogo começa, esperaríamos que nossa string impressa fosse impressa como verdadeira, porque é para isso que nossa outra vogal, outra variável, está definida. Então, se eu puder puxar e clicar em Play, você pode ver que está imprimindo verdadeiro. E se eu fosse mudar minha outra variável para false, você verá que quando clicarmos em play, ela será falsa. Então isso vai ser tudo para este vídeo. Em nossas próximas lições, aprenderemos sobre tipos de variáveis específicas e alguns nós que são comumente usados com essas variáveis. 6. Variáveis (booleanos): Olá pessoal. Nesta lição, vamos dar uma olhada mais de perto nos booleanos. As variáveis booleanas são usadas para armazenar um valor verdadeiro ou falso, mas também podem ser usadas para controlar qual código está sendo executado em seu projeto. E também podem ser o resultado de certos testes. Então, por exemplo, se estivéssemos verificando se a é maior que b, o resultado desse teste seria um booleano porque seria verdadeiro ou falso. Então, para começar, vou criar alguns exemplos de como os booleanos podem controlar qual código está sendo executado. E vamos fazer isso e precisar ThirdPersonCharacter Blueprint. Então, eu vou abrir isso. E aqui vamos criar novas variáveis. Então, no meu painel de projetos, clique no botão nova variável e chamarei meu exemplo de booleano. E o meu já está definido como booleano, mas se o seu não estiver, você pode simplesmente clicar no menu suspenso aqui e selecionar o tipo booleano. E vamos compilar para que nossos valores padrão apareçam no painel Detalhes aqui. Se você estiver perdendo algum desses painéis, você sempre pode ativá-los e as janelas suspensas aqui. Vamos deixar o valor padrão é false porque na verdade, vamos mudar isso usando código. Então, começaremos criando um nó de tick. Então, clicaremos com o botão direito do mouse no Gráfico de Eventos e pesquisaremos por tecnologia e criaremos o evento tick. Agora, se você se lembra da lição anterior, é executado toda vez que um quadro é retirado do nosso jogo. Em seguida, vamos pegar nossos booleanos de exemplo. E vamos nos arrastar e procurar por grunge. Se soletrarmos corretamente, lá vamos nós, podemos procurar marcas e criar esse nó conectado à nossa tecnologia de eventos. Então, agora, a cada quadro, esse nó de ramificação será executado. O que um nó de ramificação faz é basicamente verificar a variável booleana que está conectada a ele e executar true ou false, dependendo se a variável booleana é verdadeira ou falsa. Então, para começar, vamos apenas criar algumas cadeias de impressões. Então, vamos nos afastar da verdade. Vamos procurar por string de impressão. E este é apenas um nó que imprimirá algum texto na tela de nossos jogadores sempre que ele for executado. Então, eu vou dizer, eu vou definir isso como verdade. E vou copiar e colar isso e conectar isso ao falso. E eu vou definir isso como falso. E isso significa apenas que quando nosso pino verdadeiro for executado para ser executado na tela e quando nossa caneta falsa for executada, as pessoas correrão na tela. Então, vou mostrar agora, o valor padrão ainda é falso. Portanto, devemos esperar que as pessoas corram quando planejamos, o editor clicará Play e você poderá ver que false está sendo executado. Se aceitarmos, mudamos nosso booleano para true e clicamos em Play. Você pode ver que a verdade está em execução. O legal dos blueprints é que podemos realmente ver esse código rodando em tempo real. Então, se eu voltar para o meu ThirdPersonCharacter enquanto o jogo ainda está em execução, você pode ver o menu suspenso de depuração aqui. E se eu selecionar o ThirdPersonCharacter, só teremos uma opção porque há apenas um ThirdPersonCharacter Blueprint no nível. Então, vamos apenas coletar isso. Você pode ver que podemos ver Arctic Node está executando todos os quadros que estão executando nosso branch, o que verifica nosso exemplo Boolean. E se o salvarmos agora, você pode realmente ver que diz verdade. Então, true está sendo executado em nossa string de impressão está sendo executado e está sendo impresso como verdadeiro. Então, agora queremos ser capazes de realmente mudar nosso valor booleano durante o jogo para que possamos alterar qual código será executado. Então, vamos sair do nosso modo de jogo. E vamos criar um novo nó de entrada. E eu vou procurar o botão esquerdo do mouse. E isso será executado sempre que o botão esquerdo do mouse for pressionado. E então o lançamento será executado sempre que o botão esquerdo do mouse for solto, será arrastado e usaremos um nó de ramificação. Agora, na verdade, existem algumas maneiras de criar nós de ramificação. Uma delas é manter pressionado B no teclado e, em seguida, clicar com o botão esquerdo do mouse e você pode ver que ele cria um nó de ramificação ou você pode clicar com o botão direito do mouse e pesquisar se. Isso também traz o nó da ramificação. Ou você pode pesquisar por brunch. E isso também traz à tona os nós de ramificação , o que quer que você se sinta mais confortável. Vamos conectar isso ao prensado. Vamos pegar nosso exemplo booleano e conectá-lo à condição. Você pode ver que estou arrastando-o diretamente e ele irá conectá-lo automaticamente a nós, ao nó da ramificação para nós. E o que queremos que aconteça aqui é quando o botão esquerdo do mouse for pressionado, se nossa variável booleana atual for verdadeira, queremos defini-la como falsa. Então, eu vou apenas conectar isso em falso e ver se eu arrasto para o verdadeiro, ele simplesmente se conectará automaticamente. Então, queremos que seja definido como falso se já for verdade. E copiaremos e colaremos esse submarino conectado em falso. E se nosso valor atual for falso, queremos defini-lo como verdadeiro. Então, deve ser algo parecido com isso. Vou compilar isso. E agora podemos testá-lo. E mais uma vez, vou apertar Play. Você pode ver que atualmente é verdade porque esse é o nosso valor padrão. Se eu pressionar o botão esquerdo do mouse, ele se tornará falso. E se eu continuar pressionando, você pode ver que está mudando a string de impressão. Agora, existem alguns outros nós comumente usados com Boolean. Então, eu quero mostrar a vocês, se voltarmos ao nosso ThirdPersonCharacter Blueprint, pegamos nosso exemplo booleano e nos arrastamos para fora dele e procuramos por todos. Você pode ver que temos alguns nós ou diferentes. Então, vou usar o nó booleano OR. E você pode ver que isso nos dá duas entradas para Boolean. E então uma saída que eu quero saber é basicamente verificar, alguma de suas entradas é verdadeira? Se for, então ele retornará verdadeiro. Se forem todas falsas, elas retornarão falsas. E podemos adicionar várias entradas. Assim, poderíamos adicionar entradas adicionais, se quiséssemos. Por exemplo, nosso exemplo booleano está marcado como true, mas todos os outros são falsos. Portanto, isso ainda será executado ou, ou Node ou ainda será exibido como verdadeiro. Então, podemos testar isso. Você pode ver que está funcionando corretamente. Mas se eu mudar meu exemplo, booleano verdadeiro, falso. Todas as suas entradas agora são falsas. Então, agora retornaremos false. Você pode ver agora que está retornando falso. Uma nota semelhante são os antinós. Portanto, se excluirmos nosso off agora, arrastaremos para fora do nosso exemplo Boolean novamente e procuraremos e poderemos selecionar o nó booleano. E isso funciona de forma semelhante. Ele pega várias entradas booleanas e retorna uma saída booleana. E o que isso faz é basicamente que todas as entradas devem ser verdadeiras para que sejam verdadeiras. Então, neste momento, nosso exemplo booleano é falso e este adicional também não está digitado, então é falso. Mas se eu mudar meu exemplo booleano para verdadeiro, agora temos uma entrada verdadeira e uma falsa. Agora, a saída será falsa porque isso não é verdade. Para que possamos testar isso, clique em Play. Você pode ver que é falso. Mas se aceitarmos e eu marcar essa opção, agora que ambas são verdadeiras, ela produzirá C verdadeiro Agora, essas são notas que você usará com muita frequência com nós de ramificação e elas podem poupa a necessidade de ter vários nós de ramificação se estiver testando mais de uma variável. Por exemplo, se você precisar que as variáveis livres sejam verdadeiras antes de querer que um nó de ramificação seja executado, você usaria um ânodo. Outro nó comumente usado é o nó. Então, se nos arrastarmos e procurarmos por nada, podemos usar, Vamos ver, NÃO booleano. E isso basicamente converte ou muda ou booleano para o oposto do que é atualmente. Então, se eu conectar isso, atualmente nosso booleano está marcado para árvore, mas isso irá reverter isso e torná-lo raposa. Então, podemos ver que está definitivamente definido como verdadeiro, mas vai comandar as pessoas. Veja, se voltarmos e definirmos isso como falso agora, o nó não irá realmente converter isso e torná-lo um verdadeiro enquanto o código verdadeiro será executado. Agora, há uma outra nota que quero mostrar a vocês, que é o nó de igual. Então, ele excluirá não são nós agora e eu vou arrastar para fora, e procurarei por iguais. Faça um ou dois iguais. Eu também gosto de fazer, porque geralmente só traz a forma exata que queremos. E isso é r igual a nota aqui, você pode ver que tem duas entradas booleanas e uma saída booleana. Se eu conectar isso à nossa nota de brunch aqui, isso basicamente diz que ambas as nossas entradas devem ser exatamente as mesmas. Então, atualmente, ambos são falsos. Portanto, nosso exemplo boolean é definido como false e sua segunda entrada é definida como false. Então, isso será realmente verdadeiro porque ambos têm exatamente o mesmo valor. Então, podemos testar isso em jogo. Em C. É verdade mesmo que nossos valores sejam realmente falsos. E se eu fosse definir nosso exemplo booleano como verdadeiro, mas deixar esse valor é falso. Ele será executado como falso porque eles não têm mais o mesmo valor. E podemos verificar isso novamente. Clique em Play. Você pode ver que o pessoal está correndo. Agora, como uma nota lateral, de você E5, se você fosse criar esses nós que eu mostrei sem arrastar para fora de um booleano, eles realmente não teriam essas entradas e saídas vermelhas. Então, por exemplo, se eu pesquisar por r é igual a nota aqui, você pode ver que ele tem uma saída booleana porque um nó igual sempre retornará verdadeiro ou falso. Mas essas entradas estão realmente esmaecidas. E o curinga, o que significa que eles podem ser de qualquer tipo de variável. Algumas maneiras de convertê-los em nosso tipo booleano. Portanto, podemos simplesmente arrastar para fora do nosso exemplo booleano, conectá-lo e ele o converterá automaticamente para nós. Ou podemos clicar com o botão direito do mouse nessas penta acinzentadas, vá para converter pino. Você pode ver que podemos alterá-lo para vários tipos de variáveis diferentes. Mas você pode ver que temos nossa opção booleana lá, para que possamos selecionar isso. E agora ele converte nosso nó nesse tipo booleano. Então será isso para a nossa aula sobre booleanos. Nós os usaremos muito mais em lições futuras, pois os booleanos são uma parte muito legal da codificação. Não se preocupe muito se você não lembrar de todos os nós que usamos novamente, nós os usaremos muito mais em lições futuras. 7. Variáveis (inteiros e flutuadores): Olá pessoal. Nesta lição, abordaremos os tipos de variáveis flutuantes e inteiras. Agora, as variáveis float e integer são usadas para armazenar valores numéricos. A diferença entre os dois é que inteiros só podem armazenar números inteiros, o que significa que não pode ter um valor de ponto decimal, enquanto um ponto flutuante pode armazenar números que tenham um valor de ponto decimal. Ambos podem armazenar números de valores positivos e negativos. Então, começaremos criando dois novos tipos de variáveis. Vou criar duas novas variáveis. O primeiro que chamarei de exemplo float, e o segundo, chamarei de exemplo em inteiro, mudará os tipos para que desejemos inteiro. Então, para nosso exemplo float, selecionaremos float em qual compilador. Agora, com nossos números inteiros de exemplo selecionados, você pode ver no valor padrão que podemos definir um valor numérico. Então, posso definir isso para dizer 99, por exemplo, mas posso adicionar um ponto decimal e adicionar um valor de ponto decimal. Digamos que se eu tentasse fazer isso, quando eu pressiono Enter, ele é removido porque um inteiro só poderia armazenar números inteiros. Considerando que, se eu selecionar minha variável flutuante e for para o valor padrão aqui você poderá ver que ela realmente tem um 0 decimal. E eu posso definir isso para 99,99 mãos, e você pode ver que o valor realmente salva corretamente. seguir, mostrarei como podemos definir e obter nossas variáveis flutuantes e inteiras é muito semelhante a como estávamos trabalhando com nosso Booleano. Então, vou passar rapidamente por esse processo. Vou apenas clicar com o botão direito do mouse e criar uma entrada com o botão esquerdo do mouse, como fizemos com nosso Boolean. E obteremos nosso exemplo de estrela flutuante com, e vamos apenas selecionar Get Float do nosso pressionado. Só vou escolher o nó da string de impressão. E isso nos permitirá apenas imprimir a string do nosso valor atual. Quando o conectamos à string, ele nos dá esse nó adicional. Tudo o que está fazendo é converter nosso valor de flauta em um valor de string. E um valor de string é apenas texto. E isso permite que nossos nós Print String imprimam o valor flutuante. Agora, quando clicamos em play e eu clico com o botão esquerdo, você pode ver que está imprimindo nosso valor padrão. E o processo é o mesmo para o nosso número inteiro. Só podemos conseguir isso. Vou arrastá-lo direto para nossa entrada de string. E você pode ver que nos deu um nó diferente, parece semelhante ao primeiro, mas isso converte um inteiro em uma string. Então, vou imprimir uma string para exibi-la. Então, quando clicamos em play e eu deixei o mouse, você pode ver que está imprimindo agora são valores inteiros. Em seguida, começaremos a mudar nossos valores. Então, o que podemos fazer é mouse e usar um nó de marcação. A partir disso, vamos aumentar nosso valor inteiro. Então, obteremos um valor inteiro atual. Vamos nos arrastar, vamos usar o plus. E isso é um nó add. E funciona muito bem como você imagina. Ele pega o valor atual do nosso inteiro e adiciona algum valor a ele. Então, vou definir isso como um. Portanto, a saída será nosso exemplo atual de valor inteiro mais um. Em seguida, precisamos definir nosso número inteiro de exemplo. Então, eu vou apenas arrastar, fazer SAP, conectar isso em nosso nó tick e conectar a entrada em nosso nó de adição. Então, agora a cada quadro, nosso número inteiro de exemplo aumentará e, quando deixarmos o botão do mouse, ele imprimirá o valor atual. Então, ele irá compilar e clicar em play. Então, se eu clicar em Plus, você pode ver que já chega a 249. E isso ocorre porque nosso nó de ticks está executando todos os quadros. Então, isso vai aumentar muito rapidamente. E veja como eu clico, esse valor está subindo muito. Em seguida, faremos a mesma coisa com nosso valor flutuante. Então, voltaremos ao nosso projeto de personagem e removeremos esse código aqui. E faremos a mesma coisa, mas à tona. Então, vamos nos arrastar, faça isso. Conecte isso ao nosso nó tick. Então, queremos obter o exemplo atual float plus. Então, usaremos um nó de adição e podemos adicionar números de ponto decimal. Então, poderíamos adicionar, digamos, 1,25 e conectar a saída ao nosso flutuador de exemplo. Então, a cada quadro, pegamos o valor flutuante atual mais 1,25. E então o resultado que definimos agora para o nosso exemplo flutua. E então vamos conectar de volta aqui em baixo com o botão esquerdo do mouse, teremos nossa exibição de string de impressão, nosso valor flutuante em vez de nosso valor inteiro. Então, agora, quando clicamos em play, podemos clicar e você pode ver que está subindo em números decimais agora porque estamos usando nosso flutuador. Em seguida, mostrarei alguns dos nós mais comumente usados com flutuadores e inteiros. Agora, a razão pela qual estamos fazendo essas duas variáveis juntas é porque ambas são o número de variáveis e ambas usam nós muito semelhantes. E eles também podem ser combinados com alguns nós. Então, se voltarmos para o nosso ThirdPersonCharacter, vamos nos livrar desse código aqui em cima para nos dar um pouco de espaço. E começaremos com os nós básicos que já estamos usando. Então, eu vou pegar tanto float quanto inteiro. Agora, o primeiro é R plus node, add node. Podemos criar isso nos permite adicionar as entradas juntas. E produza o resultado. Podemos adicionar novos pinos, se quisermos, para adicionar várias variáveis juntas. Também podemos criar novas variáveis de fluxo , como chamar isso de float. Defina isso como um flutuador. Podemos conectar isso de uma variável flutuante. Assim, podemos adicionar várias variáveis de fluxo juntas. Agora, desde que você tinha cinco anos, podemos realmente mudar essas entradas de dois tipos diferentes de variáveis. Então, digamos que eu queira adicionar meu exemplo float e meu número inteiro de exemplo juntos. Nós poderíamos fazer isso. Agora, se tivermos vários pinos e quisermos removê-los, basta clicar com o botão direito do mouse e removê-los. Então, vou apenas remover esses dois extras. Então, eu quero combinar esses dois valores juntos. Nós podemos fazer isso agora. Assim, podemos clicar com o botão direito do mouse ou pino extra, ir para converter pino e selecionar inteiro. Agora podemos conectar nosso inteiro m. E agora isso produzirá o resultado do exemplo float mais inteiro como um float. Então, poderíamos definir nosso exemplo flutuante para esse valor. Agora, podemos testar isso no jogo, se quisermos. Podemos colocar isso aqui embaixo. Conecte isso ao botão esquerdo do mouse, conectará o resultado à nossa string de impressão. Então, agora vamos dizer adicionar 1,25, 1,25. E vamos acrescentar a isso. Quando apertamos o play, esperamos que seja 3,25. E, na verdade, está aumentando porque estamos definindo esse valor flutuante. Então, toda vez que clicamos, agora estamos aumentando o valor porque nosso exemplo flutuante foi aumentado. Agora, esse processo de conversão de um dos pinos um inteiro pode ser usado com a maioria dos nós que vou mostrar a você. Então, se continuarmos, terei outro exemplo, cabelo flutuante. Se arrastarmos para fora e procurarmos multiplicar, você pode usar este símbolo aqui, ou você pode pesquisar por multiplicar. Isso nos dá um nó multiplicado. Isso funciona como você provavelmente imagina. Ele pega as entradas, as multiplica e retorna uma saída. Podemos clicar com o botão direito do mouse em uma das entradas e convertê-la em um número inteiro também. Agora, você deve ter notado que estou fazendo isso para que a saída seja um flutuador. A razão pela qual estou fazendo isso é porque se fizermos isso ao contrário, se eu copiar e colar meu número inteiro aqui, e criarmos um nó de anúncio. Se eu converter isso em um float, você pode ver que a saída agora é alterada para um float, mesmo que fosse um número inteiro. A razão pela qual isso está acontecendo é porque nosso, se isso fosse uma saída inteira, perderíamos qualquer valor, qualquer valor de ponto decimal ou variável flutuante que pudesse ter. Então, ele muda automaticamente isso agora para um flutuador. Então, continuando, temos o nó multiplicado. Também podemos fazer isso com nosso número inteiro. Então, se eu excluir esta nota de anúncio aqui sendo arrastada, podemos pesquisar por multiplicar, multiplicar nó, e isso nos dará um nó de multiplicação inteiro. Também temos os nós de subtração. Então, se eu apenas excluir essas notas, podemos usar um nó de subtração. E você pode pesquisar o símbolo de linha aqui, ou você pode pesquisar por subtrair. Depende de você. E isso nos dá a mesma coisa que nosso nó de adição, mas subtrai as entradas e retorna as saídas. Novamente, podemos converter essas entradas em um número inteiro, ou se quiséssemos em um nó inteiro, poderíamos convertê-lo em um ponto flutuante. E assim como antes, ele converteu a saída em um float novamente, porque adicionamos uma entrada flutuante. Então, essas são as formas básicas de manipular os valores das nossas variáveis. Podemos definir esses novos valores. Mas também há maneiras de verificarmos nossas variáveis. Então, se nos livrarmos desses nós negativos por enquanto, também há nós como o nó maior que. Então, se eu arrastar para fora do meu inteiro, eu procuro por maior que. Você pode ver, nós podemos procurar por algo maior. Então, se eu pesquisar por maior, você pode ver que ele aparece, ou você pode usar o símbolo maior que e criar esse nó. E isso nos dá duas entradas que são inteiras e uma saída booleana. Então, isso basicamente verificará o valor a, o valor superior é maior que o valor b ou o valor inferior. Se for, ele retornará um verdadeiro booleano. E se for falso, retornará um booleano falso. Novamente, como nossos nós anteriores, podemos converter os pinos de entrada. Então, se eu converter, podemos mudar isso para um flutuador. Portanto, podemos verificar se nosso número inteiro é maior que nosso valor flutuante. E isso retornará ainda um valor booleano porque isso sempre será verdadeiro ou falso. Podemos fazer a mesma coisa com menos de. Assim, podemos arrastar para fora do nosso número inteiro e fazer o símbolo de menor que ou podemos pesquisar por menos. E isso nos dá o mesmo nó, mas invertido. Então, se a for menor que b, então ele retornará verdadeiro. Se a for maior que b, ele retornará false. Também há nós maiores ou iguais. Então, se eu fizer o símbolo maior que em C, teremos maior igual. E isso só verifica, é maior que B ou é? O mesmo que B. Se for maior que b, retornará verdadeiro. Se for o mesmo que B, ele também retornará verdadeiro. E se for menor que b, retornará false. E então temos o mesmo nó, mas com menos sol também. Então, podemos fazer menos do que igual. E isso faz a mesma coisa, mas ao contrário. Portanto, a deve ser igual ao nosso valor inferior ou menor que nosso valor inferior. E isso retornará verdade. Agora, como esses nós geram uma variável booleana, podemos realmente usá-los para dizer variável booleana, como estávamos fazendo em nossa lição anterior. Então, se eu criar uma nova variável e chamá-la de Boolean, podemos usar esses nós maiores ou menores que nós para definir uma variável booleana, se quisermos. Também podemos usar esses nós para controlar um nó de ramificação. Então, se eu pesquisar por branch e criar um nó Branch, como fizemos em nossa última lição, podemos controlar qual código está sendo executado dependendo do resultado de nosso maior que ou menor que. Nota. Uma outra nota que eu queria mostrar a vocês é o nó igual. Agora, isso funciona de forma semelhante à forma como nosso nó Boolean equals funciona. Se eu arrastar para fora do meu inteiro e fizer os dois símbolos de igual e ver que isso nos cria um nó de igual. E isso basicamente verifica se esses dois inteiros são iguais e gera um booleano que podemos usar em coisas como o nó booleano o mais rápido possível ou um nó de ramificação. Ao contrário dos nós anteriores, também podemos converter a entrada em um float, se quisermos. Podemos escolher a precisão dupla flutuante porque era essa a nossa variável. Podemos conectar nosso flutuador de exemplo a isso. E isso verificará se nosso número inteiro é exatamente igual à nossa variável flutuante? Se for, retornaremos true, se eles forem diferentes do que retornarão false. Os inteiros também têm outra maneira controlar qual código está sendo executado. Então, se eu excluir esse código aqui por enquanto, e eu arrastar nosso número inteiro de exemplo. Se eu arrastar para fora e procurar por switch, você pode encontrar switch on int. E isso nos dá uma nota que nos permite controlar qual saída é executada dependendo do nosso valor inteiro. Então, atualmente, nossos valores inteiros são dois. Temos uma caneta padrão. Então, o que aconteceria se eu tivesse deixado o botão esquerdo do mouse agora é nossa caneta padrão funcionaria e nada mais aconteceria. Mas se adicionarmos uma nova caneta, você pode ver que foi adicionado um alfinete que diz 0. Se eu adicionar mais alguns pinos, você verá que temos 012. Agora, se eu pressionasse o botão esquerdo do mouse, as duas canetas iriam tocar, porque nosso número inteiro está definido como dois. Se eu fosse mudar isso para 0, então nossa caneta 0 seria executada no testículo ou usando uma string de impressão. Vamos definir isso como 0. Vou copiar e colar isso e vamos definir este como um e este um para dois. Agora, dependendo de qual número inteiro de exemplo é executado, as diferentes saídas serão executadas se pressionarmos Play. E eu deixei o mouse, você pode ver que 0 está sendo executado porque eu defini o valor como 0. Se eu defini-lo como um, então o nosso será executado e isso executará nossa string de impressão única. Você pode ver que um está sendo executado agora. Isso pode ser útil se você quiser executar código diferente, dependendo do valor. E se eu dissesse que defina esse valor para dizer 99, agora não há uma saída de 99 pinos. Então, o que acontecerá é que nossa caneta padrão será executada porque não há saída correspondente para 99. Então, se em algum momento quisermos remover algumas dessas saídas, podemos simplesmente clicar com o botão direito do mouse no pino e podemos remover a caneta de execução para removê-las. Por fim, quero mostrar como podemos usar um ponto flutuante para definir um número inteiro. Agora, isso é um pouco diferente do normal, já que nosso float pode ter um vencedor de valor de ponto decimal, e nosso número inteiro não pode armazenar esse valor. Então, temos que arredondar para cima ou para baixo ou flutuar. Então, se obtivermos nosso exemplo float aqui, definimos nosso número inteiro de exemplo. Nós conectamos isso até o botão esquerdo do mouse aqui. Podemos arrastar e conectar diretamente em nosso número inteiro. Mas isso vai nos dar esse nó e isso vai arredondar para cima, arredondar para baixo ou flutuar valor. Então, se isso for, digamos, 1,25, ele arredondará esse valor para um e, em seguida, dirá inteiro para um. Então, se eu adicionei uma string impressa aqui para que possamos ver qual é o resultado no jogo. Esperamos que esse resultado seja um quando eu deixei o mouse, o que é, e mesmo que eu defina esse valor para 1,99, ele ainda arredondará o valor para baixo. Então, se eu apertar play novamente, você pode ver que ainda está arredondando esse valor para um. Mas existem outros nós que nos permitem arredondar o flutuador para um número inteiro diferente. Então, se voltarmos para nossa cabeça de projeto de personagem e excluirmos o nó. Esse é apenas o nó padrão para quando arrastamos de um ponto flutuante para um inteiro. Mas também podemos sair do nosso carro alegórico e procurar por rodada. E podemos usar o nó redondo, que apenas arredondaria nosso valor flutuante para o número inteiro mais próximo. Então, se eu conectar isso aqui, atualmente nossa variável é 1.2. Então, quando deixamos o botão do mouse, esperávamos arredondar para um. Então, se clicarmos em Play, você pode ver que está imprimindo um. E se eu aumentasse isso para dizer 1,8, esperaríamos que fosse arredondado para dois. Você vê que isso está funcionando corretamente. Agora, não precisamos desse mesmo processo de conversão se quisermos definir um número flutuante para um número inteiro, porque os flutuadores podem exibir números inteiros perfeitamente. Então, se eu fosse excluir esse código, definiríamos nosso flutuador. E obtivemos nosso número inteiro de exemplo aqui. Só vou reutilizar essa variável. Se conectarmos isso, você pode ver que ele apenas nos dá essa pequena nota que a converte de inteiro para fluxo. E não há arredondamento acontecendo porque nosso inteiro é um número inteiro. E nosso carro alegórico pode armazenar números inteiros muito bem. Então você pode ver nosso número inteiro, é 99. Quando deixamos o botão do mouse, mudará nosso flutuador para hoje à noite. Então, vou conectar isso à nossa string impressa. Então, quando clicarmos em play, você verá que ele está imprimindo 99 porque é float como um valor de ponto, mas está sendo definido para o valor correto do nosso inteiro. Agora, há muitos outros nós matemáticos embutidos no mecanismo que não abordaremos nesta lição porque há muitos. Mas se arrastarmos do nosso número inteiro, você pode rolar para baixo e encontrar a massa. Você pode encontrar todos os tipos de nós aqui com os quais você pode brincar, se quiser. A maioria deles é bem específica, então você provavelmente não os usará com muita frequência. Mas o que eu mostrei aqui são os nós mais usados. E você pode fazer exatamente o mesmo com os carros alegóricos. Se eu sair de lá e simplesmente rolar para baixo, podemos encontrar a matemática. Você pode ver que há ainda mais para carros alegóricos porque eles são um pouco mais versáteis, pois têm um ponto decimal. Então isso vai ser tudo para esta lição. Assim como o booleano, usaremos carros alegóricos e inteiros muito mais em lições futuras só porque eles são a parte central de fazer qualquer matemática no mecanismo. Então, você estará se familiarizando bastante com eles no futuro. 8. Variáveis (nomes, textos e cordas): Olá pessoal. Nesta lição, examinaremos os tipos de variáveis de nome, string e texto. Todas essas variáveis são usadas para armazenar texto e cada tipo de variável tem algumas limitações e benefícios em usá-las. Primeiro, temos o tipo de variável name. Agora, isso é usado para armazenar textos em que o player normalmente não vê. É mais para referenciar certas coisas no código. Por exemplo, quando queremos obter uma localização de osso ou soquetes, usaríamos uma variável de nome para dizer ao mecanismo para qual osso ou soquete queremos obter informações. Então, por causa disso, a variável name é bastante limitada. Ele não precisa de todos os nós aos quais as variáveis de strings e textos têm acesso. Então, começaremos criando nossa variável name. Então, vou criar uma nova variável e chamarei esse nome de exemplo. Definiremos nosso tipo de variável para a variável name. E vamos compilar. Depois de compilado, você pode ver que temos nosso valor padrão aqui, e este é apenas um livro didático padrão qual podemos inserir texto. Então eu posso colocar olá. Essa é uma variável de texto que armazena essas informações. Agora, como seria de esperar, como nossas variáveis anteriores, também podemos obter e definir essa variável. Assim, podemos arrastá-lo e obter um nó get, ou podemos arrastar e obter um nó definido. Agora, a única série diferente que é definida como nó tem uma caixa de texto na qual também podemos inserir texto manualmente, se você quiser. Então, podemos definir um olá. E se esse nó for executado, ele azedaria exemplo name2 hello. Claro, se tivéssemos outro tipo de variável de nome, poderíamos conectá-lo diretamente em nosso nó de conjunto para definir nosso exemplo de variável chamada para um valor diferente. Agora, porque todos os nossos tipos de variáveis que estamos vendo hoje são variáveis de texto. Todos eles armazenam texto. Todos eles podem ser convertidos uns nos outros. Então, se eu fosse criar uma nova variável de string, chamarei esse exemplo de string. O salvamento automático saiu do meu tempo. Lá vamos nós. Exemplo de string. Podemos escolher o tipo de string. E se eu obtiver minha variável de string, você pode ver se eu arrasto e me conecto ao meu texto, ele apenas nos dá esse nó de conversão e pegará qualquer que seja nossa string de exemplo, valor de texto e o definirá ao nosso nome de exemplo. E podemos fazer isso e o contrário também. Então, se quiséssemos, poderíamos definir nossa string usando o nome de exemplo. E isso nos dá esse nó de conversão ao contrário. string são os tipos de variáveis de texto mais flexíveis, eles têm muito mais nós disponíveis para eles do que textos ou tipo de variável de nome permanecem. Por causa disso, pode ser útil converter digamos, um nome ou uma variável de texto em string, editar essa string e, em seguida, convertê-la volta para o nosso nome ou tipo de variável de texto. Como podemos fazer muito mais edição codificar com nosso tipo de string. Por fim, temos os tipos de variáveis de texto. Então, vou criar uma nova variável. Vou chamar esse exemplo de texto. E definiremos o tipo texto e compilaremos para obter nosso valor padrão aqui. Você pode ver como nossas variáveis anteriores, recebemos uma caixa de texto para que possamos adicionar texto a você. Esta é uma variável de texto, por exemplo, podemos compilar e esse é agora o nosso valor inicial para o nosso texto. Agora, variáveis de texto são usadas para os textos que os jogadores tendem a ver. Então, se você tivesse um sistema de diálogo ou um sistema de menu ou algo parecido, o jogador realmente veria os valores do texto. Nós tendemos a usar variáveis de texto para isso. E a razão é porque ele pode ser localizado, o que é usado para converter texto para diferentes idiomas, para os quais o unreal tem um sistema embutido. Não abordaremos isso nesta lição. Mas é importante que quando você está construindo sistemas de menu ou qualquer texto que o jogador veja, você use um tipo de variável de texto para que você possa ter acesso a esse sistema de localização que permite que você tenha vários idiomas. Assim, os textos podem ser obtidos e definidos da mesma forma que fizemos com nossa string e nossas variáveis de nome. Então, podemos arrastar isso para fora e obter um nó get. E esse nó, você pode ver que é semelhante ao nosso nome na string. Temos uma entrada de texto e podemos definir nosso nó para outra variável de texto. Ou podemos usar, digamos, uma corda. Podemos obter nossa variável de string. Podemos conectar isso diretamente em nossos textos e você pode ver que isso nos dá um tipo de nó de conversão de aparência diferente, mas faz essencialmente a mesma coisa, qualquer que seja a string Example, ele converterá isso em texto e, em seguida, podemos definir nosso texto de exemplo. E a mesma coisa para o nosso nome. Então, se eu obtiver a variável name, podemos inseri-la diretamente em nosso texto. Você pode ver que obtemos esse nó de conversão automaticamente que converte nosso texto de nome em um texto de texto. E isso nos permite definir nossa variável de textos de exemplo. Em seguida, quero mostrar alguns nós comumente usados com esses diferentes tipos de variáveis. E começaremos com a string porque tem a maior quantidade de nós que podem ser usados com ela e geralmente é o tipo de texto mais flexível que você pode usar para codificação. Se arrastarmos um dos mais usados é anexar. Então, se procurarmos por append, podemos trazer esse nó aqui. Agora, o nó append nos permite pegar várias entradas de string e combiná-las para uma saída. Isso pode ser útil se você quiser dizer adicionar texto adicional a uma string sem alterar a variável original. Ou se você tivesse várias variáveis de string, você pode conectá-las ao append e, em seguida, ele produzirá esses valores de texto combinados. Por exemplo, se eu definir minha string de exemplo como hello e definir o espaço B2B, isso é um teste. A saída desse nó seria hello. Este é um teste tudo em um valor de string. E poderíamos usar isso para talvez definir outra string se quiséssemos ou definir uma string de exemplo também. Também podemos adicionar entradas adicionais. Então, se quiséssemos, poderíamos ter outras variáveis conectadas a essas entradas, e todas elas seriam combinadas em uma saída. Outro nó que pode ser usado com strings é o nó contains. Então, se arrastarmos e procurarmos por contains, podemos obter a string, podemos obter contains. E isso pesquisará nossa substring. Portanto, ele verificará se a substring neste texto. Então, se eu dissesse olá, ele procuraria essa string para ver se a palavra hello está contida nela e, em seguida, retornaria um valor verdadeiro ou falso. Então, como nossa string de exemplo está definida como hello, isso retornaria true. Então, temos algumas opções. Então, temos um caso de uso. Isso significa que diferencia maiúsculas de minúsculas? Então, por exemplo, se eu fosse mudar nossa idade para um h minúsculo, o olá em nossa string tem uma letra maiúscula. Então, isso realmente retornaria false porque não corresponde exatamente ao nosso olá minúsculo. Temos uma busca de n, o que basicamente significa que ele pesquisará do final da string até o início, em vez de começar até o fim. Outro nó que podemos usar é a nota substituída. Então, se eu arrastar para fora da minha busca de string por replace, podemos criar o nó replace. E isso nos permite definir textos que queremos substituir e com o que queremos substituí-los. Então, se eu selecionar minha string de exemplo aqui e adicionar, digamos a palavra test, eu defino o Fromm para testar e os dois para irreal. Ele substituirá todas as palavras de teste por Unreal. E então aqui podemos definir se é ou não sensível a maiúsculas e minúsculas e isso produzirá a nova variável. Então, podemos definir isso para nossa string de exemplo. Ok, eu pego o nó só para que possamos sentar e ganhar. Conecte isso ao nosso nó definido, criará uma string de impressão e conectará isso à saída. Então, agora, quando clicarmos em play, veremos nossa string de exemplo dizer hello e rail em vez de hello test, que é o que está definido atualmente. Agora, o último nó que vamos ver é a nota de igual. Portanto, se excluirmos nosso arrasto anotado substituído da string e podemos procurar por iguais. E queremos, bem, temos algumas opções diferentes aqui. Temos exatamente iguais. Portanto, esse é um nó igual a maiúsculas e minúsculas. Então, se criarmos isso e vermos que tem três sinais de igual. E isso verificará se ambas as entradas são exatamente iguais, incluindo letras maiúsculas e minúsculas? Se for, ele retornará verdadeiro, se não falso. Ou podemos usar os iguais sem distinção entre maiúsculas e minúsculas. Portanto, isso retornará verdadeiro se os valores do texto forem os mesmos, mesmo que tenham valores maiúsculos e minúsculos diferentes . Então, por fim, temos o não igual. Então, isso fará o oposto. Isso retornará true se as entradas de texto forem diferentes e retornará false se as entradas de texto forem iguais. Então, vamos passar para nossa variável name agora, se você quiser encontrar qualquer uma das outras funções de string disponíveis, basta arrastar para fora de uma variável de string, procurar por string. E você poderá encontrar todas as funções de string na categoria string que você pode ver aqui. Então, vamos apenas excluir esse código agora e trazer um exemplo de nome get node como esse. Agora, nossa variável name é muito mais restrita do que as notas de string. Existem apenas algumas notas que podem ser usadas para isso. Se nos arrastarmos, podemos procurar os iguais. Isso nos dá o nó igual original. Você pode notar isso em nosso vídeo inteiro, mas não podemos alterar as entradas. Então, se eu clicar com o botão direito do mouse, você verá que não há opções de conversão. Neste nó, basicamente, consideramos variáveis nomeadas e verificamos se elas são iguais e retornam um valor verdadeiro ou falso. Também podemos criar uma opção no NameNode. Então, se excluirmos esse nó e arrastarmos e procurarmos por switch, podemos criar uma opção no namenode. Agora, isso funciona de forma semelhante à opção de número inteiro que criamos em nossas lições anteriores. Podemos adicionar novos pinos de saída. E dependendo do que nossa variável de entrada está definida, podemos executar um pino de saída diferente. Assim, você pode ver no painel Detalhes que temos os nomes dos pinos. Então eu posso mudar esses nomes para dizer olá. E vamos mudar o segundo para testar. Agora, se nosso nome de exemplo estiver definido como, se apenas o alterarmos para hello, quando esse nó for executado, nossa caneta hello new será executada. E se estivesse configurado para teste, nosso pino de teste seria executado. E então, se fosse definido para algo completamente diferente, apenas letras aleatórias do que nossa caneta padrão seria executada. Assim, você pode controlar qual código está sendo executado por uma variável de nome usando um desses, esse nó também funciona com nossa string também. Então, se eu apenas arrastar rapidamente uma corda, podemos fazer uma troca na corda também. Isso funciona exatamente da mesma maneira. Podemos criar novas entradas, alterar seus nomes e elas serão executadas dependendo de como nossa entrada de string está definida. Por fim, passaremos para nossa variável de texto. Então, vou apenas excluí-los e vamos arrastar uma lacuna para o nosso texto de exemplo, como nosso nó de string, os textos podem usar nós iguais. Então, se procurarmos por iguais em C, temos os mesmos nós que tínhamos para nossa string. Temos exatamente igual, que significa que se ambas as entradas tiverem que ser exatamente iguais, os valores dos textos para que retornem verdadeiros. diferenciamos maiúsculas de minúsculas, então só precisa ter os mesmos valores de texto. Não importa se eles estão em maiúsculas ou minúsculas e depois retornam true. E então temos os não iguais, o significa que ambas as entradas precisam ser diferentes para que a neve retorne verdadeira. Agora, nosso nó de texto não pode fazer alternâncias. Então, se eu arrastar e procurar por switch, você pode ver que não há nenhuma opção no texto, então isso é uma limitação. Também não pode fazer coisas como acrescentar. Você pode ver que essas opções não estão lá como nossas cordas estão. Mas podemos usar format, format text, que é um pouco mais de uma versão avançada do nó append. Agora, o nó de texto de formato é realmente útil para coisas como criar descrições de itens ou em qualquer lugar onde você tenha entradas diferentes em seu texto. Então, o que quero dizer com isso é que se adicionarmos um formato, então o nome deste item agora é que podemos passar o mouse sobre itens diferentes e queremos que esse nome do item mude, mas não queremos que esses textos originais mudem. O que podemos fazer é adicionar esses dois colchetes aqui, e eu ampliarei para que você possa ver o tipo de colchete. Agora, seja qual for o nome que colocarmos entre esses colchetes, adicionaremos uma nova caneta. Vou chamar esse nome de item. Pressione Enter. Você pode ver que agora temos uma entrada de nome de item, e este é um curinga para que possamos adicionar, podemos inserir um texto se quisermos fazer tudo, podemos adicionar um inteiro ou uma string ou um nome, o que você preferir. E tudo o que inserirmos, ele produzirá o nome desse item e, em seguida, a entrada. Então, como exemplo, se eu adicionar um carrapato, arrastarei para fora e imprimirei a string. Podemos simplesmente conectar o resultado à nossa string de impressão. E inserirei meus textos de exemplo no nome do item e mudaremos o texto de exemplo para Apple assim. Então, agora, quando clicarmos em play, veremos que o nome desse item é Apple. Veja que o nome deste item é apple. E podemos estender isso ainda mais. Então poderíamos colocar esse item faz, e vamos fazer os colchetes novamente, tipo de dano e pressionar Enter e agora criar outra entrada. E poderíamos dizer que use nossa corda. Podemos arrastar isso para dentro, conectar até o tipo de dano. E podemos colocar fogo. E vamos adicionar danos depois daqui. Então agora vou dizer que o nome desse item é Apple e o item causa dano de fogo, aperte play, e você verá que ele está sendo impresso corretamente. Se quiséssemos, poderíamos definir essas variáveis usando outros códigos para que toda vez que passarmos mouse sobre um item diferente, por exemplo, o nome do item mude para o nome correto e o tipo de dano muda para dizer os tipos de danos de rachaduras. Então, se eu mudar isso duas vezes, você pode ver agora que quando clicamos em play, diz dano de gelo em vez de dano phi. Isso vai ser tudo para esta aula. Espero que agora você tenha uma ideia do que cada uma dessas variáveis seria útil. Só para revisar novamente, as variáveis de texto são as que usamos para realmente exibir textos para o player. É aí que vamos armazenar coisas como o nome de um item, descrições, coisas assim. Então, temos strings que são úteis para edição em nosso código. Mas não tendemos a mostrar isso para o jogador porque eles não podem ser usados para localização. E então temos a variável name que é mais usada para codificar puramente para referenciar coisas como nomes de ossos, soquetes, linhas DataTable, coisas assim. 9. Variáveis (vetores, rotadores e transformações): Olá pessoal. Nesta lição, vamos analisar vetores, rotadores e tipos de variáveis de transformação. Vetores ou uma variável usada para definir objetos, localizações. É feito de flutuadores livres chamados x, y e z. Se eu selecionar um dos meus cubos aqui no nível, você pode ver no painel Detalhes que temos uma localização e que tem uma localização X, Y e Z. E à medida que eu movo o cubo, você pode ver que esses valores mudam dependendo de qual eixo eu movo o cubo M. Os rotadores são semelhantes aos vetores, pois são feitos de flutuadores livres. Eles têm X, Y e Z. Eles também têm nomes secundários. Então, se tivermos nosso cubo selecionado, você pode ver x é rho, y é pitch e z é seu. Se eu pressionar E com meu cubo selecionado, você pode ver que podemos girar nosso cubo e esses valores começam a mudar dependendo do eixo que estamos girando nosso cubo. Então, por fim, nós nos transformamos. Agora, essas variáveis de localização, rotação e escala são, na verdade, parte de uma variável chamada transformação. Transformar é usado para definir a localização, rotação e escala de um objeto no mundo. Agora, a escala é, na verdade apenas mais um vetor que é composto de três flutuadores com os mesmos nomes do nosso vetor de localização. Temos x, y e z. E um significa que o AXA é seu tamanho padrão normal. Se aumentarmos isso para dizer dois, será o dobro do tamanho padrão, como você pode ver aqui com nosso cubo. Então, agora vamos dar uma olhada em como podemos usar e alterar esses valores dentro de um blueprint. Então, vamos abrir nosso personagem de terceira pessoa aqui. E só para começar, vamos criar uma nova variável e chamá-la de vetor. E mudaremos nosso tipo de variável para um vetor. E vamos arrastar isso para dentro e obter a variável também arrastando um conjunto. Então você pode ver como isso se parece. Agora. Nosso nó get parece praticamente o mesmo que nossas variáveis anteriores, mas nosso conjunto agora tem três entradas, e isso nos permite definir um valor para x, y e z. Você deve ter notado que este é um número de ponto decimal porque esses são apenas flutuadores individuais que podemos definir. Podemos definir isso de algumas maneiras diferentes. Podemos conectar outro vetor a essa entrada, e isso apenas definirá nosso vetor para qualquer variável que conectamos a ele. Podemos defini-los individualmente manualmente. Então eu poderia configurá-los para dizer 123. Ou podemos realmente arrastar e procurar por vetor de carne, o nó vetorial. E isso realmente nos dá esse nó, o que nos permite inserir uma taxa variável flutuante qualquer um desses valores x, y e z. Outra maneira de definir essa variável é se excluirmos nossa anotação aqui e clicarmos com o botão direito do mouse na caneta vetorial, podemos dividir a caneta struct, e isso realmente nos permite definir os flutuadores diretamente no nó definido. Portanto, não precisamos ter esse nó de vetor make. E se quisermos recombiná-los de volta na caneta original, podemos simplesmente clicar com o botão direito do mouse para selecionar Pin de estrutura recombinado. E isso redefinirá nosso nó SAT. Agora, com nosso vetor, se o selecionarmos, você pode ver que precisamos recompilar nossos blueprints, então faremos isso rapidamente e novamente, em nossos valores padrão, podemos definir um valor x, y e z, e esses serão nossos valores iniciais para essa variável. Em seguida, vou mostrar alguns nós comuns usados com vetores. Então, o primeiro é R igual. Se nos arrastarmos e procurarmos por iguais, então teremos exatamente igual. Este é um nó que basicamente verifica esses dois vetores que são inseridos nesse nó exatamente da mesma forma que os valores x, y e z são os mesmos. Se for, ele tentará e tratará. Também temos um quase igual. Então, se usarmos a nota de igual aqui, você pode ver que isso nos dá duas entradas vetoriais e , em seguida, uma entrada flutuante. E o que isso faz é que podemos conectar dois vetores, n. E podemos dizer, podemos dar a ele uma tolerância a erros. Então, podemos definir isso para dizer um. E isso retornará verdadeiro se os valores x, y e z estiverem dentro de um do outro. Também podemos usar todos os nós matemáticos padrão com nossos vetores para que possamos arrastar, podemos usar o Add Node que nos dá a capacidade de adicionar dois vetores juntos e retornar o resultado. Podemos usar o nó menos ou o nó subtrair. Isso faz exatamente a mesma coisa, mas subtrai os dois vetores um do outro e retorna a saída. Temos o nó Multiply, que possamos pesquisar por multiplicar, e isso nos dará o maior nó de subcamada. Isso multiplicará o x por dx do valor superior. O valor y é y e o z pelo valor superior C. E vou colocar a resposta. É claro que também temos divisão, para que possamos procurar por divisão. E isso funciona da mesma maneira. Divide o valor superior, mas o inferior, e nos dá a resposta. Agora, como nossos nós de mapas anteriores, podemos alterar algumas dessas entradas. Por exemplo, posso clicar com o botão direito do mouse na entrada inferior aqui e converter o pino. Podemos mudar isso para outras variáveis matemáticas para que os números inteiros flutuem. Por exemplo, se quiséssemos dizer menos um determinado ponto flutuante de todos os nossos valores x, y e z e nosso vetor, poderíamos alterá-lo para um ponto flutuante e fazer isso. Também podemos fazer exatamente a mesma coisa do nosso Add Node. Então, talvez tenhamos um número inteiro desta vez, queríamos adicionar um valor inteiro a todos os nossos valores x, y e z. Nós podemos fazer isso também. O próximo estágio que veremos é chamado de nós de volta. Então, vamos apenas excluir essas notas aqui. Vamos arrastar para fora do meu vetor e procurar por volta e criar esse nó. E isso nos permite pegar dois vetores e dar uma saída vetorial. E esse valor alfa é um flutuador. E esse é essencialmente o valor entre esses que queremos. Por exemplo, se tivéssemos um valor e um e um valor e B, e definíssemos isso como 0,5. O local de saída seria exatamente entre esses dois locais de entrada. Em seguida, vamos dar uma olhada no nó break. Agora, se você se lembrar do nosso nó definido, podemos arrastar e pesquisar o fator make. Também podemos fazer o mesmo com um nó vector get que podemos arrastar fora e podemos procurar por break. E podemos quebrar esse vetor agora em seus valores flutuantes x, y e z. Também podemos clicar com o botão direito do mouse em nosso vetor, obter nó e selecionar Split Struct Pin. E isso nos dá acesso direto a esses valores também. E se quisermos recombiná-lo, basta clicar com o botão direito do mouse novamente e selecionar recombinar structs pen. Agora vamos realmente usar o vetor para começar a efetuar um objeto no mundo. Então você pode se acostumar a fazer isso. Para começar, vamos criar um novo acesso. Então, vamos para o navegador de conteúdo, clique com o botão direito do mouse e criaremos uma classe de blueprint. Em seguida, selecione axon. E chamaremos esse cubo, abriremos nosso blueprint de fila e adicionaremos um novo componente chamado cubo. Isso só nos dará um componente de cubo, compilará e salvará isso, e depois voltará para o ThirdPersonCharacter Blueprint. E vamos clicar com o botão direito do mouse e procurar o botão esquerdo do mouse. Então, da imprensa, arrastará para fora e procurará o ator de spawn da classe. E isso vai criar um novo ator em nosso nível sempre que deixarmos o botão do mouse. E vamos definir a classe cubo porque queremos gerar nosso cubo. E vamos sair da transformação de spawn e procurar por make transform. Isso funciona de forma semelhante ao nó make vector. Isso apenas nos permite criar uma variável de transformação. Então você pode ver que temos nosso vetor para localização ou rotador para rotação e, em seguida, nosso segundo vetor para escala. E vamos usar o local para escolher onde queremos nosso spawn em cubos. Eu quero que meu cubo apareça logo acima da cabeça do meu personagem. Então, vou usar o get actor location load para criar isso. Você pode ver que a saída é um vetor e a entrada é um objeto ator. E atualmente só diz sul porque nada está conectado a ele. Então, vamos fazer com que nossos personagens de terceira pessoa atuem no local. Se nos arrastarmos e quisermos usar um add notes. Então, vou adicionar. Estamos apenas deletando nossa variável vetorial aqui por enquanto. Agora eu quero que ele apareça um pouco acima do meu personagem, porque se eu conectar isso diretamente no local, um cubo vai aparecer bem dentro do nosso personagem, que vai atrapalhar a colisão. Então, vamos pegar a saída, conectá-la ao local, e aumentaremos isso em, digamos, 150. Portanto, está bem acima do nosso caráter. Então, agora podemos compilar e clicar em play. Quando deixei o botão do mouse, você pode ver um cubo como spawn logo acima da minha cabeça. Se eu passar por cima de outro cubo ou spawn, eles continuarão fazendo isso enquanto eu me movo pelo nível. Agora, se eu quiser que o cubo me siga, podemos fazer isso também. Então, se eu sair e voltar para o nosso ThirdPersonCharacter Blueprint. Então, para que nosso cubo nos siga, precisamos fazer algumas alterações em nosso código para começar, vamos arrastar para fora do valor de retorno aqui e selecionar Promover para variável. O que isso fará é criar uma nova variável do mesmo tipo do nosso pino do qual estamos arrastando. Então, promoverá a variável. Isso criará um tipo de variável de cubo que chamaremos de cubo. E este é um ato de variável de referência que abordaremos em uma lição posterior. Mas, essencialmente, isso nos permite dizer ao nosso novo cubo o que queremos fazer com ele. Então vamos pegar nossa nova variável ao cubo. Vamos arrastar para fora e vamos fazer é válido e criar um nó é válido. O de baixo aqui, vamos criar um pouco mais de espaço e vamos conectar isso ao prensado. E então o não é válido até o nosso spawn out to cube. E o que isso faz é basicamente verificar, o r cube Admin criou antes. Se não tiver sido criado antes, então não é válido, será executado e isso nos permitirá criar um cubo. E se nosso cubo foi criado, então é válido, será executado, o que não fará nada. Isso nos impede de criar mais de um cubo. Em seguida, criaremos um nó de marcação. Então, faremos o evento tick. E, na verdade, copiaremos esses dois nós também. E conectaremos a execução ao autêntico. E então vamos nos arrastar para fora do nosso cubo e vamos usar o ator do set. Nó de localização. Isso nos permite alterar a localização de nossos cubos, dependendo de nossa nova entrada. Estamos usando. Isso é válido apenas para garantir que não recebamos nenhum erro. Porque se tentarmos definir a localização de nossos cubos sem que nosso cubo tenha sido gerado ainda, receberemos alguns erros. Portanto, usamos o is valid, interrompa esses erros. E vamos definir seu novo local para o mesmo que nossos locais de spawn. Então, vou apenas mover isso um pouco mais alto. E copiaremos e colaremos esses nós. E vamos conectar isso ao nosso novo local. Então, agora, apenas para executar esse código, cada cubo de quadro definirá sua localização para a localização atual dos caracteres mais 150 e altura. E podemos jogar isso agora. Se eu clicar em play e depois clicar com o botão esquerdo do mouse e ver que nosso cubo está me seguindo. Se eu enviar spam com o botão esquerdo do mouse, ele não está criando mais cubos também. Em seguida, vamos dar uma olhada na variável rotator. Então, vamos sair do jogo e voltar para o nosso ThirdPersonCharacter. Manteremos esse código aqui por enquanto, porque podemos usá-lo para fazer algumas coisas com o rotador. Depois de mostrar alguns dos nós comumente usados com a variável rotator. Então, criaremos uma variável rotator da mesma forma que fizemos antes. Crie uma nova variável. Chamaremos essa ferramenta Girar. E definiremos seu tipo para o tipo de rotador. Em seguida, compilaremos, reforçaremos nosso valor padrão. Você pode ver aqui que é muito semelhante ao nosso vetor. Temos um X, Y e Z, e esses são valores flutuantes. Podemos obter nosso rotador arrastando e selecionando get. E podemos semear rotator fazendo o mesmo com a opção set em C. Novamente, como nosso vetor, ele nos dá um x, y e z. Podemos arrastar e pesquisar, fazer rotator. E podemos selecionar a opção de rotação aqui. E isso nos dá as variáveis que podemos usar para definir nosso rotador. Ou, se quisermos, podemos clicar com o botão direito do mouse e selecionar Split Struct Pin para obter acesso a eles diretamente. Assim, podemos usar um flutuador para definir qualquer um deles individualmente. Como nosso vetor, também podemos arrastar para fora do nosso rotador, obter nó e procurar por break rotator. E isso nos dá nossos valores x, y e z como flutuadores se precisássemos acessar apenas um deles. Agora, ao contrário do vetor, não podemos usar mapas normais agora. Portanto, se nossa variável rotator, há nós personalizados que são usados apenas para isso. Então, se arrastarmos e procurarmos por combinado, você pode ver que temos um nó de rotadores combinado, e isso basicamente combina a com os valores B. Portanto, você pode usar isso para valores negativos ou positivos para o seu rotador e, em seguida, ele fornecerá uma saída. Também temos acesso ao laboratório para o nosso rotador. Então, se nos arrastarmos e procurarmos por LAP, veremos que temos um rotador labial e isso funciona da mesma forma que nosso amor por nosso vetor. Não podemos ter duas entradas para girar ou entradas. E podemos definir um alfa, e este é um valor entre 011 seria o valor de saída seria apenas o valor b e 0 seria o valor a, e então 0,5 seria o valor entre esses dois valores. Em seguida, temos a rotação da lacuna x nó vetorial. Então, excluiremos esse nó aqui e procuraremos por rotação x vetor. E isso é importante porque nos permite obter a direção para frente em uma variável vetorial de um ator. Portanto, x é o vetor avançado para a maioria dos atores. Então, se formos para o nosso nível aqui, eu apenas arrasto um modelo de terceira pessoa. Você pode ver que x, que é vermelho. Você pode ver que vermelho é x é nosso atacante. Então isso nos permite obter a direção para frente para o nosso personagem a qualquer momento, para que possamos girá-lo assim, eu vou para frente a direção agora estaria aqui. Mas você pode ver que a direção x do mundo ainda é assim. Podemos usar esse nó para obter a direção que algo está voltado, dependendo de sua rotação. Podemos mostrar isso em um exemplo. Se formos para o nosso modelo de terceira pessoa e vamos editar parte desse código para que nosso cubo realmente apareça na direção de nossos personagens voltados. Então, para fazer isso, vamos fazer a rotação de nossos personagens. Então, obteremos rotação, encontraremos a rotação. Lá vamos nós, obter rotação ativa. Isso nos dá a rotação atual do nosso personagem. Eu vou arrastar para fora e nós vamos conseguir rotação x vetor. E agora vamos multiplicar isso. Então, vamos arrastar para fora do vetor e vamos fazer o nó Multiply. E vamos mudar a entrada aqui para um float porque queremos multiplicá-la por um valor flutuante. E aqui vamos definir o quão à frente do nosso personagem queremos gerar em cubos, e isso está em centímetros. Então, se eu definir isso para 500, então vamos mais esses dois são a localização atual dos atores. Então, estamos basicamente dizendo 500 centímetros na frente da localização atual de nossos personagens. Queremos gerar esse cubo. Então, vamos sair da nossa nota de mais aqui e faremos outro nó positivo. E vamos adicionar o valor do nosso tempo aqui. Defina isso para o local. Vou apenas reutilizar isso e conectá-lo ao nosso novo local aqui em cima para que, quando gerarmos nossa fila, mas ela nos seguir, esse local, compile e salve isso. E isso vai jogar e jogar. Então, se eu apertar play, você pode ver que eu posso correr por aí e se eu clicar dentro do cubo é gerado ali. E se eu girar o personagem, você pode ver que o cubo está realmente atualizando sua localização à minha frente. Agora eu não o configurei para usar a rotação da câmera. É por isso que, quando olho em volta, isso não muda o cubo. Mas, em vez disso, quando eu giro o personagem, você pode ver que o cubo agora está atualizando, está cinco metros à nossa frente, mas ainda mantém a localização dos personagens, então ainda está nos acompanhando . Se eu fosse mudar esse valor 500 para dizer 200, então o cubo estaria mais perto de nós porque está apenas duzentos, duzentos centímetros à nossa frente. Agora você pode ver que está dois metros à nossa frente e ainda está atualizado na direção do nosso personagem. Então, agora, se voltarmos ao nosso ThirdPersonCharacter Blueprint, há algumas outras notas que podemos usar com nossa variável rotator. Assim como temos a nota de localização do ator definido, também temos a rotação do ator definido, rotação do nó, que faz a mesma coisa, mas, em vez disso, os conjuntos são rotação. E podemos realmente fazer algumas rotações, se quisermos, com nosso cubo. Então, se arrastarmos para fora do nosso cubo e definirmos rotação do fator nisso, e digamos cada quadro, cada quadro, queremos girar nosso cubo um pouco. Então, precisamos obter a rotação atual e depois adicionar a ela. Então, vamos nos arrastar e chegar à rotação. Vamos combinar rotadores. Basta ligar isso aqui e diremos, vamos aumentar isso um e ver como isso parece. Então, clique em Play. Se eu deixei o mouse, você verá que agora ele está girando nessa direção. Se alterássemos os valores em nosso nó rotador combinado, podemos adicionar um no y também, e veremos que ele faça uma rotação diferente. Em seguida, abordaremos o tipo de variável transform. Agora, já abordamos um pouco nesta lição, mas essencialmente uma transformação é apenas uma variável que é composta de um vetor para a localização, um rotador para rotação e, em seguida, outro vetor para nossa escala de atores. E podemos acessar essa variável da mesma forma que temos sido nossa localização e rotação. Então, se voltarmos para o ThirdPersonCharacter Blueprint agora, podemos criar uma nova variável. Chamaremos isso de forma trans. E definiremos seu tipo para transformar. Agora, da mesma forma que as outras variáveis, podemos obtê-lo e podemos centralizar. Agora você pode ver que ele não tem as opções xy porque há várias entradas que são necessidades de transformação do nosso nó definido. Se nos arrastarmos, podemos fazer a transformação. E isso nos dá acesso para definir sua localização, rotação e escala. E isso é um vetor, um vetor e nosso rotador aqui no meio. E podemos defini-las manualmente, se você quiser, neste nó. Ou podemos conectar vetores e rotadores como fizemos antes. Também podemos dividir esse nó, assim como fizemos com os outros. Então, se clicarmos com o botão direito do mouse no pino aqui, podemos fazer Split Struct Pin que nos dá acesso à localização, escala e rotação. E podemos dividir isso ainda mais se quisermos dizer que eu só queria definir essa transformação para X1 e eu tinha uma variável flutuante. Eu poderia dividir essa caneta de novo. E você pode ver que agora posso definir o valor de flutuação x para nossa localização neste único nó. E então, se eu quiser recombiná-lo, recombinar e depois recombinar novamente, e ele volta ao normal. Podemos fazer o oposto com nosso nó transform get, podemos arrastar, você pode procurar por uma transformação break break e podemos acessar nossa localização, rotação e escala. Também podemos dividir isso para que possamos clicar com o botão direito do mouse e fazer Split Struct Pin. E isso nos dá acesso a eles também. Agora podemos definir as transformações de um ator. Então, se voltarmos ao nosso código anterior, você pode ver que estamos dizendo a localização do ator e a rotação ativa separadamente, mas poderíamos realmente arrastar e usar o nó de transformação set actor. E isso nos daria acesso à sua transformação, que é claro que é composta por sua localização e rotação. Para que pudéssemos fazer uma nova transformação. Na verdade, podemos configurá-los sem esses dois nós. Então, se eu excluir esses dois, poderíamos realmente fazer isso com um nó. Então, vou conectar isso em nosso é válido. Usando um nó make, podemos simplesmente pegar nossa localização de onde estamos obtendo antes. Então, aqui embaixo. Então, nossa rotação, colocamos isso em rotação e deixaremos a escala como uma só. Mas se quiséssemos, poderíamos ajustar isso também. Agora, se apertarmos o play, podemos ver que ele ainda funciona exatamente da mesma forma que antes. Estamos usando apenas esse nó agora em vez dos dois separados. Agora, a última coisa que eu queria abordar nesta lição é que a diferença entre as transformações locais e mundiais exalará jogo por enquanto e iremos para o Projeto de Personagem de Terceira Pessoa e inerente. Vamos para a janela de exibição. Agora, na janela de exibição, podemos adicionar um componente, então vou adicionar um cubo. Então, esse é o cubo de sábado agora em nossa janela de visualização do projeto. E podemos ver que temos um local aqui e atualmente isso está lendo zeros são 0. Isso ocorre porque nossos cubos são a localização local atual. É 0, o centro do nosso personagem. Se eu fosse avançar, você pode ver que está aumentando no x. E agora, se eu puder puxar isso e colocar isso, colocar nosso personagem no nível, você pode ver nossos personagens agora neste localização. Mas se eu selecionar meu componente de cubo, você pode ver que ele está nos dando um valor diferente do nosso ator. Agora, isso ocorre porque esse valor é um local. Atualmente, está a 170 centímetros do centro do nosso personagem. Mas quando selecionamos nosso personagem, quando selecionamos o ator completo, isso nos dá a localização do nosso mundo, e essa é a localização de nossos atores no mundo inteiro. Agora podemos alterar os componentes j, localização mundial e a localização local nas plantas. Então, para fazer isso, vou abrir o personagem de terceira pessoa aqui, que pode excluir muito desse código. Portanto, excluiremos todos os códigos conectados à tecnologia e também excluiremos todo esse código. Então, ficamos com o botão esquerdo do mouse deles. Então, agora vamos para nossa janela de visualização e vamos selecionar nosso cubo que criamos. Vou redefini-lo para 0, então está bem no centro do nosso personagem aqui. E, em seguida, o gráfico de eventos, vamos arrastá-lo para fora dos componentes. E vamos dizer a ele para definir sua localização relativa. E vamos definir isso para 0 no x 0 e no y, e depois 150 no z. Agora, quando pressionarmos o botão esquerdo do mouse, ele o moverá para esse novo local. Então, se clicarmos em Play e vermos que está no centro do meu personagem. Mas se eu clicar com o botão esquerdo, ele vai acima da cabeça do meu personagem. A razão pela qual isso é feito é porque esses zeros, zeros 0 locais para meu cubo estão bem no centro do meu personagem. Então, tudo o que fiz foi dizer para aumentar isso em 150 no z. E agora está acima da cabeça do meu personagem. Agora, se alterarmos esse código para em vez de localização relativa ou definirmos a localização mundial, usaremos os mesmos valores. Então x é 0, y é 0, e então z é 150. E se apertarmos Play, eu não vou me mexer. Acabei de clicar e ver meu cubo. Se eu pressionar F1 está ali atrás da parede. Agora, a razão pela qual está fazendo isso é porque isso é 0 no mundo, mas mais 150 centímetros acima. Agora, se eu me mover, você pode realmente ver o cubo se movendo com o estilo do meu personagem. E isso porque o cubo está ligado ao meu personagem. Mas dissemos a ele para mudar para 00150 no mundo. Então, essa é a diferença entre definir uma localização local e uma localização mundial. Agora, se eu pressionar F livre para voltar ao nosso modo de iluminação normal e acessar o wireframe. Você pode pressionar F1. Se você não soubesse disso. Butt pressione F3 e saia. Podemos obter o mesmo resultado com nossa localização mundial definida como obtivemos com nossa localização relativa definida, só precisamos obter a localização do ator. Então, obtemos a localização mundial do nosso personagem atual. Nós nos arrastamos e faremos mais 1 quinto para sua localização mundial atual. E vamos definir nosso cubo para isso. Em vez disso, estamos pegando a localização atual de nossos atores no mundo, colocando 150 e, em seguida, definindo R ao cubo para isso. Para que possamos testar isso. Agora, se eu clicar em Play, se eu clicar com o botão esquerdo, você pode ver que agora temos o mesmo resultado que obtivemos quando usamos a localização relativa, porque agora estamos adicionando a localização selvagem de nossos personagens. Então nosso cubo agora fica acima da cabeça do nosso personagem. Então é isso para esta lição. Em nossa próxima lição, vamos dar uma olhada no ACTA, um tipo de variável de objeto. Nós os usamos um pouco nesta lição, mas aprenderemos muito mais sobre eles em nossa próxima lição. 10. Variáveis (atores e objetos): Olá pessoal. Nesta lição, vamos dar uma olhada nas variáveis de referência do objeto e como elas são usadas no mecanismo. Então, eu criei um exemplo muito básico aqui. Temos um gatilho e alguns cubos. E quando nosso jogador entra no gatilho, um de nossos cubos se move para cima. E então, quando o jogador deixar o gatilho, um deles desce. Se eu apertar Play e me deparar com um gatilho, você pode ver o cubo certo se mover para cima e se eu deixar o gatilho, ele se move de volta para baixo. Agora, isso está acontecendo porque nosso cabelo de gatilho tem uma referência a esse cubo que você pode ver aqui embaixo. Este é um objeto ou uma variável ativa definida como nosso cubo. E eu posso realmente mudar isso escolhendo o ator do botão Scene. Posso clicar em um dos nossos cubos para escolher o cubo à esquerda aqui. E agora quando apertamos play e eu corro sobre o gatilho agora está mudando nosso cubo esquerdo. E, essencialmente, o que as referências de objetos nos permitem fazer é dizer mecanismo quais objetos específicos queremos efetuar. Porque todos esses cubos são exatamente iguais. Eles usam nossa classe de cubo do nosso navegador de conteúdo, mas cada um é um objeto individual. Talvez queiramos afetar um deles sem afetar os outros. E as referências a objetos nos permitem fazer isso. Ele examinará nosso projeto de gatilho e verá como isso está funcionando. Então, vou abrir isso. Você pode ver que temos nossa variável de objeto selecionada, que é o que estamos usando para controlar qual cubo queremos efetuar. Então você pode ver que isso é chamado objeto selecionado e está definido como nosso cubo. E nós temos essa variável up aqui. Está definido para digitar Actor. Também temos um código aqui que controla o que fazemos com nosso objeto selecionado. Então, temos sobreposição de início ativo, um ator de evento e sobreposição. Estes são alguns desses eventos incorporados ao motor. Então, eles serão executados sempre que algo se sobrepor, disparar ou parar de sobrepor nosso gatilho. Agora, você pode ver que esses dois nós têm esses pinos hiperativos e essas são referências de objeto. Eles estão nos dizendo exatamente qual objeto se sobrepôs ou disparou. Agora, esse é um nó de custo. Teremos uma aula separada sobre custos porque eles são muito importantes e há muito para eles. Mas, essencialmente, o que isso está fazendo é tomar um ato de referência e verificar, esse ator é um ThirdPersonCharacter? E se for, então permitirá que nosso código execute um F zero. Ele retornará o custo sentido. Então, estamos essencialmente usando esse nó de custo como uma verificação. Estamos basicamente dizendo, se um ato para parar começa a nos abrir, é um personagem de terceira pessoa? Se for, então podemos executar o resto do nosso código. Se não for, então não executamos nosso código. E então o resto do nosso código está basicamente pegando nosso objeto selecionado que estamos definindo nas opções aqui. E estamos dizendo a ele para definir um novo local. Então, estamos apenas pegando sua localização atual e estamos plotando 150 e configurando para esse local. Novamente, estamos fazendo exatamente a mesma coisa na sobreposição final, mas, em vez disso, estamos reduzindo 150 de sua localização atual e, em seguida, definindo-o mas, em vez disso, estamos reduzindo 150 de sua localização atual e, em seguida, para esse novo local. Em seguida, quero explicar o que é um ator? Um ator é qualquer tipo de objeto que existe em um nível. Então, tudo o que você pode ver aqui é um tipo de ator. Existem muitos tipos diferentes de atores, como, por exemplo, o modelo do personagem aqui. Se eu arrastar isso, isso é um ator, mas é um tipo diferente de ator, digamos, tipo de personagem. Ele pode fazer tudo o que um ator pode fazer, mas também tem funcionalidade adicional porque deve ser usado como personagem. Como por exemplo, ele pode ser controlado por um jogador. Ele tem uma cápsula e um modelo de personagem como uma câmera. Essas são todas as coisas que estão incorporadas ao nosso projeto de personagem. Essas são todas as coisas que os atores por si só não têm, mas nosso personagem tem porque nosso personagem é um tipo especializado de ator. Agora, isso é feito por meio de um processo chamado herança, que pode ser um pouco complicado de entender. Então eu criei uma imagem aqui para tentar mostrar a vocês o que quero dizer. Se eu trouxer isso , você pode ver que temos um novo objeto no topo. Agora, essencialmente, cada objeto no Unreal é um objeto U. Há um tipo muito básico de objeto e tudo herda deles. Descendo a cadeia, temos atores. Agora, atores são o que estamos falando. Eles herdam de seus objetos, o que significa que eles têm tudo o que você pode fazer. Mas eles também têm sua própria funcionalidade adicional que permite que eles existam em um nível, tenham componentes e sejam visíveis. E você pode ver que eu adicionei o cubo e nossos projetos de gatilho que estamos usando para o exemplo. Você pode ver que esses herdam então do nosso ator. Então, esses são atores que podem fazer tudo o que um ator normal pode fazer. Mas porque adicionamos um código ao nosso gatilho e uma caixa de colisão agora é seu próprio tipo com sua própria funcionalidade especial. E o mesmo para o nosso cubo. Adicionamos um componente de cubo a ele. Então, agora é seu próprio tipo com seus próprios componentes. Os personagens são iguais? Ele só tem algumas etapas adicionais. Então você pode ver que a partir do ator um **** é criado. Agora, um **** é uma versão mais básica do nosso projeto de personagem. Pode ser controlado pelo jogador, mas realmente não tem nenhum movimento ou. Para que nosso modelo de personagens seja visível, temos um modelo de personagem que herda do****. Assim, ele faz com que algumas de suas habilidades sejam controladas pelo jogador e algumas de suas habilidades de movimento. E então se estende a isso e nos permite ter um componente cápsula e um modelo de personagem. Agora nosso personagem ainda é ator. Ele ainda pode fazer tudo o que um ator pode fazer da mesma maneira. Um **** ainda é um ator e pode fazer tudo o que os conectados podem fazer. Mas cada uma dessas etapas apenas adiciona algumas funcionalidades adicionais aos seus projetos. Agora, todo o ThirdPersonCharacter Blueprint seria na verdade o próximo passo abaixo do nosso personagem, porque nosso ThirdPersonCharacter herda do blueprint do personagem, acabamos de adicionar mais alguns funcionalidade para isso. Definimos um modelo e alteramos algumas de suas configurações. Então, agora é seu próprio projeto. Esse é um filho da planta do personagem. Agora, voltando ao nosso exemplo, se selecionarmos nosso gatilho, você pode ver que quando eu seleciono o menu suspenso para nosso objeto selecionado, você pode ver que posso selecionar qualquer objeto no nível. Agora, a razão disso é porque esse é um tipo de ato ou variável. E isso porque tudo em nosso nível é ator. Se quiséssemos, poderíamos mudar isso de cúbico para nosso céu. E se selecionarmos a esfera do céu, você pode ver que eu posso definir isso para um céu porque nosso céu é um ator é apenas um tipo especial de vetor com suas próprias configurações e componentes. Agora, se eu quisesse que isso fosse mais especializado e apenas me desse cubos, por exemplo, teríamos que mudar o tipo de variável de um ator para o nosso tipo de cubo. O que vamos fazer é colocar isso de volta em um cubo, então eu vou mudar para o cubo. E selecionaremos nosso modelo de cubo aqui. E então abriremos nosso projeto de gatilho. E aqui, podemos selecionar nosso objeto selecionado. Você pode ver que ele está atualmente definido como um tipo de objeto ator. Mas se mudarmos isso, podemos procurar por cubo. Por exemplo, temos nosso modelo de cubo. Podemos selecionar a referência do objeto. E quando mudamos um tipo de variável, isso nos dará esse aviso apenas nos dizendo que estamos alterando um tipo. Isso pode causar alguns problemas. Vamos selecionar Alterar tipo de variável de qualquer maneira. Fecharemos essa janela de pesquisa e compilaremos. Então, agora, quando selecionamos nosso gatilho no nível e clicamos no menu suspenso, você pode ver que ele está apenas me mostrando cubos agora, isso porque definimos nosso tipo de variável de objeto selecionado para o tipo de cubo. Você pode estar se perguntando, por que usaríamos o tipo de cubo quando podemos apenas usar o tipo de ator e selecionar qualquer ator que quisermos. Bem, você pode ter código ou variáveis especiais em nosso cubo aos quais queremos ter acesso em outros projetos. Então, vamos abrir o cubo e eu vou criar uma nova variável. E vai ser um booleano. E eu vou chamá-lo de exemplo. Agora criamos essa variável em nosso cubo. É uma variável exclusiva nosso blueprint de fila e somente os blueprints de cubo têm essa variável. Então, voltaremos ao nosso projeto de gatilho. Agora, como nossa variável de objeto selecionada é um cubo, se eu arrastá-la para fora e pesquisar, por exemplo, você pode ver que agora posso acessar essa variável usando nosso objeto selecionado. E isso nos daria se nossa variável de exemplo é verdadeira ou falsa no cubo que selecionamos no nível. Agora, se voltarmos ao nosso gatilho e alterarmos o tipo de variável para um objeto selecionado de cubo para ator. Agora, se compilarmos, você pode ver as conexões ficando vermelhas. Agora, isso é porque se arrastarmos para fora de nosso objeto selecionado e pesquisarmos, por exemplo, novamente, não poderemos mais encontrar essa variável porque essa variável só existe em nosso blueprint Coupa, não no ator. E como esse é um ato de referência, ele não encontrará variáveis que existem apenas em nosso cubo. Ele só encontrará código e variáveis que existem no ator. Agora, existem maneiras de acessar nossos cubos, variáveis e funções a partir de um ato do tipo variável. Mas isso exigiria o elenco, que abordaremos em uma lição futura. Por enquanto, eu só quero cobrir alguns nós mais comumente usados com tipos de variáveis de objeto. Já usamos alguns desses nós em lições anteriores, nesta lição. Então, temos coisas como o SAT ACT ou localização, SAT ACT ou rotação que e definir nós de transformação de ator. Estamos conseguindo nossa localização de ator com o grande nó de localização de ator. Há também a rotação do ator get, que faz a mesma coisa, mas faz a rotação de nossos atores no mundo e retorna um tipo de variável rotator. Em seguida, temos o nó Destroy Actor. Então, se excluirmos nossa rotação aqui e arrastarmos e procurarmos por Destroy Actor. Agora, quando esse nó for executado, nosso ator será destruído. E podemos usar isso com qualquer aplicativo ou tipo em nosso nível, e isso removerá esse ator do nível. Agora, outro nó comumente usado é o nó é válido. Então, se pegarmos nosso, se excluirmos nosso ator get, note-o. E eu vou arrastar para fora e pesquisar é válido. Em C, temos duas opções. Vamos usar o de baixo por enquanto. Isso nos dá uma nota de que cheques é nosso objeto selecionado para realmente definir como qualquer coisa. Então, se formos para o nível de vitrine aqui atualmente são selecionados objetos, setor ou cubo. Mas se eu esclarecer, isso agora está definido como nenhum. Nenhum dos cubos será afetado quando nosso personagem acabar. E se apertarmos Play e eu correr para o cubo e depois sair correndo e sair do Play. Você pode ver que eu tenho alguns erros agora. Isso ocorre porque nosso código acionador está basicamente dizendo ao objeto selecionado que não está definido para nada para alterar sua localização. E é isso que está nos dando essas flechas. Então, o que o nó é válido nos permite fazer é verificar se o objeto selecionado realmente está definido como algo? Se for, então vamos executar é válido. E se não, vamos correr não é válido. Então, se pegarmos esses nós agora, vou apenas copiá-los e colá-los. Conecte-os até a parte inferior aqui. E vamos apertar play. Agora, quando nos deparamos com a caixa, mesmo que não tenhamos nada selecionado, não receberemos nenhum erro. Agora, como você pode ver, porque isso é válido, node agora está impedindo a execução do código e nos dando setas. O outro nó é válido funciona da mesma maneira. Então, se procurarmos por isso, é válido. Você pode ver que isso é uma função e basicamente faz exatamente a mesma coisa. Ele apenas nos dá um valor booleano , verdadeiro ou falso em vez desse nó com as saídas. Então, podemos usar isso com um nó de ramificação, por exemplo. Por fim, eu só quero abordar como podemos definir variáveis de objeto. Então, podemos simplesmente arrastá-los para o nosso gráfico de eventos, selecionar a opção aqui. E usando o nó set, podemos arrastar para fora de nossa entrada de objeto. E como estamos usando um nó de ator, podemos conectar isso a qualquer outra caneta variável de ator. Então você pode ver que podemos conectá-lo ao outro pino do ator aqui ou ao pino de saída na neve do nosso carro muito bem. Mas se criarmos outro tipo de objeto, digamos, um personagem. Então, vou chamar esse personagem e definirei seu tipo para personagem também. Então, referência de personagem e objeto. E então vamos compilar. Se arrastarmos nosso personagem e criarmos um nó definido. Você pode ver se eu arrasto para fora da entrada, não consigo conectá-lo à saída do nosso ator começar a sobreposição. E isso é porque isso é uma saída de ator. Agora, todos os atores não são personagens. Portanto, nosso ator não consegue se conectar à entrada de um nó de conjunto de caracteres. Mas se nos arrastarmos de nossa opinião, você pode ver que posso conectar isso ao nosso nó de custo de terceira pessoa. Novamente, faremos uma aula separada sobre custos. Mas, essencialmente, esse nó está recebendo uma entrada de ator e está verificando, isso é um personagem? Se for, então podemos gerar um tipo de variável de caractere. E podemos usar isso para definir nossa variável de caractere porque esses dois pinos agora são um tipo de caractere. Agora é isso para esta lição. Espero que agora você tenha uma compreensão um pouco melhor de como as variáveis de objeto funcionam no mecanismo. 11. Variáveis (matrizes e loops): Olá pessoal. Nesta lição, vamos dar uma olhada nas variáveis e loops da matriz. Então, para começar, vamos criar uma nova variável. Então, vamos fazer isso clicando no botão de nova variável. E vou chamar esse exemplo de matriz de nomes. Definiremos o tipo para nomear no painel Detalhes, no tipo de variável, você pode ver que temos esse pequeno botão aqui. E aqui é onde podemos definir que tipo de variável é. Então, atualmente, é uma única variável. É com isso que temos trabalhado até agora. Mas, em seguida, vamos selecionar a opção de matriz. Então faça isso e clicaremos em Compilar. E você pode ver que ele tem um ícone diferente agora no tipo que indica que é uma matriz, você pode ver que meu valor padrão agora é essa opção de aparência diferente aqui. Agora, um array é basicamente uma maneira de ter uma variável que pode armazenar vários valores desse mesmo tipo de variável. Nosso array de variáveis de nome aqui pode armazenar vários valores nomeados apenas em uma variável em nossos valores padrão. Se eu clicar neste pouco mais algumas vezes em C, isso me deu entradas gratuitas aqui. Agora, no lado direito, temos nossa variável. Então, como isso tem uma variável de nome, esse é um valor de nome. Então eu posso inserir nomes aqui para que eu possa colocar como James, Bill. E bem, por exemplo, agora esses atores nomearam variáveis normais. Se eu fosse criar rapidamente outra variável, o que farei agora, chamarei esse exemplo de matriz flutuante. Vou mudar o tipo aqui para flutuar. E já está configurado como uma matriz. Mas se o seu não for, você pode simplesmente clicar na opção de matriz aqui. Você vê agora que eu tenho um flutuador e ele tem o mesmo ícone para indicar que é uma matriz. E quando eu compilo em C, isso parece o mesmo aqui e meu valor padrão, mas se eu clicar no sinal de adição, você pode ver que agora no lado direito, em vez dos nomes, temos valores flutuantes em vez disso. Porque esta é uma matriz de flutuadores em vez de uma matriz de nomes. E no lado esquerdo, você pode ver que temos esses valores de índice. Agora, é essencialmente assim que podemos acessar essas variáveis, que usaremos mais tarde. Mas, basicamente, essas são as linhas em que essa variável está armazenada. Assim, por exemplo, ou James, valor do nome é armazenado no índice 0 ou o valor de Bill é armazenado no índice um, e o valor I será armazenado no índice dois. Agora podemos mover esses valores usando esse pequeno indicador ao lado que nos permite reorganizá-los. Para que eu possa me mover, dizer bem para o número dois. Número um, você também pode fazer isso com outros tipos de variáveis. Então, se eu apenas definir isso para 12 e ver se eu arrasto esses, eu posso reordená-los. Eu quero remover qualquer um desses. Posso clicar na pequena seta para baixo e selecionar Excluir. Eu também posso duplicá-los. Ou se eu clicar na pequena lixeira aqui, você pode ver que ela exclui todas as suas entradas. E esses são apenas os controles básicos para definir seus valores padrão para uma matriz. seguir, quero mostrar como podemos realmente acessar essas variáveis em nosso código. Então, se eu arrastar minha matriz de nome de exemplo e eu puder apenas selecionar o nó como costumamos fazer com nossas variáveis. Você pode ver que eu tenho uma variável de aparência diferente. Agora, não posso arrastar e usar isso como uma variável de nome normal porque agora essa saída, qualquer um dos nossos valores. Para obter um desses valores que vamos arrastar, vou pesquisar por GET. Vamos usar para obter uma cópia. E isso nos dá esse nó aqui. Agora, como você pode ver, temos uma entrada para um número inteiro e uma saída para uma variável de nome normal. E se eu me arrastar para fora disso, eu poderia usar qualquer um dos meus nós de variável de nome normal. Então eu poderia fazer, por exemplo, o nó equals. Você pode ver que isso me dá a nota de igual que já vimos antes. Assim como uma variável de nome normal. A razão disso é porque isso basicamente faz. Ele pega nosso array, obtém o índice 0 e, em seguida, gera seu valor. Então, por exemplo, se eu fosse executar esses nós, a saída do nosso nó get seria, bem, porque esse é o nosso índice 0. Se eu fosse mudar isso para dizer também, a saída desse nó agora seria bell. A mesma coisa funciona com nossa matriz flutuante. Então, se eu pegar meu exemplo de matriz flutuante, e eu arrastar para fora dele e eu procurar ou entrar em C, obtenho uma cópia. E você pode ver que temos essa versão verde agora. Temos uma entrada para o nosso índice e temos uma saída que é apenas um valor flutuante normal que podemos usar um valor flutuante normal. Então, se eu disser Add Node, você vê que posso usar um add know muito bem com isso, porque agora é uma única variável em vez de uma matriz. E isso é o mesmo para todos os tipos de matrizes. Assim, poderíamos criar uma matriz de transformações, rotadores, vetores, inteiros, e o processo seria exatamente o mesmo. Poderíamos definir nossos valores padrão. Poderíamos usar o nó get e, em seguida, apenas adicionar um índice que queremos acessar, e ele produzirá uma versão única normal do tipo arrays. É. Agora, vou passar por alguns dos nós mais usados do nosso array. Então, usamos a nota de lacuna aqui, mas também há nós de remoção. Então, se eu arrastar para fora do meu exemplo de nome onde e eu pesquisar por remove, podemos usar remove index. E, essencialmente, quando isso for executado, ele removerá qualquer índice que inserirmos aqui. Então, atualmente, isso é 0. Portanto, se executássemos esse nó, nosso índice em 0, que está bem no momento, seria removido. Agora, algo a ter em mente com borrachas ao remover um índice. Então, se removermos o índice 0, eu posso fazer isso. Agora. Você pode ver que todos os outros índices sobem um. Então, agora James está em 0 e Bill está em um, enquanto anteriormente eles estavam. James tinha um e Bill dois. Portanto, esse nó é útil quando sabemos qual índice queremos remover, mas também é outra nota de remoção que podemos usar se arrastarmos e procurarmos remover, podemos remover item. Agora, isso nos permite dizer, nos dar um valor de nome e removê-lo se ele existir em nosso array. Então, por exemplo, se eu quisesse remover a fatura de nossa matriz, mas talvez eu não soubesse qual fatura de índice era app. Eu poderia apenas ter Bill como a entrada. Em seguida, esse nó verificaria nossa matriz, verificaria o valor da fatura. E se esse valor de fatura estiver na matriz, ele removerá esse valor. E a saída seria basicamente verdadeira se o valor fosse removido e falsa se não conseguisse encontrar esse valor na matriz. E essas são exatamente as mesmas para nossas notas flutuantes. Se eu mostrar rapidamente, podemos remover o índice e você pode ver que funciona exatamente da mesma forma, nos permite remover uma entrada do índice de saída do nosso array. Ou podemos remover o item. E isso nos dá uma entrada flutuante para pesquisar nosso array e depois remover. Agora vamos ver como podemos adicionar valores aos nossos arrays usando nosso código. Então, vamos remover esse nó por enquanto. Vamos arrastar para fora do nosso nome de exemplo, array procurará por Add. Agora, há algumas opções aqui. Escolheremos primeiro o top 1. Agora, o Add Node essencialmente apenas adiciona o valor que definimos aqui ao nosso array. Agora, como essa é uma matriz de nomes, esse valor como um nome. Mas se eu fosse arrastar para fora da minha matriz flutuante aqui e pesquisar por anúncio, você pode ver que esse valor agora é um float porque estamos adicionando um valor flutuante a uma matriz flutuante. Essa nota de anúncio basicamente adicionará nosso valor no primeiro índice disponível. Então, em nossa matriz de nomes, isso seria o índice dois porque 01 é usado. Então, se disséssemos para colocar isso em Bob, isso adicionaria um valor de pântano ao índice dois. E ele produziria esse índice usando essa caneta inteira na saída. Agora temos a outra nota de anúncio, o ADD exclusivo. E isso funciona de forma semelhante, mas o que isso fará é primeiro verificar nosso array para ver se ele tem ou se já tem uma entrada para o valor que definimos. Então, se adicionarmos Bob novamente, quando esse nó for executado, ele primeiro verificará nosso array. Ele veria que a lâmpada não é um valor que ela tem atualmente. Ele o adicionaria no primeiro Windex disponível, assim como nosso nó add normal, e então produziria esse índice usando o hit de caneta inteiro. Se Bob já estivesse em nosso array, ele não adicionaria um novo valor de bulbo, enquanto o Add Node apenas adicionaria um segundo valor de bulbo. Agora, a seguir, podemos querer alterar um valor em vez de adicionar ou remover um. Digamos que quiséssemos mudar o índice um de Bill para Bob, por exemplo. Bem, para fazer isso, usaríamos um nó M definido. Então, se arrastarmos para fora e definirmos L, Você pode ver set array. E isso nos permite especificar um índice que queremos alterar e o valor para o qual queremos alterá-lo. Então, se eu quisesse mudar, digamos Bill, eu poderia definir esse índice como um porque as contas no índice um. E eu posso definir o novo valor. Então, Bob, por exemplo. Então, agora, quando esse nó é executado, ele mudaria o valor do índice um. Então, o indexador de contas para Bob. E você pode ver que temos uma opção de tamanho adequado aqui. Agora, isso basicamente cria novas entradas se estivermos tentando definir um índice que ainda não existe. Então, por exemplo, se eu fosse definir isso para dizer quatro, nós só temos 01, então só temos duas entradas. O que isso faria se fosse executado criaria um índice 23 e depois um quatro. E isso definiria o índice quatro para Bob. Mas os dois índices que ele criou para chegar ao número quatro seriam apenas valores vazios. Agora, há algumas outras notas importantes que podemos usar com matrizes. Assim, podemos arrastar para fora de nossa matriz e pesquisar por contém e usar o item contém. E isso nos permite apenas verificar se nosso array contém um valor específico se ele retornar true e se não retornar false. Então, se tivéssemos que definir isso para dizer Bob, isso verificaria nossa matriz. Atualmente, ele contém o valor Bob? Isso não acontece. Portanto, R contém nó retornaria falso. Mas se ele contivesse esse valor, se o adicionássemos, quando esse nó fosse executado, ele retornaria true. Podemos usar o nó find. Então, se arrastarmos e procurarmos por find, find item Node, você pode ver aqui que podemos inserir um valor e, em seguida, ele pesquisará nosso array para nós. E se existir, se esse valor existir em nossa matriz, ele nos dará o índice que esse valor está atualmente acima. Por exemplo, se eu definisse isso como bill, ele procuraria nossa matriz para nós quando esse nó fosse executado, e retornaria que a conta está no índice um e esse valor aqui, o valor inteiro seria um. Outro nó útil que pode ser usado com matrizes é o nó claro. Então, se nos arrastarmos e procurarmos por claro. Isso, quando for executado, o matará completamente ou o array. Então, ele estará essencialmente esvaziando nossa matriz de todas as suas entradas. Portanto, esses são alguns dos nós mais comumente usados com matrizes. Mas se você quiser encontrar qualquer um dos outros nós, você pode arrastar e pesquisar por array. Você pode encontrar muitos nós diferentes aqui que permitirão que você altere e obtenha valores de suas variáveis de matriz. Outra observação que você pode achar útil como o comprimento do nó. Então, se arrastarmos e procurarmos por comprimento, você pode ver que temos um nó chamado length, e isso contará quantas entradas temos em nossa matriz e produzirá quantas temos. Então, se eu fosse adicionar, digamos, nó de três comprimentos estaria livre porque temos três entradas em nossa matriz. Agora vamos passar para os loops. Então, vou excluir esses nós por enquanto, e vamos começar com nossa matriz de nomes. Então, se eu arrastar e procurar por loop em C que temos para cada loop que, é isso que vamos dar uma olhada no momento. Então, vamos criar isso. Agora, essencialmente, como esse nó funciona é que ele recebe e executa. E executaremos o corpo do loop , quantas entradas tivermos em nosso array. Então, atualmente, temos grátis. Então, nosso corpo de loop funcionaria três vezes. E a maneira como posso mostrar isso como se nos arrastássemos e procurássemos uma string impressa. E vou adicionar um grande jogo aqui. Agora temos três entradas em nossa matriz de nomes no momento. Então, quando clicarmos em play, veremos Hello imprimir três vezes. Então, clique em Play, você pode ver uma execução mais baixa três vezes. Se voltarmos ao nosso código e você perceber que também temos uma caneta completa. Assim que esse corpo de loop terminar de executar o número de vezes que temos valores em nossa matriz. Em seguida, ele executará a caneta completa para que eu possa adicionar outra string de impressão aqui. Deixe-me definir isso para dizer Concluído. E agora o que veríamos Hello imprimir três vezes e depois despejado funcionaria assim. Agora, se ficarmos fora de jogo e voltarmos ao nosso projeto de personagem, também teremos um elemento de matriz e um índice de matriz. Agora, esses serão os valores de nossa matriz para os quais nosso corpo de loop será executado. Então, por exemplo, a primeira vez que isso é executado, a primeira vez que eu faço um loop no corpo, desculpe, o índice será 0 e o elemento da matriz será qualquer que seja o nosso valor. Então, atualmente, tudo isso está definido como nenhum. Mas se eu fosse substituí-los rapidamente, eu diria que este é Bill Bob James. Agora, a primeira vez que eu fizer um loop body executaria o valor, o valor do elemento da matriz seria bill e o índice da matriz seria 0. E então, na segunda vez, esse elemento raro seria Bob e o índice da matriz seria um, e assim por diante. Agora, o que basicamente decide quando o corpo do loop é executado é quando ele atinge um nó que não tem uma saída. Então, para nós, isso só vai imprimir string, seja qual for o valor que colocarmos aqui. E então esse corpo de loop está pronto e ele passará para o próximo. Agora, se estiver no último corpo do loop, então se estivesse em loop, digamos que o índice para o elemento da matriz fosse James, ele chegaria ao final deste C. Não há mais nós para executar. E porque estamos no último índice, ele será executado concluído, o que agora é feito na tela de impressão. Então, se eu conectar o elemento array aqui em nossa string de impressão, eu moverei esses nós. Se compilarmos e clicarmos em play, devemos ver nossos nomes que temos impressos no ecrã. Então, se fizermos isso em C eles serão impressos e, em seguida, teremos o valor W1 sendo impresso assim que as matrizes forem concluídas. Esse é o básico de como um nó de loop funciona, mas temos alguns outros tipos. Então, se voltarmos ao nosso personagem agora e excluiremos isso para cada loop. Vamos nos arrastar para fora e procuraremos por loop novamente. Agora vamos tentar o loop for-each com break. Agora, isso funciona de forma muito semelhante ao último nó, mas nos dá uma entrada extra que podemos ver aqui chamada break. E isso nos permite parar nosso corpo de loop funcionando em um ponto específico. Então, por exemplo, se quiséssemos executar nosso corpo de loop até chegarmos ao bob Name e então quiséssemos cancelar nosso corpo de loop. Nós poderíamos fazer isso. Então, se criarmos um pouco mais de espaço aqui, podemos arrastar para fora do nosso elemento de matriz para um igual nevado. Poderíamos dizer que se nosso elemento de matriz é igual a, acho que foi Bob. Bob dirá Bob. Queremos verificar um nó de ramificação. E queremos cancelar o loop while se o valor for Bob. Então, podemos fazer isso. Podemos arrastar de True e conectar isso até a entrada break aqui. E se clicarmos duas vezes na linha branca, podemos criar esses pequenos nós que nos ajudam a organizar nosso código um pouco melhor. Então eu vou fazer isso assim. Então, agora o que acontecerá é que quando nosso loop for executado, verificaremos se o elemento da matriz Bob. Se for, então queremos parar nosso loop em execução. Então, o que isso nos fará fazer é executar Bill e Bob imprimirá em uma string. Mas James não vai, porque paramos nosso ciclo e concluímos que teremos executado em vez disso. Nós podemos experimentar isso. Eu posso apertar Play. Você pode ver que Bill e Bob estão correndo e depois é executado porque nosso valor James não está mais sendo executado. Se mudássemos esse nome para dizer Bill, agora, esperaríamos que ele executasse apenas o nome da conta, porque uma vez que chegasse a faturar, cancelaria nosso ciclo. Então, podemos tentar isso agora. E você vê Bill, e então está apenas cancelando nosso loop e pronto está sendo executado em vez do resto do nosso loop ser concluído. Também poderíamos fazer isso com nosso índice se nos arrastarmos para fora do nosso índice e fizermos iguais, em vez de usar os valores, podemos simplesmente usar o índice. Então, digamos que eu queira parar nosso índice de loop um, eu posso fazer isso. Eu poderia simplesmente definir isso para um, conectar isso ao nosso brunch e compilar e clicar em Play. Você pode ver que obtemos o mesmo resultado que Bill e Bob estão imprimindo. E então os loops terminam porque cancelamos o loop e depois o completamos como errado. Agora, há um outro tipo de loop que podemos dar uma olhada. Então, eu só vou deletar esses textos. Não precisamos mais deles. Mas se nos arrastarmos, podemos procurar por loop novamente. E há o inverso de cada loop. E isso funciona da mesma forma que o primeiro nó de loop que elaboramos. Mas em vez de fazer um loop do começo ao fim, ele faria um loop do final ao começo e todo o resto é o mesmo com esse nó. Também existem nós de loop que não usam uma matriz. Então, se excluirmos isso por enquanto e eu apenas pesquisei por loop, vou rolar para baixo e você verá que temos quatro loops. Agora, se eu clicar nisso, você verá que, em vez de uma entrada de matriz, temos um primeiro índice e o último índice. Isso basicamente diz a um loop quantas vezes ele vai rodar? Então, se eu deixasse nosso primeiro índice em 0, mas definisse o último índice para dizer que esse loop seria executado cinco vezes porque ele seria executado uma vez para 0 e depois novamente até chegar a quatro. E à medida que percorria cada corpo de loop, o índice aumentaria em um. Também temos o mesmo nó , mas com uma pausa, se quiséssemos, poderíamos fazer um loop for com break. E isso novamente funciona de forma semelhante ao nosso nó de interrupção. É que, em vez de uma entrada de matriz, podemos definir novamente um índice e o último índice até o ponto de definir isso como 04, ele seria executado cinco vezes. Mas durante nosso corpo de loop, poderíamos cancelar esse loop executando a entrada break como acabamos de fazer com o loop com nosso array. Por fim, eu só queria mostrar como podemos definir uma corrida para que possamos defini-los como valores normais. Então, se arrastarmos, podemos escolher a matriz de nome de exemplo de conjunto. Você pode ver que isso apenas nos dá um nó de conjunto normal e podemos definir isso para ser um número de valores de matrizes, a fim de criar rapidamente outro array de nomes. E definimos isso para nomear e alterar seu tipo para array. Poderíamos pegar isso e conectá-lo ao nosso array de nomes de exemplo assim como fazemos com variáveis normais. E isso apenas pegaria nosso atual, ou desculpe, pegaria nossos valores de matrizes de nome e os definiria para a matriz de nomes de exemplo. Então, ele limparia completamente nossa matriz de nomes e, em seguida, definiria os valores exatamente iguais aos da nossa matriz de nomes. Isso também é o mesmo para nossa matriz flutuante. E então, qualquer outro tipo de matriz que você criar, podemos defini-los perfeitamente. E podemos pegar outro valor de matriz. Poderíamos definir isso para isso desde que sejam do mesmo tipo, como se tivéssemos nosso float conectado ao nosso array float, nome conectado ao nosso array de nomes. O mesmo vale para todos os nós que eu tenho usado. Então, nossas matrizes de loop, se eu mostrar rapidamente, podemos pegar nosso exemplo de matriz flutuante, eu posso arrastar para fora e posso procurar por loop. E você vê que temos esses mesmos nós para eu criar um novo nó de loop. Temos esse elemento de matriz, mas em vez de um nome, é apenas um valor flutuante porque é uma matriz de valores flutuantes. Mas nosso índice permanece o mesmo porque sempre terá um índice para cada entrada em nosso array. Também podemos fazer uma corrida pelas referências de nossos atores ou objetos. Então, se eu fizer isso rapidamente, basta chamar isso de matriz de atores. Você pode ver que se eu mudar o tipo para ator, vamos para nossa referência de objeto ator. Você pode ver que agora temos uma variedade de atores. E isso funciona novamente, da mesma forma que usamos nosso nome e matrizes flutuantes. Poderíamos percorrer uma série de atores. E isso nos dará uma saída de ator e um índice de que esse ator é app em nosso array. Agora, o mecanismo tem alguns nós integrados que realmente geram matrizes. Então, um exemplo disso seriam os atores sobrepostos. E isso basicamente pega os atores que estão se sobrepondo aos nossos projetos atuais. Então, eu estou no ThirdPersonCharacter. Isso faria com que qualquer aplicativo se sobreponha ao nosso personagem, os produziria como uma matriz. Poderíamos usar isso da mesma forma que estamos usando nossas variáveis de matriz. Assim, eu poderia, por exemplo, percorrer todos os atores que estão atualmente sobrepondo meu personagem. E poderíamos fazer qualquer tipo de verificação que quiséssemos, poderíamos dizer, talvez destruí-los. Se quiséssemos, poderíamos destruir os atores que se sobrepõem ao nosso personagem. E podemos usar esse elemento de matriz como uma variável normal, como fizemos em nossa lição anterior com o tipo de ator, podemos usar isso para dizer obter suas localizações. Ou podemos usá-lo para definir suas localizações. Assim como um ato normal de variável. Obviamente, também não precisamos usar um nó de loop para fazer isso. Poderíamos usar o nó get e isso nos dará o primeiro índice na matriz de atores que se sobrepõem ao nosso personagem. Se quiséssemos passar, digamos, o segundo ou o terceiro, poderíamos alterar esse valor de entrada. E então poderíamos usar nosso nó get para conectar a qualquer um desses nós que podemos usar com variáveis ativas. Então é isso para esta lição, e é isso para a seção de variáveis do curso. Em nossa próxima lição, vamos dar uma olhada nas funções e como elas funcionam e como podemos criar novas. 12. Basics (Funções): Olá pessoal. Nesta lição, vamos aprender sobre funções, como elas são usadas e para que são usadas. As funções são partes de código independentes que podemos modificar e reutilizar com muita facilidade. Então, para começar, no meu personagem de terceira pessoa aqui, vou criar uma nova função. E podemos fazer isso clicando no botão de nova função aqui. Ou podemos ir ao botão Adicionar e selecionar nova função que criará uma nova função para nós. Vou chamar o meu exemplo. Você pode ver que ele também abriu um novo gráfico de eventos para nós com uma entrada. E tem o nome da nossa função aqui. Agora aqui é onde codificaremos nossa função se você precisar acessar o código de uma função. Então você está no Gráfico de Eventos e deseja obter o código da sua função, você sempre pode clicar duas vezes no nome da função e isso o levará diretamente para sua função. Agora, como você pode ver, temos um nó de entrada e ele será executado sempre que nossa função for executada. Se formos para o Gráfico de Eventos e arrastarmos nossa função de exemplo, você pode ver que ela nos deu um novo nó chamado exemplo. Agora, sempre que esse pino de execução de entrada for executado, o código dentro da nossa função será executado. Então, como um exemplo rápido, se eu adicionar uma string de impressão à minha função de exemplo aqui, em nosso gráfico de eventos, vou apenas criar um nó de início de reprodução. E eu conecto isso à minha função de exemplo. Agora, quando o jogo começar, nossa função de exemplo será executada, e isso executará o código dentro do nosso exemplo, que é essa string de impressão. Então, eu só vou compilar o hit Play. Você pode ver que nossa string de impressão está sendo executada. Então, para mostrar como isso pode ser útil, vamos sair do jogo, voltar para ThirdPersonCharacter e criaremos uma nova função que chamaremos isso de aumento de saúde. E também criaremos uma nova variável, e chamaremos isso de saúde atual. Se o seu for um número inteiro, basta clicar nele e alterá-lo para um número inteiro e nós compilaremos. Agora, você pensaria que se quiséssemos aumentar a saúde, iríamos para o nosso Gráfico de Eventos, fomos arrastados para fora da nossa saúde atual para obter saúde. E usaríamos um nó add, adicionaríamos a montanha que queremos adicionar para dizer um. E então definiríamos a saúde atual. Mas o problema com isso é toda vez que você quiser mudar nossa saúde e nosso código, teríamos que escrever todas essas notas. O que as funções nos permitem fazer é basicamente pegar esse código e colocá-lo dentro de uma função. E em vez de ter que escrever esse código, podemos simplesmente arrastar uma função para o Event Graph ou outra função e executar esse código. Então, se pegarmos esse código, vamos apenas cortá-lo e voltar para nossa função de saúde aumentada. Colará isso e conectará. Agora, se executarmos a função aumentar como, tudo o que ela fará é adicionar uma saúde à nossa saúde atual, o que não é particularmente útil. Queremos poder escolher quanta saúde é adicionada à nossa saúde atual, e não podemos fazer isso. Portanto, se selecionarmos nosso nó de entrada aqui, você pode ver no painel Detalhes que temos entradas e saídas. Agora podemos adicionar novas entradas clicando neste pequeno botão aqui. E isso adicionará uma nova entrada de variável. Você pode ver que temos uma contribuição aqui. E se formos para o Gráfico de Eventos e arrastamos nossa função de aumento como, você pode ver que essa variável também está disponível aqui. Agora, podemos renomear isso voltando para nossa função, selecionando a entrada e vamos alterá-la para mount. Também podemos alterar o tipo de variável aqui. Então menos foi para inteiro por padrão. Mas você pode alterá-lo para qualquer variável que quiser. Vamos usar inteiro por enquanto, porque é isso que nossa variável de saúde é. E podemos arrastar nossa quantidade e conectá-la ao nó positivo aqui. Então, agora o que acontecerá é que, quando nossa função de aumento de saúde for executada, ela levará qualquer quantidade mais essa para nossa saúde atual e definirá a saúde atual. Agora, vou arrastar para fora daqui e adicionar uma string de impressão apenas para que possamos dizer que, se isso estiver funcionando, arrastamos para fora do nó set e o conectamos ao nó da string de impressão aqui. Agora, em nosso Gráfico de Eventos, queremos executar nosso aumento de saúde, digamos, quando eu pressiono um botão, então eu vou clicar com o botão direito do mouse e procurar por evento de entrada. Diga por quê. Vamos percorrer e encontrar a entrada y deles. Isso só será executado sempre que eu pressionar Y no meu teclado. Se eu conectar isso para aumentar o quão rápido eu posso definir o valor. Então, vou definir para dizer cinco. Então agora, quando compilamos e apertamos play, toda vez que pressiono Y, você pode ver que minha saúde atual aumenta porque aumenta em cinco toda vez que pressiono Y. Agora também podemos adicionar saídas para nossa função. Então, se voltarmos e sairmos do jogo, podemos voltar para nossa função de aumento de saúde aqui. Se selecionarmos o nó de entrada, podemos adicionar uma nova saída. Então, vou clicar no novo botão de saída aqui e você verá que ele criou um novo nó para nós agora. E isso é o que executamos quando queremos gerar algo da nossa função. Então, se eu conectar isso na parte anterior depois imprimir a string em C, posso dar um nome. Então, vou colocar a saúde atual. E pegaremos qualquer que seja o nosso valor atual de Saúde e produziremos isso. Se compilarmos e voltarmos ao nosso gráfico de eventos, você pode ver que agora nosso nó no gráfico de eventos tem uma saída chamada integridade atual. E essa saída, quaisquer que sejam os valores que conectamos a ela a partir de nossa função. Então, no momento, estou apenas produzindo meu valor atual para a saúde. Assim, podemos acessar isso no gráfico de eventos. Agora também podemos usar funções dentro de uma função. Então, se formos para nossa função de aumento de saúde aqui, e aqui, nós, talvez quiséssemos tocar um som toda vez que nossa saúde aumentasse, poderíamos criar uma nova função que toca um som em localização de nossos personagens que também podemos usar em outros lugares, se quisermos. Então, por exemplo, criaremos uma nova função. Vamos chamar isso de tocar som. Tocar reprodutor de som. Localização. Aqui, podemos arrastar para fora de nossa entrada e usar o som das placas no local, o nó será arrastado para fora do local e obterá a localização do ator. Isso reproduzirá um som que definimos na localização do jogador atual. Agora, podemos adicionar uma nova entrada para nossos sons para que possamos escolher qual som será reproduzido. Uma maneira mais rápida. Podemos fazer isso como se arrastássemos da nossa entrada de som aqui e arrastássemos isso para o nó de entrada, se eu soltar, você pode ver que na verdade apenas adiciona uma nova entrada de som para nós e nomeia esse som. Se quisermos renomeá-lo, podemos, basta fazer isso nas entradas aqui. E agora, quando compilamos, se voltarmos para qual aumento, como função, agora podemos arrastar essa nova função que acabamos de criar para nossa função aumentada. Podemos usar isso como podemos no Gráfico de Eventos. Então, se eu conectar isso, agora podemos dizer som porque adicionamos a entrada de som à nossa função. E sempre que aumentamos a forma como a função é executada e executamos o mesmo código aumentando nossa saúde na quantidade. Ele imprimirá a string no valor atual e, em seguida, executará o código dentro do som de reprodução no local usando o som que definimos. Atualmente, não defini um som. E então, uma vez que o som reproduzido e essa função esteja concluída, ela continuará e retornará nosso valor de Vida atual em nosso Gráfico de Eventos. E, claro, o som de reprodução no local de reprodução é apenas uma função como nosso aumento de saúde. Então, se quiséssemos, poderíamos usá-lo no gráfico de eventos também e em outros lugares ou dentro de uma função. Agora, uma das melhores coisas sobre funções é que elas são reutilizáveis. Então, eu tenho minha função de aumento de saúde sendo executada aqui na entrada y. Mas eu também poderia usar o aumento função em outras partes do meu código, se eu quisesse, eu posso ter quantos eu quiser. E quando todo mundo for executado, ele executará o código como você esperaria. Sempre que modificamos qualquer coisa dentro de nossa função celular aumentada. Então, digamos que quiséssemos fazer uma mudança aqui ou se houvesse um bug ou algo parecido, poderíamos fazer uma mudança em um lugar dentro ou aumentar a forma como funciona. E isso afetará todos os lugares que usamos são aumento do nó da função de saúde. As funções também têm outro recurso chamado variáveis locais. Então, se abrirmos o aumento do coração como funciona aqui, você pode ver na parte inferior do painel Meu Blueprint, temos as variáveis locais. Agora, uma variável local opera praticamente da mesma forma que uma variável normal, é só isso. Ela só existe dentro da nossa função. Portanto, não podemos acessar uma variável local no gráfico de eventos de nossa função de saúde aumentada, só podemos acessá-la dentro de nossa função aumentada. Outra coisa das variáveis locais é que, uma vez essa execução ou quando nossa função for concluída, variável será redefinida para seu valor padrão. Então, como exemplo, se eu criar uma nova variável, descolado e legal esse exemplo. E isso é apenas um booleano. Então, se fizermos um nó get aqui, também criaremos uma string de impressão. Agora, quando executarmos esse nó de string de impressão, vou conectar meu exemplo à string. Ele imprimirá verdadeiro ou falso dependendo do valor do nosso exemplo atual. Por padrão, ele é definido como false. Agora, depois disso, se eu defini-lo como true, você esperaria que da próxima vez que executarmos esse código ele retorne true porque estamos definindo-o como true depois de imprimir string. Mas sempre retornará falso, como você pode ver aqui. Porque toda vez que nossa função terminar, essa variável será redefinida para seu valor padrão, que é false. Variáveis locais são uma ótima maneira de armazenar temporariamente informações dentro sua função sem ter que criar novas variáveis que podem se somar rapidamente se você tiver muitas funções em andamento. Também foram muito bons para organizar sua função. Digamos que você tenha um pouco mais de código em andamento e queira armazenar variáveis apenas para manter as coisas organizadas. Você poderia fazer isso também. Outra coisa útil que você pode usar para manter suas funções organizadas, pois temos nossas entradas, digamos, por exemplo, nossa entrada MT aqui. E esse fio está indo para nossa nota de anúncio. Agora, talvez no futuro você tenha uma função que tenha muitas entradas. Você teria fios saindo por todo o lado e não ficaria muito arrumado. Então, o que você pode fazer é mouse e esquecer essa quantidade. Você pode ver que tenho acesso à variável amount, mas não tenho uma variável local chamada amount. Não há uma variável normal chamada quantidade. Isso é basicamente apenas um atalho para essa quantidade de saída aqui. Então, em vez de ter o fio conectado a partir de nossa entrada deles, podemos simplesmente arrastar isso aqui e podemos obter esse valor. E tudo o que está fazendo é basicamente cortar o fio e acessar essa variável de quantidade, uma espécie de atalho. Agora, as funções têm algumas limitações. Então, por exemplo, não podemos usar nós latentes dentro de uma função. Agora ainda não cobrimos as notas latentes, mas falaremos em uma lição futura. Mas, apenas como um resumo rápido, se clicarmos com o botão direito do mouse e o gráfico de eventos aqui e procurarmos por hoje, podemos criar um nó de atraso. Agora, um nó latente terá um pequeno ícone de relógio no canto superior direito. E basicamente o que um nó de atraso faz é obter uma entrada e, em seguida, qualquer que seja a nossa duração, ele espera esse tempo antes de executar a saída. Então, isso só nos permite manter o código. Então, por exemplo, se eu estivesse conectando minha nota de reprodução aqui, e eu vou definir isso para dizer três. E então eu coloquei meu aumento de saúde aqui. Ele começaria a ser reproduzido, seria executado, um nó de atraso seria executado e esperaria três segundos e, em seguida, executaria a saída concluída. Agora, como esse é um nó latente, não podemos usá-lo dentro da função. Então, se eu for para o meu aumento de saúde, justo, e eu me arrasto e procurei por atraso. Você pode ver que esse nó de atraso não está surgindo porque está latente e não podemos usá-los dentro da função. Em seguida, vamos analisar as funções puras e impuras. Então, se voltarmos ao nosso gráfico de eventos aqui, e eu criar um novo aumento de como funciona. E no painel Detalhes, você pode ver que podemos alterá-lo para uma função pura. Então, se eu assumir isso, você pode ver que isso também afetará todas as outras funções de aumento, ele muda para essa função. Agora, a forma como isso funciona para cada saída conectada aos nossos pinos de saída, essa função será executada. Então, como exemplo, se eu pegar minha dica inicial do Plano e eu vou usar um conjunto de saúde atual. E nos conectaremos até aqui, aumentaremos a saúde, digamos, um. E vamos conectar isso à saúde atual. Então, digamos que espero que com 0 ele aumente em um e, em seguida, produza uma nova saúde atual. Então isso seria um. E se eu fosse copiar e colar esse nó definido novamente, e nós conectaremos isso aqui. Esse nó seria um, mas esse nó seria executado novamente para esse nó definido, e esse nó realmente o definiria como dois, e assim por diante e assim por diante. Para cada conexão, executaríamos esse nó novamente e aumentaríamos o valor, espero. Considerando que uma função impura, se selecionarmos nossa função novamente e clicarmos na tecnologia P0, se conectarmos esse backup para começar a ser reproduzido, isso sempre retornará a mesma saída que tinha quando foi executado. Então, quando o jogo começar aumentará nossa saúde de 0 para um. Vamos definir esse valor aqui. Esse valor será definido como um. E então este também será definido como um porque só será executado uma vez quando for executado. E então ele armazena os valores de sua saída nesses pinos. E então todas as conexões que temos para isso serão as mesmas até executarmos essa função novamente. Isso é apenas algo para lembrar quando você está trabalhando com funções puras, é quantas conexões você conectou a essa função é quantas vezes ela será executada. Se você tem algum tipo de matemática acontecendo ou algo parecido com aumentar a saúde, toda vez que você arrasta e define algo, ele será executado novamente. Portanto, seu valor, seus valores de saída podem ser diferentes a cada vez que é executado. Em seguida, vamos dar uma olhada nas funções principais. Agora, se você ainda não viu, recomendo ir e dar uma olhada. Temos uma lição variável sobre atores e objetos. Nessa lição, eu vou para a herança e explico um pouco sobre isso. Mas, essencialmente, qualquer objeto que existe no mundo é um ator, incluindo nosso personagem. Mas então temos diferentes tipos de atores como nosso personagem aqui. E podemos acessar o ato das funções ou as funções que existem dentro do ator por meio dessa opção de substituição aqui na guia de funções. Então, se clicarmos nisso, você pode ver que temos no lado direito, diz ator. Agora, essas são funções que podemos acessar que existem no ator. E nós os temos porque somos um personagem, mas também somos atores. Se você descer um pouco mais, você pode ver que temos alguns que dizem caráter. Agora temos acesso a essas funções porque nosso personagem em terceira pessoa é um personagem. E se descermos ainda mais, você pode ver que temos **** outros também. E nós temos isso porque nosso personagem também é um ****. E sempre que selecionamos uma dessas funções aqui, basicamente dizemos ao mecanismo, não queremos que você execute o código que existe, digamos, no blueprint do personagem. Queremos assumir essa função e executar nosso próprio código. Então, por exemplo, podemos clicar, pular. E você vê que agora assumimos essa função da classe character. Podemos escrever nosso próprio código e agora nem todas as funções se parecerão com isso, onde temos um editor separado se criarmos ou se substituirmos outra função, digamos, a destruída, que irá criar o que parece ser um evento dentro do nosso gráfico de eventos. E a razão pela qual ele faz isso é apenas porque nossa função destruída não tem nenhuma saída, mas pode pular, então ela tem uma saída aqui. E tudo o que retornamos aqui será basicamente verificado sempre que tentarmos pular. Então, atualmente, se eu tentasse pular agora, eu não seria capaz porque assumimos a função e estamos apenas dizendo que não podemos pular com definir isso como falso. Assim, poderíamos ter nosso próprio código aqui que controla se podemos ou não pular, por exemplo. Agora, você pode estar se perguntando se podemos substituir essas funções. Podemos realmente ir e descobrir onde essas funções estão e olhar para dentro e ver o que está acontecendo da forma que podemos com as funções que criamos. Infelizmente, essas são classes C plus plus. Ator, personagem importante é realmente criado em C plus plus e embutido no motor. Não há projeto para o qual possamos ir. Podemos personagem em primeira pessoa, por exemplo, e olhar para essas funções. Você pode fazer isso em C plus plus se quiser, mas isso é um pouco mais avançado. Por fim, eu só quero mostrar como você pode chamar funções de um blueprint dentro de outro. Então, se formos para o nosso mapa de terceira pessoa aqui, eu vou criar uma nova classe de blueprint rapidamente. Haverá um ator, chame-o de gatilho, arrastará para o nível aqui. E eu vou abrir esse projeto. Vamos adicionar um novo componente e chamaremos essa caixa. Queremos a colisão da caixa e eu vou apenas movê-la para cima. E também estamos na busca de detalhes por escondido no jogo Nin. Vou desmarcar isso só para poder ver. E então vamos nos livrar dessa busca e rolar para baixo até o final. Vamos dizer que, na verdade, podemos ir para o Event Graph, que cria uma nova função. Desculpe, o evento faria, começaria a se sobrepor. Agora já usamos esse nó antes, se você se lembra em nossas lições anteriores. Mas, essencialmente, esse evento ocorrerá sempre que algo se sobrepõe nosso gatilho e nos dará uma referência ao ator que se sobrepôs a nós. Então, podemos nos arrastar para fora disso. E eu só vou fazer um custo para ThirdPersonCharacter. Agora, se você se lembra essencialmente de qual custo ele verifica, esse objeto de entrada é um personagem? Se for, executaremos o cubo x superior aqui e ele nos dará acesso a esse caractere é variável. Agora, novamente, no futuro, haverá uma aula de elenco, mas este é apenas um exemplo rápido. Se você se lembra, podemos acessar variáveis usando isso. Então fizemos isso com nossos cubos. Também podemos acessar funções. Então, se eu me arrastar porque estou lançando para o ThirdPersonCharacter Blueprint e é nisso que estamos trabalhando. Se eu arrastá-lo para fora e procurar aumentar a saúde, você vê que posso obter esse aumento como funciona. E se você se lembrar, definimos isso para, se voltarmos à nossa característica, definimos nosso aumento de nossa função como PO. Então, se eu desmarcar isso e torná-lo impuro, preciso desconectar este porque isso nos dará vontade de outra forma. Você pode ver que ele está realmente atualizado aqui. E usando isso, podemos acessar as funções que existem em nosso personagem de terceira pessoa em outro projeto. Essa função será executada como se tivéssemos executado em nosso personagem de terceira pessoa. Mas, em vez disso, agora podemos executar isso sempre que nosso, digamos, nosso personagem se sobrepõe. Então eu vou acionar, para que possamos aumentar sua saúde em, digamos, cinco. Agora, quando apertamos o play e eu atropelo aquela caixa, vocês podem ver que agora ela está imprimindo esse valor de saúde aumentado. Isso vai ser tudo para esta aula. Espero que você entenda um pouco mais sobre funções de vez em quando em nossa próxima lição, vamos dar uma olhada nas macros. 13. Noções básicas (Macros): Olá pessoal, Nesta lição, vamos analisar macros. Elas são semelhantes às funções, pois são partes de código independentes que podemos reutilizar em torno de nosso blueprint. Também aprenderemos sobre quando você pode querer usar uma macro em vez de usar uma função também. Então, vamos começar. Vamos criar uma nova macro. Podemos fazer isso no meu painel de projetos aqui. Você pode clicar no botão nova macro aqui ou ir para o menu suspenso e selecionar macro. Se clicarmos nisso, podemos chamar nosso novo exemplo de macro. Você pode ver que ele também abriu um novo editor para nós, como acontece com uma função. E temos uma entrada e uma saída com neve. Agora, ao contrário de uma função, você pode ver que na verdade não temos nenhuma entrada e nossa macro, e isso é porque precisamos adicioná-las nós mesmos. Então, no painel Detalhes aqui, podemos clicar no símbolo de mais e criar algumas novas entradas. Agora, podemos criar entradas e saídas de pinos de execução. Portanto, se clicarmos na opção Criar nova saída aqui para as saídas, você pode ver agora que tenho uma entrada de execução e uma saída de execução. E se pudermos puxar isso, vá para o Gráfico de Eventos, poderia realmente arrastar essa macro agora para o nosso gráfico de eventos. E você pode ver que temos nossas entradas e saídas e podemos renomeá-las também, algo um pouco melhor. Então renomeie isso para dizer neste 12 out, apenas para torná-lo um pouco mais claro. Agora, o legal com macros é que você pode realmente ter várias entradas e saídas de execução. Então, se eu quisesse, eu poderia adicionar outra saída de execução. Eu poderia chamar isso de um fora para. E poderíamos executar um pouco de código e cabelo. E então, dependendo do que esse código faz, podemos executar qualquer uma dessas saídas. Assim como nossas funções, também podemos ter entradas e saídas variáveis. Então, por exemplo, eu poderia adicionar uma nova entrada inteira e eu poderia mudar o nome para dizer amount, como fizemos com nossa função em nossa lição anterior. Você pode ver que agora temos uma entrada de valor. Se eu voltar para o Event Graph, você pode ver que temos isso na caneta de execução, e também temos uma entrada e, em seguida, ambas as nossas saídas. Agora, a maneira como usamos macros é muito semelhante à maneira como usamos funções, pois podemos ter vários da mesma macro em qualquer lugar em nosso blueprint, podemos usar macros dentro de outras macros, se quisermos para e se fizermos alguma alteração dentro da macro. Por exemplo, se adicionarmos algum código aqui, isso afetaria todas as macros que criamos a partir desse tipo de macro. Então, todas essas macros seriam atualizadas com as alterações que fazemos dentro de nossa macro. Então, agora configuramos nossa macro de algumas entradas e saídas diferentes. Podemos codificar aqui da mesma forma que podemos no Gráfico de Eventos ou em nossa função. Então, em nosso último vídeo, eu configurei uma função de saúde para aumentar a saúde. Eu posso fazer a mesma coisa com macro, então vamos criar uma nova variável, vamos chamar isso de saúde atual. E vamos defini-lo como inteiro se o seu ainda não estiver. E vamos arrastar isso em um nó add. E adicionaremos o valor. E vamos sair da saída do nosso Add Node e definiremos a saúde atual assim. Agora, como essa é uma macro, podemos ter várias canetas de execução de saída. Então, poderíamos fazer uma verificação, digamos, nossa saúde atual é igual a 100? Se estiver lá, talvez queiramos executar uma caneta de execução diferente. Eu uso um nó de ramificação aqui. Se estiver em 100, executaremos a saída superior e, se não, executaremos a saída inferior. Você pode renomeá-los, digamos, saúde máxima para o superior e não saúde máxima para o inferior. Porque talvez queiramos que ele execute um código diferente, dependendo se somos Max Health ou não. Então, se voltarmos ao nosso gráfico de eventos aqui, você pode ver que ambas as nossas notas de exemplo aqui eu atualizei, então eles atualizaram as saídas. E isso porque mudamos a macro deles. E poderíamos executar isso agora e aumentar nosso valor de saúde. Então, se eu disser, coloque isso 50 e nós adicionaremos um novo evento de entrada. E o que você usaria, digamos x, que encontra a entrada x de m. Então, quando eu pressionar X no jogo, adicionarei 50 pontos de vida. E então podemos executar um código diferente dependendo se somos próprios do Mac ou não. Então, vou usar a string impressa porque eles são fáceis de ver no jogo. Então, chamaremos a saúde máxima e copiaremos e colaremos. Isso vai rodar no máximo assim. Então, vamos fazer o componente. Agora podemos clicar em play e ver se isso funciona. Se eu pressionar X, você pode ver que atualmente não está no máximo. Se eu pressioná-lo novamente, agora estamos aumentando a saúde máxima. Então, esse é apenas um exemplo de como podemos usar macros para executar códigos diferentes em nossos blueprints, dependendo de um valor, por exemplo, agora o mecanismo realmente inclui muitas macros embutidas. Então, por exemplo, r é um nó válido se clicarmos com o botão direito do mouse e tal o que é válido, e rolamos para baixo até o nó é válido. Você pode reconhecer isso em uma de nossas lições anteriores. Isso é apenas uma macro e está embutido no motor. Então, se clicarmos duas vezes nele, ele realmente nos levará a um blueprint chamado macros padrão. E isso vem com o motor e você pode ver que isso é apenas uma macro, assim como nossa macro de exemplo. Ele tem o mesmo tipo de layout e também podemos ver as entradas. Então, se formos para macros padrão, veja aqui as entradas. Então, ele só tem um alfinete de execução. Entrada e um pino de objeto e , em seguida, para saídas de execução. E tudo o que isso está fazendo é usar a função válida que está embutida no motor. Cheques. O objeto de entrada é válido e, em seguida usa uma ramificação para executar é válido ou não é válido. Existem outras macros que vêm com o mecanismo que você pode conferir. Eles estão todos nessas categorias aqui. Então, se você quiser, você pode olhar através deles e ver como eles funcionam. Mas, essencialmente, macros são realmente úteis para partes menores e independentes de código que você pode reutilizar muito em seu projeto. Então, por exemplo, talvez você quisesse verificar se o personagem está morto? Então, em vez de obter a verificação de saúde, isso é menor que ou, isso é menor ou igual a 0? E, em seguida, executando um nó F, você poderia realmente pegar todo esse código, cortá-lo e colocá-lo em suas próprias macros para que você pudesse tê-lo morto. Poderíamos jogar isso aqui. E se realmente arrastarmos da nossa caneta de execução para a entrada, e pudermos fazer o mesmo com as saídas. Então, podemos fazer assim. Isso só torna isso um pouco mais rápido do que ter que adicionar todos aqui. Então agora temos uma pequena macro aqui que podemos usar para verificar se nosso personagem está morto. Então, podemos simplesmente arrastar isso para dentro. E em vez de ter que adicionar todos esses nós. E toda vez que quisermos verificar se o personagem está morto, podemos simplesmente arrastá-lo em uma pequena macro e ele faz tudo isso por nós. É aqui que a força deles está com as macros, você pode usá-las muito. Eles podem controlar qual código está sendo executado. E são apenas pequenas ferramentas úteis, especialmente para coisas como verificar valores, como estamos fazendo aqui. Outro benefício da macro diz que você pode usar nós latentes neles. Portanto, se você se lembra da lição anterior, não é possível usar um nó de atraso dentro de uma função, mas pode usá-los dentro de macros. Então, se eu quisesse, eu poderia adicionar um nó de atraso e aqui, então um grande atraso. Você pode ver que eu posso adicionar isso muito bem . Eu posso compilar. E se formos para o nosso gráfico de eventos, você pode ver que a macro está latente porque tem o pequeno relógio lá. E isso porque, dentro dele, adicionamos esse nó de atraso. E a razão para isso é que as macros são executadas como se fossem códigos no Gráfico de Eventos. Mas, em vez disso, eles simplesmente se compactaram no OneNote que podemos reutilizar e editar com muita facilidade. Eles também não redefinem as funções sempre que as executamos. Portanto, eles são muito mais parecidos com o código que temos no gráfico de eventos do que o código que você tem em uma função. Agora, algumas coisas que você não pode fazer com macros é não poder chamá-las de outros projetos. Então, se você se lembra em nossa lição anterior, eu crio um gatilho e podemos fazer isso de novo. Se criarmos uma nova classe de blueprint, vamos vendê-la para um sotaque e eu chamarei isso gatilho, abriremos isso. E vou criar um novo componente de colisão de caixa. E nós apenas movemos isso um pouco para cima e vamos configurá-lo como oculto no jogo vamos tirar isso para que possamos ver. E aqui criaremos um nó de sobreposição inicial. Se você se lembra, isso só funciona sempre que algo se sobrepõe nosso gatilho e então nos dá o ator que se sobrepôs a ele. Então, saia daqui e use o Cast to ThirdPersonCharacter. E isso levará nossa saída de ator que se sobrepôs ou acionou. E ele verificará se é um ThirdPersonCharacter para é, então ele nos dá acesso a essa variável de fogo e executaremos o pin de sucesso aqui no topo. Então, se você se lembra, podemos chamar funções por meio disso. Mas volte ao meu personagem aqui e eu vou criar uma função. Vamos chamar isso de dizer aumentar a saúde. E vamos apenas compilar. Não vou adicionar nenhum código e voltamos ao nosso gatilho. Se eu me arrastar, posso ou posso acessar essa função para que eu possa aumentar a saúde. Você pode ver que eu posso chamar essa função do meu personagem. Mas se você se lembra, temos uma macro morta. Se eu arrastar e procurar por está morto, não consigo encontrar essa macro porque ela não está acessível a partir do meu Modelo de Personagem. Eu só posso usá-lo dentro do meu Modelo de Personagem. Por fim, se você se lembra de nossa lição anterior, podemos substituir funções de nossos projetos pais. Por exemplo, como esse é um esquema de personagem em terceira pessoa, é um filho do personagem. Posso substituir funções que existem no Character Blueprint. Mas você não pode fazer isso com macros. Macros existem apenas em nosso cabelo de blueprint. Não consigo substituir e assumir controle de nenhuma das macros, digamos, do blueprint do personagem ou do blueprint ativo, por exemplo. Então, apenas para resumir, macros são ferramentas realmente úteis que você pode criar e que podem tornar sua vida um pouco mais fácil. Então você não precisa recodificar as coisas o tempo todo. E você pode modificá-los em apenas um lugar e isso afetará todos os lugares em que a macro é usada. Eles também podem controlar qual código está sendo executado com muita facilidade, porque podemos ter várias entradas e saídas de execução. 14. Noções básicas (estruturas e acessórios): Olá pessoal. Nesta lição, vamos dar uma olhada em estruturas e enums. Então, vamos começar. Estruturas, ou às vezes chamadas de estruturas, são uma forma de armazenar vários tipos diferentes de variáveis, tudo dentro de uma variável. Então, para dar um exemplo, vou criar uma nova variável. Vou chamá-lo de exemplo de palha. E vamos definir o tipo de variável para uma estrutura que realmente vem embutida com o mecanismo. Se você quiser encontrar as outras estruturas de motor que vêm com ele, você pode simplesmente ir até a categoria de estrutura. E aqui você pode ver todas as estruturas que você usou em todo o motor. Provavelmente, você não vai entrar aqui com muita frequência. Porque eles são usados principalmente para funções do motor e coisas assim. Mas vamos usar um como exemplo. Então, vou criar, ou vou definir nossa variável tipo dois chamada float. E definiremos nossa variável com dois nomes flutuantes e depois compilaremos. Agora que compilamos, você pode ver que nosso valor padrão inclui uma variável flutuante e uma variável de nome que podemos ambas individualmente, se quisermos. E eles operam da mesma forma que você esperaria que um nome ou uma variável flutuante funcionasse. Agora, essa estrutura inclui apenas duas variáveis, um float e um nome, mas você pode ser atingido muito mais variáveis e diferentes tipos de variáveis também. Agora, podemos obter e definir o traçado sustentado da maneira que podemos com qualquer outro tipo de variável. Então, se arrastarmos nossa estrutura de exemplo aqui, você pode ver que podemos obter tudo. Podemos criar um nó de conjunto e ele nos fornece esses nós que vimos antes com outros tipos de variáveis. Agora, a coisa legal sobre estruturas que podemos acessar essas variáveis é armazenada nela com muita facilidade. Podemos simplesmente arrastar para fora do nosso nó get e podemos criar um nó break. Agora, porque estou usando o nome float, ele diz break chamado float. Mas se estivéssemos usando uma estrutura diferente com um nome diferente, diria break e em seguida, o nome dessa estrutura. Então, ele criará a quebra Blake chamada nó flutuante. E você pode ver aqui que agora podemos acessar ou flutuar a variável, bem como nossa variável name. E esses são apenas pinos variáveis comuns. Agora, se quiséssemos, poderíamos arrastar para fora do nosso flutuador e criar um nó add, por exemplo, ou qualquer outro nó relacionado flutuante. E poderíamos fazer a mesma coisa com nosso nome, saída variável também. Se tivéssemos dito, uma variável flutuante, poderíamos definir essa variável flutuante usando essa caneta também. Também podemos obter o cabelo dos pinos uma maneira diferente se obtivermos o suficiente, novamente, observe e clicarmos com o botão direito do mouse no pino de saída, podemos selecionar a opção Split Struct Pin aqui. Você pode ver que agora podemos obter diretamente o valor float e nosso valor name da variável struct de exemplo. E se quisermos recombiná-los, então ele volta ao nosso nó get padrão normal aqui, podemos clicar com o botão direito do mouse nos pinos de saída e selecionar recombinar Struct Pin. Você pode ver que agora ele volta ao normal. No entanto, direi que, com minha experiência no mecanismo usando essa opção Split Struct Pin, em vez de usar o nó break, isso é um pouco mais propenso a quebrar com as atualizações do mecanismo e coisas assim. Então, pessoalmente, eu prefiro usar os nós de quebra, mas é uma preferência pessoal. Você pode usar os pinos divididos se quiser. Então, agora sabemos como obter informações do nosso nó de obtenção de traços. Queremos ser capazes de definir informações para nossos traços, o que podemos fazer. Portanto, se pegarmos nossa nota definida aqui e arrastarmos para fora do pino de entrada, procuraremos por make. Você pode ver que temos uma opção para fazer fluxo nomeado. Agora, novamente, se estivéssemos usando um tipo diferente de struct, ele diria Make e, em seguida, o nome do traço. Então, criaremos essa nota aqui. Você pode ver que agora temos uma entrada flutuante e uma entrada de nome. E isso nos permite desencadear o fluxo ou nomeado variáveis em nossa estrutura. Agora, o único problema com isso é dizer que só queremos que ele mude nosso valor flutuante e não queríamos alterar o valor do nosso nome, só queríamos deixar o mesmo. Na verdade, isso substituiria o valor do nosso nome. Então, o que podemos fazer em vez disso, se quisermos apenas alterar uma das variáveis dentro de nossa estrutura, podemos fazer é criar um nó, arrastar e procurar por membros do conjunto. E você vê que temos membros definidos no nome não estruturado. Então, novamente, o nosso é chamado de float. Então, diremos que os membros do conjunto no fluxo nomeado criarão esse nó. E recebemos essa nota estranha aqui. No painel Detalhes. Podemos ir até esse menu suspenso. Você pode ver que temos uma caixa de seleção para cada tipo de variável que está dentro de nossa estrutura. Então, se eu quisesse apenas alterar a variável flutuante, podemos assumir isso aqui. E você vê que isso agora adicionou uma entrada para o nosso carro alegórico. Agora, quando esse nó é executado, podemos definir uma nova variável float dentro de nossa estrutura sem afetar nossa variável name. Enquanto com o nó set, teríamos que definir nossa variável float e nossa variável name. E, claro, se você tivesse uma estrutura com mais variáveis, elas seriam listadas aqui. Você pode assumir várias variáveis usando as notas de membros do conjunto. Então, se eu quisesse, eu poderia ter esses dois pinos aqui como uma entrada também. E poderíamos mudar esses dois valores ao mesmo tempo. Esse nó age automaticamente como um nó definido. Portanto, não precisamos usar um nó de conjunto para que essas alterações sejam aplicadas. Quando esse nó for executado, ele mudará esses valores para nós dentro de nossa estrutura. Então, até agora, temos usado esse chamado flutuador que vem embutido no motor. Mas podemos criar nossos próprios traços e escolher quais variáveis serão armazenadas dentro dele. Então, para fazer isso, vamos para o navegador de conteúdo aqui. Só vou clicar com o botão direito do mouse e um espaço vazio. Em seguida, queremos ir para as plantas que aparecem e selecionamos a estrutura. Agora, e se você nomear sua estrutura é a estrutura será chamada e a opção de tipos de variáveis. Então, eu vou chamar o meu vídeo de struct assim. E vamos clicar duas vezes nele para abri-lo. Eu só vou colocar o meu no topo aqui. Você pode ver que agora temos uma opção na qual podemos definir nossas variáveis. Então, por padrão, acabamos de obter uma variável booleana que é chamada de sublinhado de membro 0. Podemos adicionar novas variáveis aqui clicando no botão adicionar variável. E se quisermos, podemos remover variáveis clicando na pequena lata de lixo aqui para removê-las. Então, vamos adicionar algumas variáveis. E você pode imaginar se quiséssemos armazenar informações sobre, digamos, um item, poderíamos usar uma estrutura para fazer isso e manter todas essas informações armazenadas em uma variável, em vez de ter que ter centenas de variáveis descrevendo um item. Então, por exemplo, talvez quiséssemos que nosso item tivesse um nome. Então, definiríamos o nome do item. Poderíamos chamar esse nome talvez de peso. Então, usaremos o flutuador. Chamamos esse peso variável de talvez um valor danificado. Então, poderíamos dizer um número inteiro para danificar, e então talvez um texto que possamos dizer que seja a descrição. E podemos salvar isso. Agora, quando voltarmos ao nosso ThirdPersonCharacter, podemos criar uma nova estrutura. E vamos chamar isso de nosso vídeo. E quando vamos para o tipo de variável, podemos pesquisar um vídeo. E você verá a estrutura do vídeo. Esse é o nome da nossa estrutura. Se você chamou mandíbulas de algo diferente do que você terá que procurar por isso. Então, vamos criar isso e compilar. Então, agora, quando vamos para o valor padrão, você pode ver que temos todas as nossas quatro variáveis que criamos dentro de você pode ver que temos todas as nossas quatro variáveis que criamos nossa estrutura com os nomes corretos e ver se podemos definir name, um float, um número inteiro e uma descrição para nossa estrutura. E assim como antes, podemos acessá-los com a nota de freio. Então, se criarmos um nó, arrastarmos e criarmos uma estrutura de vídeo de quebra, você pode ver que o mecanismo configurado automaticamente para nós, para que possamos criar esse nó. E assim, temos acesso ao nosso nome, peso, dano e descrição usando nosso nó de quebra. Novamente, se quisermos definir essas variáveis usando o nó set members, podemos arrastar para fora, usar os membros do conjunto. E você vê os membros do set na estrutura do vídeo. E podemos assumir qualquer variável que quisermos, como fizemos antes com nosso nome float. Mas essa agora é nossa própria estrutura personalizada. Agora, também podemos definir os valores padrão para nossa estrutura. Então, se voltarmos aos nossos traços de vídeo, você pode ver que temos uma opção de valores padrão aqui. Então, aqui podemos apenas dizer quais os valores padrão são os valores padrão para o tipo Struck de vídeo. Então, talvez eu só queira dizer, diga o nome do item. Queríamos que o peso padrão fosse dizer um e descrevesse qual parte? Informações do item aqui. E o dano será dez. Então, esses agora são os valores padrão se salvarmos agora e voltarmos para ThirdPersonCharacter. E eu seleciono minha estrutura ou compilação de vídeo porque fizemos algumas alterações na estrutura, teremos que compilar. Você pode ver que agora ele está usando os valores padrão que definimos dentro de nossa estrutura. Se quisermos voltar a ser capazes de alterar variáveis, podemos simplesmente clicar na guia Estrutura aqui e podemos acessar essas variáveis. Agora, uma outra coisa que você pode fazer aqui é se quiséssemos, poderíamos reordená-los para que eu pudesse pegar esse pequeno ícone no final aqui. Podemos alterar a ordem, então talvez eu queira que o nome seja o terceiro agora, em vez do topo, fazemos isso e podemos clicar em Salvar. Volte para o nosso personagem e vamos compilar. Veja que agora, com nosso traço de vídeo selecionado, eles agora estão em uma ordem diferente. Agora, algo que torna as estruturas realmente poderosas é que podemos usá-las em matrizes. Então, se você se lembra do nosso vídeo de matriz para definir uma variável como uma matriz, podemos clicar neste pequeno menu suspenso aqui e selecionar array. Agora vamos meio que quebrar algumas de nossas conexões lá porque não podemos conectar um array em nenhum desses nós. Então, eu vou excluí-los por enquanto. Mas se você se lembrar, podemos arrastar para fora de uma variável de matriz e procurar por loop. Podemos selecionar para cada loop. Usando isso, agora podemos percorrer nossas entradas em nosso array. Então, vou compilar aqui, então temos nossos valores padrão. Por exemplo, poderíamos usar uma estrutura para armazenar muitas informações sobre itens diferentes, talvez para um inventário, por exemplo. Então, por exemplo, se eu criar algumas entradas aqui, você pode ver que agora temos várias versões dessa estrutura armazenadas na matriz. E então podemos percorrer essas versões de nossa estrutura usando o nó de loop e, em seguida, acessar suas informações usando o elemento array. E então podemos usar o vídeo de pausa amarrado como antes. E podemos acessar essas informações de nossa matriz. Então, esse é basicamente o básico das estruturas. Eles são realmente úteis para manter as coisas organizadas e armazenar grandes quantidades de dados. Como se você tivesse um inventário cheio de itens. Você pode usá-los para armazenar muitas informações sobre cada item. E então podemos colocá-los dentro um raio ou podemos usar traços apenas para manter as coisas organizadas também. Talvez você tenha um conjunto de variáveis que sempre usou juntas. Assim, você pode armazená-los em uma estrutura e acessá-los por meio de uma variável. Em seguida, vamos analisar os sindicatos. Agora. Novamente, como a estrutura, o motor realmente tem índio embutido. Então, se você descer até o final, você pode ver a categoria de idioma aqui. E há muitos que vêm com o motor. Novamente, você realmente não vai usar isso. Eles são simplesmente integrados ao motor e usados por nós dentro do motor. Mas você também pode criar seus próprios enums, assim como fizemos com nossa estrutura. Agora, eu vou te mostrar como fazer isso. Então, ele compilará esse projeto por enquanto. E clicaremos com o botão direito do mouse e nosso navegador de conteúdo irá para os blueprints novamente. E aqui vamos selecionar a enumeração. E vamos chamar isso de vídeo. Novamente, o que quer que você chame esse blueprint é o que ele será chamado na opção de tipo variável. Então, isso é apenas algo para se ter em mente . Podemos abrir isso. Você pode ver que parece um pouco semelhante à nossa estrutura no topo, mas há algumas diferenças aqui, então não temos nenhum valor padrão para começar. Clicaremos em Adicionar no numerador. Você vê que isso nos dá uma nova contribuição aqui. Agora tudo o que podemos definir um nome, então podemos dizer a opção um. E adicionaremos mais alguns para que possamos ver no editor. Então, chamaremos essa opção dois e salvaremos isso. Agora, não há muito mais que você possa fazer aqui. Então, voltaremos ao nosso ThirdPersonCharacter. E eu vou criar uma nova variável. Vamos chamar isso de vídeo. Nele. Vou alterar o tipo de variável aqui. Eu só vou mudar para um single. E clicaremos no menu suspenso e procuraremos nosso vídeo em você. Exatamente assim. E vamos compilar. Agora você pode ver no valor padrão aqui que temos esse menu suspenso. Você vê isso? Como eu tenho a opção um e a opção dois que me sentei na minha união de vídeo, elas são as opções que tenho para o meu valor padrão. Agora, os enums funcionam da mesma forma que maioria das variáveis que podemos obter e defini-las. Então, se eu arrastar e fizer um nó get, você pode ver que podemos obtê-lo como uma variável normal. E também podemos configurá-lo. Então, se eu arrastar para fora e definir, você pode ver que eu tenho um nó definido, mas podemos realmente definir manualmente qualquer opção que queremos emparelhar usando o nó definido também, ou podemos receber uma entrada se quisermos. Agora, enums são realmente úteis para controlar qual código está sendo executado em seu projeto. E a maneira como eles podem fazer isso é se nos arrastarmos para fora do nosso nó get, podemos fazer uma troca. Você veria ligar o vídeo. Novamente. Se você está em humanos chamados de algo diferente, diria ligar e então esse nome enumera. Mas o nosso é video indium. Então, vamos criar isso. Você pode ver que ele criou um nó de comutação para nós e para cada configuração que temos dentro do nosso índio, ele nos dará um pino de saída. Então, se voltarmos ao nosso vídeo em número aqui, adicionei mais algumas opções, então adicionaremos mais algumas. Vou definir isso para dizer teste 123 e teste 456. Nós salvamos isso. Agora, quando voltarmos ao nosso ThirdPersonCharacter, você provavelmente desejará compilar apenas para garantir que essas opções de atualização sejam vistas. Agora, temos nossas duas opções originais e, na verdade, adicionamos outras. E usando isso, podemos realmente controlar qual código será executado, dependendo do que nossos enums definiram como. Um bom exemplo de como isso pode ser usado, pois talvez você tenha itens em seu jogo e itens diferentes façam coisas diferentes quando usam. Então, talvez você tivesse consumíveis, medicamentos, coisas assim. Você pode ter uma opção para cada um desses tipos de item diferentes e, em seguida executar um código diferente dependendo do tipo de item. Agora, também podemos usar uma nota seleta deles. Então, se nos arrastarmos, procuramos por select. Na verdade, podemos selecionar uma variável dependendo do valor de nossos enums. No momento, ele está esmaecido porque não inserimos nenhum tipo de variável. Mas se eu fosse criar uma nova variável e chamarmos isso de float, eu vou defini-la como um float. Se colocarmos esse flutuador agora na nota selecionada, você pode ver que todos eles se tornam flutuadores. E isso pode nos permitir selecionar e produzir a partir desse valor de retorno. Podemos selecionar qualquer uma dessas entradas dependendo do nosso valor indiano. Então, por exemplo, se a definíssemos para a opção dois, o que estiver conectado à opção dois seria retornado através do valor de retorno. Agora, também podemos fazer coisas como controlar um nó de ramificação usando enums. Então, se eu apenas excluir esses nós por enquanto, podemos arrastar e fazer um nó igual. Nós podemos verificar. criar esse nó Ethereum igual aqui. E podemos verificar se nossa imunidade é igual a um se for opções nítidas? E se for, podemos gerar um valor verdadeiro e, se não, ele colocará um valor falso. Assim, poderíamos criar um nó de filial para ele e controlar se isso vai ou não ser verdadeiro ou falso, dependendo do valor de nossos sindicatos. Agora também podemos usar nosso índio dentro de nossa estrutura, para que possamos fazer isso agora, se quisermos, poderíamos voltar para a nossa estrutura de vídeo aqui, adicionar uma nova variável, e vamos chamar isso de tipo de item. Podemos definir isso para ser imune ao nosso vídeo. Exatamente assim. Salve isso e talvez quiséssemos mudar quais eram nossas opções. Então talvez isso fosse comida, bebida, carne e arma. Então agora poderíamos usar este vídeo indium dentro da nossa estrutura para definir o ID de tipo de um item. Então, se voltarmos aqui e obtivermos nossa estrutura de vídeo, podemos dizer loop através de nossa matriz. Podemos acessar todos os valores em nossas estruturas para que eu possa arrastar, quebrar nossa estrutura de vídeo. Você pode ver que agora ultrapassamos um certo número de variáveis. Então, temos essa pequena opção suspensa que podemos usar. E você pode organizar isso ainda mais. Então, talvez você só precise do valor do peso. Então você pode entrar aqui e desmarcar certas variáveis que somente a opção Peso mostra. Agora, só para manter as coisas organizadas, porque você pode ter uma estrutura com muitas variáveis. Assim, você pode desmarcar quais você simplesmente não precisa naquele momento específico. Isso não afeta seu golpe de forma alguma. Isso apenas arruma o nó. Mas também podemos acessar aquele tipo de item nele que adicionamos à nossa estrutura. Então, se nos arrastarmos, podemos usar, digamos, o nó equals. Podemos verificar se esse item, essa entrada em particular em nosso array? É um item alimentar, por exemplo, se for, então talvez queiramos executar um pedaço de código específico. Ou se fosse, digamos, uma arma, por exemplo, poderíamos fazer com que ela executasse um código diferente. Como eu disse antes, poderíamos usar esse nó de switch. Para que pudéssemos ativar o vídeo. E agora podemos alternar dependendo do tipo de item que essa entrada em nossa matriz é. Agora é isso para esta lição. Apenas como resumo, structs são uma ótima maneira de armazenar vários tipos de variáveis dentro de uma variável. E então, com matrizes, podemos armazenar muitas informações que podemos acessar facilmente. E enums são uma ótima maneira de controlar qual código em seus projetos está sendo executado. Ou podemos usá-los para selecionar variáveis dependendo das nums, fantasia. 15. Noções básicas (eventos): Olá pessoal. Nesta lição, vamos dar uma olhada nos nós de eventos. Agora, já usamos um pouco os nós de eventos em nossas lições anteriores. Se você se lembra da nota de reprodução inicial, por exemplo, que é um evento ou eventos destruídos, o nó também é um evento. Esses eventos são chamados a partir do código dentro do mecanismo. código embutido no mecanismo executa esses eventos quando o jogo começa ou quando os atores são destruídos. Agora, também podemos criar nossos próprios eventos personalizados que podemos realizar sempre que quisermos. Faça isso, podemos clicar com o botão direito. Podemos pesquisar eventos personalizados. E podemos usar a opção Adicionar evento personalizado aqui para criar um novo nó de evento. Vou chamar o meu exemplo evento, evento como esse. E você pode ver que agora parece com nossos outros eventos, mas esse evento nunca será chamado agora porque não o chamamos em nenhum lugar. Então, se eu quisesse que meu exemplo de ventilação executado e visse o código que eu conecto a ele, como print string para executar, precisaríamos chamar nosso evento de exemplo. Então, para fazer isso, podemos usar um evento existente como a nota do plano inicial para chamá-lo. Assim, poderíamos arrastar e pesquisar, por exemplo, evento. E isso agora chamaria nosso exemplo de evento quando o jogo começa. Agora podemos chamar eventos em vários lugares em nosso código. Por exemplo, se quiséssemos que esse exemplo de código de evento executado quando o jogo começar e também quando nossos personagens fossem destruídos. Nós poderíamos fazer isso também. Poderíamos simplesmente nos arrastar em outro evento de exemplo. Legal aqui. E agora, quando nosso jogo começar, chamaremos esse evento, estou executando seu código. E também quando esse ator é destruído, chamamos o evento e executamos esse código. Também podemos adicionar contribuições aos nossos eventos. Então, se selecionarmos nossa nota do evento aqui, você pode ver que há uma opção de entrada. Então, se eu clicar no botão adicionar entrada aqui, podemos ver que você tem uma nova entrada booleana. E isso adiciona uma saída ao nosso nó de evento e também entradas para nossos nós cool de eventos. Então, agora podemos controlar uma variável usando os nós principais. Por exemplo, talvez quiséssemos que nosso booleano fosse verdadeiro quando o jogo inicial for executado, mas falso quando o destruído for executado. E então poderíamos ter talvez um código diferente executado, dependendo se esse valor de saída era verdadeiro ou falso. Os eventos também são usados extensivamente na codificação para multijogador. Se selecionarmos o evento aqui, você pode ver que ele tem algumas configurações de replicação. São para multijogador. Agora, eu não vou abordar isso nesta lição porque o multiplicador é um tópico enorme e realmente você precisa saber o básico dos projetos antes de começar a codificar para multipolar, ele seguir em frente, outra coisa que você pode fazer com eventos é chamá-los de outros projetos, como podemos com nossas funções. Então, se eu puder puxar meu projeto aqui, eu vou criar um novo projeto. Só vou usar um ator e vamos vendê-lo para acionar. E eu vou abrir isso. Só vou adicionar uma caixa. colisão irá para o Gráfico de Eventos e vamos criar uma sobreposição inicial. O ator do evento começa a sobrepor Novamente. Isso é só um evento. Você pode ver que diz evento no nó. Mas isso é chamado quando algo se sobrepõe ao ator de gatilho, que nos dá uma saída de qualquer ator que o gatilho de Todd se sobreponha a isso. Usaremos um nó Cast to ThirdPersonCharacter. E se você se lembra de nossas lições anteriores, essa verificação é o outro ator que está sobrepondo nosso gatilho, um personagem de terceira pessoa. Se for, então ele nos dá acesso às suas variáveis, funções e eventos. Então, se eu sair daqui e pesquisar, por exemplo, você pode ver que posso chamar meu evento de exemplo. E também temos acesso à variável que adicionamos. E quando um ator se sobrepõe ao gatilho, verificaria se é um ThirdPersonCharacter? E se for, chamaremos evento de exemplo nesse blueprint de ThirdPersonCharacter. E se clicarmos duas vezes nesse evento, ele realmente nos levará à planta do nosso personagem. E isso nos leva diretamente ao nosso código possamos encontrar facilmente o que estamos executando. Também podemos usar eventos com temporizadores. Então, se nos desligarmos, eu começo a tocar nota aqui e vou movê-la aqui para um pouco mais de espaço. Se sairmos do meu Begin Play e procurarmos definir um cronômetro por evento. Você pode ver que temos uma opção chamada definir cronômetro por eles. E isso nos dá esse nó. Agora, se você puder pesquisar, receberá um erro. Não se preocupe com isso porque ainda não temos um evento conectado. Então, há algumas maneiras de fazer isso. Podemos arrastar nosso pin de evento aqui e, em seguida, pesquisar por personalizado. E podemos adicionar um evento personalizado como fizemos antes. E isso nos dá um novo nó de evento. Ou podemos simplesmente clicar com o botão direito do mouse e pesquisar por personalizado e adicionar um evento personalizado como fizemos antes. E podemos conectá-lo à entrada do evento aqui. Agora, uma coisa a ter em mente é que, se seu evento tiver alguma entrada, você não poderá conectá-lo a esse nó. Então, por exemplo, se eu adicionei um booleano aqui e podemos puxar, você pode ver se eu arrasto para fora do meu respiradouro do cliente aqui, não consigo conectá-lo à entrada. E isso porque temos uma variável de entrada para mover isso e compilar novamente, poderei conectar esse backup. Portanto, agora o evento timer nos permite executar um evento dependendo de suas configurações. Então, atualmente em Begin Play, queremos que nosso cronômetro seja executado, digamos, a cada 1 segundo, para que possamos definir o tempo para um e ativar o loop se quisermos que este evento seja executado a cada segundo. Para que pudéssemos assumir isso. Se deixássemos isso de fora, a jogada inicial não seria executada. Ele funcionaria no horário definido em que eu os comprasse. Isso esperaria 1 segundo e executaria nosso evento uma vez, e então seria isso. Mas se tivermos tiques em loop, ele será executado a cada segundo. Agora, os temporizadores são uma alternativa muito boa para usar o evento tick. Então, se você se lembrar, se criarmos o evento tick, isso executará todos os quadros que nosso jogo for renderizado. E muitos iniciantes tendem a anexar muito código a isso só porque ele é executado continuamente. O problema é que maioria dos códigos não precisa ser executada cada quadro e você pode facilmente arruinar o desempenho do seu projeto fazendo isso. Portanto, uma ótima alternativa é usar temporizadores. Digamos que se você precisasse que o código fosse executado a cada 1 segundo, você pode conectá-lo assim, em vez de usar uma técnica, por exemplo. Agora podemos usar um manipulador de temporizador para controlar nosso cronômetro. Então, se arrastarmos para fora deste valor de retorno aqui, podemos criar uma nova variável usando a opção promotes Variable, e isso apenas criará alguma nova variável é type is timer handle, e eu vou chamá-lo de temporizador. Agora, desta vez, uma variável nos permite controlar nosso cronômetro. Digamos, por exemplo, que queríamos executar esse cliente várias vezes e, em seguida, interromper a execução do cronômetro. Nós podemos fazer isso. Então, poderíamos adicionar, digamos, uma nova variável. Vou ligar para esse número. Vou defini-lo como um número inteiro. Vamos pegar nosso inteiro e ele apenas verificará, é igual a dizer, cinco a cinco? E faremos um nó F. Então, se não for igual a cinco, queremos adicionar um a ele. Faremos isso, vamos conseguir. Vamos adicionar um e depois sexaremos o valor do número em cinco. Queremos parar nosso cronômetro. Então, o que podemos fazer é arrastar para fora de R ou podemos obter uma variável de tempo aqui, arrastar para fora dela e procurar por clipe e usar o tempo claro e invalidado que eu compro. Então, agora, a maneira como esse código funcionaria é quando o jogo começa ou quando o personagem é gerado. Nosso cronômetro executará nosso cliente a cada 1 segundo, definiremos sua referência de cronômetro para a variável de controle do temporizador. Então, agora, quando nosso evento personalizado é executado, verificamos se o número é igual a cinco. Se não estiver, adicionamos um a ele e o definimos. E então, da próxima vez que isso for executado, depois de um segundo, verificamos novamente. E então, uma vez às cinco, dizemos a esse cronômetro para parar. Agora, usar o clear e invalida o timer pelo nó manipulado irá parar completamente desta vez. Você terá que executá-lo novamente para iniciar. Mas se você quiser continuar esse cronômetro, podemos usar um nó diferente. Assim, podemos nos arrastar e procurar, digamos, pausar. E podemos pausar o controle do cronômetro. Então, podemos executar isso em vez disso. Agora, isso nos permite dizer que talvez quiséssemos retomar o tempo limite novamente mais tarde. Poderíamos então usar o nó de não pausa que retomaria a execução do temporizador. Agora podemos testar isso e jogar. Então, vou apenas excluir o cancelamento de pausa anotado. E vou adicionar algumas cordas de impressões só para que possamos ver o que está rodando. Vamos inserir nosso número dois, imprimo uma string aqui, e adicionarei uma string de impressão até o meu tempo de pausa do código. E vou definir isso para o tempo limite. Então, agora, quando clicamos em play, tudo isso deve acontecer quando começarmos o jogo. Assim, podemos verificar se nosso tempo está passando a cada segundo. Está aumentando nosso valor numérico. Quando são cinco, a porta, o tempo limite é pausado. Agora, se você quiser encontrar os eventos que vêm integrados ao mecanismo, você pode fazer isso se formos para o nosso ThirdPersonCharacter Blueprint aqui, clique em Pesquisar evento. Você pode ver uma lista de todos os diferentes eventos que vêm incorporados ao nosso personagem. Agora, como esse é um personagem, ele tem alguns eventos personalizados que outros atores não têm. Como por exemplo, o pouso, isso será executado sempre que nosso personagem pousar de um salto. Você também pode fazer isso em atores normais, como por exemplo, nosso gatilho. Se eu clicar com o botão direito do mouse em search for event, você pode ver que ele não tem tantos eventos quanto o personagem, mas tem alguns eventos construídos e que você pode usar para executar seu código. É isso para nossa aula de eventos. usaremos eventos em nossas futuras lições, apenas porque eles são parte central da codificação e dos projetos. 16. Noções básicas (Herança de Blueprint): Olá pessoal. Nesta lição, falaremos um pouco sobre a herança do Blueprint. Agora, já falamos sobre isso um pouco antes os atores e os objetos variam de acordo com o vídeo. Se você ainda não assistiu a esse, eu recomendo dar uma olhada. Mas, essencialmente, a herança de blueprint nos permite criar um blueprint a partir de um blueprint existente que, em seguida, usa esse blueprint existente como pai. E o que isso significa é nosso novo blueprint, que faz com que o filho herde todas as funções, variáveis e código do blueprint pai. Então, primeiro vou dar um exemplo aqui. Se apenas criarmos qualquer Blueprint, vou clicar com o botão direito do mouse e selecionar Classe Blueprint. Você pode ver que quando realmente selecionamos uma dessas opções aqui, na verdade estamos escolhendo uma classe pai. Agora, temos usado o ator na maior parte do tempo porque esse é apenas o objeto mais básico que pode existir no mundo. Então, vamos selecionar o ator novamente agora. E ao fazer isso, herdamos nosso novo projeto aqui, herdamos todas as funções, variáveis e habilidades que um ator tem. Agora, se abrirmos nosso novo projeto, posso mostrar o que quero dizer. Se tivermos isso no PEP superior, se formos para nossa opção de variáveis aqui em baixo, parece que só temos nossa rota vista padrão, que vem com nosso ator. Na verdade, o diretor vem com várias outras variáveis. Nós simplesmente não podemos vê-los porque eles são herdados. Da maneira que podemos ativar isso, se formos para essa pequena engrenagem aqui, podemos clicar em Mostrar variáveis herdadas. E você vê que agora eu tenho uma tonelada de categorias que acabaram de aparecer. Agora. Todas essas são variáveis que meu novo projeto ou herdou porque é filho do ator. Todas essas variáveis foram criadas no ator. Agora podemos usar essas variáveis da mesma forma que podemos com as variáveis que criamos por nós mesmos. Então, se eu for para o Gráfico de Eventos aqui, eu posso arrastá-los para dentro, eu posso obtê-los. Não consigo definir certos. Então, por exemplo, somente relevante para o proprietário é realmente desativado. Eu não posso definir isso usando código, mas outros eu posso, por exemplo, se rolarmos para baixo, eu posso ter pode ser danificado se eu arrastá-lo e você pode ver que eu posso obter essa variável assim como nossas variáveis normais. E eu também posso configurar. E isso é o mesmo para as funções. Falamos um pouco sobre isso na lição de funções, mas quando clicamos com o botão direito do mouse e procuramos por digamos, definir para transformar, esse nó de transformação de ator definido é apenas uma função que existe em a classe de ator a que temos acesso porque nosso novo projeto é filho da classe de ator. Agora, não podemos acessar o Navegador de conteúdo e encontrar o modelo porque ele não está aqui. Na verdade, ele está embutido no mecanismo e todas as suas variáveis e funções são codificadas em C mais mais. Agora vou mostrar como podemos criar nosso próprio sistema de herança, como herdamos do ator. Poderíamos ter nosso novo projeto, ter algum código nele, algumas funções, variáveis. Então, poderíamos ter outro novo blueprint herdado de nosso novo blueprint e ter acesso a essas variáveis e funções. Então, vamos para o navegador de conteúdo aqui, e eu vou renomear meu blueprint. Eu vou chamá-lo de mestre, vou chamá-lo de BP Underscore Master. Agora, para criar um projeto filho, há algumas maneiras de fazer isso. Podemos clicar com o botão direito do mouse em nosso projeto mestre bp. Você pode ver que há uma opção aqui chamada Create Child Blueprint class. Se clicarmos nisso, você pode ver que ele nos criou qualquer novo projeto. Está dando a ele o nome BP master underscore child, e este agora é um projeto infantil do nosso mestre. Se abrirmos, você verá que em vez de a classe pai ser o ator como está no projeto mestre ou filho mestre, a classe pai é mestre da BP. Agora eu vou para o Navegador de conteúdo e renomear isso para filho apenas para, para não fiquemos confusos aqui assim. Agora, outra maneira de criar blueprints filhos é na opção Criar blueprint. Então, se formos para a aula de Blueprint, vocês podem ver aqui embaixo que tem todas as classes. E se procurarmos por BP Underscore Master, você verá que realmente o encontramos. É meio difícil de ver porque está destacado lá. Mas isso diz BP master. Se clicarmos nisso, podemos clicar em Selecionar. E isso também nos tornará filhos da máscara. Então você pode ver que ele criou um novo projeto. Se eu abrir isso, você verá que a classe dos pais também é mestre da BP. Agora vou voltar ao meu navegador de conteúdo e excluir esse novo projeto porque já temos um filho com quem podemos trabalhar. Então, agora, se voltarmos ao nosso bp master e eu vou excluir esses nós por enquanto. Vou esconder mostrar variáveis herdadas. Então, agora estamos de volta à nossa visão padrão. Vou criar qualquer variável e vou chamar isso, digamos, variável de exemplo criará uma nova função também. Vou chamar esse exemplo de função. Agora, essa variável e função são exclusivas do nosso bp master. Então, outros filhos do acesso, digamos, por exemplo, nosso personagem, que na verdade é filho do ator também. Ele não terá acesso a essas variáveis porque nosso personagem não é filho de nosso mestre bp, mas nosso filho, sinto muito. Bp Child Blueprint é filho do mestre da BP. Então, se formos para o ou se voltarmos ao nosso mestre aqui e compilarmos a maioria, salve isso também. Em seguida, voltamos para o nosso filho bp. Entramos no Event Graph. Podemos ativar isso, mostrar variáveis herdadas. Ok, então no menu suspenso, você vê que temos todas as variáveis ativas porque, embora o mestre da BP seja nosso pai, o pai do mestre da BP é o ator. Então nosso filho ainda tem todas as coisas que os atores fazem, ainda tem todas as suas variáveis são outras funções. Mas depois adicionamos o que nossos pais receberam também. Então você pode ver nossas variáveis de exemplo que podemos usar como se tivéssemos criado. Podemos configurá-lo muito bem na BP do nosso filho. Também podemos usar essa função que criamos no mestre. Então, se eu apenas clicar com o botão direito do mouse e pesquisar por função de exemplo, você pode ver que posso criar a função de exemplo e qualquer código que tivéssemos dentro nossa função aqui seria executado da mesma forma que se nós o chamamos em nosso projeto mestre do Event Graph podemos acessá-lo em nosso blueprint. E se você se lembrar do nosso vídeo de funções, podemos substituir as funções de nossos projetos pais. Então, se formos substituir na guia de funções aqui, você pode ver que temos todas essas funções que podemos substituir do nosso ator. Mas também temos o mestre da BP. E você pode ver que temos nossa função de exemplo aqui. Se eu clicar nisso, podemos assumir e alterar qual código será executado sempre que nossa função de exemplo for executada, também temos essa nota extra aqui, e isso basicamente torna o código que está na execução do projeto pai. E então poderíamos ter um código adicional, se quiséssemos. Também podemos excluir esse nó e executar completamente nosso próprio código personalizado para sempre que o exemplo funcionar como RAM. Agora, o código que está sendo executado no blueprint mestre também será executado para o nosso Projeto Filho. Então, está dando um exemplo. Vou para o Event Graph e vou excluir esses nós. Vou deletar esses também. Eles só vêm com novos atores que são criados. Então você pode ver que nosso filho agora não tem código nele. Podemos excluir isso, substituir alguns apenas selecionando a função de exemplo aqui, exclua isso. Na verdade, isso não exclui a função. Se você ver, eu ainda posso acessar a função que apenas exclui são Override of it. Portanto, qualquer código personalizado que possamos ter adicionado à substituição agora se foi e usaremos apenas o que nosso blueprint mestre tiver nessa função. Então, se eu excluir isso, você pode ver que não temos nenhum código em nosso filho. O Bp compilará e salvará isso. Agora, se eu for ao meu mestre da BP e vou criar uma nota inicial para tocar. E vou adicionar uma string impressa a isso. Então, apenas algo simples que nos deixa olá. Então, agora o único código que temos em ambos os projetos é começar a tocar e, em seguida, uma string de impressão. Agora, se eu for para o mapa da terceira pessoa arrastar meu filho BP, e arrastar meu filho BP, vou colocá-lo lá. Agora lembre-se, nosso filho não tem nenhum código nele. Mas quando eu clicar em Play, você verá que está imprimindo hello, mesmo que não tenha código lá. Isso ocorre porque a criança ainda executará o código que existe no pai. Então, nossos pais dizem para começar a tocar cordas de impressão. Então, eu vou fazer o mesmo. Agora, assim como nossas funções, também podemos substituir eventos. Então, no meu filho agora, se eu criar uma nova peça inicial de m, não vou me conectar a nada até isso. Eu simplesmente deixaria assim. Vou compilar. E agora quando eu clico em play e vejo que No Print String acontece. E isso é porque nós, estamos dizendo ao motor que nosso filho substitui seus pais começam a jogar nó. Então isso não vai mais correr para o nosso filho. Executaremos nosso próprio código personalizado para que possamos adicionar outra string de impressão e poderíamos dizer isso, isso, isso é um teste. E agora isso será executado em vez de ser executado. Então, se clicarmos em Play, você verá que isso é um teste. E novamente, se eu remover isso, começar a brincar com meu filho, você verá que ele começará a imprimir o olá novamente. Agora, você pode estar se perguntando qual é o objetivo da herança do Blueprint. Por que você não teria todo esse código e cada um dos projetos. Bem, a principal razão é porque é mais difícil manter se você tivesse todo esse código e digamos 20 blueprints diferentes e houvesse um bug com esse código. Você teria que passar e mudar 20 projetos. Ou, se você quisesse adicionar um novo recurso, novamente, teria que passar por todos esses 20 projetos e alterar o código. Agora, com a herança do blueprint, você pode ter um blueprint mestre todo o código que você precisa nele. E então projetos infantis que herdam esse código. E se talvez um dos projetos filhos precisasse fazer algo especial, mas a maior parte do código ainda precisaria ser a mesma. Você poderia ir para aquela planta infantil. Você pode substituir, digamos, uma função ou um evento e fazer com que o código personalizado seja executado somente nesse filho, sem afetar todos os outros filhos ou afetar o blueprint mestre. Um bom exemplo disso seria coisas como armas. Se você tivesse 20 armas diferentes em seu jogo, você não gostaria de ter todo o código para atirar, mirar, recarregar em cada projeto de arma, porque se você quisesse alterar qualquer um desses códigos ou corrigir um bug ou adicionar um recurso, você teria que passar por 20 ou 30 projetos fazendo a mesma coisa repetidamente. Considerando que se você tivesse apenas um projeto mestre que tivesse todo o seu código de mira , recarregando. Todas as armas são filhos desse projeto mestre. Você pode alterar tudo em um só lugar e isso afetará todos os projetos filhos. Agora, a herança também cobre os componentes do projeto mestre. Então, se adicionarmos um novo componente ao nosso blueprint mestre aqui, vou usar apenas um componente de malha estática. Você verá que temos um componente de malha estática. Agora podemos definir uma malha. Vou colocar o meu em um cubo, por exemplo. E eu vou apenas definir um cubo e compilar. Então, agora temos um cubo em nosso projeto mestre. Vamos para o Child Blueprint. Você pode ver que também temos um cubo na janela de exibição. Agora, você também pode encontrar a malha de estado no painel Componentes. Se selecionarmos isso, podemos realmente mudar nosso cubo esmagado. Então eu posso mudar isso para dizer, um pente. Então, se eu procurar por cone, posso definir isso como um cone. Agora, nosso filho tem uma malha de pilha diferente do nosso projeto mestre. Poderíamos fazer o mesmo com vários projetos filhos do nosso maior projeto. Digamos se você tinha armas Meli, por exemplo, e adiciona uma arma corpo a corpo mestre com todo o código. E você poderia então ter projetos infantis para, digamos, uma faca e atua como uma lança e assim por diante. E você pode alterar a malha da pilha para cada um deles e fazer com que todos eles ainda tenham o código do blueprint mestre. Isso vai ser tudo para esta aula. Espero que você tenha uma melhor compreensão da herança no mecanismo e também do que ela é realmente útil. 17. Noções básicas (fundição): Olá pessoal, Nesta lição, vamos dar uma olhada no nó de custo. Portanto, antes de começarmos, eu recomendo fortemente se você ainda não assistiu à lição variável atores e objetos. E também nossa lição anterior sobre herança de projetos como fundição se conecta com esses dois sistemas. Então, para começar, vamos criar um novo projeto como fizemos antes. Apenas Blueprint Class, vamos vendê-lo para um ator. E eu vou chamar esse gatilho, que vai configurar uma caixa básica que nosso personagem pode se sobrepor. E usaremos esses eventos de sobreposição para fazer algumas notas de elenco. Então, vamos abrir nosso gatilho. E eu vou apenas adicionar um novo componente, e este será um componente de colisão de caixa. Eu só vou mover isso para que quando estiver no mundo seja corrigível, seja capaz de sobrepor isso. E também estou com nossa caixa selecionada. Vou procurar por escondido. E eu vou desmarcar o jogo final oculto aqui, só para que possamos ver nossa caixa enquanto estamos jogando no jogo. Em seguida, no gráfico de eventos, vou excluir esses nós mouse e procure por começar a sobreposição. Vou usar o evento para começar a se sobrepor. E se você não se lembra de nossas lições anteriores, esse nó será executado sempre que algum ator se sobrepor ao nosso ator. Portanto, as sobreposições são desencadeadoras. Isso será executado e nos dará uma referência a qualquer ator sobre a lactose. Portanto, a saída do nosso nó begin overlap é um ato de referência. E se você se lembrar disso, podemos usar isso para acessar qualquer uma de nossas funções de ator, variáveis ou eventos. Mas talvez quiséssemos acessar informações que estavam em nosso personagem quando elas se sobrepõem ao gatilho. Agora, para fazer isso, podemos usar o custo. Então, se eu me arrastar do meu outro ator aqui e procurar o custo para a terceira pessoa. Você pode ver que podemos causar ao BP ThirdPersonCharacter. Então eu vou clicar nele e isso nos cria um novo carro nevado. E, essencialmente, o que a neve de um carro faz é pegar um objeto e verificar, é o objeto que estamos tentando fantasiar? Então, tomando nossa referência de ator, que pode ser qualquer coisa que exista no mundo, esse nó de custo verificará, é um personagem de terceira pessoa? Se for, nosso pino de execução de saída superior será executado. E podemos executar o código ou o custo falhou seria executado, e também podemos executar código diferente. Também nos dá acesso a um tipo de variável de caractere de terceira pessoa. Agora, isso só será válido se o Elenco for bem-sucedido. E o que quero dizer com válido é que só podemos obter informações por meio dessa variável se o Cast for bem-sucedido. Então, se por exemplo, talvez você tivesse um veículo quando o nível que passasse por cima do nosso gatilho, se não fosse um personagem de terceira pessoa se não fosse um personagem de terceira pessoa, o custo falharia correria. E se tentarmos obter qualquer informação de nossa saída variável aqui, usando o código que está sendo executado a partir de cost failed, nós realmente obteríamos erros porque o custo havia falhado. Portanto, não podemos realmente recuperar nenhuma informação dessa saída de ThirdPersonCharacter. Então, um exemplo de como podemos acessar informações de nosso personagem de terceira pessoa usando essa saída variável é que podemos ir para nosso ThirdPersonCharacter. E vou criar uma nova história que foi um acidente, uma nova variável. E chamaremos isso de saúde atual. E vamos defini-lo como um número inteiro. Eu só vou deletar essa nova macro. E vamos salvar isso agora e voltar ao nosso projeto de gatilho. E se nos arrastarmos, agora podemos procurar por obter saúde atual. Você pode ver que agora podemos acessar nossa variável de saúde atual por meio do pino de saída em nosso nó de custo. E se adicionarmos, digamos, uma string de impressão tal que em uma string de impressão aqui. E observe que estou conectando-o ao PIM superior porque só queremos que essa string de impressão seja executada. Se nosso custo for bem-sucedido, vamos nos arrastar da saúde atual e apenas conectá-la à nossa string de impressão aqui. E vou voltar ao meu ThirdPersonCharacter, selecionar minha saúde atual. Eu só vou definir a saúde atual para dizer 50. Então, agora, quando jogarmos e eu atropelar meu gatilho, ele imprimirá o valor da nossa saúde. Então, clique em Play. Estamos passando por cima do meu gatilho e você pode ver que está imprimindo o valor 50. Agora, se você se lembra de nossas lições anteriores sobre eventos e funções, também podemos chamar aqueles que usam nosso nó de custo. Então, se sairmos do editor de aviões, volte para o nosso personagem. Eu só vou criar uma nova função ou esfriar essa função de exemplo. E vamos adicionar algo como selá-los, imprimir barbante e cabelo porque é fácil de ver e função de exemplo de jogo. Portanto, essa é uma função dentro do nosso ThirdPersonCharacter Blueprint, e podemos chamá-la a partir do nosso gatilho. Então eu vou apenas compilar, voltar para o meu gatilho aqui, vou deletar esse código por enquanto. Vamos arrastar do pino ThirdPersonCharacter aqui e pesquisar, por exemplo, função. Você vê que agora podemos acessar nossa função que, embora esteja no ThirdPersonCharacter. E quando apertamos o play, passamos por cima do gatilho. Você verá que o código interno está realmente sendo executado como se essa função fosse executada dentro do ThirdPersonCharacter. O mesmo pode ser feito com eventos também. Então, se voltarmos ao nosso ThirdPersonCharacter, vá para o Gráfico de Eventos e crie um novo cliente. Então vou dar um zoom aqui e chamar esse exemplo. E vamos apenas adicionar outra string impressa aqui. E vamos colocar o evento de exemplo de string two. Agora, quando voltarmos ao nosso gatilho. Podemos excluir a função de exemplo e vamos arrastar para fora e podemos pesquisar, por exemplo. Você vê que agora eu posso acessar esse exemplo deles. E então, quando clicarmos em play, atropelar nosso gatilho, você verá que agora ele está imprimindo a string de impressão de evento de exemplo. Agora também quero dar um exemplo de quando um elenco falha. Então, para fazer isso, vamos sair do jogo. E eu vou criar uma nova classe de projeto, que a envia para o ator. E eu vou chamá-lo de exemplo de sublinhado EP. E vamos abrir isso e apenas compilar e salvar. Eu vou arrastá-lo. Portanto, está na guia superior aqui com o resto de nossos projetos. E eu vou criar uma nova variável. E eu vou chamar isso de Teste. E vamos compilar. Próximo. Vamos ao nosso gatilho aqui, e vamos remover essas notas. O custo do personagem de terceira pessoa que retiramos de nossa produção de outro ator e custará para nosso modelo de exemplo de bp. E vamos arrastar para fora da variável de exemplo BP. E nós fazemos o teste. Eu só vou passar uma string de impressão. E imprimiremos string se esse valor for verdadeiro ou não. Então, agora, quando compilamos e atropelamos nossa caixa, você verá que nada está acontecendo. E a razão para isso é que nosso personagem é o que está sobrepondo nossa caixa e não é um exemplo da BP. Portanto, nosso custo está falhando. Se tivermos que sair agora, volte ao nosso gatilho e adicione uma nova string de impressão ao custo falhou. Você verá que o Print String é impresso. Então, se passarmos por cima agora, você pode ver que está imprimindo “Olá”, e isso é porque a cartilagem está falhando. O objeto de entrada para nosso nó de custo não é um exemplo de BP. Então, o custo falhou. Agora, se eu tentasse obter informações do nosso cabelo de pino variável bp quando o elenco falhar. Então, na verdade, recebemos um erro e mostrarei como será se tentarmos acessar nossa variável de teste aqui, quando o custo falhar, nós compilamos e executaremos a caixa. E gays, você pode ver que o nó print string ainda está em execução e está executando false porque esse é apenas o valor padrão para variáveis. Mas se sairmos agora, você pode ver que agora estou recebendo um erro. E, essencialmente, isso está apenas nos dizendo que nosso custo falhou. Ainda estamos tentando acessar as informações dele, mesmo que tenha falhado. Portanto, sabemos que estamos acessando nossa variável de exemplo bp aqui, mas o custo falhou. Portanto, isso é algo a ter em mente ao trabalhar com notas de custos. Vou mudar isso de volta para o nosso ThirdPersonCharacter para que possamos fazer mais algumas coisas. Então, o custo para terceira pessoa, e vamos conectá-lo assim e compilar. Agora, podemos querer armazenar uma referência ao ato que se sobrepõe ao I trigger para usá-lo mais tarde com o código. Então, há algumas maneiras de fazermos isso. Poderíamos sair do nosso outro ator aqui e promover uma variável. E isso nos criará uma nova variável. E vou deixá-lo chamado de outro ator e está definido como um ato para digitar porque esse é o tipo de alfinete que é. Poderíamos definir isso aqui. E então, mais tarde, talvez tivéssemos algum outro código que estávamos executando. Mais tarde, poderíamos acessar nosso ThirdPersonCharacter apenas obtendo nossa outra variável de ator, arrastando o custo para a terceira pessoa, novamente, para custar o personagem de terceira pessoa. E, novamente, poderíamos acessar essas variáveis, funções e coisas de que precisamos. Mas também podemos armazenar a referência à nossa terceira pessoa em vez do ator. E a razão para isso é que realmente não queremos lançar nosso projeto toda vez que precisamos de informações dele. Tudo bem uma ou duas vezes, mas eles podem começar a somar e afetar o desempenho. Então, o que poderíamos fazer é nos livrar de nossa outra variável de ator aqui. Porque eu só quero que meu código o execute se for um personagem de terceira pessoa de qualquer maneira. Portanto, não há nenhuma razão real para armazenar a referência real. Podemos simplesmente armazenar a referência do personagem. Então, para fazer isso, podemos excluir nossa variável anterior. Vou apenas arrastar para fora do meu ThirdPersonCharacter, do promotes variável. E vamos deixá-lo chamado ThirdPersonCharacter e ver que ele também é definido como o tipo de variável de caractere de terceira pessoa BP. Então, vamos apenas salvar isso e compilar. Então, agora podemos acessar todas as variáveis e funções usando essa variável. Agora, não precisamos custar mais um tempo para acessar essas informações. Assim, eu poderia me arrastar e obter minha saúde atual, por exemplo, ou eu poderia acessar essas funções ou eventos de exemplo. Agora, até agora, acabamos de custar direto para o ThirdPersonCharacter Blueprint porque isso que nosso personagem é. Mas devido ao nosso projeto de personagem, também há um filho dos tipos de personagem, então sua classe pai tem caráter. Também podemos custar para o personagem. Então, se eu excluir essas notas aqui por enquanto, vamos arrastar para fora do nosso ator geral e custo para o personagem. Usará uma nota de caráter de custo. E eu vou apenas adicionar outra string de impressão aqui na caneta superior. E isso será se nosso custo for bem-sucedido, então eu terminei. Então eu vou imprimir a tela dm vai correr se nosso custo for bem sucedido, e falhar, vai funcionar se nossos carros falharem, e se atropelarmos nossa caixa agora no mundo tem caráter. Você pode ver que Don está concorrendo porque nosso personagem ou nosso personagem de terceira pessoa também é um personagem e suas paredes e nosso personagem também são importantes. Então, poderíamos voltar ao nosso gatilho novamente e substituí-lo por um custo para****. E, assim como antes, conectarei o bem-sucedido até W1 e o que falhou até a string de impressão do arquivo. E você verá quando atropelarmos a caixa novamente, que ela ainda está dando certo, porque nosso personagem é filho do****. Agora, se voltarmos ao nosso gatilho e tentarmos acessar, digamos, nossa variável de saúde a partir do custo **** aqui. Então, se eu me arrastar e não conseguir. Saúde atual, você pode ver que não podemos acessar essa variável porque essa variável não existe na classe ****. Só existe em nosso personagem de terceira pessoa. Portanto, não podemos acessar nada disso, nenhuma dessas funções, eventos ou variáveis que criamos lá por meio do ****. E isso é o mesmo para nossos custos de personagem. Então, se eu arrastar e custar caracteres novamente, novamente, só poderemos acessar variáveis, funções e eventos. Eles existem na classe de personagem, não em nada que exista em nosso ThirdPersonCharacter. E isso é útil porque talvez você tivesse cinco personagens diferentes em seu jogo e todos eles tivessem seus próprios projetos individuais. Você queria seu gatilho apenas para verificar se o personagem está se sobrepondo a mim, em vez de ter que ter um custo para cada projeto de personagem possível que se sobrepõe, você pode apenas fazer um nó de custo, digamos que é um personagem ou o projeto que está se sobrepondo a nós? Ele herda de um personagem? Se isso acontecer, então ótimo, podemos passar com sucesso. Podemos definir variáveis e, se precisarmos mais tarde, podemos até usar essa saída. Poderíamos defini-lo como uma variável de caractere. E mais tarde em nosso código, se precisássemos, poderíamos então lançar para um projeto mais específico para que pudéssemos causar até o ThirdPersonCharacter e pudéssemos acessar todas as suas informações como nós fiz antes. Então, podemos nos atualizar e conectar isso à nossa string de impressão. Então, agora, quando sobrepomos uma caixa, ela verificará se o objeto é um personagem? Se for, definiremos isso como uma variável. Em seguida, verificaremos se o personagem que sobrepusemos. É um ThirdPersonCharacter? E se for ótimo, imprimiremos a string em sua saúde atual. Então, quando sobrepomos a caixa, você esperaria que a saúde atual deles fosse impressa. Portanto, o elenco nos permite custar ou fazer com que os projetos dos filhos custem para o projeto dos pais e o custo ainda será bem-sucedido. Para que eu possa dar um exemplo disso. Podemos clicar com o botão direito do mouse em nosso ThirdPersonCharacter e criar uma classe de blueprint filho Eu só vou chamar essa terceira pessoa, na verdade, apenas manter esse nome. Vou abrir o programa Blueprint Class up. Vou selecionar a malha do personagem e vou mudá-la para dizer, o dinheiro simples aqui. Assim, podemos dizer a diferença entre os dois personagens diferentes ou compilar. E também podemos mudar o valor atual da saúde. Então, se eu pesquisar por atual, mudarei o valor de saúde atual para 25. E vamos para o nosso nível aqui, e eu vou para as janelas. E queremos as configurações do mundo. E isso só me permitirá mudar qual personagem estamos usando no jogo. Então, vou mudar de ThirdPersonCharacter para ThirdPersonCharacter child. Agora é quando clicamos em play, você pode ver que agora estamos usando o personagem filho em vez do personagem original. E se eu passar por cima dessa caixa, você pode ver que a saúde ainda está sendo impressa mesmo que não estejamos usando o ThirdPersonCharacter. E isso porque nosso filho ThirdPersonCharacter é filho do ThirdPersonCharacter. Então, em nosso gatilho, quando chegar ao nosso custo, ThirdPersonCharacter, ele terá sucesso porque nosso filho ThirdPersonCharacter ainda é um ThirdPersonCharacter é apenas um filho disso. Personagem de terceira pessoa. Portanto, todos os seus custos ainda serão bem-sucedidos. E se quiséssemos, poderíamos até adicionar código personalizado e variáveis ao nosso Projeto Filho. Então, queríamos acessá-los. Teríamos então que lançar. Ou poderíamos custar do nosso outro ator aqui, poderíamos custar ao projeto filho acessar essas variáveis. Por exemplo, se eu for ao meu filho da terceira pessoa aqui, adicionarei uma nova variável, variável, não uma macro. E vamos definir isso como um flutuador, e chamaremos isso de dano. Agora, quando compilamos e voltamos ao nosso gatilho, se eu simplesmente desconectar esse código por enquanto, se eu arrastar para fora do meu outro ator e fizer Cast to ThirdPersonCharacter. Temos nossa nota original de ThirdPersonCharacter aqui. Se eu me arrastar e tentar obter essa recuperação de danos, você pode ver que não consigo acessá-la porque essa variável não existe no ThirdPersonCharacter, só existe no filho ThirdPersonCharacter. Então, se precisássemos acessar essa variável, precisaríamos custar para nosso filho ThirdPersonCharacter. Então, vai custar para o filho ThirdPersonCharacter. E a partir disso, podemos danificar o vale assim. Também podemos acessar esse valor de saúde atual porque nosso filho herdou esse valor do modelo de personagem de terceira pessoa. Agora, outra característica dos custos. Observe que podemos mudá-los para serem puros. Então, se você se lembra de nossa lição de funções, temos funções impuras e puras. E, essencialmente, se uma função pura é executada, então isso, desculpe, uma função impura. Essa é uma função impura. O cálculo só será feito quando for executado e, em seguida, ele armazena esse tipo de referência na caneta para que possamos acessá-lo várias vezes, e esse nó só será executado uma vez quando realmente executarmos isso. Agora, se eu desconectar esse nó daqui e clicar com o botão direito do mouse e converter para custo puro. E você vê que ele se torna um nó que não tem pinos de execução, plug-in ou outro ator aqui. Então, agora, sempre que alguma informação passar por esse custo, esse custo será executado novamente. Se eu fosse imprimir a string, imprimiremos a integridade atual e imprimiremos o dano atual. Esse nó de custo seria executado duas vezes para cada pino de saída conectado a ele. Considerando que se convertermos isso de volta a um custo impuro, assim. Agora, nossa nota de custos só será executada uma vez. Ele será executado uma vez quando o executarmos através dos pinos de execução. E então ele armazena essa referência ao nosso filho ThirdPersonCharacter nesta caneta. E mesmo que estejamos usando uma string de impressão duas vezes, esse nó de custo só será executado uma vez. Então essa é a diferença entre custos puros e impuros. Na maioria das vezes, você usará o NPR só porque eles são um pouco mais ideais. E você realmente não quer que um custo seja executado para cada caneta conectada a ela. Não se esqueça de que você sempre pode simplesmente promover seu pino de saída para uma variável. Isso significa que ele só será executado uma vez. E então você pode acessar essas variáveis de blueprints no futuro sem precisar custar. Então é isso para a nossa aula de elenco. Usaremos causas um pouco mais em lições futuras só porque há uma parte muito legal da codificação e do mecanismo. Em nossa próxima lição, vamos dar uma olhada nos despachantes do evento. 18. Noções básicas (distribuidores de eventos): Olá pessoal, Nesta lição, vamos dar uma olhada nos despachantes do evento. Então, se você estava acompanhando nossa última lição, eu tinha alguns projetos extras e estava mudando algumas coisas nas configurações. Então, tudo o que fiz para esta lição foi criar um novo modelo de terceira pessoa. Então, temos um novo começo para esta lição. Então, para começar, o Event Dispatcher permite esfriar o código em Blueprints sem realmente ter conhecer o blueprint específico em que estamos chamando o evento. Vou dar um exemplo aqui para que possamos experimentar isso. Então, vou começar criando uma classe de blueprint. Vou definir isso para um ator e vou chamar isso de gatilho. E também vamos criar outra classe Blueprint, e eu vou chamar isso. Então, vamos abrir nosso gatilho. E como fizemos antes, vou apenas adicionar um componente de caixa de colisão e vamos compilar. Então vou mover minha caixa de colisão para cima um pouco para que possamos atropelá-la e o jogo. E eu vou procurar por escondido e desmarcar escondido no jogo. Em seguida, vamos para o Gráfico de Eventos. E eu vou apenas excluir esses nós, clicar com o botão direito do mouse e pesquisar por evento começar a se sobrepor. Como antes. Esse evento ocorre quando algo se sobrepõe. Então eu vou acionar e isso nos dá acesso ao ator que se sobrepôs a nós. Agora, vamos ao nosso cubo que acabamos de criar. Então abra o plano da fila. E aqui eu vou apenas adicionar um novo componente e vou apenas procurar por cubo. Vamos adicionar um cubo. Eu só vou subir um pouco assim. E vamos ao nosso gráfico de eventos e apenas compilamos. Em seguida, vamos criar uma nova variável. Só vou clicar no botão da nova variável. Vou chamar esse gatilho. E vamos definir o tipo de variável para o blueprint de gatilho que acabamos de criar. Então, para mim, essa é a opção de gatilho aqui. Vou selecionar isso e compilá-los. Vamos selecionar nossa variável de gatilho e vamos assumir a instância editável. E se você se lembrar, isso nos permitirá alterar esse valor quando selecionarmos nosso cubo no nível. Então, vamos compilar novamente, vá para o nosso mapa em terceira pessoa aqui. Eu só vou adicionar três cubos, então eu vou desenhá-los assim. E eu vou adicionar um gatilho também. Então vou colocar isso aqui. Agora vou selecionar cada um dos meus cubos e você pode ver que temos nossa opção Trigger aqui. Agora. Isso porque, quando selecionamos nosso gatilho, marcamos a instância editável. Portanto, se o seu não for, você precisa ter certeza de que está marcado e depois compilar. Então, agora podemos selecionar um gatilho. Só vou clicar no menu suspenso e selecionar nosso gatilho aqui. Então esse é o projeto do gatilho aqui. Farei isso para cada um dos nossos projetos de cubos. E tudo o que estamos fazendo é configurar essa variável de gatilho em nossos cubos para esse gatilho específico. Agora vamos voltar ao nosso gatilho e criar um novo despachante de eventos. Então, se formos aqui e eles podem painel de projetos, você pode ver que temos despachantes de eventos e podemos clicar no botão Novo despachante de eventos aqui ou podemos adicionar e selecionar Evento Expedidor. Então, eu só vou clicar nisso. Vou nomear esse exemplo de despachante assim. E vamos compilar. Agora, vamos chamar nosso despachante de eventos sempre que um personagem se sobrepõe ou aciona. Então, eu vou me afastar de outro ator. Só vou custar para o personagem. E isso nos permitirá verificar se o objeto ou personagem de entrada. Se for, então podemos executar o resto do nosso código. E eu vou sair do meu despachante de eventos aqui. Você pode ver que temos algumas opções diferentes. Eu vou checar, Clicando legal. E se clicarmos nisso, você pode ver que obtemos esse nó e isso causa nosso despachante de eventos. Agora, vou compilar e ir para o nosso cubo aqui. Eu só vou deletar esses dois, observe e eu só quero manter o nó de reprodução inicial porque vamos usar isso. Vou pegar a variável trigger aqui. Eu vou me arrastar para fora. Eu vou fazer um sinal. Vamos rolar para baixo e queremos encontrar o despachante de exemplo de seno. Vou clicar nisso. Você pode ver que isso cria alguns nós para nós. Então, ele cria primeiro e depois atribui o nó. E isso realmente nos cria um novo evento personalizado. E eu vou conectar isso até o início do jogo. Então, o que isso faz essencialmente é em Begin Play, atribuímos, bem, usamos nossa referência de gatilho aqui para atribuir nosso evento a ser executado sempre que o exemplo de despacho for chamado. E se você se lembra em nosso gatilho, sempre que um personagem se sobrepõe ou aciona, chamamos esse despachante de eventos. E o que isso fará agora são nossos cubos, todos os três executarão esse evento quando o evento, o despachante de exemplo, for chamado dentro do gatilho que selecionamos. Para que eu possa executar algum código aqui. Digamos que podemos definir a localização, a localização. Queremos que a localização do Sac seja mapeada para a localização L mais algum valor para ela. Então, faremos um acréscimo. Agora eu diria um 100 na altura e conecto até o local das notícias. Agora é quando entramos em nosso gatilho porque vinculamos esse evento. Dois exemplos, despachante ou gatilho será um exemplo legal e divertido com o despachante e nossos cubos se moverão para cima, então vamos tocar. Agora, quando eu passar por cima do meu gatilho, você pode ver que todos esses três cubos se moveram para cima. Agora, isso é útil porque nosso gatilho não precisa dizer a cada um desses cubos para fazer algo. Tudo o que nosso gatilho está fazendo é chamar o despachante de exemplo. E então nossos cubos são realmente configurados para fazer algo quando esse gatilho específico executa o despachante de exemplo. Então, esse é o básico de como os despachantes de eventos funcionam. Agora, se você se lembra quando estávamos em nosso gatilho aqui e eu arrastei meu despachante de exemplo, temos algumas opções diferentes. Então, tentamos o nó legal. É isso que executa o Event Dispatcher e executa todos os eventos atribuídos ao despachante de exemplo. Também temos vínculos. Então, se criarmos isso em C, esse é realmente o mesmo nó que tínhamos em nosso cubo. Simplesmente não criou o evento para nós. Então, talvez já tenhamos tido um evento para clientes que só queremos conectar a ele. Podemos usar um nó Bind. Se eu arrastá-lo de novo, você pode ver que temos o unbind. Isso nos permite conectar a um evento e dizer a ele que não queremos mais que esse evento seja executado para nosso despachante de exemplo. Por exemplo, se compilarmos novamente e eu clicar em Reproduzir quando me deparar com esse cubo e vê-los subir. E se eu topar com eles de novo, você pode ver que está aumentando a altura. Agora, talvez eu só quisesse que fosse executado uma vez. E depois disso, se o jogador se deparar com a pupa, ele não vai mais subir. E eu posso fazer isso. Então eu posso ir para o meu cubo e eu posso me arrastar para fora do meu gatilho e desatar. Queremos encontrar desvincular todos os eventos do Event Dispatcher, ou podemos usar eventos de desvinculação. Então, vamos usar a desvinculação deles. E podemos dizer que queremos que esse evento seja desvinculado do nosso despachante de exemplo. Então, agora isso só será executado uma vez e depois não funcionará mais. Então, se eu me deparar com isso agora e voltar e correr de volta, você pode ver que agora nosso evento não está mais vinculado ao nosso despachante de exemplo. Então, mesmo que ainda esteja sendo realizado, esse evento não está mais acontecendo. Agora voltando ao nosso gatilho, podemos nos arrastar novamente. E também há uma opção de desvincular todos. Agora, isso praticamente faz a mesma coisa. A única diferença é que não especificamos o evento. Então, se eu arrastar e desvincular tudo, podemos desvincular tudo do nosso despachante de exemplo aqui. Você pode ver que não há entrada de evento. Isso apenas desvinculará todos os eventos em todos os blueprints vinculados a esse despachante de exemplo. Agora, os despachantes de eventos também podem ter entradas variáveis semelhantes a funções e eventos. Portanto, se voltarmos ao nosso plano de gatilho aqui e selecionarmos nosso exemplo de despachante no painel Detalhes. Só vou me livrar dessa busca oculta. Você verá que temos insumos. E se clicarmos no botão Novo parâmetro aqui, podemos adicionar novas variáveis. Então, podemos adicionar flutuadores, booleanos, qualquer tipo de variável que você quiser. Eu só vou adicionar um flutuador e vou definir isso para ser chamado, digamos float. Vamos compilar. Você pode ver que ele está me dando um erro aqui e não atualizou o nome da variável. Às vezes, isso pode acontecer com os despachantes de eventos. Não se preocupe muito. Você pode simplesmente clicar com o botão direito do mouse no nó e nós faremos a atualização dos nós. E você vê que agora mudou o nome para o que deveria ser e podemos apenas compilar. E agora não temos erros. Agora isso adicionou essa entrada variável ao nosso despachante legal. Se formos ao nosso cubo agora e compilamos, você pode ver que ele adicionou automaticamente essa variável flutuante ao nosso evento aqui. Agora, tudo o que definimos em nosso Event Dispatcher é o que será exibido aqui em nosso evento. Então, se eu, por exemplo, quisesse que isso fosse cinco, e eu fui para o nosso cubo, eu só vou fazer, eu tinha uma corda impressa. Então, vou apenas adicionar uma string impressa aqui. E conectaremos a string de impressão ao valor flutuante, que os move um pouco. Então, temos um pouco mais de espaço assim. Agora, quando esse evento for executado, ele imprimirá qualquer valor que seja nosso valor flutuante, e isso é definido pelo nosso Despachante de Eventos. Então, se eu compilar, tocar e correr para o meu cubo, você pode ver que todos esses três cubos estão executando o código, então ele imprime strings 53 vezes. Agora, o legal dos despachantes de eventos é que podemos ter muitos outros projetos que também estão usando esse despachante de eventos que acabamos de configurar. Para que, talvez, quando um personagem entra em uma sala, você tenha um gatilho pelo qual ele passa. E talvez você quisesse que o quarto mudasse de alguma forma. Você queria que alguns objetos desaparecessem. Você queria que alguns objetos se movessem, talvez, talvez um som para tocar. Você pode ter tudo isso acontecendo usando apenas um despachante de eventos que é executado quando seu personagem se sobrepõe a uma caixa. Agora voltando ao nosso projeto de gatilho, se você se lembra quando selecionamos nosso despachante de eventos aqui, também temos uma opção chamada cópias de assinatura de. E se eu clicar nisso, você pode ver que temos algumas opções diferentes. Agora, basicamente, isso permite que você copie as variáveis de entrada de outro despachante de eventos. Portanto, há uma grande lista deles aqui porque o mecanismo vem com um monte de despachantes de eventos integrados. Portanto, isso é útil apenas se você quiser, em vez de ter que adicionar manualmente entradas variáveis. Digamos que você já tenha um despachante de eventos com as mesmas entradas que deseja usar. Você pode usar Copiar assinatura de e adicioná-las imediatamente. Agora, para dar um exemplo de que alguns dos despachantes de eventos estão realmente integrados ao mecanismo. Podemos clicar com o botão direito do mouse e pesquisar por bind. E se percorrermos isso, você pode ver que temos alguns eventos de vinculação integrados. Por exemplo, temos alguns para entradas de mouse, alguns para danos e também alguns para colisão. Você pode realmente ver que há um evento de ligação para um ator começar a se sobrepor. É o mesmo que nosso evento aqui. Então, poderíamos configurar isso de forma diferente. Então, se eu clicar em Vincular evento também. Em atos ou começar a sobreposição obterá um nó de jogo. Conecte isso até aqui. Agora podemos realmente excluir esse evento e criar nosso próprio evento personalizado que será executado sempre que um ator se sobrepor, eu acionarei usando esse despachante de eventos. Então eu posso clicar com o botão direito do mouse ou posso realmente arrastar para fora do evento aqui, pesquisar por personalizado. Você verá que acabou de fazer um evento para nós e, na verdade adicionou aqueles atores sobrepostos e outros atores aqui. Então eu posso chamar isso, digamos. E agora podemos conectar isso. Podemos pegar o pino do outro ator, conectá-lo à nossa verificação de personagem. Então agora, essencialmente, o que esse código está fazendo é em Begin Play, vinculamos um evento, que é nosso evento de sobreposição aqui, a quando um ator começa a sobrepor nosso gatilho. E então, quando um ator se sobrepõe, eu acionarei ou o evento de sobreposição será executado. Isso nos dará o outro ator. Podemos verificar se outro ator que está se sobrepondo, eu aciono um personagem. Se for, então chamamos isso de nosso exemplo de despacho. Podemos testar se isso está funcionando, então vamos apenas compilar e salvar, clicar em Play. E agora, quando estamos passando por cima do gatilho, você pode ver que esse código ainda está sendo executado como antes. Mas, em vez disso, agora estamos usando um Event Dispatcher que está realmente embutido no mecanismo. Agora, até agora, eu só usei o Event Dispatcher para resfriar eventos em outro Blueprint. Então, por exemplo, um cubo aqui executa este evento When example dispatcher is rum, mas também podemos usar nosso Event Dispatcher dentro do mesmo blueprint. Então, talvez eu quisesse que um evento executado quando eu chamasse meu Event Dispatcher, na verdade, dentro do meu gatilho, eu poderia fazer isso também. Para que eu pudesse arrastar meu despachante de eventos. Eu poderia fazer, se clicarmos em Atribuir aqui, ele faz a mesma coisa que o evento Bind, mas também cria nossos eventos personalizados. Então, se eu clicar em atribuir, você verá que ele criou nosso evento Bind e o desabafo do cliente. Enquanto que se eu arrastar para fora e ligar, você pode ver que isso apenas cria a ligação. Isso está a apenas um clique de distância, basicamente criando os dois nós juntos. Então, podemos fazer isso. Eu posso conectar isso aqui. E vou mover meu evento this aqui em c que nos dá uma saída flutuante. Porque se você se lembra, temos uma entrada flutuante em nosso despachante de exemplo. Legal. E poderíamos executar algum código dentro do nosso acionador, e isso será executado sempre que nosso despachante de exemplo for chamado. Então eu poderia adicionar uma tela de impressão aqui, dizer olá. Agora, quando chegarmos ao nosso cubo, você verá que ele imprime os cinco valores para R ao cubo. E depois só é executado uma vez. Olá, porque temos apenas um gatilho e esse código está sendo executado dentro do nosso gatilho. Agora, algo a ter em mente com esses eventos, despachos é, se eu já tiver um evento personalizado, digamos que vou criar um personalizado deles, e talvez ele tenha entradas diferentes. Então, vou apenas adicionar uma entrada flutuante. Se eu tentasse conectar isso ao Event Dispatcher para um ator começar a se sobrepor e ver que não consigo conectá-lo. Se eu desconectar isso, você pode ver que ainda não consigo conectá-lo. E isso porque esse evento personalizado não tem as entradas nem as saídas. Esse nó de vinculação requer. Portanto, qualquer evento de cliente ao qual nos conectamos precisa ter essas duas variáveis. Então, não consigo conectar isso a isso. Posso conectá-lo ao nosso despachante de exemplo assim, porque ele tem um valor flutuante e é isso que é necessário, por exemplo, despachante. Então, normalmente, a maneira mais fácil se você tiver apenas um evento Bind, digamos assim, é simplesmente arrastar e procurar por Customer them. E isso criará um evento personalizado para você. E ele adicionará qualquer uma das variáveis que você precisa para poder se conectar a esse despachante. Agora, como você provavelmente pode imaginar, se você tivesse muitos desses, você teria esses fios longos espalhados por todo o lado e poderia ser um pouco confuso. O que você pode fazer em vez de ter passar o fio para o evento aqui, ela pode arrastar para fora e você pode pesquisar por Criar evento. E você recebe essa pequena nota aqui que nos permite selecionar outro evento. Então, podemos clicar aqui e você pode ver que ele está apenas me dando a opção sublinhado 0 de ventilação do cliente e exemplo de evento de sublinhado do despachante. E isso só está me dando essas opções porque eles são os únicos eventos que têm nosso valor flutuante. E posso dizer que select selecionará nosso exemplo de despachante deles assim. Agora você pode ver que nosso fio vermelho não está mais conectado a esse evento. Mas eu vou olá relógio de corda, eles ainda funcionam porque esta nota Criar evento aqui basicamente conecta o despachante de eventos ao evento aqui em cima, sem realmente conectar um fio. Então, se compilarmos o jogo, eu estou correndo para o nosso gatilho aqui. Você pode ver que nossa string de impressão Hello ainda está em execução, mesmo que não esteja diretamente conectada a esse nó Bind. Agora, criar um nó de evento nos permite usar funções com despachantes de eventos também. Portanto, se clicarmos na opção suspensa aqui, você poderá ver que podemos defini-la como nenhuma. Também podemos criar uma função ou evento correspondente. Se você clicar em evento correspondente, ele criará um novo evento personalizado aqui em baixo. E ele adicionará as saídas variáveis apropriadas que o Event Dispatcher precisa e, em seguida, também a definirá automaticamente para esse novo evento. Então, agora, quando as execuções em lote de eventos estão acostumadas, o evento será executado. Mas também podemos criar funções que vão esfriar. Em vez disso, podemos clicar em Criar uma função correspondente e isso nos cria uma nova função. Esta é apenas uma função normal como já usamos antes, é que esta agora será executada sempre que nosso despachante de exemplo for executado. Assim, você pode ver que ele adicionou automaticamente um flutuador para nós. Isso será executado como uma função normal. Então, poderíamos adicionar algum código a isso, se quiséssemos . Eu tinha uma tela impressa. Agora, para colocar isso em funcionamento, sabemos que é essa string de impressão que está sendo executada. E agora, quando apertamos o play, eu atropelo meu gatilho aqui. Você pode ver que isso os mantém em movimento ao imprimir esses cinco valores. E também é função de impressão porque essa função dentro do nosso gatilho agora está sendo executada porque está configurada para ser vinculada ao despachante de exemplo. Então é isso para a nossa aula de despachantes de eventos. Há uma ótima ferramenta para poder chamar um evento e um blueprint e efetuar muitos outros blueprints e maneiras diferentes sem precisar especificar cada blueprint que você deseja efetuar. 19. Básico (Interfaces): Olá pessoal. Nesta lição, falaremos sobre as Interfaces Blueprint. As Interfaces de Blueprint nos permitem chamar funções e eventos em outros Blueprints sem ter custar com esse tipo de blueprint. Agora você deve ter notado que eu ainda tenho o cubo e as plantas de gatilho da minha lição anterior. Eu só vou mantê-los porque vou reutilizá-los para um exemplo um pouco mais tarde. Então, para começar, vamos criar uma nova Interface Blueprint. Se eu clicar com o botão direito do mouse aqui e for para as plantas, apareça e nós iremos para a Interface do Blueprint. Eu só vou chamar o meu BP na interface de exemplo de pontuação como essa. E vamos clicar duas vezes nele para abri-lo. E eu vou apenas arrastar o meu e adicioná-lo à guia aqui em cima. Então, como você pode ver, temos uma nova interface de usuário. Temos esse grande gráfico de eventos que, na verdade, não vamos usá-lo. Não podemos fazer nenhuma edição aqui ou adicionar qualquer código é apenas uma prévia das funções que adicionamos. E você pode ver que temos nossa guia de funções aqui , onde podemos criar e excluir funções. E se tivermos uma função selecionada, podemos adicionar entradas e saídas. Então, começaremos renomeando a função padrão que vem com nossa interface de exemplo. Então, vou renomear a minha para diminuir a saúde assim. E vamos compilar e voltaremos aqui em um momento. Mas eu quero mostrar a vocês como a função de diminuição da saúde se parece em nosso projeto de personagem. Então, vamos para o ThirdPersonCharacter. Vou clicar com o botão direito do mouse e procurarei por diminuir a saúde. E você pode ver que isso surge ou diminui o nó da mensagem de saúde. Agora, como criamos isso em nossa interface de exemplo, isso aparecerá em cada blueprint se clicarmos com o botão direito do mouse e procurarmos por ele. Então, se eu criar isso, você pode ver que se parece muito com o nó legal que usamos com os eventos. Com algumas diferenças. Temos esse ícone no canto superior direito, e também temos a entrada de destino, mas não diz self ao lado dele. Na verdade, temos que fornecer um alvo. E isso é apenas o, o projeto ou a referência ao projeto que queremos chamar de nossa diminuição. Como funciona em. Agora, se eu fosse executar este nó agora, então se eu pegar o Plano e conectar isso para diminuir nossa função, nada aconteceria porque não fornecemos um alvo. Mas se nos arrastarmos e fizermos a nós mesmos como alvo, nada aconteceria ainda, porque não implementamos essa função em nosso personagem de terceira pessoa. Então, para fazer isso, precisamos compilar primeiro, vamos para as configurações da classe. E em Interfaces implementadas, diz que não há interfaces atualmente, mas podemos adicionar uma nova. Então, clicaremos em Adicionar e pesquisaremos, por exemplo. E selecionaremos a interface de exemplo lá. E então vamos compilar. Agora, se formos para a interface é a opção a, você pode ver que diminuímos a saúde. Agora, se clicarmos duas vezes nisso, isso criará um evento de diminuição da saúde. Agora, quando corremos, quando nosso Begin Play é executado e ele executa esse nó de redução de saúde com nosso eu como alvo. Este evento aqui em baixo será executado. Eu só vou movê-lo para mais perto do nosso nó de jogo inicial aqui, que se move para cá assim. Para que possamos testar isso rapidamente. Vou apenas executar uma string de impressão e clicaremos play e veremos que a tela de impressão que acabamos de adicionar está em execução. Agora também podemos adicionar entradas e saídas às nossas funções de interface. Então, se voltarmos para a interface de exemplo, selecione nossa diminuição de saúde. Vou adicionar uma entrada primeiro, então vou adicionar uma nova entrada. Vou deixar como booleano. E vou apenas dizer que isso é, vamos chamá-lo de teste por enquanto. Você pode ver que a visualização está atualizada. Ele diz que o teste será compilado e retornará ao nosso ThirdPersonCharacter. E você pode ver agora que nossa nota legal aqui, o nó de recall da função de interface de diminuição de integridade agora tem uma entrada de teste e nosso evento tem uma saída de teste. Portanto, seja qual for a nossa entrada de teste, essa será a saída para o nosso nó de evento. Se eu pegar isso e conectar isso em nossa corda aqui, quando apertarmos play, você verá que ele imprimirá string true, true. Agora, também podemos adicionar saídas ao nosso exemplo de função Interface. Então, se formos a isso, vou pressionar Escape para aceitar que o editor do plano selecionará diminuir a saúde. E aqui embaixo, podemos adicionar uma nova saída. Então, vou adicionar uma saída. Há um bug agora em que agora tudo se foi, esmaecido. Eu tenho que compilar e, em seguida, selecionar a diminuição da nossa função novamente, você pode ver que agora posso renomeá-la e acessar essas informações. Talvez no momento em que você estiver seguindo esta lição, isso esteja consertado. Mas, por enquanto, é isso que você tem que fazer. Quatro saídas. Eu só vou nomear essa saúde atual assim. E vamos defini-lo como um número inteiro e vamos compilar isso. Agora, adicionar saídas a uma função de interface realmente causará algumas alterações em nosso esquema de personagem. Então, se voltarmos ao nosso personagem, você pode ver que nosso nó de evento agora tem um aviso nele e ele realmente se converteu em um cliente, então não é mais uma interface eventos até o momento de acertar o jogo agora. E você pode ver que nossa string de impressão não está mais em execução porque esse evento não está realmente sendo resfriado. E se formos ao nosso serviço de saúde diminuído e clicarmos duas vezes nele, você pode ver que ele realmente nos levou ao que parece ser uma função. Agora, ele não adicionou nosso nó de saída. Podemos adicionar isso apenas clicando com o botão direito do mouse e retornando. Queremos adicionar nó de retorno. E você vê que agora está nos dando uma caneta de execução de saída com nossa saúde atual de saída. Variável. Você pode não ter que fazer isso. Ele pode apenas adicionar automaticamente o nó retornado para você, mas às vezes isso não acontece. Então, se isso não acontecer, então você mesmo pode começar. Então, agora essa função será executada no local Begin porque ainda estamos chamando a função de interface de diminuição da integridade. Então, se conectarmos isso à nossa saída, agora, talvez eu queira que ele produza um valor de saúde atual. Então, criaremos um novo valor para a saúde. Saúde. Nós mudamos isso para um número inteiro. Vou compilar, vou definir isso para 100. Agora, porque isso é uma diminuição da função que chamei , fará com que diminua em alguma quantidade. Nós vamos subtrair e vamos fazer Set Health. Agora. Subtrairemos cinco da nossa saúde e, em seguida, produziremos o valor atual da saúde. Como você pode ver, você pode simplesmente escrever código aqui como uma função normal. Ele se comporta exatamente como funções que usamos antes. Então, agora, se formos ao nosso gráfico de eventos, se você se lembrar de Começar a Jogar ou diminuir a saúde, função da interface será resfriada. Temos testes marcados, mas não estamos fazendo nada com isso e diminuímos a forma como funcionam, como você pode ver, não está conectado a eles. E então queremos que ele retorne um valor de saúde atual. E eu posso adicionar uma restrição a isso, que começou a imprimir string aqui. Agora estão diminuídas as funções de saúde que tínhamos anteriormente. Isso não está fazendo mais nada. Ele acabou de ser convertido em um cliente normal, então podemos excluí-lo agora. E se eu conseguir puxar e apertar Play, você pode ver que nossa saúde atual caiu em cinco. Começou em 100 e agora são 95. Então você pode estar se perguntando qual é o objetivo da interface. Estamos apenas usando esses eventos e funções normais. Agora, o legal sobre eles é que podemos usá-los em outros projetos sem ter que lançar para dizer personagem em primeira pessoa. Então o que eu vou fazer é ir para o meu gatilho aqui. E vou para o Gráfico de Eventos agora, esse código é da lição anterior, então vou destacar e excluir isso. Também vou excluir essa função . E vamos apenas compilar. Agora, normalmente, se eu quisesse dizer diminuir meu valor de saúde e meu ThirdPersonCharacter, criaríamos um evento, começaríamos a sobreposição ou começaríamos a sobreposição de atores. E isso é executado sempre que algo se sobrepõe, eu vou acionar e isso nos dá acesso ao ator se sobrepôs ao nosso gatilho e custaríamos para o ThirdPersonCharacter como fizemos em nosso vídeo de elenco. Então, obteríamos nossas funções, digamos que eu diminuiria a função de saúde, ou obteríamos nossa variável de saúde. Em seguida, diminuiríamos e definiríamos o novo valor usando nosso carro nevado. Mas o que as Interfaces Blueprint nos permitem fazer é, em vez de ter que lançar, podemos simplesmente arrastar para fora de outro ator e podemos procurar uma função de interface de saúde reduzida e criar isso e esse será o nosso alvo, quaisquer que sejam as sobreposições que eu acionar, chamaremos a função de diminuição da saúde nesse projeto. E isso só será executado nesse blueprint se tivermos implementado a interface como fizemos em nosso ThirdPersonCharacter. Você se lembra, definimos a interface e aqui, se um objeto que não usa interface de exemplo RPP se sobrepõe, então eu vou acionar, esse código ainda será executado, mas nada acontecerá. Não receberemos nenhum erro, não teremos problemas. Isso será ignorado e, em seguida, o resto do código será executado. Agora, como nosso ThirdPersonCharacter usa uma função de diminuição quando sobrepomos nosso gatilho, ele será executado. Então, se formos para o nosso personagem de terceira pessoa aqui, eu vou apenas abrir a função celular diminuída e adicionarei, ou realmente voltaremos ao nosso gatilho aqui. Vamos adicionar uma string de impressão e aqui em vez disso, então eu tive que imprimir uma string e imprimiremos nossa saúde atual. E porque nossos personagens, o que vai se sobrepor ou desencadear isso diminuirá sua saúde em nosso personagem e, em seguida, obteremos saúde atual de nossos personagens para que possamos compilar o jogo. Agora, quando atropelamos nosso gatilho, você pode ver que nossa saúde diminui. Agora, a coisa boa sobre isso é que não estamos limitados a apenas fazer isso em nosso ThirdPersonCharacter. Se quiséssemos outras plantas, digamos, um veículo, por exemplo, quando ele acerta esse gatilho, queremos reduzir sua saúde também. Nós podemos fazer isso. Então, se abrirmos nosso modelo de cubo aqui, por exemplo, vou excluir esse código da lição anterior. Nós adicionamos uma variável de saúde. Também diremos isso para um número inteiro. E definiremos o valor para dizer 50. Agora, se nosso cubo se sobrepusesse ao cabelo do gatilho, nada aconteceria porque nosso cubo não tem a interface de exemplo implementada. Então, vamos fazer isso agora. Adicionaremos a interface de exemplo e compilaremos. Agora, como você pode ver, a função de saúde diminuída está agora na guia Interfaces aqui. Mas se eu fosse um cubo para sobrepor nosso gatilho, agora, ele ainda não faria nada porque na verdade não adicionamos nenhum código à função de diminuição de saúde dentro do nosso cubo. Se abrirmos isso, basta clicar duas vezes para cima, você pode ver que temos nosso nó de retorno e nota r aqui. E podemos executar o código. Então, se eu quisesse, eu poderia fazer saúde. Faremos menos. E dizemos, bem menos cinco. E então definiremos e retornaremos a saúde atual aqui. Então, agora, quando nossas sobreposições de cubo forem acionadas, essa função será executada. Ele pegará o valor de saúde atual menos cinco, definirá o valor de saúde atual e o retornará. Então, se apertarmos Play, se eu atropelar com meu personagem, você pode ver que ainda está diminuindo nosso valor de saúde. Mas se eu pressionar F8, o que basicamente me impede de controlar meu personagem e me permite me mover livremente. Mas o jogo ainda está rodando. Eu posso selecionar meu cubo se eu movê-lo para o gatilho, você pode ver que quando ele entra no gatilho, ele está realmente imprimindo seu valor de saúde e também está diminuindo. Então, espero que isso lhe dê uma ideia de como as Interfaces Blueprint funcionam. Essencialmente, eles nos permitem criar funções que podem ser executadas em diferentes projetos sem ter que custar para esses projetos. E isso é útil em casos de uso como nosso gatilho aqui, onde se você quiser uma caixa de gatilho que uma caixa de gatilho danifique qualquer coisa que tenha saúde nela, você pode configurá-la usando Interfaces de Blueprint. 20. Noções básicas (componentes): Olá pessoal. Nesta lição, examinaremos projetos dos componentes. Agora, se você está acompanhando a lição anterior, tudo o que fiz aqui foi criar um novo modelo de terceira pessoa. Então, temos um novo começo para esta lição. Então, para começar, usamos componentes para adicionar novas funcionalidades aos projetos do ator. Então, por exemplo, em nosso nível aqui, se eu selecionar o solo, por exemplo, e mais no painel Detalhes, temos a guia de componentes que mostra quais componentes esse ator tem. Assim, podemos ver que ele tem um componente de malha estática. E é isso que nos permite definir uma malha estática para exibir no mundo para esse ator. Agora, existem muitos tipos diferentes de componentes. Então, se eu for para o meu Modelo de Personagem, por exemplo, e formos para a janela de exibição. Você pode ver no painel Componentes que temos alguns tipos diferentes de componentes aqui também. Então, para começar, nosso personagem tem um componente de cápsula, que é essa área de colisão em forma de cápsula. E é isso que impede que nosso personagem simplesmente caia no chão ou seja capaz de atravessar paredes. Então temos um componente de seta, que basicamente é configurado para apontar na direção para frente do nosso personagem. Temos o componente de malha, que é um componente de malha esquelética. E isso nos permite definir uma malha esquelética. E a malha esquelética é apenas uma malha que pode ser animada. Então temos o boom da câmera, e a câmera que está conectada ao boom da câmera. E a maneira como funciona é se entre o final do boom da câmera e o início da borda comum, há um objeto bloqueando que ele ficará mais curto. E porque nossa câmera está conectada ao final da câmera, boom, isso aproximará nossa câmera do personagem. Se houver um objeto bloqueando nossa câmera, bum. Então temos nossa câmera. E nossa câmera é exatamente o que nos permite escolher a perspectiva que nosso jogador vê quando está controlando esse personagem. Agora, todos os componentes do explicado até agora estão vendo componentes. Esses são componentes que podem existir no mundo. Eles têm uma localização e às vezes têm objetos visíveis para eles. Mas também temos um tipo diferente de componente que é apenas código. Eles não têm uma localização. Então, por exemplo, se este for nosso Componente de Movimento de Personagem aqui, que vem embutido no mecanismo e incorporado ao nosso projeto de personagem. E se quiséssemos, poderíamos adicionar esse componente a outros projetos também. E é isso que lida com o movimento do nosso personagem. A diferença importante entre um componente coletor e um componente padrão é que um componente padrão não existe no mundo, não tem uma localização e não pode ser visível para o jogador. Considerando que os componentes de visão podem existir no mundo. Eles têm uma localização em uma rotação. E alguns deles, como nosso componente de malha, por exemplo, têm um objeto físico no mundo. Agora, a razão pela qual usamos componentes em vez de apenas colocar todo esse código e funcionalidade diretamente no blueprint de um ator de blueprint é porque podemos reutilizar componentes em vários blueprints que podem poupamos muito tempo tendo que escrever código repetidamente ou copiá-lo e colá-lo quando poderíamos fazer isso apenas uma vez em um componente e, em seguida, reutilizar esse componente em vários blueprints. Da mesma forma como as funções são úteis, porque podemos alterar o código em um só lugar e isso afeta em todos os lugares em que a função está sendo usada. Se alterarmos o código dentro de nosso blueprint de componente, o blueprint que está usando esse componente também será atualizado e obterá essas alterações. Podemos criar nossos próprios componentes de blueprint. Todos os que vimos até agora estão embutidos no motor. Se você clicar fora, poderá ver todos os componentes que realmente vêm com o motor. Mas se quisermos criar o nosso próprio, precisamos acessar o Navegador de conteúdo. Vamos clicar com o botão direito do mouse e ir para a classe Blueprint. E então aqui você pode ver na parte inferior que temos componente ativo e o componente coletor. Agora, se você se lembra da cena completa , os componentes podem existir no mundo. Eles têm uma localização, enquanto os componentes ativos não. Eles são puramente código. Começaremos criando um componente ativo. Eu só vou chamar esse VP para sublinhar o componente do ator assim. E vamos clicar duas vezes nele para abrir. Depois, vou arrastar a guia até a barra superior com as plantas. Agora, você deve ter notado que essa interface do usuário parece um pouco diferente do nosso editor de blueprint normal. E, como você pode ver, não temos um painel Componentes porque os componentes podem ter seus próprios componentes. Somente atores podem. Também não temos uma janela de visualização porque esse é um componente ativo. Ele não tem componentes de partes visíveis. Portanto, é puramente código. Portanto, só temos acesso à interface do usuário relevante ao código. Passe essas diferenças. Não há muita diferença na codificação e componente do que na computação e na codificação em um blueprint. Temos nosso nó ou nó de reprodução inicial, por exemplo, eles estão aqui por padrão, mas podemos acessar a maioria dos eventos e funções que podemos em nosso blueprint ativo normal dentro de um componente. Agora, como esse é um componente ativo, não posso fazer algo como, digamos, obter localização e não podemos encontrar o nó getLocation porque esse ator, desculpe, componente, não tem um local. Então, posso dar um exemplo de como podemos executar código e componente I. Agora, se eu me arrastar para fora do meu grande jogo aqui, eu vou apenas adicionar uma string impressa. Então eu adicionei algum código ao meu componente. E se eu puder pesquisar e clicar em Play, você verá que nada acontece. Agora, isso é porque eu não adicionei meu novo componente ativo a nenhum projeto existente no meu nível. Então esse código não será executado. Mas se eu for para o meu ThirdPersonCharacter aqui e eu for adicionar, e eu procuro pelo componente ator. Você pode ver que temos nosso BPR, seu componente, é quando acabamos de criar ou adicionar isso. E você pode ver que ele foi adicionado a essa segunda metade do painel junto com o movimento do personagem. Isso porque ambos são apenas componentes ativos, não vendo componentes. Mas agora, se eu compilar e voltarmos para a peça e o editor, você pode ver que agora esse código dentro do nosso componente está realmente em execução porque agora está anexado a ThirdPersonCharacter e seu início de jogo será executado quando o personagem em terceira pessoa for gerado ou quando o jogo começar. Agora também podemos acessar funções, eventos e variáveis do nosso componente ativo dentro do blueprint ao qual os adicionamos. Então, se sairmos de um editor e eu voltar ao meu componente ativo aqui. Vou apenas adicionar , digamos, uma nova variável. Vamos chamar isso de Teste. criarei uma nova função e chamaremos esse exemplo de função. E também vou criar um evento ou criar um evento, vou chamar esse exemplo. Então agora temos nosso evento, função e variável, e tudo isso está dentro do nosso componente ator. Agora, se eu voltar ao meu personagem de terceira pessoa aqui, posso acessar essas variáveis e funções com muita facilidade apenas arrastando meu componente BPS do painel Componentes. Arraste para fora. E eu posso apenas pesquisar por teste, por exemplo. E eu posso definir essa variável de teste se eu quiser. Também posso acessar as funções para que eu possa arrastar e pesquisar, por exemplo. E você pode ver que posso acessar minha função de exemplo e meu evento de exemplo. Exatamente assim. Agora, um bom exemplo de um sistema que você pode querer colocar em um componente é algo como um sistema de saúde. E a razão para isso é que você pode ter vários atores em seu jogo que você queria ter um sistema de saúde. Agora, em vez de ter que adicionar uma variável e funções que afetam sua saúde a cada um desses atores. Poderíamos simplesmente criar um componente de saúde e adicionar esse componente de saúde aos vários atores. Então, porque podemos simplesmente acessar as funções e variáveis do nosso componente facilmente dentro de qualquer blueprint ao qual o adicionamos. Poderíamos então usar esse sistema de saúde sem precisar recriar todas as funções e variáveis dentro do blueprint. Agora, também podemos acessar e atores componentes de outros projetos. Então, se eu montar rapidamente um projeto de gatilho, vou apenas criar um novo projeto. Haverá um ator. Eu só vou chamar isso de gatilho vai abrir isso. Vou adicionar um componente de colisão de caixa. Colisão de caixa. Vamos, vou subir um pouco. E eu vou desligar escondido no jogo. Em seguida, iremos para o Gráfico de eventos e excluiremos esses nós. E eu vou criar um começo sobre a volta. Se você se lembrar, esse nó é executado sempre que algo se sobrepõe, eu aciono e ele nos dá acesso ao ator que se sobrepôs a nós. Assim, podemos acessar nosso componente nosso ThirdPersonCharacter e de algumas maneiras diferentes. Se eu me afastar de outro ator e pesquisar custará para a pessoa. Agora temos nosso nó de custos, sobre o qual, se você se lembrar, fizemos uma lição separada sobre. E se nos arrastarmos, podemos acessar isso. Ou eu vou personagens de terceira pessoa, variáveis e funções. Mas também podemos acessar seus componentes. Então, se eu pesquisar por componente de ator, nós rolamos para baixo que geralmente na parte inferior aqui você pode ver que eu posso obter nosso componente ativo que nos permite acessar qualquer uma das funções e variáveis de nosso componente x por meio de nosso ThirdPersonCharacter. Se eu me arrastar quando procuro por testes, por exemplo, obter teste, lá vamos nós. Eu posso acessar essa variável. Também posso acessar se eu pesquisar, por exemplo, você pode dizer que posso acessar meu evento de exemplo e minha função de exemplo. Agora, há outra maneira de acessar os componentes de nossos atores sem o elenco. E podemos fazer isso usando um nó que, se nos arrastarmos para fora do nosso ator, procurará o componente ao entrar em conflito. Veja aqui, se eu criar esse nó. Agora, essencialmente, o que isso faz é pegar uma entrada de ator e definir uma classe de componente para que eu possa pesquisar por componente de ator. E vou definir isso para o componente BP act. Esse é o que criamos. Isso verificará se nossa entrada de ator tem esse componente? Se isso acontecer, ele exibirá uma referência a esse componente aqui. E se eu me arrastar, posso pesquisar novamente apenas a partir da minha variável de teste. Também posso acessar os eventos e funções que criamos. Agora, se r não tiver um componente ativo, essa referência não será válida. Então, o que fazemos sempre que usamos esse nó é apenas ter certeza de que usamos e é um nó válido como esse. Então, agora, quando um objeto sobreposto for acionado, esse evento será executado. Ele vai verificar, esse ator tem nosso componente bp act? Então, se isso acontecer, produziremos uma referência válida. Portanto, R é válido, seria executado válido. E se isso não acontecer, então o nó é válido seria executado, não é válido. Agora podemos ter vários do mesmo componente nos mesmos projetos. Então, se eu for para o meu personagem de terceira pessoa aqui e adicionar o aplicativo BP underscore ao componente. Novamente, você verá que agora tenho dois desses componentes no meu ThirdPersonCharacter. Agora, podemos querer acessar aqueles que usam um nó como esse. Portanto, podemos excluir esse nó, podemos usar o componente Get por classe. E esse é um nó que funciona exatamente da mesma forma que nosso nó anterior, mas em vez de uma única saída variável, é uma matriz. Agora, se fôssemos procurar por componente de ator não escolarizado da BP, isso retornaria cada componente que corresponda à nossa classe de componente de nosso personagem. E ele o retorna em uma matriz. E se você se lembra de nossas matrizes de vídeo e re apenas nos permite armazenar vários do mesmo tipo de variável, tudo em uma variável. E se quiséssemos acessar uma dessas variáveis do nosso array, precisaríamos arrastar para fora e user get node. Precisamos fornecer um índice. Então, essa é a variável dentro do nosso array que queremos acessar. E então, a partir do nosso nó get, podemos simplesmente arrastar e procurar, digamos, obter teste. E como esta caneta aqui é uma caneta componente BP act, podemos obter nossa variável de teste ou podemos obter função e o evento de exemplo que criamos anteriormente. Então, essas são apenas algumas maneiras pelas quais você pode acessar os componentes de um ator usando esses nós. Agora, outro recurso interessante dos componentes é que podemos realmente definir suas variáveis para cada blueprint ao qual adicionamos o componente. Então, se formos para o nosso projeto de componente de aplicativo aqui, vou apenas criar uma nova variável e chamarei isso dizer max health. Assim. Vamos defini-lo como um número inteiro. Agora, se compilarmos esse blueprint e voltarmos ao nosso ThirdPersonCharacter Blueprint. Vou apenas excluir esse componente ativo extra e adicionei foi como o primeiro. E você pode ver no painel Detalhes, temos uma categoria padrão. E aqui temos nossa variável de teste. Esse é o booleano que criamos no início. E também temos nossa variável de saúde máxima, e podemos usá-la para definir se os valores iniciais serão para nosso componente de aplicativo. Então eu poderia definir isso para dizer 100. E talvez eu tivesse um segundo plano de personagem. Vou usar o gatilho como exemplo. Portanto, se adicionarmos outro componente BP underscore, BP, BP act, você não precisará usar sublinhados. E aqui você pode ver se eu uso um sublinhado, ele não o encontra. Então, se eu fizer o componente BP x e nos livrarmos desse pesquisador, e eu seleciono esse componente. Você pode ver que, novamente, temos nossas variáveis de teste e saúde máxima aqui e a categoria padrão. E você vê que é padronizado para 0 por padrão porque é para isso que está definido dentro do nosso componente x. Então, aqui, poderíamos definir isso para ser, digamos, mil. Agora, se configurarmos o Begin Play, imprimiremos nossa vida máxima. Por exemplo. Colocamos nosso gatilho e o nível e apertamos Play. Você pode ver que está imprimindo mil e esse é o nosso gatilho fazendo 100, e esse é o componente de atuação de nossos personagens fazendo isso. Em seguida, eu só queria mostrar como podemos criar rapidamente um componente de coletor. Então, vamos sair dos planetas para clicar com o botão direito do mouse e criar um novo projeto. E em vez de componente ativo, vamos clicar em componente visto. Vou apenas chamar esse componente visto de sublinhado da BP. E vamos clicar duas vezes nisso para abri-lo. Agora, como você pode ver, é praticamente o mesmo que nosso blueprint de componente ativo. A única diferença está no padrão da nossa classe. Então você pode ver que nós realmente temos uma localização, rotação e escala. E se formos para o nosso ThirdPersonCharacter aqui, adicione um novo componente e, em seguida, adicionaremos nosso componente bp seen. Você veria que temos uma localização no, no Viewport aqui. Nós podemos movê-lo ao redor. Se selecionarmos o componente lá, você vê que eu posso movê-lo, posso posicioná-lo, podemos girá-lo e dimensioná-lo. E se voltarmos ao nosso componente coletor, porque é o mesmo componente, podemos acessar sua localização para que possamos pesquisar por gets wild location. Você pode ver que temos nosso nó Obter localização mundial. Também temos a rotação mundial do nosso get. Se eu soletrar direito, rotação que vamos obter rotação mundial. E eles funcionam da mesma forma que nossos nós em nossos projetos ativos. Ele apenas obtém a localização e rotação do nosso componente pecado. Agora, até agora só adicionamos componentes usando o painel Componentes aqui, mas também podemos adicionar componentes durante o jogo usando código. Então, se eu clicar com o botão direito aqui e no meu ThirdPersonCharacter Blueprint, eu procuro começar a jogar. Se nos arrastarmos dos pais, procure por add e, em seguida, o nome de nossos componentes. Então BP, você pode ver que eu tenho opções para o componente BP x e nosso BPC e componente. Então, se eu clicar em nosso componente x aqui, chegamos a esse nó. E isso significa essencialmente que em Begin Play ou quando nosso personagem aparecer, ele adicionará um novo componente BP act ao nosso personagem. Podemos usar o valor de retorno aqui como poderíamos com se arrastarmos uma referência como essa, podemos simplesmente arrastar para fora e procurar, digamos, obter, testar, por exemplo, podemos acessar nossa variável. Também podemos acessar essas funções de exemplo e o evento que criamos anteriormente. E se quiséssemos, poderíamos criar uma variável para armazenar essa referência. Então, se quiséssemos acessar essa nova variável mais tarde em nosso código, poderíamos fazer isso. Estamos apenas promovendo uma variável que nos cria uma nova variável que define um tipo de componente BP acts. Podemos nomear isso para dizer novo computador. E isso nos permite agora acessar esse novo componente que criamos mais tarde, então podemos usá-lo. Então, ele obtém um valor máximo. Ao selecionar esta actina de adição de BP, HE pode realmente ver que temos acesso a ela variáveis iniciais. Para que pudéssemos definir nosso eu máximo para o que quiséssemos dizer 99. E agora, quando esse ato criou seu máximo útil, benigno. E, por fim, também podemos destruir componentes durante o jogo. Então, se eu arrastar minha referência de componente ativo aqui, vou excluir esse código. Agora, para destruir o componente, precisamos fazer é arrastar, procurar por ele, destruir. Você pode usar o nó do componente destroy e isso removerá completamente o componente do blueprint durante o jogo. Claro, isso não afeta o projeto aqui. Portanto, não é como se você o tivesse excluído, ele apenas destrói o componente durante a sessão de jogo. Então, isso é basicamente tudo para componentes. Espero que você tenha uma melhor compreensão de como eles funcionam e para que são usados agora. 21. Noções básicas (controlador de jogadores): Olá pessoal. Nesta lição, vamos dar uma olhada no projeto do controlador do jogador. Agora, no controle de jogo, o blueprint é criado quando clicamos em play e iniciamos o jogo. E é criado para cada jogador que existe no nível. E o objetivo de um controlador de jogador é assumir o controle de um projeto, como personagens ou veículos, e fornecer a eles as entradas que o jogador está pressionando. Agora, o controlador do jogador permanece o mesmo para cada jogador, a menos que um novo nível seja aberto, nesse caso, o controle antigo é destruído e um novo é criado para quando o novo nível é aberto. Agora, no modelo de personagem de terceira pessoa que abrimos aqui, ele não inclui, na verdade, um controlador de blueprint. E isso porque, por padrão, ele usa apenas o controlador de player embutido que vem com o mecanismo, que é codificado em C mais mais. Portanto, você não encontrará o controlador do player em nosso painel de projetos. Se abrirmos nosso modo de jogo, podemos ver onde podemos realmente definir nosso controle de jogador. Então, se formos para baixo e as classes, você pode ver que temos a classe de controlador de peste atualmente que está definida para jogar controle. E esse é o nosso controlador de jogador C plus plus que está embutido no motor. Você também pode ver que temos a classe de peão padrão aqui, que é definida como nosso bp ThirdPersonCharacter. E, essencialmente, o que um modo de jogo faz é dizer ao mecanismo que queremos iniciar cada jogador no jogo com este controlador de jogador, que atualmente é o controlador de jogador C plus plus. E esse personagem, que é nosso ThirdPersonCharacter em que estivemos trabalhando, em lições anteriores. Mas podemos criar nossos próprios projetos de controle de jogadores. Então, para fazer isso, fecharei meu modo de jogo por enquanto, e clicaremos com o botão direito do mouse no navegador de conteúdo e acessaremos os projetos. E vamos selecionar o controlador do jogador. E vamos nomear esse exemplo de BP, controle assim. E vamos clicar duas vezes nele para abri-lo. E eu vou arrastar o topo aqui até o topo com nossos outros projetos. Agora, vou jogar com controladores. Blueprint se parece muito com um ato de Blueprint. E isso porque, na verdade, um ator é apenas um filho do controlador do jogador também. Então, na janela de exibição aqui você pode ver isso, mas não temos nenhum objeto visível. Normalmente, você não adicionará coisas como uma malha ou algo parecido à janela de visualização de um controlador de jogador. Também temos uma câmera aqui. Agora, esta câmera só é usada quando não estamos possuindo outro Blueprint. Então, quando possuímos um personagem de terceira pessoa, por exemplo, nós realmente usamos a câmera que está incluída nisso. Se quisermos possuir alguma planta, então esta câmera é usada. Há também algumas configurações adicionais nos padrões de classe exclusivos para o controlador do jogador. Portanto, temos coisas relacionadas ao cursor do mouse e eventos de toque para dispositivos móveis, bem como algumas ferramentas de gerenciamento de câmera aqui também. E se formos para o Gráfico de Eventos, você pode ver que temos praticamente o layout padrão que você esperaria. Agora, o que você pode estar se perguntando, o que é que realmente usamos nosso fórum de controle de jogador, o que codificaríamos aqui em vez de apenas codificar dentro de nosso personagem? Agora, porque eu vou jogar controles permanecem os mesmos, não importa qual personagem estamos controlando, podemos armazenar informações aqui que queremos manter as mesmas para controlar coisas diferentes. Por exemplo, se você tivesse um sistema de missão e quisesse que suas missões estivessem disponíveis o tempo todo, não importa se você possui um personagem, um veículo ou algo assim, você provavelmente deseja armazenar essas informações dentro do seu controlador, seja diretamente criando o código dentro do controlador ou adicionando componentes a esse controlador. Outra coisa para a qual os controladores são úteis é adicionar entradas que você deseja manter as mesmas, independentemente do personagem que você está controlando. Então, um exemplo disso seria se você tivesse, digamos, um menu de escape em seu jogo onde todas as suas configurações e controles, ou você provavelmente gostaria que esse botão funcionasse , não importa qual personagem você seja controlando. Então, em vez de fazer ou adicionar esse código em cada blueprint de personagem, podemos adicionar de uma vez e o controlador, e dessa forma a entrada sempre estará disponível para o jogador não importa qual personagem eles estejam controlando. Então, para dar um exemplo do que quero dizer com a informação permanece a mesma, não importa qual personagem estamos controlando, criará uma nova variável. E vou chamar essa missão de concluída. E vamos deixá-lo como um booleano. E eu vou compilar. Agora, voltarei ao navegador de conteúdo e criaremos um gatilho. Esse gatilho definirá essa missão como booleana como verdadeira. Então, vamos criar um ator. Vou chamá-lo de gatilho de missão. Assim. Vamos abrir isso. Vou adicionar uma colisão de caixa só para que possamos sobrepor nosso ator a ela. Vou movê-lo para cima. Agora defina que está escondido no jogo como falso para que possamos sentar. E então, em nosso gráfico de eventos, vou usar o ator begin overlap. E se você se lembrar, isso será executado quando algo se sobrepõe nosso gatilho e nos dirá qual ator se sobrepôs a ele. Então, isso vai se arrastar daqui, eu vou fazer um custo para o personagem. E a partir disso, podemos arrastar para fora e obter o controlador. E isso nos dá acesso a qualquer controlador que esteja controlando esse personagem. Agora, isso será válido ou não. Portanto, se um personagem não estiver sendo controlado, isso retornará e não será uma caneta válida. Então, queremos criar um nó é válido. Dessa forma, se um personagem que não está sendo controlado, as sobreposições são acionadas, não obteremos nenhum erro. Então, do nosso controlador, precisamos fazer nossa missão de forma variável. Então, se nos arrastarmos e a pesquisa concluir a missão, não funcionará porque isso é apenas uma referência de objeto controlador, não uma referência ao nosso controlador de exemplo real. Então, o que podemos fazer é porque nosso controlador de exemplo é um filho do tipo de controlador que podemos arrastar para fora, podemos converter para exemplo, controlador conectará isso até é válido. E então, a partir disso, podemos nos arrastar e fazer missão definida, uma cumprida. E podemos definir isso como verdadeiro. Então, só para repassar isso, quando um ator se sobrepõe. Então, nosso gatilho, verificamos é que Aja onde um personagem, se for, então obtemos como controlador e verificamos se é válido? Então, basicamente, verificamos esse personagem está realmente sendo controlado por alguma coisa? Se for, então verificamos se esse controlador é um exemplo de controlador BP? Se for, então definimos que os controladores de exemplo BP missão one done variável como true. Agora queremos poder acessar informações para ver se nossa missão foi cumprida. Então, vamos para nosso ThirdPersonCharacter e depois para o Gráfico de Eventos. Vou adicionar novas entradas deles que pesquisam o evento de entrada um. E isso só será executado sempre que eu pressionar um no meu teclado. Agora, podemos obter nosso controlador da mesma forma que fizemos no gatilho da missão. Então eu vou procurar por ele, pegar o controlador. E usando esse nó, ele verificará se há um controlador. Então, estamos no ThirdPersonCharacter, os autônomos como um **** e nosso personagem é um poema. Assim, podemos verificar se temos um controlador que custará ao controlador de exemplo de sublinhado da BP. E a partir disso, podemos cumprir nossa missão. E só imprimiremos uma string, esteja ela pronta ou não. Usaremos um nó de string de impressão e conectaremos isso em string. Assim. Vou apenas compilar isso. Agora vamos voltar ao nosso mapa em terceira pessoa, e vou adicionar o gatilho da missão ao nosso nível. Vou torná-lo um pouco maior, então vou usar a ferramenta de reescalonamento aqui vamos nós. E há uma última coisa que precisamos fazer antes de testarmos isso, que é mudar nosso controlador. Então, atualmente no modo de jogo em terceira pessoa, se eu abrir isso, você pode ver que o controlador do jogador ainda está configurado para o controlador do jogador. Precisamos mudar isso agora para nosso controlador de exemplo bp. Agora, como esse controlador é filho do controlador do jogador, ele fará tudo o que o controlador do jogador faz por padrão. Bell agora também tem nossa nova variável que adicionamos. Então, se eu clicar em Play, se eu pressionar um, você pode ver que está imprimindo false. Mas se eu esbarrar no meu gatilho, agora, quando eu pressiono um, você pode ver que está imprimindo verdadeiro. Então é assim que podemos definir e obter informações do controlador de jogadores da OCT. seguir, mostrarei como podemos realmente mudar qual personagem estamos controlando. Então, para fazer isso, vou criar um segundo plano de gatilho. Então, vamos clicar com o botão direito do mouse e fazer a aula Blueprint faria um ator, vou chamar isso de mudança de cenoura. Personagem. Gatilho. Vou abrir isso e faremos a mesma coisa. Vamos adicionar uma nova caixa de colisão, moveremos isso para cima. Eu defini isso como oculto no jogo como falso. E vamos compilá-lo e ir para o gráfico de eventos. Vou usar a sobreposição de ator iniciante aqui. Então, para começar, controlaremos outro personagem que coloquei em um nível. Vou para o mapa da terceira pessoa aqui, e vou arrastar um ThirdPersonCharacter. Estou aqui. Então, voltaremos ao nosso gatilho de mudança de personagem aqui. E vamos nos afastar de outro ator e vamos escalar para o personagem novamente. A partir disso, queremos que seu controlador obtenha, obtém o controlador. Em seguida, vamos arrastar para fora de Get Controller e procurar possuir e usar o nó do processo. Agora, você percebe que eu não estou lançando para o meu controlador de exemplo BP. E isso é porque não precisamos, porque esse evento possess existe no controlador de jogador que é o pai do nosso controlador de exemplo. Portanto, não há necessidade de lançar para isso. Já podemos acessá-lo. E vamos conectar isso ao nosso nó de custo. Agora, isso nos permite assumir o controle de uma bomba. Então, o que faremos é nos arrastar da entrada e promover a variável. Isso criará uma nova variável**** para nós. E com essa variável de ponto selecionada, vou me livrar do pesquisador. E tomaremos, por exemplo, editável. Assim, quando selecionamos nosso personagem, mudamos, alteramos o gatilho do personagem e, em seguida, o nível será capaz selecionar um controle de ponto. Então, ele só vai fazer isso. Agora, vou arrastar meu gatilho de cenoura. Vou colocá-lo aqui e vou torná-lo um pouco maior assim. Agora, no meu painel de detalhes aqui, por padrão, você pode ver em ****, eu posso selecionar um controle de ponto e eu escolheria nosso ThirdPersonCharacter. Então esse é o personagem aqui, assim. E agora podemos voltar ao nosso caráter de mudança e garantir que isso seja compilado. Agora podemos testar isso, então vamos jogar. Então, temos nosso caráter normal como antes de podermos correr por aí. Se eu encontrar o gatilho da minha missão e pressionar um, você pode ver que isso agora está retornando verdadeiro. Mas se eu encontrar meu personagem de mudança, você verá que agora assumimos controle desse outro personagem aqui. Você vê nosso velho personagem ali ainda correndo por aí. Se eu pressionar um, você verá que nossa variável de missão ainda é verdadeira mesmo que estejamos controlando um personagem diferente. Isso porque nosso controlador de jogador ainda é o mesmo modelo. Foi. Quando estamos controlando esse personagem sobre isso. Agora também podemos assumir o controle dos personagens que foram gerados durante o jogo. E para fazer isso, se formos para o gatilho de mudança de personagem aqui, vamos excluir essa variável de poema por enquanto, porque vamos criar um recém-nascido usando o spawn ativo do nó de classe. Agora, vamos entrar em mais detalhes sobre como usar esse nó no futuro. Mas, essencialmente, permite que você crie novos atores e o nível durante o jogo, chegamos à aula. Então esse é o projeto que gostaríamos de gerar. Então, para nós, esse será o ThirdPersonCharacter. E nós temos, digamos, um local de desova. Então eu vou me arrastar e procurar por make. Não queremos esse, desculpe, queremos fazer uma transformação assim. E isso nos permite definir um local e uma rotação. Precisamos fornecer um local para que nossos personagens apareçam. Então, vou voltar ao local agora. Vamos arrastar para fora disso e fazer um nó de adição apenas para adicionar alguma distância entre o surgimento do nosso personagem e alterar o código para acionar. Então vou adicionar, digamos, 200 e o Z e talvez 400 e o X assim. Então isso diz ao nosso personagem onde queremos que ele seja gerado. E então temos esse valor de retorno e isso nos dá uma referência ao novo personagem que acabamos de gerar. Agora, porque nosso personagem é filho de um tipo de personagem, e os personagens são filhos do tipo peão. Podemos conectar isso diretamente à opção importante aqui. Então, agora, quando eu compilar e clicar em Play, podemos encontrar nosso gatilho de mudança de personagem e você verá que ele aparece, eu digo novo personagem em sua localização. Dissemos que assumimos o controle desse personagem. Então é assim que você pode gerar novos personagens e assumir o controle deles com o controle do seu jogador. Agora, o que você pode querer destruir aquele personagem que sobrou quando eu não estiver mais controlando. Então, o que podemos fazer é voltar ao gatilho do personagem, um inerente. Precisamos fazer mais algumas coisas. Então, primeiro precisamos armazenar uma referência de variável do controlador. E a razão para isso é, se você se lembrar, essa é uma função pura. As funções puras executarão todas as conexões que tiverem. Agora, se tentarmos destruir nosso personagem antes de gerarmos um novo e possuí-lo, o que acontecerá é quando tentarmos possuí-lo ou obter nó do controlador será executado e ele usará o alvo de um personagem. Mas se tivermos destruído esse personagem, ele não terá mais um controlador para usarmos para possuir o novo personagem. Ela é um pouco difícil de entender, mas vamos, vamos nos arrastar de get controller e promovê-lo para uma variável. Vamos chamá-lo de controlador de sobreposição, assim, que se conecta até aqui. Então, agora estamos apenas armazenando uma referência ao controlador assim que o sobrepomos. E podemos realmente desconectar o alvo agora daqui. Então, a partir do nosso controlador de sobreposição, podemos simplesmente arrastar para fora e ser controlados****. Esta nota apenas nos permite obter uma referência a qualquer peão que nosso controlador esteja controlando. Então, podemos nos arrastar para fora disso e vamos destruí-lo. Porque isso ainda é uma referência ao nosso antigo personagem que não fazemos mais. Então, podemos fazer isso. Em seguida, pegamos nossa variável controladora de sobreposição e a conectamos ao alvo de nossa posse. Portanto, seu código deve se parecer com isso. E podemos compilar isso. Então, agora, quando entramos no nível e clicamos em Play, se eu correr para o meu gatilho agora, você pode ver que eu criei um novo personagem. Eu tenho o controle disso, mas personagem antigo que encontramos na largura da caixa se foi. E se fizermos isso de novo, você pode ver que geramos outro personagem. Esse velho personagem se foi de novo. Então esse é o básico de como você pode gerar novos personagens e destruir os antigos. Agora, há uma outra nota sobre a qual quero falar com vocês, que são as notas não processadas. Então, se você voltar para o gatilho de mudança de caractere aqui, vou excluir esse código agora porque não precisamos mais disso. E podemos realmente nos livrar desse controlador de sobreposição porque também não precisamos disso. Agora, quando nos arrastamos para fora do controlador, você se lembra disso O nó de posse. Há também o nó não processado. Então, se criarmos um nó não processado, ele basicamente diz ao controlador para parar de controlar qualquer personagem, veículo, qualquer **** que ele esteja controlando. Então, se conectarmos isso agora, quando atingirmos a caixa de colisão, vamos perder o controle do nosso personagem. Então, quando eu me deparo com isso, você pode ver que meus personagens ficaram correndo na hora. Não consigo controlar isso. Não consigo mover minha câmera. E isso porque não controlamos mais esse personagem ou qualquer personagem em nosso nível. Isso vai ser tudo para a nossa aula de controle de jogadores. Espero que você tenha uma compreensão um pouco melhor de como eles funcionam. 22. Noções básicas (GameMode): Olá pessoal. Nesta lição, vamos dar uma olhada mais de perto no tipo de projeto do Modo de Jogo. Então, essencialmente, o Modo de Jogo é o que diz ao mecanismo com qual controlador queremos que cada jogador comece, bem como com qual personagem queremos que cada jogador comece em nosso nível. Então, se formos para o modo de jogo em terceira pessoa que temos em nosso navegador de conteúdo e o abrimos. Você pode ver que temos os padrões de classe abertos aqui, e isso nos dá algumas opções diferentes nas classes. Agora, vamos nos concentrar no controle e na classe de peão padrão para esta lição, porque esses são os principais que você mudará. Examinaremos as outras configurações em uma lição futura. Mas para a classe de controlador de jogador, este é o projeto do controlador de jogador que será gerado para cada jogador que entrar no jogo. Agora, atualmente, ele está definido como controlador de exemplo BP da nossa última lição. Mas se quiséssemos, poderíamos clicar aqui e mudar isso para outro controlador. Se quiséssemos. Então temos a classe de peão padrão. Agora, atualmente está definido como BP, caractere de terceira pessoa porque esse é o valor padrão. Este é o modelo de terceira pessoa. Mas se quiséssemos, se adicionarmos outro personagem, digamos um veículo, por exemplo, com o qual queríamos começar. Em vez disso, podemos selecionar isso aqui no menu suspenso. Agora, como esse blueprint não tem nenhum código, ele nos deu essa visão. Mas se você quiser acessar o editor principal do blueprint completo, você sempre pode simplesmente clicar nesta opção aqui para abrir o editor de fotos principal. E isso nos dá acesso a todas as configurações que você esperaria, os componentes, o gráfico de eventos e assim por diante. Agora o modo de jogo existe no nível, é um filho dos tipos de ator, então ele pode ter componentes. Também podemos escrever código nele como qualquer outro modelo. Também podemos criar nosso próprio modo de jogo. Portanto, se formos para o Navegador de conteúdo e apenas clicar com o botão direito do mouse, vá para Classe Blueprint. E temos uma opção para a base do Modo de Jogo aqui, mas isso é um pouco mais uma versão reduzida do modo de jogo. Então, se formos em todas as classes e procurarmos o Modo de Jogo, você pode ver que há uma opção de Modo de Jogo aqui. Eu prefiro usar este só porque ele vem com um pouco mais de funcionalidade integrada. Então, clicaremos em Selecionar para criar um novo blueprint usando o modo de jogo. E eu vou chamar esse exemplo de modo de jogo da BP. Se clicarmos duas vezes nisso, podemos abrir. E eu vou apenas arrastar a guia até o topo aqui. Agora, além de ser o modelo onde podemos definir nosso controlador inicial e classes de peão, podemos realmente adicionar código ao nosso modo de jogo. Agora, normalmente, você adicionaria código ao modo de jogo que move o jogo de alguma forma. Então, por exemplo, se eu começar a jogar, você queria um cronômetro para fazer a contagem regressiva e, em seguida o jogo terminar ou um novo mapa para abrir. Você normalmente faria isso dentro do seu plano de modo de jogo. Agora, uma coisa útil sobre o modelo de camuflagem é que você pode acessá-lo em qualquer lugar. Então, um exemplo disso é se fôssemos para o nosso quadril ThirdPersonCharacter. Agora eu tenho alguns códigos restantes de nossas lições anteriores, então vamos apenas excluir isso. E se clicarmos com o botão direito e procurarmos por ele, obterá o modo de jogo Podemos usar esse nó para obter uma referência ao nosso modo de jogo atual. E atualmente é uma saída básica do modo de jogo. Então, o que podemos fazer é simplesmente arrastar o custo para o nosso modo de jogo de exemplo. E a razão pela qual podemos fazer isso é porque nosso modo de jogo de exemplo é filho do modo de jogo. E o Modo de Jogo é filho da base do Modo de Jogo. Assim, podemos usar esse nó de custo para acessar nossas funções e variáveis em nosso modo de jogo de exemplo. Então, se eu voltar ao meu modo de jogo aqui e criar uma nova variável, vou chamar esse nome de jogo. E vou definir o meu para um tipo de nome. E vou definir isso para dizer muito, por exemplo. Nós podemos fazer isso. Se voltarmos ao nosso ThirdPersonCharacter, podemos arrastar e pesquisar, esquecer o nome do jogo. Podemos acessar essa variável. Se eu adicionar, digamos print string, podemos simplesmente imprimir uma string quando pressionarmos uma no teclado. E vamos compilar. Agora, se fôssemos jogar agora, isso não funcionaria e há algumas razões simples. Ainda não definimos nosso jogo para usar nosso modo de jogo de exemplo. E também não definimos nosso modo de jogo para usar nosso personagem em terceira pessoa. Então, se voltarmos ao nosso motor de jogo de exemplo e, em seguida, os padrões de custo, podemos definir nossa classe de controlador padrão e nossa classe **** padrão. Então, vou definir o padrão **** para o BP ThirdPersonCharacter. E vamos definir a classe do controlador. Podemos mudar isso para o nosso controle da nossa última lição ou simplesmente deixá-lo como controlador de jogador. Eu vou deixar o meu como controlador de jogador por enquanto. Vamos apenas compilar. Em seguida, precisamos ir para as configurações do projeto. Então, se eu for editar aqui na parte superior e formos para Configurações do projeto, vou arrastar isso para a minha outra tela. Em seguida, precisamos ir para mapas e modos. Agora, mapas e modos também, podemos definir o modo de jogo padrão para nossa gangue, e esse será o modo de jogo para cada mapa que criarmos. Atualmente, está definido para o modo de jogo em terceira pessoa. Se eu mudar isso aqui, quero selecionar meu modo de jogo de exemplo BP. Então, agora, quando criarmos um novo nível ou clicarmos em Jogar e nosso nível atual, ele usará o modo de jogo de exemplo em vez de um modo de jogo em terceira pessoa. Agora, a partir daqui, também podemos definir nossa classe **** padrão e nosso controlador padrão se quisermos, pessoalmente, eu prefiro apenas ir para o blueprint em si. Então vá para o nosso modo de jogo de exemplo e altere-o lá. Mas se você quiser, você pode alterar essas configurações e aqui também. Agora há outro lugar onde podemos definir o modo de jogo e isso está em nossas configurações mundiais. Então, se fecharmos as configurações do nosso projeto e formos para o mapa da terceira pessoa, eu vou para o Windows e vou marcar as configurações do mundo. O seu já pode estar marcado, mas o meu não. Então, eu só vou assumir isso. E aqui estão as configurações para esse nível específico. Você pode ver que temos uma categoria de modo de jogo e podemos substituir um modo de jogo. E isso basicamente diz que apenas para este nível, queremos usar um modo de jogo diferente do padrão que acabamos de definir nas configurações do nosso projeto. Você pode ver que isso está definido para o nosso modo de jogo em terceira pessoa. Então, se eu fosse jogar, mesmo que tenhamos definido nosso modo de jogo de exemplo nas configurações do projeto, esse nível por si só ainda usaria o modo de jogo em terceira pessoa. Essa configuração é útil porque você pode querer ganhar o modo que permite o uso de níveis, além de alguns que você pode ter um modo de jogo específico que deseja usar para esses níveis. Então você usaria essa configuração para assumir o controle do Modo de Jogo e vendê-lo para o que quiser para esse nível específico. Então, por enquanto, vou definir isso como nenhum, ou podemos simplesmente clicar nele e selecionar nenhum. E isso limpará a substituição do modo de jogo. Então, agora, quando pressionamos play e pressionamos um, você pode ver que está imprimindo death match, que é a variável que definimos dentro do nosso modo de jogo de exemplo. Mas podemos acessá-lo facilmente apenas usando a transmissão do nó get Game Mode para o nosso modo de jogo e, em seguida, podemos acessar essa variável. E isso também mostrará o trabalho para eventos e funções. Agora, por fim, eu só quero cobrir algumas das funções integradas que vêm com a obtenção da maioria. Então, se formos para o nosso modo de jogo de exemplo, agora, se você se lembrar com as funções, podemos substituir as funções de nossos projetos pais. Então, se clicarmos nesta opção de substituição aqui, você pode ver que temos algumas funções aqui, maioria delas vindo da nossa base de modos de jogo. Agora, se você se lembra de nossa lição de funções, quando você substitui uma função, basicamente diz ao mecanismo que você não quer que o código que está dentro dessa função na base do Modo de Jogo seja executado, você quer usar seu próprio código. Agora, como um aviso, você deve ter cuidado ao substituir essas funções porque praticamente substituir qualquer uma delas pode prejudicar seu projeto. Então, por exemplo, se eu fosse substituir, gerar Default, Pawn that transform, se eu clicar nisso, você pode ver que temos essa função que está embutida na base do modo de jogo. E essa função é responsável por realmente gerar no personagem. Então, se eu compilar isso e clicar em play agora, você pode ver que eu não tenho mais um personagem e não controlei mais nada. E isso é tudo porque eu acabei de substituí-lo. Função que realmente gera nosso personagem. Então, eu não vou passar por todas essas funções. Existem alguns. Alguns deles são autoexplicativos, alguns são um pouco mais complexos, mas fique atento quando estiver substituindo essas funções. Se você optar por fazer isso, tenha cuidado. Eles podem quebrar seu projeto com bastante facilidade, porque são funções essenciais para garantir que o jogo realmente funcione. Além disso, se você passar o mouse sobre essas funções, você pode ver que realmente obtém dicas de ferramentas razoavelmente decentes que informam exatamente o que cada uma dessas funções faz e é responsável. Então isso vai ser tudo para a nossa aula de modos de jogo. Espero que agora você entenda um pouco mais sobre o que os modos de jogo realmente fazem no mecanismo e como você pode usá-los em seus projetos. 23. Noções básicas (nós de utilidade): Olá pessoal. Nesta lição, vamos dar uma olhada mais de perto nos nós utilitários. Os nós utilitários são úteis para algumas coisas diferentes. Eles nos permitem escolher qual código será executado, com que frequência esse código será executado. E eles também podem nos ajudar a organizar o código do nosso projeto. Então você pode ver em nossa última lição, eu realmente reiniciei apenas com um novo modelo de terceira pessoa. Então você pode querer fazer o mesmo também. E então eu vou abrir o ThirdPersonCharacter. E eu adicionei alguns dos nós utilitários mais comumente usados aqui que vamos seguir nesta lição. Então, para começar, vamos dar uma olhada na nota de sequência. Então, se movermos isso aqui por enquanto, agora uma nota de sequência recebe uma entrada de execução e tem várias saídas de execução. Podemos adicionar novas saídas clicando no botão Adicionar pino aqui. E podemos removê-los apenas clicando com o botão direito do mouse e selecionando a opção remover pino de execução. A maneira como o nó de sequência funciona é que ele recebe uma entrada como, digamos, uma reprodução inicial. Nota. Podemos conectar isso aqui. E ele executará qualquer código conectado ao então 0PM. Depois que todo esse código for executado, ele executará o que um código e seguida, o próximo código e o próximo código e assim por diante até que todos os pinos tenham sido executados. Agora, o principal uso do nó de sequência é manter seu código um pouco mais organizado. Com plantas. Se você tem muito código, tende a ter essas linhas de código muito longas. Um nó de sequência permite que você simplesmente quebre isso para que você possa ter várias linhas e manter as coisas um pouco mais organizadas. Você também pode usar o nó de sequência dentro de uma função. Então, se eu criar uma nova função, eu arrasto para fora quando eu pesquisei sequência curta em C, eu posso criar um nó de sequência. A maneira como funciona dentro de uma função, apenas algo que você quer estar ciente. Diz que eu tinha algum código aqui, digamos que eu imprimo string e depois if node, e então se eu tivesse do cabelo um nó de retorno. Agora lembre-se de que quando você executa um nó de retorno, ele termina a função. Portanto, se esse nó de retorno onde executar qualquer código que você conectou a qualquer um desses outros pinos dentro de sua função não seria executado. Portanto, isso é apenas algo a ser observado ao usar sequências dentro de uma função. Então, agora vamos voltar ao nosso gráfico de eventos e vamos dar uma olhada no nó do portão. Então, se excluirmos nesses poços, novamente, permite que você execute o código que está conectado até a saída em uma frequência de qualquer entrada para o entrenó. Então, o que quero dizer com isso é que se eu conectar um tick ao entrenó aqui, então nosso código de saída executará todas as tecnologias. E o portão nos permite essencialmente abrir e fechar essa saída PM. Então, se eu adicionar um, se eu clicar com o botão direito do mouse e tal entrada, entrada deles, um, podemos criar uma entrada deles, um. Conecte isso para abrir, copiar e colar isso. Agora selecione a nota aqui, este pequeno ícone de teclado e pressione dois, e na verdade apenas muda isso para uma entrada 2 agora. E eu conecto isso e vou apenas adicionar uma string impressa aqui que estamos fazendo tudo isso dentro da primeira pessoa, terceira pessoa personagem. Desculpa. Vamos compilar e vamos para o mapa. É jogar. Agora você pode ver que minha string de impressão não está funcionando. E se eu voltar para o personagem de terceira pessoa aqui e usar a opção de depuração. Você pode ver que o código do meu tick está sendo executado. Está indo para o portão, mas a saída não está funcionando. Agora, se eu voltar ao meu nível, eu pressiono um. Você pode ver que a string de impressão está sendo executada. E se formos para nossa terceira pessoa novamente, você pode ver que o código de saída está sendo executado. E isso porque eu apertei um e abri o portão. Se eu pressionar dois, agora posso fechar o portão. Se eu voltar, você pode ver que o código não está mais em execução e que a string de impressão também não está sendo executada. Agora, existem algumas outras opções em nosso nó de portão. Podemos usar o botão de alternância. Então, basicamente, apenas os portões abertos atualmente e queremos alternar, ele vai fechá-lo. Se os portões estiverem fechados e corrermos alternar, alternar, ele abrirá e então temos a opção de começar a fechar. Então, atualmente, ele começa fechado. Mas se eu desmarcar isso, clicarmos em Play, você verá que ele realmente começa a funcionar. Agora, eu tenho comandado o portal com um techno. Então, se eu simplesmente sair do jogo aqui, poderíamos usar um temporizador em vez de um nó tecnológico, o que provavelmente é melhor para o desempenho. Então, faremos apenas um plug-and-play, conectaremos um cronômetro. Portanto, se você se lembrar do nó setTimeout by event, nós arrastamos para fora dele e criamos um evento personalizado que chamou de timer. Podemos conectar isso ao nosso portão em vez de uma tecnologia, ou seja, 0,5. Então, a cada 2,5 desta vez será executado, assumirá o loop. Agora, quando clicamos em play, você pode ver que nossa string de impressão Hello só está sendo executada a cada 2,5, porque esse temporizador é o que está controlando nossa saída de saída. Então, em seguida, passaremos para o nosso próximo nó. Então, vamos sair do editor do avião lá. E usaremos a nota “fazer uma vez”. Agora, o D quer saber muito bem o que diz. Ele pega uma entrada, executa um complete e, em seguida, se for executado novamente, ele não executará o código completo. Então, podemos experimentar isso. Se eu apenas excluir minha nota de portão, ele conectará isso ao nosso cronômetro que acabamos de usar e conectá-lo ao concluído. Então, devemos ver nossa string impressa um. Olá uma vez e depois nada mais acontece. Então eu vou apertar play e ver se isso acontece. E mesmo que eu vá para o meu ThirdPersonCharacter aqui, você pode ver que meu tempo está correndo, mas o D uma vez está bloqueando. Agora podemos redefinir esse nó do once. Se eu pegar um pino aqui e conectá-lo para redefinir, posso puxar e apertar Play. Você pode ver saudações impressas, mas não está mais imprimindo. Se eu pressionar um, você pode ver que está impresso novamente, mas agora novamente ele parou. Então, eu teria que continuar pressionando um para continuar abrindo e reiniciando que eu quero nevar. Como nosso nó de portão, ele tem uma opção de estoque fechado. Então, se eu assumir isso e pressionarmos Play, você verá que não obtemos nenhuma string de impressão até que eu pressione uma, o que redefine esse nó. Agora, se sairmos do editor de planos, passaremos para o próximo nó, que é o do n. E n basicamente faz a mesma coisa que eu quero nevado. Mas isso nos permite controlar quantas vezes esse nó será executado antes de bloquear o código. Então, se eu excluir isso, eu conecto o temporizador enter two aqui e a saída para nossa string de impressão e digo, queremos que esse código seja executado cinco vezes e depois queremos que ele pare. Assim, podemos conectar o contador em nossa string de impressão aqui, e isso apenas exibirá quantas vezes isso é executado. Se pudermos puxar, apertamos Play. Você pode ver que ele está imprimindo os números, mas quando chega a cinco é interrompido porque o ARRA faz, um nó está bloqueando a saída. E também podemos redefinir esse nó. Então, se eu pegar o pino de reset, conectá-lo em um, clicar em play, podemos redefinir, ou desculpe, contar até dez ou cinco, desculpe, então pressionaremos um e você verá que posso redefini-lo novamente. Então, agora vamos voltar ao nosso ThirdPersonCharacter e dar uma olhada no próximo nó, que é o nó flip-flop. Agora, isso basicamente quando ele é executado, ele executará a. Então, se esse nó for executado novamente, ele executará B. E ele continuará indo entre esses dois pinos cada vez que você executá-lo. Então, se eu conectar isso ao nosso único evento de entrada aqui, e eu imprimir uma string de um, nós podemos fazer, eu vou apenas definir isso como uma cópia e colar isso e definir isso como. Vamos compilar e jogar. Você pode ver que nosso cronômetro ainda está funcionando. Mas se eu pressionar um e você vir a, B, a B. Então você pode usar isso para alternar entre duas partes do código. Como uma nota lateral, com o flip-flop, você provavelmente não o usará quando estiver um pouco mais confiante com a codificação. Mas pode ser útil se você estiver criando um protótipo rápido ou algo assim. Mas normalmente você gostaria de usar, digamos, um ramo, um nó e um booleano. E isso lhe daria muito mais controle sobre como esse código funcionaria. E, em seguida, seguindo em frente, temos nossos nós latentes. E se você se lembrar, isso é latente porque eles têm esses pequenos símbolos de relógio e os cantos. Agora que usamos o nó de atraso antes, nos permite essencialmente manter o código ativo por um determinado período de tempo. Então, se nós excluíssemos esse código com delete this, e eu removerei isso também. Então, quando pressionamos um, podemos ter um atraso e então podemos fazer algumas coisas. Então, eu poderia dizer, chame o salto deles. Isso realmente fará nosso personagem pular. Vou definir o atraso para dizer dois segundos. Então agora, quando eu clico em play e pressiono 12 segundos depois, você vê que o personagem pula. Agora, há um tipo diferente desse nó. Então, se sairmos do jogo aqui e voltarmos para o ThirdPersonCharacter. Podemos usar o re-trigger se ambos atrasarem. Agora, a diferença aqui é se eu dissesse apenas continue pressionando um enquanto meu nó de atraso está contando que a duração, esse nó simplesmente ignoraria a entrada e contaria. dois e depois o salto correria. Agora, um novo disparo ou atraso continuará sendo redefinido toda vez que receber uma entrada. Então, se eu usar a palavra trigger delay em vez de apenas o nó delay, ela e eu pressionamos Play e começo a pressionar um. Você viu que minhas cenouras não pulam mesmo depois dois segundos porque eu continuo reiniciando o cronômetro. Se eu parar de pressioná-lo, ele esperará dois segundos agora e nosso personagem pulará. Agora, há uma última nota que eu queria mostrar a vocês, e esse é o atraso até o próximo nó de tick. Então, se eu arrastar isso aqui, você pode ver que este também é um nó latente, e isso essencialmente apenas blocos de código para um quadro ou faz o código pesar um quadro antes que o pinna completo seja executado. Então, se usássemos isso com a função one e eu pularei aqui, você não notará nenhuma diferença, pois eu pressiono um, parecerá que é instantâneo, mas na verdade está esperando um quadro antes de dizer à função de salto para funcionar. Agora, isso tem usos às vezes em blueprints, você pode precisar esperar um quadro antes uma variável seja definida ou algo parecido. Portanto, esse nó pode ser útil para esse tipo de coisa. Isso é tudo para nossa lição de nós utilitários, usaremos a maioria deles novamente em lições futuras, que você tenha a chance de se familiarizar com eles. 24. Noções básicas (instância de jogo): Olá pessoal. Nesta lição, vamos dar uma olhada no projeto da instância do jogo. Agora, o blueprint da instância do jogo é criado quando nosso jogo é iniciado pela primeira vez e permanece lá até fecharmos o jogo. E, ao contrário de outros projetos, se mudarmos de nível, nossa instância de jogo não será destruída. É permanente enquanto estivermos executando o jogo. E isso o torna um modelo realmente útil para armazenar informações que você precisa transferir para outros níveis. Por exemplo, você pode ter variáveis que deseja transferir do nível do menu principal para o mundo do jogo. Bem, você pode usar uma instância de jogo para fazer isso. Então, para começar, vamos criar um novo projeto. E esse projeto vai levar nosso personagem a um nível diferente. Então, clique com o botão direito do mouse, vá para Classe Blueprint, crie um ator. Vou ligar para o meu teletransporte de sublinhado DP . Teleporte. Lá vamos nós. E vamos abrir isso. Eu só vou arrastar o meu até a barra superior aqui. Agora, esse será o projeto que realmente leva nosso jogador a um nível diferente. Então, vamos adicionar uma colisão de caixa só para sabermos que quando eles entrarem nesse ator, eu vou mudar o meu um pouco assim. Em seguida, vamos para o Gráfico de Eventos. E vamos apenas usar o nó actor begin overlap. Então, ele excluirá esses dois e vamos arrastar para fora de outro ator e apenas custar para personagem para garantir que só executemos esse código se o ator sobreposto for um personagem, então vamos usar as notas de nível aberto. Então, vamos arrastar e pesquisar por nível aberto, e vamos usar o nível aberto por nome. E isso nos permite apenas dizer ao motor para abrir um novo nível. E isso abrirá o nível para o qual definimos o nome. Isso eu vou apenas arrastar e criar variáveis. Então, promoveremos a variável e a deixaremos como nome de nível e um tipo de variável de nome como esse. Também vou assumir a instância editável e, em seguida, compilaremos. Em seguida, precisamos criar um novo nível para o qual vamos nos teletransportar. Então, vamos para o Navegador de conteúdo e, em seguida, para mapas de terceira pessoa. E aqui temos nossos mapas de terceira pessoa, então vamos apenas duplicar isso. Agora. Posso clicar com o botão direito e clicar em Duplicar por algum motivo. Mas o que podemos fazer é arrastar isso sobre a pasta de mapas. Você pode ver que podemos copiar aqui. Agora, na verdade, crie uma cópia do nosso mapa atual. Agora vamos abrir nosso sublinhado de terceira pessoa para mapear. Eu só vou selecionar Save actors. Agora estamos no segundo mapa e vou deletar algumas coisas para que possamos ver a diferença entre os dois. Então, basta selecionar todas essas coisas aqui, excluí-las. Então, sabemos que quando entramos neste mapa, estamos em nosso segundo mapa. Agora vamos voltar ao nosso mapa em terceira pessoa. Então, vamos clicar duas vezes para abrir isso. Vou selecionar, Salvar, selecioná-lo. E agora estamos de volta ao nosso primeiro mapa em primeira pessoa. E vamos adicionar nosso teletransporte a este mapa. Então, vamos para as plantas e arrastamos uma para dentro. Eu vou fazer o meu um pouco maior. Também podemos ir ao nosso projeto de teletransporte, selecionar a caixa e simplesmente desligar o oculto no jogo para que possamos realmente ver a colisão assim. E agora precisamos usar essa variável que criamos em nosso teletransporte para dizer para qual nível queremos nos teletransportar. Então, vamos para Detalhes e você verá que temos nosso nome de nível aqui. Então, o que vamos fazer é ir para mapas, basta clicar com o botão direito do mouse ou sublinhar dois na terceira pessoa, vamos renomear, depois fazer Control C e clicar fora. E então vamos colar esse nome no nome do nosso nível aqui. E então podemos testar isso. Então eu vou apertar play ou correr para a caixa. E você pode ver que agora transportamos para o nosso novo segundo nível. Agora, quando abrimos um novo nível, tudo no nível anterior é destruído. Nossos modos de jogo de controle de jogador de personagem estão todos destruídos. E então, quando o novo nível é aberto, nosso personagem está sendo gerado. Um novo controle e modo de jogo também são criados para o nosso novo nível. Então isso significa que todas as variáveis que você definiu em seu personagem antes de transportarmos para este novo nível, todas elas serão perdidas e começaremos de novo com um personagem novo. E para dar apenas um exemplo de que sairá do editor de avião, vá para nossos projetos do que personagem de terceira pessoa. Eu só vou criar um novo booleano. Vamos chamá-lo de exemplo e usaremos um nó de marcação. Então, vou clicar com o botão direito do mouse e pesquisar por tecnologia. Em tecnologia, vamos apenas imprimir se nossa variável de exemplo é verdadeira ou não. Então, usamos uma string de impressão. Vamos conectar isso até aqui, assim. E agora vou adicionar uma entrada, então chamaremos esse evento de entrada de um. Então, quando pressionamos um, eu quero definir essa variável como true. Então, faremos isso e depois compilaremos. Então, agora, quando eu clico em play, vocês podem ver que estamos atualmente em nosso primeiro mapa em terceira pessoa. Se eu pressionar um, você pode ver que nossa variável se torna verdadeira. Mas se eu encontrar nossa caixa e formos para um novo nível, você pode ver que essa variável agora mudou para falsa porque temos um novo projeto de personagem. Agora podemos usar nossa instância de jogo para salvar essa variável para nós e passar para o próximo nível. Então, o que vamos fazer é sair. Vamos criar uma nova instância de blueprint. Vamos clicar com o botão direito do mouse e vamos para as plantas. Queremos a aula de Blueprint. E nas opções aqui, na verdade não há classe de instância de jogo. Então, vamos descer a todas as classes e pesquisar, por exemplo. E então vamos selecionar a instância do jogo aqui e clicar em Selecionar. E agora isso nos criou um novo projeto de instância de jogo. Então, vamos chamar esse exemplo de sublinhado da BP, instância de jogo como essa. Então podemos abrir isso. E você pode ver que isso é apenas um plano básico. Ele nem mesmo tem nenhuma variável embutida. Você pode ver se eu clico em padrões de classe, não há variáveis aqui. Esse é apenas um plano bem simples que podemos usar para armazenar variáveis. Também podemos criar funções, macros como outros projetos. Existem algumas funções duplas de substituição aqui, então você pode substituir o init, que é basicamente a função que será executada quando criarmos nossa instância de jogo pela primeira vez, temos um erro de rede, que eu não vou abordar nesta lição. Fomos encerrados e isso será executado quando fecharmos nosso jogo. Então temos um erro de viagem. E isso será executado se tivermos algum tipo de problema no transporte para um novo nível. Por enquanto, queremos que nossa instância de jogo realmente armazene uma variável para nós. Então, vamos criar essa variável. Eu só vou chamar esse exemplo novamente. E vamos compilar. Agora, antes de abrirmos nosso novo nível, precisamos definir essa variável. Então, ele irá para o nosso ThirdPersonCharacter aqui e criaremos uma nova função. Vou chamar essa instância de ganho de atualização , assim. Agora, o legal das instâncias do jogo é que você pode acessá-las de qualquer blueprint, da mesma forma que o modo de jogo. Então, podemos simplesmente clicar com o botão direito do mouse na pesquisa por Instância E você pode ver que podemos usar a instância get Game e isso apenas retorna uma referência à nossa instância de jogo. Agora, como criamos nosso próprio blueprint de instância de jogo, precisamos lançar isso para poder acessar suas variáveis. Ou você pode configurar uma interface de blueprint, se quiser. Mas vamos continuar com o elenco. Então, vou usar um custo para exemplificar, e depois queremos exemplo, instância de jogo como essa. Então, agora vamos apenas mover esses nós para baixo aqui e conectá-los à entrada de nossa função. Então, queremos usar definir essa variável de exemplo que criamos o suficiente. Então, vamos dar o exemplo, conectar isso aqui. E então vamos pegar nossa variável de exemplo de nosso personagem, e vamos conectá-la ao set. O nó set será compilado. Então, agora precisamos executar essa função antes de abrirmos nosso novo nível. Então vamos para o teletransporte e herdaremos , executaremos essa função. Portanto, precisaremos alterar nossa nota de custos aqui para custos de terceira pessoa. Então, vamos nos arrastar e fazer o custo. Terceiro, queremos o ThirdPersonCharacter porque esse é o plano que nossa nova função será arrastada e procurará a instância do jogo de atualização. E isso definirá nossa variável dentro da instância do jogo para o que quer que seja do nosso personagem. E então vamos conectar isso ao nosso nível aberto assim. Então, agora, quando nosso personagem aparece, precisamos que ele realmente leia a variável de exemplo que criamos dentro da instância de jogo de exemplo. Então, para fazer isso, que pode ir para o Gráfico de Eventos, criará planetas iniciais. Então, isso começará a jogar novamente, o que pode obter a instância ou desculpe, obter a instância do jogo. E isso nos dará acesso ao projeto, custará para a instância de jogo de exemplo. E então obteremos sua variável de exemplo. Então, vamos nos arrastar e obter exemplo. E usaremos isso para definir nossa variável de exemplo de caracteres. Então, vamos definir isso assim. E vamos executar isso no Begin place. Então, sempre que nosso personagem o gerar, leia qualquer que seja a variável de exemplo em nossa instância de jogo e, em seguida, defina isso como sua variável de exemplo. Agora, há mais algumas coisas que precisamos fazer antes de podermos testar isso. A primeira coisa é que não dissemos ao mecanismo para usar nosso novo exemplo de instância de jogo. Agora, na verdade, não fazemos isso no modo de jogo como a maioria das coisas, na verdade fazemos isso nas configurações do nosso projeto. Então, teremos que editar as configurações do projeto. E vamos pesquisar por Instância de Jogo. E você quer a classe de instância de jogo aqui, e vamos mudar isso para a instância de jogo de exemplo BP. Agora, o mecanismo sabe usar essa instância do jogo. E depois, em segundo lugar, vamos voltar ao nosso segundo mapa que criamos. Então, eu vou abrir isso e vamos clicar em Salvar aqui. E aqui, na verdade, vou adicionar nosso projeto de teletransporte aqui também. Então eu vou apenas arrastar isso para dentro, aumentar a escala para ficar um pouco maior. Estou adicionando isso apenas para que possamos nos mover para frente e para trás entre nossos dois níveis. Precisamos definir um nome de nível. Então esse será o nome do nosso primeiro mapa, que é um mapa em terceira pessoa. Vou clicar com o botão direito do mouse em selecionar, Renomear , copiar isso e colar isso em nossa variável de nível aqui assim. Em seguida, voltaremos ao nosso primeiro mapa em terceira pessoa. Então, vamos abrir isso e clicar em Selecionar, Salvar e selecioná-lo. E então estamos prontos para realmente testar isso. Então, vou apertar Play. Você pode ver que o valor é falso no momento porque acabamos de começar e eu não defini o valor. Mas se eu apertar um, isso se torna verdade. Agora, se formos para o teletransporte, isso permanecerá verdadeiro mesmo quando estivermos em nosso segundo nível. E isso porque nosso personagem está lendo essa variável do nosso exemplo de instância de jogo e depois configurando. E não importa quantas vezes alternamos entre os níveis, ele sempre lerá esse valor porque nossa instância de jogo não está sendo destruída ao contrário de nosso personagem e controlador. Agora, é claro, esse é um exemplo bem simples, que é armazenar uma variável em nossa instância de jogo. E, em seguida, lendo o personagem, você pode armazenar quantas variáveis quiser no blueprint da instância do jogo. E você pode acessar essas variáveis praticamente de qualquer projeto. Então, usamos nosso ThirdPersonCharacter, mas se quiséssemos, poderíamos acessar nossa instância de jogo no teletransporte. Então, poderíamos obter a instância do jogo. Também podemos acessar nossa instância de jogo aqui. Então é isso para esta lição. Espero que agora você entenda os usos da instância do jogo e como você pode usá-la em seus projetos futuros. 25. Aulas adicionais (traços): Olá pessoal. Nesta lição, vamos dar uma olhada nos traços. Os rastreamentos nos permitem pegar um local inicial e final e, em seguida, verificar o que há entre esses dois locais. Então, para começar, criaremos alguns exemplos de projetos. Vou clicar com o botão direito do mouse e criar uma nova classe de blueprint. Vai ser um ator, só vou chamar esse traço BP ao cubo. Vamos abrir isso. E eu vou apenas arrastar a guia até o par superior. E adicionaremos um novo componente. Vou apenas adicionar um componente de cubo que irá compilar isso. E vamos para o Gráfico de Eventos. Então, vamos configurar este cubo para que ele faça um rastreamento para outro cubo a cada quadro. Então, ele começará excluindo esses reprodução e o ator começará a sobrepor nós. Na verdade, use o nó de tecnologia e criaremos uma nova variável e chamaremos esse cubo. E eu vou definir seu tipo para BP underscore trace, trace cube. E vamos compilar então no painel Detalhes, que terá uma instância editável como essa. E vamos compilar novamente. Então vamos nos arrastar para fora e vamos pegar nosso outro cubo. Queremos verificar se ele está configurado, então usaremos um nó israelense apenas para garantir que não recebamos nenhum erro. E então de r é válido, vamos arrastar para fora e procuraremos por rastreamento. Agora, se rolarmos para cima aqui, você pode ver que temos alguns nós de rastreamento diferentes. Eles estão todos em colisão aqui. Vamos começar com apenas um simples traçado de linha por canal. Então eu vou criar isso. Agora. Um traçado de linha é essencialmente uma linha de pixel único que vai do início ao local final, verificando se ele atinge alguma coisa ao longo do caminho. Agora, existem algumas outras opções nesse nó, mas vamos configurar nosso exemplo primeiro e depois explicá-las. Então, o que faremos é nos arrastar para fora do nosso outro cubo. Queremos chegar até o local. E vamos conectar isso ao local final. E então, para o local de início, vamos usar nossa localização atual de cubos. Então, obtenha a localização do ator. Portanto, nosso rastreamento começará neste local de manutenção e viajará para o outro local do cubo. Agora, quando eu digo viagem, o rastreamento acontece em um quadro, não é como se ele se movesse lentamente. Tudo acontece em um quadro e, essencialmente, apenas verifica se existe um objeto entre os locais inicial e final? Também vou ativar o Draw Debug aqui. Vou configurá-lo para um quadro, e isso essencialmente nos permite ver o traço em nosso jogo, geralmente os traços são invisíveis, mas essa opção nos permite ver um traço enquanto estamos jogando no jogo. Um quadro significa que o traçado só será visível para um quadro. Duração significa que o traçado ficará visível por quanto tempo o tempo de gaveta estiver definido para, portanto, são cinco segundos por padrão. E então persistente significa que o traço ficará visível para sempre. Então, como estamos desenhando nosso traçado a cada quadro, podemos definir isso para um quadro. Então, agora vamos apenas compilar esse projeto e ir para o nosso nível. Eu só vou arrastá-lo em um cubo. E vamos arrastar em um segundo cubo. E eu vou, com meu segundo cubo selecionado, vou usar a outra opção de cubo aqui em baixo nos detalhes. E selecionaremos R de um cubo. E eu vou mover os dois para cima para que possamos vê-los um pouco melhor quando apertarmos o play. Então, quando eu clico em play, você pode ver que temos essa linha de pixel único que vai deste cubo para o cubo que selecionamos. Se eu pressionar F1 para entrar no modo wireframe, você pode ver que o traço começa no centro do nosso par de chaves e é lido. E quando ele atinge o outro cubo, obtemos esse quadrado vermelho e a linha fica verde. E isso significa essencialmente que até aquele quadrado vermelho, o traço não atingiu nada. Em seguida, o quadrado vermelho indica que atingiu algo, e então a luz fica verde porque é, os traçadores atingiram algo além desse ponto. Agora, você pode estar se perguntando por que são rastreados e atingem o cubo de onde vieram. E se sairmos do modo editor de plano e voltarmos ao nosso cubo de rastreamento, você pode ver que há realmente uma opção aqui chamada ignorar self no traçado de linha. E isso significa que o rastreamento basicamente ignorará o ator que fez o rastreamento. Então, como estamos em nosso cubo, se eu desmarcar isso e compilar e clicar em Play, você pode ver que a linha já está verde. E se atingirmos F1, você pode ver que nosso traço está realmente atingindo nosso cubo assim que ele começa e então o resto da linha fica verde. Veja, na verdade, não atinge nosso segundo cubo. Agora, isso é porque esse é um traço de linha única. Ele atingirá um objeto e não se importará com o resto depois disso. Agora, voltando ao nosso rastreio, há algumas outras opções para que possamos definir os atores para ignorar. Isso nos permite essencialmente definir atores que queremos que nossa linha seja rastreada para ignorar completamente. Então, se eu fosse arrastar e fazer um make array, isso nos permite apenas adicionar atores individuais a uma matriz e, em seguida, adicionar isso ao nosso traçado de linha. Então, se eu fosse conectar meu outro cubano aqui e conectá-lo ao array, eu vou marcar de volta no ignore self porque queremos que eu vou marcar de volta no nosso traço ignore o cubo que faz o rastreamento compilar quando eu clico em play, você pode ver se eu pressiono F1 ou trace não está atingindo mais nada porque dissemos que não queremos ou desculpe, queremos que ele ignore nosso segundo cubo. Agora, voltando ao nosso projeto de cubo de rastreamento, há outra opção aqui chamada canal de rastreamento. Agora, os canais de rastreamento são como camadas nas quais podemos usar nossos traços. Agora, a razão pela qual temos isso é que você pode ter um objeto que deseja bloquear um tipo de rastreamento, mas não outro. Então, agora você pode ver que temos tudo configurado para visibilidade. Este é um canal de rastreamento embutido no motor. Se eu for até o meu cubo aqui no nível e selecioná-lo, vou selecionar o componente do cubo. Vou deixar isso um pouco maior para que possamos ver o que vou rolar para baixo até a categoria de colisão. Em Predefinições de colisão, você pode ver que está configurado para bloquear todas as dinâmicas. Clicamos no menu suspenso aqui. Você pode ver que temos essas opções aqui que estão esmaecidas. Isso porque temos uma predefinição selecionada. Portanto, se clicarmos no menu suspenso aqui e clicarmos em Personalizado, isso nos permitirá personalizar as configurações. Assim, você pode ver que, para respostas de rastreamento, temos visibilidade e temos câmera. Agora, se eu definir nosso par de chaves para ignorar o canal de rastreamento de visibilidade, e eu voltar para o meu cubo. Eu só vou desconectar o outro cubo aqui da nossa matriz make. Então agora vou rastrear, vou acertar o outro cubo. Vou clicar em Compilar e clicar em Reproduzir. Você pode ver se eu pressiono F1, o traço ainda não está atingindo o cubo, portanto, tem que voltar com nosso cubo selecionado aqui. Selecione nosso cubo e configure-o para bloquear a visibilidade novamente e, em seguida, pressione Play. Você vê que agora está atingindo aquele cubo. E isso porque estamos dizendo a essa malha cúbica para ignorar ou bloquear esse tipo de traço. Agora, os rastreamentos são usados para todos os tipos de coisas no desenvolvimento de jogos. Eles usaram para interação para determinar o que o personagem está olhando. Você pode usá-los para coisas como sistemas de pegadas para detectar que tipo de solo os personagens estão. Você pode usá-los como armas. Então aperte Escanear armas, você usa rastros. Portanto, qualquer jogo em que não haja tempo de viagem de bala que normalmente use traços para os cálculos da bala. Portanto, os traces têm uma grande variedade de usos no desenvolvimento de jogos. Mas o importante sobre os traços que podemos realmente obter informações sobre o objeto que ele atingiu. Então, se eu sair do nosso editor de planos aqui, voltamos ao nosso cubo de rastreamento. Você pode ver que temos alguns resultados. Agora, se eu sair da minha roupa aqui, podemos quebrá-la. E isso porque, na verdade, é apenas uma estrutura. Você pode ver a estrutura dos resultados dos quadris. Para que possamos quebrar isso. E isso nos dá esse nó aqui com todas as informações sobre qual objeto, a cabeça de rastreamento. Agora também temos o valor retornado aqui, e isso basicamente diz se o rastreamento realmente atinge alguma coisa. Então, normalmente você provavelmente gostaria de fazer nó aqui e obter informações sobre o objeto somente se o rastreamento realmente atingir algo. Agora vou passar por algumas dessas variáveis. Não vou cobrir todos eles porque existem alguns, mas vou examinar os mais usados no topo. Aqui temos bloqueios aqui. Isso basicamente faz a mesma coisa que um valor de retorno. Diz se o traçado de linha atingiu ou não alguma coisa, e isso é um booleano. Em seguida, descendo, temos distância. Agora, isso é o quão longe da estrela o traço da linha atinge alguma coisa. Portanto, se a distância entre, digamos, início e o fim fosse de 500 centímetros e o traço atingisse algo 100 centímetros desde o início, então esse valor de distância seria 100. Em seguida, temos a localização e o ponto de impacto. Agora, para um rastreamento de linha, eles serão exatamente o mesmo valor, mas serão diferentes para alguns de nossos outros nós de rastreamento que veremos em um momento. Em seguida, temos um dos pinos mais importantes, que é o nosso Ator de Sucesso. Agora, isso nos dá uma referência a qualquer ator ou traçado de linha. E é muito útil para coisas como se você estiver criando uma arma, aquele traçado de linha da Pfizer ou um sistema de interação, você quer saber qual ator o traçado de linha realmente atingiu e usando o pino Hit Actor aqui está como você faria isso. Também temos acesso ao componente do quadril. Então esse será o componente dentro do ator que atingimos. Então, por exemplo, nosso cubo, estaríamos atingindo o componente do cubo. Portanto, esse componente de acerto seria uma referência ao cubo dentro do nosso ator de cubo. Esses pinos funcionam como se usássemos pinos de ator e canetas de componentes antes. Poderíamos nos arrastar disso, poderíamos usar um custo para determinar se é, digamos, Cast to ThirdPersonCharacter. E se o rastreamento atingir um personagem de terceira pessoa, poderemos acessar essas informações usando nossos nós de custos. Também podemos usar nossos nós de interface e obter informações do ator. Para que pudéssemos fazer algo como getLocation. E podemos usar esse ato de alfinete, como fizemos com tipos dependentes de atos anteriores . Também temos acesso ao nome do osso que o traço atinge. Então, se eu rastrear atinge uma malha esquelética, então essa é uma malha de máscara animada que tem um esqueleto. Isso retornará o nome real do osso da parte de colisão atingida pelo traçado. Assim, você pode usá-los para acessar nomes de ossos. E então aqui em baixo temos nosso rastreamento, início e rastreamento. E isso seria o mesmo nossos insumos aqui em cima para começar e terminar. Agora, até agora, só observamos o traçado de linha por canal. Agora há outro nó de rastreamento de linha. Então, se procurarmos por traço mentiroso, você pode ver que também temos um traçado de linha por perfil e traçado de alinhamento para objetos também. Então, se eu criar um rastreamento de linha para objetos, esse é essencialmente o mesmo nó. Faz a mesma coisa que temos aqui fora. Temos o começo e o fim. Temos as mesmas configurações, mas em vez de um canal de rastreamento, temos essa entrada de matriz que é um tipo de objeto. Se eu arrastar para fora daqui e usá-los make array que nos permite realmente definir quais valores estarão nessa matriz de entrada. Então você pode ver que, por padrão, tem um mundo estático aqui. Eu clico no menu suspenso. Você pode ver que ele está nos dando alguns tipos de objetos. Agora, se voltarmos ao nosso cubo com nosso cubo selecionado aqui, e formos para o componente cubo. Isso se refere ao tipo de objeto listado aqui. Então você pode ver que isso está definido como mundo para dinâmico, o que significa que este cubo ou apenas ser mantido por traços que têm uma entrada de dinâmica mundial. Esse traçado de linha aqui com a estática mundial ignoraria completamente esse cubo. Então é a isso que os tipos de objetos de entrada estão se referindo. É esse tipo de objeto em nossas predefinições de colisão. Poderíamos conectar isso rapidamente para ver se eu apenas conecto isso no meu como válido, vou excluir nosso nó de rastreamento de linha anterior. Vamos conectar isso à nossa estrela e ouvir o nosso fim. E vamos conectar isso. Podemos deixar isso por enquanto. Acabamos de definir o Draw Debug Type two para que um quadro seja compilado e, em seguida, pressionaremos Play. Você pode ver que se eu pressionar F1, esse traço está ignorando completamente o cubo. Mas se voltarmos ao trace, ao trace cube e mudarmos isso para world dynamic. Clique em Compilar, clique em Reproduzir. Você pode ver que agora esse traço está atingindo um cubo porque está atingindo esse Q porque é o mesmo tipo de objeto. E o legal disso é que podemos definir vários tipos. Então, podemos simplesmente adicionar uma nova caneta e também adicionar estática selvagem. Poderíamos adicionar outra entrada. Poderíamos definir isso como ****, por exemplo. Poderíamos adicionar quantos quisermos esse traço ao quadril. Agora, a última nota de rastreamento de linha que veremos é o traçado de linha por perfis. Então, se eu pesquisar por rastreamento de linha por perfil, agora as entradas são as mesmas que nossos nós anteriores, mas temos esse nome de perfil. Agora, isso se refere às respostas do objeto que o objeto que estamos tentando atingir tem. Então, voltamos ao nosso mapa aqui, selecionamos nosso cubo e, nas configurações de colisão, você pode ver que temos respostas de objetos. Agora, vou usar **** como exemplo. Então você pode ver que **** está definido para bloquear. Então, se eu voltar para o meu rastreador, vou definir o nome do perfil para conectar isso como fizemos antes. Conecte-se para começar a obter uma localização ativa e terminar em nossos outros cubos, localização do ator. Vamos ativar o Draw Debug Type two para um quadro. Vamos clicar em Compilar. E quando apertamos play, você pode ver que nosso traçado de linha está atingindo o de um cubo ali. Mas se aceitarmos e eu selecionarmos o cubo e selecionarmos nosso componente de cubo e definirmos nosso objeto**** responsivo para ignorar. Então eu clico em play. Você pode ver que nosso rastreamento não está mais atingindo o cubo porque nosso rastreamento é feito na resposta do objeto de perfis. E nosso cubo, não está mais bloqueando esse rastro. Em seguida, vamos dar uma olhada em vários traços. Agora, se você se lembra, quando nosso traço atinge algo, ele não se importa mais com mais nada ao longo de seu caminho, ele fica verde e não atinge nenhum outro objeto. Mas com vários traços , pois nos permite atingir vários objetos em um traço. Então, se voltarmos para o nosso cubo de rastreamento agora, vou excluir essa nota de rastreamento que estamos usando e farei o aluguel. Se eu pesquisar um rastreamento de linha, você pode ver que temos versões de rastreamento de múltiplas linhas dos nós que examinamos. Assim, podemos fazer um rastreamento de várias linhas por canal. E você pode ver que todas as entradas são iguais, mas em vez de uma única aqui, temos uma variedade de saídas. E isso funciona como uma matriz normal. Podemos dizer obter o resultado getter em um determinado índice. Assim, poderíamos usar a entrada do nó get em um índice que queremos acessar a partir do array e a saída são resultados de hit. Então, se nos arrastarmos para fora do nosso nó get, então faremos uma pausa. Você pode ver que temos a mesma nota de pausa que tínhamos antes. E agora estamos acessando o resultado do primeiro hit de nossa variedade de roupas. Agora também podemos percorrer esses resultados. Assim, podemos usar um nó de loop a para cada nota de loop e, se você se lembrar, isso percorrerá todos os resultados ou todas as entradas em nossa matriz. E isso nos dará acesso a cada um deles usando nossos elementos de matriz. Então, novamente, podemos usar um nó de resultado do kit de freio, acessar todas essas informações sobre cada um dos objetos que nossos traçados de linha atingiram. Agora, além de ter várias saídas para nossos resultados de quadril, o rastreamento de múltiplas linhas funciona exatamente da mesma maneira que um traçado de linha normal por nó de canal, fornecemos um local de início e localização final. Podemos dizer um canal no qual queremos fazer o rastreamento. Então, atualmente, está definido para alguma visibilidade. Podemos definir se podemos ou não ver o traço. Eu só vou definir o meu para, para um quadro. Então, agora, se compilarmos e clicarmos em Play, você pode ver que nosso rastreamento está funcionando. Mas o legal dos traços de múltiplas linhas é que podemos ter vários hits. Agora, para fazer isso, vou arrastar um novo cubo aqui. vou definir meu primeiro cubo disso, vou definir meu primeiro cubo para rastrear esse. Agora, se eu clicar em play, você pode ver que ainda estamos entrando no wireframe com F1. Você pode ver que ainda estou batendo apenas em um dos nossos cubos. Se eu voltar para o nosso código e eu puder realmente arrastar para fora das roupas, eu farei o comprimento deletará esse traço, o nó de loop por enquanto. Isso realmente nos dirá quantos resultados estão em nossa matriz de resultados de acertos. Então, se compilarmos e clicarmos em Play, você verá que ele está atingindo apenas um objeto, mesmo que esteja rastreando até este cubo. Agora, a razão para isso é que esse cubo ainda está bloqueando o traço de visibilidade, o que significa que o traçado não pode percorrer e atingir outros objetos. Para permitir isso, temos que definir nosso cubo para realmente se sobrepor. O traço. Então vamos para a visibilidade aqui com nosso cubo selecionado, e eu vou configurá-lo para se sobrepor. Agora, quando clicamos em play, você pode ver que estamos acertando dois objetos. Se entrarmos em nosso wireframe, você pode ver que estamos atingindo este primeiro cubo e, em seguida, estamos vendo nosso segundo cubo. Portanto, isso é algo a ter em mente se você trabalhar com traços de várias linhas. E o futuro é se você quiser que o traço seja capaz viajar através de um objeto e ainda atingir outros objetos. O objeto precisa ser configurado para sobreposição em vez de bloco. Se estiver definido como block, qualquer objeto nas ocorrências de rastreamento após esse objeto não será gerado em nossos resultados do nosso nó de rastreamento de várias linhas. Agora, existem outros tipos de nós de rastreamento. Até agora, usamos apenas o traçado de linha. Se clicarmos com o botão direito do mouse e procurarmos por rastreamento, rolaremos para cima. Você pode ver que temos um rastreamento de caixa por canal, multicast, rastreamento por canal. Temos o traçado da esfera por canal. E, essencialmente, eles farão a mesma coisa que nosso canal. Traçado de linha por canal, traçado de linha por perfil e linha traçada por objetos, nós. Mas, em vez de apenas uma única linha de pixel na verdade, nos dá uma forma. Então, se selecionássemos, digamos, por exemplo, o traço quadrado por canal, você pode ver que temos o mesmo tipo de entradas. A única diferença é que temos um raio. Este é o tamanho da esfera que é um bit rastreável. Então, se eu excluir nosso traçador de várias linhas, podemos atuar em nosso canal de rastreamento de esfera. Vou conectar isso até o fim, início e fim. E vamos definir o raio para dizer dez. Esse é o tamanho da esfera que vai do início ao fim. Então, vamos definir o sorteio D balde dois para um quadro será compilado e, em seguida, clicaremos em Play. Você pode ver que agora, em vez de uma única linha, é esse traço em forma de esfera. Agora, isso só permite que você rastreie uma área maior. Então, digamos que você não queria que uma bala um pixel de tamanho quando uma arma a dispara, talvez você quisesse que fosse uma esfera 55 centímetros de diâmetro, então você poderia fazer isso em vez disso. Agora, como nosso rastreamento de linha, há uma versão múltipla desse nó. Então, se eu clicar com o botão direito do mouse e procurar por rastreamento de esfera, você pode ver que temos rastreamento multi-escalar por canal, maltês, rastreamento justo por perfil e rastreamento multi-esfera para objetos. Assim, poderíamos criar uma versão multiesfera desse nó. Você pode ver que é exatamente o mesmo, mas temos nossa entrada de raio e podemos produzir vários resultados de quadril. Agora eu não vou passar por todos os nós de rastreamento porque a maioria deles é a mesma. Eles são apenas versões diferentes para o traço múltiplo e , em seguida, o traço diferente por tipos e, em seguida, as diferentes formas. Mas se você quiser encontrá-los, você sempre pode procurar por rastreamento e procurar por, digamos, caixa que lhe dará acesso a toda a caixa. Rastreie esses traços superiores aqui com um único traço e então você tem os vários traços. Você também pode pesquisar por esfera. Isso lhe dá acesso a todos os traços da esfera. Você pode pesquisar por linha, traçado, linha. Isso lhe dará acesso a outros traços de linha. E então, finalmente, você tem a cápsula. Isso lhe dará acesso a todos os tipos de traços de cápsula. Agora, por fim, eu disse que diria a diferença entre o ponto de impacto e a localização em nosso intervalo agora, então se clicarmos na seta para baixo aqui e abrirmos isso. Agora, em um traçado de linha a localização e ponto de impacto serão exatamente os mesmos, mas com uma esfera, por exemplo, o ponto de impacto e a localização em diferentes, o ponto de impacto seja o ponto exato em que a esfera atinge a superfície do cubo. Então, se você imaginar bem na borda da esfera onde as caixas vermelhas, esse é o ponto de impacto. O ponto exato em que a esfera se sobrepõe à caixa. Enquanto o pino de localização aqui é a localização dessa esfera. Portanto, nossa esfera, o centro dela, está na verdade mais distante da superfície do cubo. Então essa é a diferença entre o ponto de impacto. Esse é o ponto exato em que a esfera se sobrepõe, o cubo e a localização são o centro do cubo quando essa sobreposição acontece. Agora é isso para nossos traços menos do que no momento, voltaremos a usar traços novamente em algumas de nossas lições futuras. 26. Aulas adicionais (tabelas de dados): Olá pessoal. Nesta lição, vamos dar uma olhada nas tabelas de dados. Usamos tabelas de dados para armazenar informações que não precisamos alterar durante o jogo, mas podemos recuperar essas informações usando blueprints. Um exemplo de quando você pode usar uma tabela de dados é, por exemplo, se você está criando um RPG ou jogo de sobrevivência onde você tinha centenas ou talvez até milhares de tipos diferentes de itens e você está obter cada um desses itens terá algum tipo de informação que não muda durante o jogo, como por exemplo, seu nome, item, descrição e peso. Esses valores podem não mudar durante o jogo. Portanto, uma tabela de dados seria uma boa maneira armazenar essas informações e, em seguida, recuperá-las facilmente no código. Então, vamos começar. Precisamos criar uma nova estrutura. E isso ocorre porque as tabelas de dados usam a estrutura para determinar quais informações elas podem parar. Então, vamos clicar com o botão direito do mouse e vamos para as plantas , saímos e vamos para a estrutura. Vou nomear o meu sublinhado S e essa é a estrutura do exemplo, struct. Vamos abrir isso. E se você se lembra, temos uma lição anterior sobre estruturas. Então, se você ainda não viu isso, eu recomendo dar uma olhada. Mas vamos apenas adicionar algumas novas variáveis e dar nomes a elas. Então, o nome do nosso primeiro artigo. E definiremos isso como um tipo de variável de texto. Vamos ligar para o segundo, espere. E vamos definir isso como um flutuador. Vamos chamar o próximo dano. E definiremos isso como um número inteiro e causaremos saúde ao último. E definiremos isso como um número inteiro também. E então salvaremos essa estrutura. Agora estamos prontos para criar nossa tabela de dados. Então, vamos voltar ao navegador de conteúdo, clicar com o botão direito do mouse e selecionar a categoria miscelânea. E então aqui queremos selecionar Tabela de dados. Agora, aqui é onde selecionamos qual struct queremos que nossa tabela de dados use. Então, vou clicar no menu suspenso e pesquisar por S underscore example struct. Vou selecionar isso e clicar em OK. Agora vamos nomear nossa tabela de dados. Então, vou chamar minha tabela de dados de exemplo. E vamos clicar duas vezes nisso para abri-lo. E eu vou arrastar o meu até o topo. Então, agora temos um novo layout de interface do usuário aqui. Temos nossa tabela de dados. Agora, esta é a informação atual que essas tabelas armazenam. Como você pode ver, está vazio no momento. E aqui embaixo temos o editor de linhas. Então, quando temos informações em nossa tabela de dados, podemos selecionar uma linha, e esse editor de linha nos permitirá alterar as informações armazenadas nessa linha específica. Então, para criar uma nova linha ou vá até o botão Adicionar e pressione isso. Agora você pode ver que temos uma nova linha na tabela de dados. E com isso selecionado, posso alterar qualquer uma das variáveis que criamos dentro de nossa estrutura para essa linha específica. Agora também temos o nome da linha. Agora, esse é o nome que usaremos para acessar as informações armazenadas nessa linha específica quando estivermos codificando e projetando. Portanto, você sempre quer ter certeza de que está dando nomes amigáveis às suas linhas e tabelas base. Então, poderíamos renomear isso para dizer atos. Por exemplo, digamos que estamos criando uma tabela de dados para itens que estarão em nosso jogo de RPG. Portanto, você teria entradas na tabela de estados ou novas linhas para cada item. Aqui, você definiria o nome do item, por exemplo, que possamos definir nosso nome para agir. Como eu disse, o peso dez, o dano a 20, por exemplo. E agora definimos esses dados nessa corda específica. E se quiséssemos, poderíamos criar outra linha. Então, podemos clicar em Adicionar. E agora temos uma nova linha. Talvez quiséssemos armazenar informações sobre tipos para que pudéssemos criar uma linha de espada em C. Renomeei o nome da linha para classificar e definirei o nome para classificar. Quem definiu o peso para salvar cinco e nosso dano para dez, por exemplo. Agora, existem alguns outros botões aqui em cima que nos permitem controlar nossas linhas. Então, temos copiar e colar. Isso permite que você copie o conjunto de dados em uma linha e cole-o em outra. Então, se eu selecionar meu AKS, por exemplo e eu copiar, e eu selecionar minha espada escreveu e eu colar. Você pode ver que agora substituiu os dados na minha linha de espada pelas informações que foram definidas na minha linha AKS, você pode ver que o nome da linha não foi alterado, que ainda está definido como espada. Isso porque seus nomes de linha precisam ser exclusivos. Portanto, não pudemos criar uma nova linha, por exemplo, e chamá-la de atos. Você pode ver que isso nos dá um erro porque cada linha precisa ter um nome exclusivo. Agora também podemos excluir linhas. Então, com minha nova linha selecionada aqui, posso clicar em remover para remover a linha. E também podemos duplicar linhas. Assim, podemos selecionar a linha, clicar em duplicar e ela duplicará essa linha. Você pode ver que está dando a ele um novo nome chamado espada sublinhado 0. Se agora eu vou apenas remover essa espada sublinhado 0 e vou definir minhas informações de volta para o que era para o nosso SolidWorks. Então eu vou selecionar Sort e vou definir isso como espada. E vamos definir isso para, eu acho que era branco F5 e o danificou. Agora vou mostrar como podemos realmente acessar essas informações que estamos definindo em nossa tabela de dados dentro de um blueprint. Então, começaremos acessando nosso Projeto de Personagem de Terceira Pessoa. Eu só vou abrir isso. E se clicarmos com o botão direito do mouse, podemos procurar a linha Get Data Table. Você pode ver que temos duas opções aqui. Vou selecionar o nó de linha get data table aqui e ver que obtemos esse novo nó que não usamos antes. Se selecionarmos nossa tabela de dados, é assim que definimos de qual tabela de dados queremos acessar as informações. Portanto, temos apenas a tabela de dados de exemplo que eu criei. Então, vamos selecionar isso. Você pode ver que o nome da nossa função mudou automaticamente para uma pequena opção suspensa. E podemos ver que temos nossos atos e linhas de espada que criamos dentro do nosso exemplo DataTable. Agora, essas são apenas entradas variáveis. Então, digamos que eu tenha uma variável de nome de linha que eu queria conectar aqui. Eu poderia, se eu me arrastar daqui, podemos fazer promoções variáveis. E se você se lembrar, isso apenas cria uma nova variável do tipo da qual nós arrastamos para fora. Então, vou criar uma nova variável e ver que ela está usando um tipo de variável name. Ele acabou de chamá-lo para o nome da linha, mas essa é apenas uma variável de nome padrão que podemos conectar à nossa tabela de dados para nos dizer qual linha queremos obter de nossa tabela de dados. Mas, por enquanto, vou excluir isso e usaremos o menu de seleção aqui. Então, eu só vou selecionar a espada. Agora, temos duas saídas. Temos linha encontrada e rho nada encontrado. Agora, isso é mais usado se você estiver usando uma variável que se conecta ao nome da linha. Porque se usarmos uma dessas seleções, ela nos dará as linhas que existem em nossa tabela de dados. Então, sempre vai encontrar essas linhas. Mas se tivéssemos nossa variável de nome de linha conectada e disséssemos que isso foi definido como, se pudermos puxar para mostrar o valor padrão, digamos que isso foi definido como algo como back pack. Agora, não há uma linha de mochila dentro da nossa tabela de dados de exemplo. Então, esse nó executaria rho nada encontrado porque não encontrará essa linha. Enquanto que se fosse definido para algo como atos, por exemplo, então rho found seria gordo, seria executado porque encontrou essa linha dentro da nossa tabela de dados. Agora temos uma produção aqui chamada outgrowth. E se nos arrastarmos, podemos fazer um nó de quebra. E você pode ver que é realmente um nó de quebra para a estrutura que usamos ou criamos e estamos usando dentro de nossa tabela de dados. Para que possamos quebrar essa estrutura. Você pode ver que agora podemos acessar todas as informações que definimos em nossa tabela de dados. Então, se eu fosse criar um jogo inicial, por exemplo, nós conectamos isso em nossa linha da tabela de dados. Assim, garantirá que o nome da linha esteja definido como machado, o que é então que faremos apenas a partir da linha encontrada. Vamos arrastar para fora e fazer uma string de impressão. E podemos conectar, digamos, o nome até nossa string impressa. E vamos compilá-lo e clicar em play. E você verá que o machado está sendo impresso. Se voltarmos ao nosso ThirdPersonCharacter e mudarmos nome da nossa linha para algo como, acho que foi vendido. Nós podemos empilhar. E quando clicamos em Play, você verá que a tabela de dados dentro do ThirdPersonCharacter está encontrando linha da espada e está retornando as informações que armazenamos dentro dessa linha. Se quiséssemos, poderíamos alterar esses dados. Então, se eu for para a tabela de dados de exemplo e eu mudar o nome dentro da nossa linha de espadas, outra coisa, digamos maçã. Se salvarmos isso e clicarmos em Play, você verá que agora ele imprime maçã, mesmo que estejamos selecionando a linha da espada, e esse é apenas o nome da linha. Estamos usando as informações que armazenamos dentro dessa linha, e agora é a Apple. Agora, há outra maneira de dizer nossas datas de obtenção, linha da tabela, nó, qual linha queremos que isso seja um pouco mais fácil de usar do que usar apenas uma variável de nome. Portanto, se removermos nossa variável name do gráfico de eventos aqui, criaremos uma nova variável. Vou chamar isso de seleção de linha. seletor definirá o tipo para manipulador de linhas da tabela de dados, desculpe. Criaremos isso, compilaremos e receberemos um erro desse nó só porque não definimos uma linha. Então, vou definir isso para classificar. E se compilarmos novamente, você pode ver que o erro desaparece. Agora, nossa linha pode selecionar uma variável como essa. Agora, isso é basicamente apenas uma estrutura embutida no motor. Então, se arrastarmos, você pode ver que temos um nó de identificador de linha da tabela de dados de quebra que nos permite acessar as duas variáveis que são definidas dentro da estrutura seletiva de linha e na classe default. Portanto, se nossas variáveis do seletor de linha forem selecionadas, você pode ver que podemos dizer tabela de dados e um nome de linha. Agora, se eu selecionar Renomear e acho que surge porque não definimos uma tabela de dados. Então, vou definir isso para nossa tabela de dados de exemplo aqui. Agora, quando eu seleciono o nome da linha, você pode ver que ele nos dá acesso às duas linhas existentes dentro de nossa tabela de dados de exemplo. Eu poderia definir isso para dizer machado. Agora, usando o nome da linha em nosso nó break, podemos simplesmente conectá-lo diretamente em nossa linha Get Data Table. Observe que agora temos uma maneira muito mais amigável de dizer a esse nó sobre qual item queremos obter informações da nossa tabela de dados. Então, se eu compilar, e agora esperaríamos que nossa string de impressão imprimisse o nome, porque é assim que estamos dizendo para acessar. Se voltarmos, podemos mudar isso para a espada. E agora vamos vê-lo imprimir o nome da Apple para o qual mudamos. Agora, apenas como uma nota lateral, se sairmos dos planetas, você também pode inserir essa variável na linha get data table, nó. Mas eu não recomendo fazer isso porque se você estiver conectando isso e alterar a tabela de dados para uma tabela de dados que usou uma estrutura diferente da que estamos usando aqui, você pode causar erros e problemas em seus projetos. Então, normalmente, eu recomendo apenas deixar isso desconectado ou desconectado e, em seguida, deixar a configuração manual da tabela de dados que você está usando aqui. Agora, há outra nota da tabela de dados, então, se clicarmos com o botão direito do mouse e procurarmos a tabela de dados, e procurarmos a linha em C, isso é a. A linha da tabela de dados existe? Agora, isso basicamente faz a mesma coisa que nossa linha Obter tabela de dados, mas não nos fornece as informações armazenadas nessa linha. Tudo o que ele faz é verificar se o nome da linha existe dentro da DataTable. Então, novamente, poderíamos copiar e colar esses nós. Eu coloco meu nome de linha nele, e vou definir a tabela de dados para tabela de dados de exemplo. Agora e comece a brincar com ele. Vamos apenas imprimir verdadeiro ou falso. Se a tabela de dados que selecionamos existir. Agora, como estamos usando nossa linha, selecione uma variável. Só podemos selecionar tabelas de dados que existem dentro dessa tabela de dados de qualquer maneira. Portanto, sempre retornará true quando usarmos esse nó para controlar qual linha queremos selecionar. Mas talvez estivéssemos usando uma variável de nome. E dessa forma poderíamos definir um nome aqui, digamos mochila. E essa linha não existe em nossa tabela de dados. Então, quando clicarmos em Play, você verá que a impressão é falsa. Se eu voltar e mudar isso para dizer atos que, e podemos clicar em Play. Você verá que está retornando true porque essa linha existe dentro do nosso exemplo DataTable. Outro nó é o, se excluirmos esse código aqui apenas para torná-lo um pouco mais de espaço, vou movê-lo para cima aqui. Se clicarmos com o botão direito do mouse e procurarmos por tabela de dados, você verá que precisamos obter nomes de linhas da tabela de dados. Se eu criar esse nó, você verá que definimos uma tabela de dados. Definiremos a tabela de dados de exemplo e, em seguida, sua saída será, na verdade, uma matriz de nomes. E isso produzirá uma matriz que contém todos os nomes das linhas que existem em nossa tabela de dados de exemplo. Então, se eu conectar isso para começar a jogar, vamos percorrer esses resultados. Portanto, esse nó será executado para cada linha que existe dentro do nosso array. Podemos apenas imprimir uma string como essa. Agora, isso imprimirá todos os nomes das linhas quando o jogo começar. Então, se clicarmos em Play, você pode ver que está imprimindo cera e está imprimindo espada. Agora. Por fim, eu só quero explicar como as tabelas de dados compostas funcionam. Tabelas de dados compostas nos permitem pegar várias tabelas de dados e combiná-las para que possamos acessar várias tabelas de dados quando selecionamos uma tabela de datas específica. Então, o que quero dizer com isso é que se criarmos outra tabela de dados, agora, essas tabelas de dados terão que usar a mesma voz de estrutura. Não seremos capazes de combiná-los juntos. Então, criaremos uma nova tabela de dados. Usaremos novamente a estrutura de exemplo de sublinhado S. E eu vou apertar Ok, vou nomear isso. Chamamos isso de itens de arma. Então, por exemplo, você poderia ter diferentes tabelas de dados para armas, consumíveis, remédios, coisas assim se você quisesse, se estivesse fazendo itens para, digamos, um jogo de RPG. Então abra itens de armas IPython. E eu vou criar algumas novas linhas de espingarda legal. E vou chamar isso de um rifle. Defina o nome para rifle. Rifle também. E também a espingarda para espingarda. Agora defina o peso para dizer para, para a espingarda e seis para o dano do rifle será definido para 30, e chocolate mais dano definido para dez. Agora temos essas linhas dentro de nossa tabela de dados de itens de armas. Agora, se voltarmos ao nosso ThirdPersonCharacter e voltarmos ao código que criamos antes. Agora, essas linhas estão dentro de uma tabela de dados diferente. Portanto, se selecionarmos nosso seletor de linha aqui, você verá que não consigo selecionar essas linhas porque atualmente estamos usando a tabela de dados de exemplo. E se ligássemos, digamos, um nome de linha, e ligássemos isso e definíssemos manualmente o nome da linha para dizer espingarda. Quando esse código é executado, ele realmente não encontra essa corda porque, novamente, essa linha existe em nossos itens de arma, não dentro de nossa tabela de dados de exemplo. Portanto, não seria encontrado. Agora, porque a tabela de dados de exemplo e a tabela de dados de itens de armas usam a mesma estrutura. Podemos combiná-los usando uma tabela de dados de concertos. Então, vamos para o navegador de conteúdo, clique com o botão direito do mouse, vá para miscelânea e queremos criar uma tabela de dados composta. Novamente, temos que escolher uma estrutura. Agora, essa precisa ser a mesma estrutura que usamos para ambos, por exemplo, tabela de dados e tabela de dados de itens de armas. Então selecione o exemplo struct hit, Ok? E chamaremos isso de lista de itens mestre, por exemplo. Abriremos isso e teremos um novo editor. Na verdade, não há muito que você possa fazer dentro de uma tabela de dados composta. Podemos criar novas linhas ou algo parecido. O que podemos fazer, no entanto, é adicionar tabelas pai. Então, vamos adicionar um novo elemento. E vamos definir isso para nossas armas que os itens não deveriam ver. Depois de fazer isso, agora podemos ver nossos itens de armas dentro de nossa tabela de dados composta. E vamos adicionar outro elemento. E vamos definir isso para nossa tabela de dados de exemplo. Você pode ver quando eu faço isso, os itens que estão dentro de nossa tabela de dados de exemplo também adicionados em nossa lista de itens mestre. Agora, não podemos editá-los aqui, ou basicamente podemos adicionar novas tabelas de dados e combinar as linhas em uma tabela de dados composta. Então, agora que temos todos esses itens dentro de nossa tabela de dados composta, se voltarmos ao nosso personagem de terceira pessoa, em vez de usar a tabela de dados de exemplo aqui, vou desconectar o nome da linha no momento. Podemos definir isso para a lista de itens mestre. Essa é a nossa tabela de dados composta. E agora, se você for para o nome da linha, podemos selecionar nossa espingarda, rifle e essas flechas que existem na tabela de dados de itens de armas. Ou podemos selecionar os atos e as linhas de espada e aqueles que existem em nossa tabela de dados de exemplo. Isso nos permite combinar várias tabelas de dados, desde que elas estejam usando a mesma estrutura em uma tabela de big data que podemos acessar dentro de nosso blueprint. Isso é útil para organizar. Se você tiver muitos dados que armazenará dentro das tabelas de dados. E se formos dizer nossa tabela de status de item de arma e eu adicionar novas linhas, chamarei isso de faca assim. E nós economizamos. Se voltarmos ao ThirdPersonCharacter Blueprint, podemos clicar no menu suspenso aqui e você pode ver que a faca agora está aparecendo e ela será atualizada automaticamente se adicionarmos ou editarmos as informações e Eva são nossos itens de arma, tabela de datas ou a tabela de dados de exemplo. Por fim, se formos para o nosso seletor de linha aqui, também podemos usar a tabela de dados composta aqui também. Então, se eu for para a opção Tabela de dados, podemos definir isso para a lista de itens mestre. E agora, se compilarmos e olharmos o nome da nossa linha, você pode ver que podemos acessar todas as armas de nossa tabela de dados de exemplo e de toda a tabela de dados de itens de armas aqui também. Então podemos simplesmente inserir o nome certo. E agora podemos usar facilmente nosso seletor de linha para selecionar qualquer uma dessas linhas de qualquer uma das nossas tabelas de dados. Novamente, não se preocupe com esse erro. É porque não tínhamos um conjunto de nomes de linha. Se eu compilar, você pode ver que o erro desaparece. Então, para resumir, as tabelas de dados são realmente boas em armazenar muitas informações que não precisam ser alteradas durante o jogo. Se você tiver informações que precisam ser alteradas, então você não pode armazená-las dentro uma tabela de dados porque você não pode alterar as informações da tabela de datas durante o jogo. 27. Aulas adicionais (códigos de sobreposição): Olá pessoal. Nesta lição, falaremos sobre os nós sobrepostos. As notas sobrepostas são uma ótima alternativa ao uso de componentes de colisão de caixa ou esfera. Agora, uma coisa muito comum que vejo com iniciantes é que você tende a abrir seus níveis e eles são preenchidos com componentes de colisão de caixa e esfera. Agora, eles podem funcionar e são razoavelmente fáceis de trabalhar. Mas o problema é mais tarde em seu projeto, quando você tem projéteis ou traços ou veículos tentando se mover, essas caixas de colisão e esferas podem interferir com o funcionamento desses sistemas. corretamente, pode exigir que você dê a volta e altere as configurações de colisão em centenas de diferentes componentes de colisão de caixa e esfera. Portanto, os nós de sobreposição nos fornecem uma alternativa útil ao uso de componentes Box e sphere. Às vezes, podemos ir ao nosso ThirdPersonCharacter e eu vou criar um exemplo. Vamos clicar com o botão direito do mouse e pesquisar a entrada. Um. Esta é uma nota que, como usamos antes, será executada quando pressionarmos uma no teclado. E se clicarmos com o botão direito, podemos procurar por sobreposição. Você vê que temos diferentes notas de sobreposição aqui. Vou começar com a sobreposição de caixas para atores. Então, vamos criar essa função. Agora temos algumas entradas para esse nó. Temos a posição da caixa. Este é o local em que a caixa de seleção será feita. Temos a extensão da caixa, que é o tamanho das caixas. Temos tipos de objetos. Portanto, esses são os tipos de objetos que a sobreposição de caixa detectará. Se você se lembra da nossa lição de rastreamento de linha, procuramos por make array. Podemos definir quais tipos de objetos esse nó detectará. Também podemos adicionar várias entradas a isso. Então, queríamos detectar, uau, estática, dinâmica mundial. Se você se lembra quando vamos para um objeto, digamos em um mundo como esta rampa aqui, se selecionarmos o componente de malha, irá rolar para as configurações de colisão e você verá que atualmente está definido como padrão, mas vou vendê-lo para a alfândega. E se você verificar o tipo de objeto, você pode ver que ele está atualmente definido como wild static. Portanto, nossa caixa sobreposta detectaria esse objeto porque estamos dizendo a ele que queremos detectar tipos de objetos estáticos do mundo. Em seguida, temos nosso filtro de classe de ator. Isso diz à sobreposição da caixa que só queremos encontrar um tipo de ator tão rápido para definir isso para dizer personagem de terceira pessoa como esse. Nosso nó de sobreposição de livros agora retornaria apenas ThirdPersonCharacter Blueprint. Não se esqueça de esclarecer isso, caso contrário, nosso exemplo mais tarde não funcionará. Portanto, certifique-se de definir isso como nenhum. Por fim, temos atores para ignorar. Agora, isso é apenas uma série de atores que podemos inserir, dizer que nossos livros se sobrepõem que queremos ignorá-los. Então, poderíamos nos arrastar para fora disso e fazer um make array. Poderíamos sair dessa taxa de criação e procurar por nós mesmos. E agora estamos dizendo à sobreposição da caixa que queremos que ela ignore nosso ThirdPersonCharacter e as saídas desse nó ou dos atores externos. Esta é uma série de atores que a caixa se sobrepõe, se sobrepõe. E então temos um valor de retorno. E isso é apenas um booleano que será verdadeiro ou falso se o nó de sobreposição da caixa se sobrepuser a qualquer coisa. Então, agora vamos dar um exemplo. Vamos pegar a localização do ator, e é aqui que faremos nossas verificações de sobreposição de caixas. Então, vamos conectar isso até a posição da caixa definirá a extensão da caixa para dizer 200 por 200 por 200. Vamos definir os tipos de objeto. Vamos deixar isso como estático e dinâmico. Certifique-se de que o filtro de classe de ator esteja definido como nenhum. Caso contrário, não será capaz de detectar outros atores. E vamos deixar isso conectado ao acesso para ignorar aqui também. Poderíamos simplesmente conectar isso em nossas anotações aqui. Mas algo que eu gosto de usar quando estou usando nós de atores de sobreposição de caixa é um nó de depuração. Então, se clicarmos com o botão direito do mouse e procurarmos por depuração, desculpe, desenhe a Esse nó nos permite criar uma caixa visual no mundo que podemos usar para depuração. Então, vou colocar isso em nossa caixa Draw Debug. E eu vou conectar isso em caixas sobrepostas. E para seu centro, usaremos apenas a localização do ator e a definiremos na mesma medida em que nossa caixa se sobrepõe. Molhos para duzentos, duzentos, duzentos. Vou definir a duração para três segundos e a espessura para um. Ao fazer isso, vamos apenas criar uma caixa visual e o nível por três segundos no mesmo local e tamanho que nossa caixa se sobrepõe. Assim, podemos ter uma ideia do tamanho da área que estamos verificando se há atores sobrepostos. Agora, eu vou me arrastar para fora do estupro de nossos atores e vou procurar por comprimento. E usaremos isso apenas para detectar quantos atores estavam realmente sobrepostos. Quando executamos nossos livros sobrepõem o nó dos atores. Então, eu vou conectar isso em uma string impressa como esta, e vamos compilar. Agora podemos testar isso. Então, se eu apertar play e apertar um, você pode ver que temos essa caixa grande e você pode ver que nosso texto está imprimindo um. E isso porque atualmente nossos livros se sobrepõem. A nota dos atores é apenas para amamentar um ator. Esse é o chão. E a razão para isso é que estamos dizendo para ignorar nosso caráter. Se eu correr até aqui e apertar um, você pode ver que ele subiu para três porque estamos atingindo a rampa, este quadrado e o chão. Essa é apenas uma maneira fácil de detectar quais atores se sobrepõem uma determinada área sem ter que criar um novo componente de colisão de caixa ou esfera. Agora, existem outras versões desse nó. Se clicarmos em Escape e voltarmos para nossa terceira cenoura, ThirdPersonCharacter Blueprint e clicarmos com o botão direito do mouse e procurarmos por sobreposição. Você pode ver que temos uma caixa de componentes sobrepostos. Agora, isso funciona da mesma forma que nossos atores de sobreposição de caixas. Em vez disso, ele apenas procura por componentes. Então, em vez de devolver os atores, ele retornará os componentes que se sobrepõem. Então, por exemplo, se nosso piso estava sobreposto, nossa caixa sobreposta aos componentes verifica. Ele retornaria em vez do cubo agir para referência, ele retornará a pilha de restaurantes de componentes de malha em vez de fora dos componentes externos estão estuprando. Fora isso, tudo é o mesmo com esse nó. Você pode definir o tamanho da posição, os tipos de objetos e assim por diante. Agora também temos formas diferentes para esses nós sobrepostos. Assim, podemos criar, digamos, uma sobreposição de esfera. Você pode ver que temos nossos atores de sobreposição de esfera e nós de componentes de sobreposição de esfera. E, por último, também há os nós de sobreposição da cápsula. Então você pode ver que temos atores de sobreposição de cápsulas e componentes de sobreposição de captura. E essas são apenas formas diferentes que verificaríamos se há aceitadores ou componentes sobrepostos. Então é isso para esta lição. É um breve que eu só queria fazer nesses nós porque os acho muito úteis. E espero que eles possam reduzir o número de componentes de caixa e esfera que você tem em seus níveis. 28. Aulas adicionais (entrada): Olá pessoal, Nesta lição, vou falar com vocês através do sistema de entrada. Agora, no Unreal Engine cinco, temos dois sistemas de entrada. Temos o original do Unreal Engine quatro e temos o novo sistema de entrada aprimorado que agora está no Unreal Engine cinco. Nesta sessão, vou falar com você através do sistema de entrada original. E a razão pela qual estou fazendo isso são muitos projetos, pelo menos na hora de filmar isso, ainda usando aquele sistema original. Então, em nossa próxima lição, falarei sobre o novo sistema de entrada aprimorado. Agora, o que quero dizer com sistema de entrada? E o sistema de entrada é como pegamos o jogador pressionando um botão no meu teclado ou pressionando um botão no meu teclado ou mouse ou um gamepad, na verdade traduzindo isso em código sendo executado em nossos projetos. Agora, já usamos alguns nós de entrada em nossas lições anteriores. Se formos para o ThirdPersonCharacter e eu clicar com o botão direito do mouse e procurar por entrada. Um, por exemplo, você pode ver que estamos usando o evento one input, e esse é o evento que será executado se pressionarmos a tecla one no teclado. Se formos para o painel Detalhes, podemos realmente alterar essa entrada para funcionar como quisermos, podemos pressionar este botão aqui e selecionar a tecla que queremos que ele use. Então eu poderia pressionar L, por exemplo. Agora, esse nó será executado sempre que, sempre pressionado. Ou podemos clicar neste menu suspenso aqui e podemos ver todas as diferentes entradas principais que o motor incorporou. Agora, esses tipos de nós são realmente úteis para testar coisas, depurar, apenas obter uma entrada em um blueprint rapidamente. Mas eles não são particularmente úteis para jogos completos ou finalizados. A razão para isso é que a maioria dos jogos modernos tem um menu de teclas vinculadas onde o jogador pode revincular as teclas a quatro ações diferentes. Agora, se você estiver usando esses nós e um jogo finalizado, não conseguirá fazer isso. E é aí que entra um sistema de entrada. Agora, nesta lição, falarei com vocês sobre o sistema de entrada de vocês antes. E a razão para isso são muitos projetos que você pode abrir. Ainda usaremos o sistema de entrada da UE para. Portanto, é uma boa ideia entender como isso funciona. Então, em nossa próxima lição, daremos uma olhada no novo sistema de entrada aprimorado que vem com o Unreal Engine cinco. Então, para começar, veremos uma das principais entradas que vem com o personagem de terceira pessoa. Se rolarmos para baixo aqui e encontrarmos a ação de entrada de salto, você pode ver que, em vez de dizer um nome de chave, ela diz salto de ação de entrada. Isso ocorre porque essa ação de entrada é realmente definida em nosso sistema de entrada. E então, no sistema de entrada, atribuímos chaves. Então, para encontrar esse sistema, podemos ir para Editar configurações do projeto. E então aqui vamos até a seção de entradas aqui, e isso está na categoria de motor. Aqui você pode ver que temos ação e mapeamentos de acesso. Agora, o meu já abriu, mas o seu pode parecer um pouco com isso. Clicamos na seta ao lado dos mapeamentos de ações. Você pode ver que temos a ação de entrada de salto. E então, abaixo disso, se você clicar na seta ao lado dela, você pode ver que a tecla padrão para ela é a barra de espaço. E também temos um buy-in chave para o gamepad aqui também. Então, essencialmente, o que isso está dizendo ao mecanismo é que queremos criar um mapeamento de ação. Agora, um mapeamento de ação é semelhante aos nossos eventos de entrada que usamos antes. Ele pode ser pressionado ou solto. E estamos dizendo que estamos criando um novo mapeamento de ação chamado Jump. E queremos que essas duas chaves estejam ligadas a essa ação. E é por isso que quando jogamos no mapa de terceira pessoa, se eu pressionar Espaço, essa ação de entrada de salto será executada pressionada. E então quando eu liberar espaço, liberado vai correr e vai correr os eventos de salto e parar de pular. Agora também podemos criar nossas próprias ações de entrada aqui. Então, se você voltar para as configurações do projeto, podemos simplesmente clicar neste pequeno botão de adição aqui para criar uma nova ação de entrada. Eu posso chamá-lo de algo como atirar, por exemplo, vai definir a chave para. Assim, você pode definir a chave várias maneiras, clicar neste botão aqui e, em seguida, clicar na tecla desejada. Então eu posso apenas o botão esquerdo do mouse e você verá que ele é automaticamente captado para mim. Ou você pode examinar todos os diferentes atalhos de teclas apenas clicando nesta seta para baixo aqui e percorrendo as opções. Agora criamos uma nova entrada de ação e seu nome é shoot. E quando pressionarmos o botão esquerdo do mouse, esse evento de sapato será executado. Se voltarmos ao nosso ThirdPersonCharacter, clicaremos com o botão direito do mouse e procuraremos por entrada. Tiro de ação em C que sob impactações que temos agora é um evento de filmagem. E isso será executado sempre que pressionarmos o botão esquerdo do mouse. Para que eu possa adicionar uma string impressa aqui. E eu vou apenas colocar pressionado. Vou copiar e colar isso e colocar assim. Então agora, quando clicamos em play, você pode ver que quando eu pressiono o botão do mouse, ele está registrando pressionado, e quando eu libero, ele está registrando liberado. Agora, o bom desse sistema é que você pode adicionar várias chaves para serem vinculadas ao mesmo evento. Digamos que seu jogo tenha funcionado no desktop e também no console e na RV. Você pode ter entradas para VR, tecla de salto, o game pad ki, e tudo isso pode estar abaixo da categoria de tiro se quisermos adicionar novas entradas. Então, podemos clicar no pequeno sinal de mais em C, agora posso adicionar uma nova chave. Eu poderia dizer pressione K, por exemplo. Agora k também executará esse evento de sapatos, bem como o botão esquerdo do mouse. Se você quiser remover qualquer um desses, basta clicar no ícone da lixeira aqui. Se você quiser remover um mapeamento de ação inteiro, basta clicar na lixeira ao lado do nome do mapeamento de ações como esse. Agora tenha em mente que se você fizer isso e ainda tiver o evento e a coisa se pudermos pesquisar, você verá que receberemos um aviso. E isso está apenas nos dizendo isso. O mapeamento não existe mais nas configurações do nosso projeto. Então, vamos excluir isso por enquanto porque não estamos mais usando e vamos compilar para nos livrar desse desejo. Em seguida, temos mapeamentos de acesso. Então, se voltarmos às Configurações do projeto, você pode ver que temos mapeamentos de acesso. Eu clico no pequeno menu suspenso aqui. Você pode ver que temos opções humor para frente e para trás. Mover para a direita e esquerda. E então temos as mesmas opções para gamepad e gamepad olhar para cima e para baixo, bem como olhar para cima e para baixo na parte inferior aqui. Agora, os mapeamentos de acesso funcionam de forma um pouco diferente. Eles executam todos os quadros. Então, o que quero dizer com isso é se eu for para frente e para trás e eu apenas adicionar uma string de impressão. Então, nós apenas adicionamos uma string impressa aqui. Você verá que quando eu clicar em play, ele está imprimindo cada quadro. Não estou apertando nenhum botão, não estou fazendo nada. Esse mapeamento de acesso será executado em cada quadro. E isso é o mesmo para todos os mapeamentos de acesso. Então, isso será o mesmo para o nosso movimento para a direita e para a esquerda, e também para o nosso gamepad, olhe para cima e para baixo, assim como nosso mouse olhe para cima e para baixo. Os mapeamentos de acesso também fornecem um valor de acesso. Agora, isso é essencialmente quanto ou quanto da entrada está sendo recebida. Então, se eu pegar o valor do meu eixo aqui, e eu estava realmente, excluiremos a string de impressão aqui, e conectaremos uma nova string de impressão até a nossa vez, direita e esquerda para o mouse, o sim. E eu vou inserir o valor x na minha string de impressão e vou compilar. Agora você pode ver que não estou movendo meu mouse, então o valor do eixo é 0. Mas se eu começar a mover meu mouse devagar, você pode ver que a quantidade de acesso aumenta. Agora, isso é essencialmente o que diz ao motor o quanto eu estou movendo meu mouse, quão rápido eu o estou movendo, e então ele adiciona esse valor ao arco, a rotação da câmera. Então, se eu começar a mover meu mouse muito rapidamente, você pode ver que o valor começa a subir muito mais. Isso é essencialmente o que permite que os mapeamentos de acesso controlem nossa câmera, a direção em que ela está se movendo, bem como nosso personagem. Se voltarmos ao nosso plano, você pode ver que nosso valor de eixo para avançar e retroceder é um valor de eixo. E se eu fizer uma impressão aqui, nós conectamos isso a ele. Compilar. E removerei essa string de impressão para que possamos ver o valor apenas de nosso movimento para frente e para trás. Clique em play e veja atualmente é 0. Mas se eu começar a avançar, o valor do eixo foi direto para um. E se eu for para trás, você pode ver que na verdade foi para menos um. E é isso que diz ao motor se estamos nos movendo para trás ou para frente. Se tivermos um editor fora do plano e formos para as Configurações do Projeto, e abrirmos um desses Mapeamentos de Acesso. Digamos, por exemplo, a pesquisa reduziu o mouse. Você pode ver que atualmente não está definido como. Na verdade, uma tecla é definida como na direção do mouse. Portanto, está definido como mouse Y. A escala é menos um. Agora, a razão para isso é que é apenas a maneira como a câmera está funcionando no trilho. Se eu fosse definir isso para escalar um e clicar em Play. Agora, quando eu movo meu mouse para cima, eu começo a olhar para baixo e meus controles estão realmente invertidos. Então, normalmente com movimentos do mouse para cima e para baixo, usaríamos uma escala de menos um para nos livrarmos desse movimento invertido da câmera. Mas se olharmos para, digamos, avançar e retroceder, você pode ver que temos W e S. Agora, w nos dá uma escala de um que diz ao personagem quando se move para frente. S dá uma escala de menos um, e é isso que diz ao personagem que estamos retrocedendo. E, em seguida, temos alguns atalhos de chave adicionais aqui. Estas são as duas teclas de seta do seu teclado e, em seguida, temos o manípulo digital em um game pad também. Agora, uma coisa importante a lembrar sobre eventos de entrada é a razão pela qual eles estão sendo executados dentro de nosso ThirdPersonCharacter é porque nosso personagem de terceira pessoa é controlado pelo nosso controlador de jogador. Se começássemos a usar esses nós em projetos, aquele controlado pelo nosso controlador, eles não seriam executados. Agora, um modelo no qual podemos usar esses eventos de entrada é nosso controlador. Agora, no modelo de terceira pessoa, não há um controle. Um projeto criará um novo rapidamente. Eu só vou criar uma Classe Blueprint, selecionar controlador de jogador. Vou chamar esse exemplo de controlador. Assim. E se você se lembra, precisamos definir nosso controle e nosso modo de jogo. Então, vou para o modo de jogo em terceira pessoa e encontro a classe de controle de jogador. Aqui, vamos apenas mudar isso para o nosso controlador de exemplo, compilaremos e salvaremos. Agora, quando clicarmos em play, usaremos nosso controlador de exemplo. E eu vou abrir o controle. Vou arrastar isso até o topo aqui, ir para o Gráfico de Eventos. E agora, se eu pesquisar por digamos salto, por exemplo, você pode ver que eu posso criar a ação de entrada de salto e isso realmente funcionará muito bem. E isso é porque estamos no controle, as ações de entrada funcionarão perfeitamente bem dentro do nosso controlador de jogador, porque o controlador do jogador é o que identificadores são ações de entrada. Em seguida, eu só queria falar com você sobre algumas das configurações que você encontrará se selecionar um nó de entrada, temos consumir entrada, executar quando pausado e substituir a vinculação pai. Portanto, a primeira entrada de consumo significa que, se isso estiver marcado no que estamos usando uma ação de entrada dentro do nosso controlador. E tivemos o mesmo evento dentro do nosso personagem de jogador. A ação de salto em nosso personagem não vai realmente correr. E isso porque nosso controlador está essencialmente consumindo essa entrada e não permitindo que nenhum outro blueprint seja executado. Então, se eu fosse imprimir uma corda aqui do nosso evento de salto. Agora, quando compilamos e pressionamos Play, se eu pressionar espaço, se eu voltar para o meu personagem de terceira pessoa aqui, vamos apenas remover essas sequências de impressão para que possamos ver o que estamos fazendo assim, que compilam isso. E agora, quando clicamos em Play, se eu pressionar espaço, você pode ver que está imprimindo olá, mas meus personagens, sem sorte em pular. Isso porque dentro do nosso controlador de exemplo, estamos consumindo essa entrada. Mas se eu desmarcar isso e eu posso estourar e apertar Play. Agora, quando pressiono espaço, você pode ver que meu texto de saudação está sendo executado e o personagem está pulando. Então, esses dois eventos no meu controlador e no projeto do personagem ou em execução agora. Outra das configurações, se selecionarmos a produção de salto aqui, é executar uma pausada. Você pode pausar o mecanismo ou, se abrir um menu, por exemplo, se estiver marcado, a entrada ainda poderá ser executada mesmo se o jogo estiver pausado. E, por último, substitua a vinculação pai. Digamos, por exemplo, que nosso controlador de exemplo tivesse um blueprint pai que era diferente do controlador do player. Então, se tivéssemos essa opção marcada e esse blueprint pai também estivesse usando a ação de entrada. Então, estamos basicamente dizendo que o mecanismo ignorou a entrada e nosso blueprint pai, use o código que está conectado a nós. Se desmarcarmos, esse nó não seria executado. O nó em nosso blueprint pai seria executado. Por fim, temos esse outro pino aqui, e isso apenas nos dá uma referência à tecla que foi pressionada que fez esse evento funcionar. Então, talvez você tenha várias teclas que fariam o salto acontecer e você queria que algo diferente acontecesse dependendo de qual tecla a pessoa pressionou, poderíamos arrastar e procurar por igual. E usando esta nota, você pode verificar se a tecla que foi pressionada é igual a outra tecla. Então, poderíamos dizer que é igual ao espaço. E este nó verificaria se é a tecla que foi pressionada Barra de espaço. Se for, então voltaria verdadeiro. Também podemos obter o nome da chave, para que possamos pesquisar com display. Podemos usar o nome de exibição da chave getc. E isso apenas nos dirá em texto qual é o nome da tecla que foi pressionada que deu o salto na produção. Então isso vai ser tudo para esta lição. Em nossa próxima lição, veremos o novo sistema de entrada aprimorado que vem com o motor cinco não atracado. 29. Aulas adicionais (entradas aprimoradas): Olá pessoal. Nesta lição, vamos dar uma olhada no sistema de entrada aprimorado que vem com o Unreal Engine cinco. Então, para começar, mostrarei como ativá-lo. Nesta versão atual do mecanismo, eu realmente tenho que habilitar um plug-in. Então, vou para Editar plugins e vou procurar por aprimoramento. Você pode ver uma entrada aprimorada, que eu posso assumir. Se o seu já estiver marcado, você não precisa fazer isso. Mas para mim, eu vou assumir. Você pode me dar um aviso aqui, apenas me dizendo que ainda está na versão beta. Então, eu só vou clicar em Sim. E precisamos reiniciar o motor, então vou fazer isso agora. Então, agora eu reiniciei o mecanismo e, se verificarmos o menu de plug-ins e procurarmos por aprimorados, podemos ver que ele está marcado. Em seguida, vamos para Editar e ir para Configurações do projeto. E então aqui vamos usar uma pesquisa e vamos pesquisar por entrada, ou desculpe, entrada padrão. Agora você pode ver que o meu por padrão está definido como entrada do jogador e componente de entrada. Vou alterá-los para a entrada aprimorada do player. E o componente de entrada aprimorado. Se o seu já está definido para esses, então você não precisa fazer isso. Agora, o sistema de entrada é o que nos permite executar o código quando o jogador diz, pressiona um botão no meu teclado ou botão no meu gamepad ou move o mouse de uma determinada maneira. Agora, em nossa última lição, analisamos o sistema de entrada que vem do Unreal Engine quatro. Isso ainda está presente no Unreal Engine five. Então, analisamos isso em nossa última lição, se você quiser conferir isso. Mas nesta lição, vamos analisar o novo sistema que foi implementado no Unreal Engine cinco. Agora, o bom desse novo sistema aprimorado é que ele é, na verdade, compatível com versões anteriores. Então, se voltarmos ao nosso personagem de terceira pessoa aqui, todos esses eventos, eles ainda estão usando o sistema de entrada mais antigo de algum lugar, o mecanismo para esses eventos ainda funcionará. Então, se eu apertar play, agora que estou usando o sistema de entrada aprimorado, mas ainda posso me mover. Eu ainda posso olhar sobre essas entradas ainda funcionarão. Mas agora podemos realmente criar as novas entradas aprimoradas, o que faremos agora, sairemos da peça como editor. E começaremos clicando com o botão direito do mouse no navegador de conteúdo. E vamos para a opção de entrada aqui e criaremos uma nova ação de entrada. Agora, isso é o equivalente a, se você se lembra da nossa última lição, de ir para a opção de entradas aqui e criar um novo mapeamento de ações. Isso é o equivalente a isso, mas agora temos seu próprio projeto. Então, seja lá qual for o nome, esse será o nome do nosso evento. Então, vou chamar esse exemplo de entrada. Sem espaços. Então, exemplo de entrada como essa. Agora, se abrirmos isso, vou arrastar isso até o topo aqui. Agora aqui é onde podemos definir as configurações para nosso exemplo de evento de entrada. Então, para começar, temos o tipo de valor. Agora, esse é essencialmente o valor que a chave fornece ao nosso código. Se estiver definido como Boolean, nossa tecla será pressionada ou não pressionada. Mas podemos mudar isso para dizer, um eixo um dia. Portanto, esse é um único flutuador que representa um estado de nossa entrada. Então, se nosso mouse, por exemplo, estiver se movendo ao longo do eixo x, isso é lado a lado. Esse valor flutuante será negativo ou positivo dependendo da direção em que estamos nos movendo nele e, em seguida, da velocidade em que o movemos, defina o tamanho do número. Agora também há um 2D e um 3D. Vou explicar o 2D um pouco mais tarde. O 3D é um pouco mais avançado, então não vamos entrar nisso nesta lição. Em seguida, temos gatilhos. Os gatilhos definem o que realmente faz nossa entrada de exemplo ser executada. Então, se eu criar uma nova entrada, você pode ver que agora tenho um novo índice, e aqui posso escolher entre algumas opções diferentes. Agora, eles essencialmente dizem ao mecanismo o que temos que fazer com essas vinculações de chave para fazer com que essa entrada de exemplo seja executada. Por exemplo, se configurarmos para tocar, teremos que tocar na tecla. Este evento está vinculado a, para fazê-lo funcionar. E se clicarmos na seta para baixo aqui, temos algumas configurações para o tipo de toque. Temos o limite de tempo de liberação do tap. Então, isso basicamente significa que, desde que eu pressione uma tecla e a solte mais rápido do que 0,2 segundos, nosso exemplo de evento de entrada será executado. Próximo. Vamos configurar um exemplo em nosso personagem de terceira pessoa para que possamos chamar nossa entrada de exemplo. Mas primeiro precisamos criar outro modelo. Agora, você deve ter notado que neste blueprint podemos realmente definir uma chave que queremos fazer com que nossa entrada de exemplo seja executada. Agora, há outro projeto que realmente define isso. Teremos que criar isso. Então, vamos clicar com o botão direito e ir para a entrada. Então, queremos contextos de mapeamento de entrada. Vou chamar o meu exemplo contexto de mapeamento. E vamos abrir isso. Agora aqui é onde definimos nossas entradas. Então, por exemplo, nossa entrada de exemplo. Então, o que podemos fazer é clicar no pequeno botão de adição aqui. Você pode ver que temos essas opções. Podemos definir uma entrada. Então, vamos usar nosso exemplo e bombear. Então, estamos dizendo que esse mapeamento é para a entrada de exemplo. E então aqui podemos definir quais chaves queremos realmente executar essa entrada. Então, podemos clicar no pequeno ícone do teclado aqui e eu posso pressionar dizer, L no meu teclado. Ou você pode clicar no menu suspenso aqui e selecionar uma chave e as opções aqui. Então, agora dissemos ao mecanismo que, quando pressionamos, queremos que ele execute o evento de entrada de exemplo. Então agora podemos ir para o nosso ThirdPersonCharacter e podemos criar um novo evento. Podemos pesquisar, por exemplo. Você pode ver que temos exemplos de entrada. Se eu criar isso, você pode ver que obtemos esse novo nó de entrada. Agora, esse nó de entrada terá uma aparência diferente ou terá saídas diferentes dependendo dos acionadores que configuramos em nossa entrada de exemplo. Então, atualmente, temos configuração de toque. Portanto, seus insumos serão relevantes para o topo. Mas se eu fosse mover isso e voltarmos para o nosso ThirdPersonCharacter. Você pode ver que os resultados da nossa nota de mudança. Agora, essas saídas farão coisas diferentes, dependendo dos gatilhos que você definiu dentro da sua entrada. Então, vamos adicionar de volta em nossa entrada de toque ou gatilho, desculpe, e esse é o que está na parte inferior aqui. E deixaremos as configurações como padrão. Então, vamos salvar isso e podemos voltar para ThirdPersonCharacter são acionados aqui serão executados sempre que pressionarmos o botão de toque pela primeira vez. Então, para nós, isso está lá fora. Eu o defini em nossos contextos de mapeamento. E o concluído será executado quando levantarmos a chave. Então, o que podemos fazer é adicionar uma string impressa aqui. Definimos isso como acionado. Soletre certo. Lá vamos nós. E vou copiar e colar isso. Vamos conectar isso, completá-lo e eu vou colocá-lo completo assim. Soletre errado, mas lá vamos nós. Então, agora, quando eu compilar, esperávamos que, quando eu tocasse mais rápido do que 0,2 segundos, eles seriam impressos, mas na verdade não eram. E podemos ver isso se eu apertar play by tap out, nada está acontecendo. Isso é porque também temos que fazer algumas alterações de código dentro do nosso personagem. Então, para fazer isso, vou fazer um evento possuir. E se você se lembrar de nossa aula de eventos, esse evento ocorrerá sempre que um controlador assumir o controle desse personagem. Então, a partir disso, vamos nos arrastar do nosso novo controlador, também custará. Controlador de jogador. E então, a partir disso, precisamos obter o subsistema de jogadores locais de entrada aprimorada. Então, a partir disso, precisamos adicionar um contexto de mapeamento. Agora, isso está essencialmente dizendo ao controlador do player que queremos usar esse exemplo de contexto de mapeamento que configuramos a sobrecarga. Portanto, precisamos definir nossos contextos de mapeamento para o contexto de mapeamento de exemplo. Então, agora, quando compilamos e clicamos em play, se eu tocar, você pode ver isso completo e acionar nossa impressão. Agora, o propósito de ter que definir os contextos de mapeamento permite que você tenha diferentes esquemas de controle, dependendo do que você quer fazer. Por exemplo, você pode ter um personagem em seu jogo e um veículo. Agora você pode querer que os controles dos personagens e dos veículos sejam completamente diferentes. Então, o que você poderia fazer é ter um contexto de mapeamento para seu personagem e, em seguida, um segundo veículo de combustível. Em seguida, em seu personagem, você pode definir os contextos de mapeamento usando o nó adicionar contextos de mapeamento ao contexto de mapeamento de caracteres, que pode ter todas as suas entradas para quando seu jogadores controlando o personagem. Então, em seu veículo, um blueprint, você pode ter o mesmo código, mas isso poderia definir contextos de mapeamento de um veículo. E nesse contexto de mapeamento, você poderia ter controles diferentes, talvez para mudar de marcha e coisas assim, coisas que você não precisaria em um projeto de personagem. Agora, isso é um pouco mais complicado do que dizer, o sistema de entrada anterior que estou organizando para uso. Mas esse sistema é muito mais completo e, quando você pega o jeito, há muito mais que você pode fazer com ele. Mas saiba por enquanto que se você planeja usar o sistema de entrada aprimorado, você precisará desse código em seu personagem para dizer ao controlador do jogador exatamente quais contextos de mapeamento você deseja usar. E lembre-se de que o contexto de mapeamento é onde você realmente diz aos eventos de entrada quais chaves podem chamá-los. Agora, você deve ter notado que, dentro de nossos contextos de mapeamento, podemos adicionar várias chaves. Então, se você quiser dizer ter L e outra chave, execute nosso exemplo e coloque, nós poderíamos fazer isso. Então eu poderia definir isso para dizer x. Agora, se eu clicar em Reproduzir e tocar em X, você pode ver que isso também está sendo impresso. Se eu pressionar para fora, você pode ver que isso também está sendo impresso. Se voltarmos aos nossos contextos de mapeamento, você pode ver que , na verdade, temos uma opção de gatilhos aqui também para cada uma das chaves. Agora, se adicionarmos um gatilho dentro de nossa entrada de exemplo, isso afetará todas as chaves que temos. Quaisquer chaves que adicionarmos em nosso exemplo, input, terão que seguir as regras de gatilho que configuramos em nossa entrada de exemplo. Mas talvez não queiramos ter isso em nossa entrada de exemplo. Queríamos que certas chaves tivessem que fazer certas coisas. Então, talvez, por exemplo, para L trabalhar, queira ter que tocá-lo. Mas para X funcionar, talvez precisemos manter a tecla pressionada. E se formos, se clicarmos na opção suspensa aqui e vermos que temos configurações para segurar essa represa chave. Portanto, o principal deles é o limite de tempo de espera. Isso significa que tenho que manter o botão pressionado por 1 segundo antes que o código seja executado. Se apertarmos play agora, se eu pressionar X, nada acontece até. Um segundo aconteceu, e agora meu gatilho está realmente funcionando continuamente até eu soltar x. Você pode ver completo, Ele acabou de ser executado e acionado, parou de funcionar. Mas se eu tentar tocar no meu x, nada acontece. Se eu segurar minha coruja, nada acontece porque se você se lembrar, configuramos a regra de toque para o meu L. Então, se eu bater fora, você pode ver o evento que estava acontecendo agora. Então, apenas para resumir para os gatilhos, se sairmos do editor de plano, se você quiser que os gatilhos afetem todas as teclas que podem chamar um evento, você deseja adicioná-las dentro do evento. Então, aqui dentro, você define os gatilhos aqui que afetarão todas as chaves que você atribuiu a esse evento. No contexto de mapeamento. Se você quiser que chaves individuais tenham regras de acionamento diferentes, você pode fazer isso dentro dos contextos de mapeamento sob a chave específica. E, claro, se você quiser adicionar um gatilho, clique no botão Adicionar aqui. Você quer remover um gatilho. Basta clicar no ícone da lixeira para removê-lo. Agora, vamos remover a entrada x por enquanto. Você também pode ter vários acionadores configurados. Então, se adicionarmos um gatilho e eu disser para definir isso para tocar, eu também posso adicionar um segundo, e eu posso definir isso para segurar. Portanto, agora nosso botão L funcionará se eu tocar nele rapidamente ou se eu o mantiver pressionado por mais de 1 segundo. E podemos testar isso. Eu posso apertar play. E se eu pressionar ou tocar em L rapidamente, você pode ver que está funcionando. Ou se eu segurar e esperar 1 segundo, você pode ver que agora acionado está executando todos os quadros. E se eu deixar ir, você pode ver as execuções concluídas. Agora eu não vou passar por todo tipo de gatilho porque existem alguns. E se você quiser descobrir o que eles fazem, uma boa maneira de fazer isso é passar o mouse sobre eles neste menu suspenso. E, na verdade, dá uma explicação razoavelmente decente do que cada um faz. Agora você deve ter notado em nossa nota de evento aqui que temos um valor de ação. Agora, dependendo do tipo de entrada que você usou nos contextos de mapeamento, isso nos dará um valor que podemos usar para controlar o código. Então, como estamos usando apenas um alceno, isso executará apenas um quando a tecla for pressionada e 0 quando a tecla não for pressionada. Mas também podemos alterar esse valor dentro de nossa entrada de exemplo. Aqui podemos definir isso para dizer Boolean em C que recebemos essa notificação toda vez que mudamos algo. Se voltarmos para o personagem de terceira pessoa, você pode ver que agora ele mudou para um booleano. E isso só seria verdade quando nossa tecla fosse pressionada e falsa quando fosse liberada. Agora também podemos usar esse valor para controlar coisas como a direção do olhar e a direção do movimento. Da mesma forma que o valor do eixo no sistema de entrada mais antigo controla nossos controladores, seu e pitch. Essas são as direções que nossa câmera estará voltada. Agora, existem algumas maneiras diferentes de fazer isso com o novo sistema. Vou te mostrar algumas maneiras de fazer isso agora. Então, começaremos excluindo esse evento porque não usaremos mais isso. E vamos para o navegador de conteúdo. Na verdade, vou renomear nossa entrada de exemplo. Eu só vou renomeá-lo, dizer mouse para cima, para baixo. Podemos abrir isso. E eu vou mudar o tipo de valor para um eixo um D, Então, um flutuador. Portanto, o valor de saída do nosso evento em nosso ThirdPersonCharacter será um float. Em seguida, vamos ao nosso exemplo de contextos de mapeamento. Agora vamos nos livrar de nossos mapeamentos atuais e vou criar um novo. E vamos definir isso com o mouse para cima e para baixo. E vou definir essa entrada para o mouse Y. E o mouse Y é o movimento do mouse para cima e para baixo. Então, vamos selecionar isso. Então, agora configuramos o mouse para cima e para baixo para um valor flutuante. Nós configuramos nosso mouse Y para chamar esse evento de mouse para cima e para baixo. Então, vamos ao nosso ThirdPersonCharacter e encontraremos o visual para cima e para baixo. E vou deletar isso porque esse é o evento antigo. E reutilizaremos a nota de apresentação aqui. Então, vamos fazer o mouse para cima ou para baixo. Você pode ver em eventos de ação aprimorados, temos o mouse para cima e para baixo. Daqui. Vamos arrastar acionado para nossa entrada Add controller pitch. E isso só será executado quando eu estiver movendo meu mouse. E ele pegará o valor da ação e conectará isso e nós compilaremos. Agora lembre-se, isso só está funcionando porque eu tenho esse código aqui no possess que diz ao nosso personagem que queremos usar nossos contextos de mapeamento de exemplo, que é o que costumamos fazer atribua o movimento do mouse ao nosso evento. Então, o que vamos fazer agora é apertar play e eu vou mover meu mouse para cima e para baixo. Você pode ver que está funcionando, mas meus controles estão invertidos. Então, o que eu preciso fazer é inverter os valores negativos e positivos que estão sendo fornecidos pelo meu mouse. E a maneira como podemos fazer isso é usar modificadores. Então, ele irá para o nosso evento de cima e para baixo do mouse aqui. E aqui temos uma opção de modificadores. Agora, os modificadores são um pouco mais avançados, então não se preocupe muito se você não conseguir isso imediatamente. Mas o que eles nos permitem fazer é modificar o valor que está sendo fornecido pelo pressionamento de tecla ou movimento do mouse, por exemplo. Então, vamos adicionar um novo modificador. Se clicarmos na opção aqui, temos algumas diferentes. Mas o que queremos fazer é inverter nossa saída de valor. E o Negate aqui foi o que fará isso. Então, vamos configurá-lo para negar. Então agora, quando eu clico em play, se eu mover o mouse para cima, eu olho para cima e se eu mover o mouse para baixo, eu olho para baixo. Isso, novamente, é basicamente fazer com que, quando o mouse estiver emitindo um valor positivo, então negate converta isso em um valor negativo. E então, ao contrário, quando o mouse fornece um valor negativo, então o portão o transforma em um valor positivo, e é isso que dá à minha câmera o movimento correto. Então, agora precisamos de um site para site. Agora, meu movimento lado a lado ainda está funcionando porque ainda estou usando essa entrada antiga aqui. Mas se eu excluir isso e clicar em Reproduzir agora, só posso olhar para cima e para baixo. Não consigo olhar de um lado para o outro. Então, precisamos configurar um movimento de um lado para o outro. Então, faremos isso clicando com o botão direito do mouse. Iremos para plantas ou desculpe, vamos para Entrada, ação de entrada e chamaremos esse mouse de esquerda, direita. E vamos abrir isso. Queremos definir o valor do tipo para o eixo um dia. E então precisamos ir para o nosso exemplo de contexto de mapeamento. E aqui, precisamos adicionar um novo mapeamento. Então, estamos adicionando um novo evento. Essencialmente. Queremos definir isso à nossa esquerda e direita. Precisamos definir uma chave ou um movimento do mouse para fazer esse evento acontecer. Então, queremos o mouse x, então esse é o movimento do mouse lado a lado. Então, vamos selecionar isso. Agora, com o mouse para cima e para baixo, usamos um Negate para inverter os valores que ele nos fornece. Não precisamos fazer isso com a esquerda e a direita. Então, agora vamos voltar ao nosso ThirdPersonCharacter. E novamente, clicaremos com o botão direito do mouse e faremos o mouse para a esquerda, direita ou para a esquerda para a direita. Temos o mouse esquerdo, direito, sob eventos de ação aprimorados. E conectaremos nosso acionado para adicionar controlador. E vamos pegar nosso valor de ação conectá-lo e compilar. Agora, quando vou para o meu mapa de terceira pessoa e clico em Jogar, posso olhar de um lado para o outro e ele está se movendo corretamente. Eu posso olhar para cima e para baixo. Agora estamos usando o novo sistema de entrada aprimorado para controlar o movimento da câmera. Agora, o sistema de entrada aprimorado realmente tem outra maneira definir esse movimento de entrada do eixo para cima. Agora, em vez de precisarmos de nós individuais para isso, poderíamos realmente fazer isso com um. A maneira como poderíamos fazer isso é usando um flutuador 2D em nosso evento. Então, o que faremos agora é excluir o evento mouse para cima e para baixo aqui. Vamos usar o mouse para a esquerda e para a direita. Na verdade, vou renomear isso para apenas o movimento do mouse. Então, agora podemos usar apenas uma ação de entrada para controlar. Ambos estão olhando de um lado para o outro e para cima e para baixo. Então, no movimento do mouse, definimos nosso eixo, definimos nosso acesso para 2D. Então isso significa que, em vez de um único valor flutuante, terá um valor X e Y. Em seguida, precisamos ir para o nosso contexto de mapeamento de exemplo. E vamos nos livrar do top aqui. Já temos o movimento do mouse aqui porque tínhamos acabado renomeá-lo e temos o X do mouse aqui. Mas vou deletar que acabamos de criar completamente um novo mapeamento. Então, vamos movê-los com o mouse. Então, agora precisamos escolher os movimentos do mouse que farão com que esse evento de movimento do mouse seja executado. Então, vamos para a opção aqui. Procuraremos o primeiro Y do mouse. Agora, se você se lembrar do branco do mouse como nosso para cima e para baixo, e precisamos inverter esse valor. Então, precisamos de um modificador, e precisamos definir esse modificador para negar que irá inverter o vale para cima e para baixo. Então precisamos de uma nova contribuição. Então, adicione uma nova entrada. Isso vai ser mouse x. Agora, se você se lembra antes de termos eventos individuais para mouse branco e mouse x, agora estamos fazendo os dois no mesmo evento. Então, agora adicionamos as entradas branco do mouse e X do mouse. Quatro deles irão para o ThirdPersonCharacter aqui. E vamos excluir esses eventos que tínhamos anteriormente. Então, agora, em vez de ter dois eventos separados para cada um desses nós que controlam movimento para cima e para baixo e lado a lado, clicaremos com o botão direito do mouse e procuraremos o movimento do mouse. Movimento do mouse assim. E temos nosso novo evento de movimento do mouse que configuramos. Então, agora vamos acionar, vamos conectar isso para controlar o tom. E vamos conectar isso ao seu jeito. Agora você pode ver que temos um valor de ação, e isso é apenas um vetor 2D. Então, se arrastarmos, podemos criar um nó de interrupção e isso apenas nos dá acesso aos valores de fluxo X e Y. Portanto, ele usará esses valores para controlar o movimento da câmera para cima e para baixo e de um lado para o outro. Portanto, nosso x é sempre nosso site a site. Então, vamos conectar isso à entrada do seu controlador. E o y está para cima e para baixo. Então, vamos conectar isso em nossa entrada de pitch do controlador. E agora podemos compilar. E estamos prontos para testar isso para que possamos jogar. E se eu mover meu mouse para decidir que está funcionando bem. Mas se eu movê-lo para cima e para baixo, ele ainda está se movendo de um lado para o outro. Podemos mover a câmera para cima ou para baixo. Agora, a razão para isso é se voltarmos ao nosso contexto de mapeamento de exemplo, o mouse branco e o mouseX apenas nos fornecem um único valor flutuante. Agora, se formos ao nosso evento, você pode ver que temos duas saídas de fluxo. Agora, essas duas entradas para o mouse para cima e para baixo e de um lado para o outro, ou ambos estão tentando usar esse valor x. Mas os dois não podem usá-lo. Precisamos dizer a um deles que ele precisa usar a saída y. Então, em nosso contexto de mapeamento, nos modificadores para nosso mouse Y, vamos adicionar um novo modificador. E vamos definir isso para os valores do eixo de entrada da Suíça. E se você ler a dica da ferramenta, ela realmente explica o que ela faz. É útil mapear uma entrada 1D, que é o Y do nosso mouse, é uma entrada 1D no eixo y de uma ação 2D. Então, se você se lembra, o movimento do mouse é um eixo 2D. Portanto, nosso switch mapeará o valor do eixo do nosso Y mouse Y para esse segundo valor y. Então, vamos usar isso. Então, agora nosso movimento lado a lado usará o valor X aqui. E nosso movimento para cima e para baixo agora usará o valor y por causa do modificador que acabamos de adicionar. Se eu apertar play, eu movo meu mouse de um lado para o outro para cima e para baixo, e tudo está funcionando corretamente. Então, esses são apenas alguns exemplos de como você pode usar entradas de acesso com o novo sistema de entrada aprimorado. Agora, existem outros tipos de modificadores que você pode aplicar às suas entradas principais, se quiser, você pode adicioná-los onde adicionamos em um portão e valores de eixo suíço ou de entrada. Eu não vou abordá-los nesta lição porque existem alguns. Mas se você quiser descobrir o que eles fazem, basta passar o mouse sobre ele e ele fornece uma breve descrição do que cada um faz. Agora podemos aplicar modificadores a uma entrada para um jogador, como fizemos aqui com a entrada Y do mouse. Adicionamos a negação e a entrada do switch. Você também pode aplicar esses modificadores dentro do movimento do mouse. Agora, todos os modificadores que adicionarmos aqui afetarão todas as teclas que adicionarmos a esse movimento do mouse dentro de nossos contextos de mapeamento. Portanto, é importante lembrar que às vezes você vai querer adicionar modificações apenas a uma entrada como fizemos com o mouse Y, em vez de apenas aplicá-las ao tipo de entrada, porque isso afetará todas as chaves que você vincula a esse tipo. Então, apenas para resumir, o sistema de entrada aprimorado nos permite criar ações de entrada como o movimento do mouse. Podemos então criar um contexto de mapeamento, que é onde podemos definir quais chaves chamaremos de nossas novas ações de entrada. Então, podemos criar essas ações de entrada dentro do nosso personagem ou controlar as plantas. Em seguida, usando gatilhos, podemos escolher como essa tecla deve ser pressionada para que o evento seja ativado e, em seguida, as modificações nos permitem modificar o valor da ação que é fornecido por esse evento. Para que esses eventos funcionem, precisamos nos certificar de que usamos o contexto de mapeamento add. E podemos usar isso obtendo o controlador do jogador, obtendo o subsistema de jogadores locais de entrada aprimorada. E isso nos permite adicionar um contexto de mapeamento. Em seguida, definimos quais contextos de mapeamento queremos usar. Então, estamos usando o contexto de mapeamento de exemplo. Então é isso que se passa aqui. Se não tivermos esse código, os eventos de entrada que estamos usando não funcionarão. Então isso vai ser tudo para esta lição. Espero que você tenha uma melhor compreensão de como o sistema de entrada aprimorado funciona agora e nós o usaremos um pouco mais em nossas futuras lições. 30. Aulas adicionais (etiquetas): Olá pessoal. Nesta lição, vamos dar uma olhada nas tags de ator e componente. Agora, se você estava acompanhando nossa lição anterior, tudo o que fiz aqui foi criar um novo modelo de terceira pessoa para que possamos começar do zero. Portanto, começar com tags são basicamente apenas uma matriz de variáveis de nome que os eixos e os componentes incorporaram. E por causa disso, isso significa que podemos agir como tags ou tags componentes sem ter que custar para outro Blueprint. Use interfaces de blueprint. Em seguida, podemos usar alguns dos nós incorporados ao mecanismo para verificar se um ator tem uma tag. Ou podemos fazer algo como conseguir todos os atores do mundo que têm uma tag específica. Começaremos acessando ThirdPersonCharacter e mostrarei onde você pode adicionar novas tags. Eu só vou arrastar isso até o topo aqui. E então nossos padrões de classe vão apenas procurar por tag. E aqui você pode ver que temos uma opção de tags e é uma matriz, e é apenas uma matriz de nomes como usamos antes. Portanto, se clicarmos no botão Mais aqui, podemos adicionar uma nova entrada. Eu posso configurá-lo para dizer jogador. Também podemos adicionar novas entradas, se quisermos apenas clicando no botão de adição, se quisermos remover entradas, basta clicar na seta para baixo ao lado da caixa de texto e clicar em excluir. Então, agora adicionamos uma tag ao nosso ThirdPersonCharacter e esse alvo é o plano. Agora precisamos de um plano que leia esses textos. Então, vou criar um novo blueprint e o navegador de conteúdo. E vamos selecionar Ator e eu vou chamar esse gatilho, abrir isso. Vou adicionar um componente de colisão de caixa. Eu vou apenas mover isso um pouco para cima aqui. Iremos a detalhes como oculto e desmarcado, oculto e jogo apenas para que possamos sentar e compilar. Agora, como fizemos antes, vamos para o Gráfico de Eventos. Vou excluir a reprodução inicial e os nós de tick, e na verdade usaremos o nó actor begin to overlap que já está aqui. Agora, se você se lembra, esse nó é executado sempre que algo se sobrepõe ao nosso gatilho e nos dá acesso ao outro ator que sobrepôs o gatilho. Agora, normalmente, se eu quisesse obter informações que estão no meu ThirdPersonCharacter, eu teria que arrastar e tenho um custo para meu personagem de terceira pessoa ou configurar uma Interface Blueprint para recuperar essa informação. Agora, como nossas tags estão incorporadas ao nosso ator, não precisamos fazer isso porque isso já é um pin de ator. Assim, podemos arrastar e acessar nossas tags para que eu possa pesquisar por get tax. E você vê que eu posso acessar minha variedade de tags. Então isso se comporta como uma matriz normal. Nós podemos nos arrastar para fora. Podemos usar um nó get com ele. Tudo o que podemos arrastar para fora e podemos percorrer todas as tags que são encontradas em nosso ator. Agora o act realmente veio com algumas tags, funções específicas embutidas para que possamos arrastar e pesquisar por tag has. Podemos usar o nó actor has tag e isso só verifica se é a tag que definimos aqui. Ou esse acessório tem a etiqueta que colocamos aqui? Se isso acontecer, isso retornará verdadeiro e, se não, retornará falso. Para que possamos testar isso. Agora, eu posso sair daqui. Na verdade, ele clicará com o botão direito do mouse e procurará por Vamos conectar isso ao nosso início de sobreposição, e eu vou conectar isso em nossa saída booleana, vou compilar, jogar um desses no mapa aqui, que o torna um pouco maior. Para redimensionar ou abrir a ferramenta de reescalonamento, vou torná-la um pouco maior. Aperte play. Agora, quando eu corro para o meu cubo aqui, você pode ver que ele está retornando falso porque eu realmente não defini o Typekit. Então, vamos definir isso para compilar e clicar em Play. E agora, quando eu corro para a guarda e vejo que está voltando verdadeiro porque nosso personagem de jogador tem essa etiqueta de jogador. Agora, como nossa tag é apenas uma matriz de nomes que podemos adicionar a ela durante o jogo também. Então, se quiséssemos, poderíamos arrastar e conseguir tags. E usando esse array PIM, poderíamos arrastar e usar o Add Node. E poderíamos adicionar uma nova etiqueta ao nosso plano. Então, poderíamos adicionar uma etiqueta de dizer sobre fogo. E então excluiremos essas notas aqui por enquanto. Então, poderíamos nos arrastar de nossas tags novamente e fazer um loop. Então, percorremos todas as tags atuais e imprimiremos string, as tags atuais dos jogadores. Então, vamos conectar isso à string de impressão e o elemento array à string será compilado. Clique em Play. Agora, quando eu encontrar a caixa aqui, vai adicionar uma nova etiqueta ao nosso enredo. E então ele vai imprimir esses nomes de tag. Exatamente assim. Agora também podemos adicionar tags aos componentes. Então, se sairmos do avião, eu me sinto magoado e vou para o nosso ThirdPersonCharacter. Vamos nos livrar dessa busca no momento, e vou selecionar algo como o componente cápsula aqui. Portanto, este é um componente e é a forma da cápsula que está em nossa janela de visualização aqui. E se eu com ele selecionei pesquisar por tag no painel Detalhes em C, temos tags de componente. Agora, eles funcionam exatamente da mesma forma que nosso pós-imposto é apenas que essas tags são específicas para esse componente. Então podemos adicionar uma nova etiqueta, Oh legal, essa colisão. E eu vou compilar. Agora, se voltarmos ao nosso gatilho, terei que escalar para um personagem usando meu outro pino de ator aqui. Porque se você se lembra, o ator não contém realmente os componentes da cápsula, então não vou conseguir encontrá-lo. Mas se eu escalar para o personagem. Assim. E excluiremos o resto desse código. Então, do nosso personagem, queremos obter o componente da cápsula. E isso está aqui embaixo. Agora, a partir disso, podemos arrastar e pesquisar por tag has. Você pode ver que temos um componente com nota marcada aqui, e isso funciona exatamente da mesma forma que nossa tag ou ator marcou node. Definimos uma tag que queremos verificar. Colisão. Ele retornará verdadeiro ou falso se componente cápsula desse personagem tiver essa etiqueta de colisão. Então, ele arrastará para fora e outra string de impressão e se conectará até aqui, clique em Compilar. E agora, quando atropelamos nossa caixa aqui, você pode dizer que ela está retornando verdadeira. Portanto, as tags são uma maneira muito útil de adicionar um pouco de informação extra a qualquer ator. Então, qualquer coisa que esteja no nível ou em qualquer componente desses atores. Um bom exemplo de como as tags podem ser úteis talvez seja , no futuro, você criar um sistema de IA. E você quer que a IA seja capaz de dizer se um ator é amigável ou inimigo. Você pode fazer isso usando tags. Como todos os atores e seu nível têm tags embutidas, você pode adicionar essas tags a qualquer objeto e eles poderão lê-lo. Agora, os tanques também são úteis para obter atores ou componentes. Então, se aceitarmos nosso plano como fosse o cabelo dela e voltarmos ao nosso gatilho. Só vou excluir esses nós. Se você se lembra, temos as notas get component by class. Então, se eu pesquisar por ele, obter componente por classe, você pode ver que já usamos esse nó antes e isso nos permite obter um componente de um blueprint específico. Agora, também temos o nó get components by tag. Então, se criarmos isso aqui, podemos obter todos os componentes que estão dentro de um blueprint com uma tag específica. Se você se lembra, quando definimos nossa tag dentro de nosso componente Capsule, essas são as tags que ele verificará. Em seguida, ele produzirá todos os componentes que têm essa tag específica que definimos. Por exemplo, eu poderia definir isso para uma colisão assim. Vamos arrastar para fora e obter o comprimento dessa matriz. E imprimiremos a corda, o comprimento, arrastaremos daqui e imprimiremos a corda assim. Agora, quando atropelamos o gatilho, devemos vê-lo imprimir um. Agora também podemos pegar os atores que atacaram. Então, se voltarmos ao nosso gatilho e clicarmos com o botão direito do mouse e tal ator com tag. Você pode ver que temos o nó get all actors with tag. Para que possamos criar isso. E isso fará com que todos os atores do nosso nível tenham uma tag específica. Agora, como um aviso, esse é um nó de desempenho bastante pesado, então você não quer usá-lo em tecnologia, por exemplo. Há também outra opção para obter todos os atores que marcamos agora, se clicarmos com o botão direito do mouse e isso fará com que todos os atores tenham tag. Você pode ver que há um gueto de atores de classe com etiquetas. Então, se criarmos isso, isso fará a mesma coisa que o nó aqui em cima, mas limitará sua seleção a um ato específico do tipo. Então, talvez tivéssemos muitos atores com uma tag inimiga, por exemplo, mas só queríamos obter aqueles que eram o ThirdPersonCharacter. Talvez você tenha tido muitos personagens que tinham a tag inimiga, mas só conseguimos um para obter nosso ThirdPersonCharacter, poderíamos definir isso aqui. Agora, isso só retornará projetos de personagens em terceira pessoa que tenham a etiqueta inimiga. Portanto, as tags são uma maneira muito útil de adicionar um pouco de informação a qualquer objeto no mundo ou a qualquer componente. Então é isso para esta lição. Espero que você entenda agora para que as tags são usadas e também como elas funcionam no mecanismo. 31. Aulas adicionais (atores de geração de gerações): Olá pessoal. Nesta lição, vou falar com você por meio de atores desovadores. Atores coadjuvantes é como criamos novos objetos no mundo durante o jogo. Então, vai começar com a criação um novo ator que vamos gerar. Eu só vou criar uma aula de blueprint. Vou configurá-lo para um ator, e vou chamar esse exemplo de esfera. E vamos abrir isso. Eu só vou arrastar isso até o topo aqui. E vou adicionar um novo componente ou procurar por esfera e criaremos uma forma de esfera. Eu também vou permitir, se formos para a física aqui, simular a física, isso é só para que, se a colocarmos no mundo, ela comece a rolar e tenha física. Então, agora vamos voltar para o mapa. Eu só vou deletar esse gatilho. Isso é apenas da nossa lição anterior. Você não precisa se preocupar com isso se não tiver. E vamos para o nosso ThirdPersonCharacter. E então aqui vou criar um novo evento de entrada. Então, procuraremos pelo evento de entrada um. E se você se lembra, esse nó só é executado sempre que eu pressiono um no meu teclado. Agora, para gerar atores no mundo, usamos o ator colher do nó de classe. Já usamos isso um pouco antes, mas nesta lição vamos entrar em detalhes sobre como isso funciona. Então, começando do início, temos a turma. Esse é o tipo de projeto que estamos gerando no mundo. Será capaz de selecionar qualquer um de nossos projetos em nosso navegador de conteúdo. Se clicarmos no nosso quadril, boa pesquisa, por exemplo, esfera. Em C, encontramos nossa esfera de exemplo. É um pouco difícil de ver porque o destaque, mas isso é que se eu clicar aqui, você pode ver que nossa classe agora é exemplo de natação. Você pode ver que o nome do nó realmente mudou para spawn actor example sphere. E isso realmente muda o tipo de valor de retorno. Então, se passarmos o mouse sobre isso, você pode ver que isso agora é um exemplo de referência de objeto de esfera, o que significa que se tivéssemos variáveis, digamos em nosso exemplo lá, eu criarei uma nova variável rapidamente, que chamou esse exemplo. Eu posso sondar. Agora, se eu arrastar para fora do valor de retorno, posso simplesmente obter essa variável de exemplo. Não preciso lançar minha esfera a partir desse valor de retorno porque já dissemos ao nó que estamos gerando esse tipo e ele definiu o valor de retorno para essa referência de esfera de exemplo. Portanto, isso pode ser útil se você tiver funções ou eventos que deseja que esfriem assim que o projeto for gerado. Então, em seguida, temos a transformação spawn. Este é o local no mundo em que o ator será gerado. Se arrastarmos, podemos usar a nota make transform aqui que nos permite definir a localização, rotação e também a escala do ator. Agora também podemos, se desconectarmos isso, clique com o botão direito do mouse na transformação de spawn aqui e faça Split Struct Pin. E você pode ver que podemos realmente acessar a localização, rotação e escala diretamente no nó aqui, se quisermos. Ou podemos clicar com o botão direito do mouse novamente e recombinar, e isso os combinará novamente nesta caneta de transformação. Agora, quando você está gerando um ator, ele pode colidir ou qualquer outra coisa no mundo enquanto está tentando gerar. Portanto, temos configurações de tratamento de colisões. Agora, o padrão será as configurações padrão do projeto que são definidas dentro das configurações do projeto. Então sempre temos que gerar ignorar colisões. Isso significa que ele não se importa com colisões. Eles aparecerão no local em que você SAP. Tentamos ajustar a localização, mas sempre batemos. Isso significa que se ele está tentando gerar em um local que está sobreposto, outra coisa é colisão. Ele tentará ajustar um pouco a localização para que não se sobreponha à colisão. Em seguida, tentamos ajustar a localização, não gerar se ainda estiver deslizando. Então isso faz a mesma coisa. Ele tenta ajustar o local que está surgindo se houver interferência de colisão. Mas se não conseguir encontrar um local para gerar sem colisão, então não gerará esse ator. E então nós não temos o spawn, que significa que o ator simplesmente não vai aparecer se colidir com qualquer coisa. Para isso, eu sempre quero que minha esfera surja. Então eu vou colocar sempre desovar, ignorar colisões. Agora, a caneta instigadora é uma referência de peão. Agora, na verdade, não precisamos conectar isso para que nosso ator apareça, mas isso nos permite dizer ao ator essencialmente quais jogadores surgiram. Isso pode ser útil, digamos, talvez você esteja gerando projéteis de uma arma. Então você gostaria de dizer aos projéteis qual jogador os gera para que, quando esses projéteis atingirem outro jogador, por exemplo, o de um jogador possa ver quem os estava danificando. Há outros usos para isso, é claro, não apenas para projéteis, mas isso é apenas um exemplo. Então, se clicarmos na seta para baixo aqui, temos o proprietário. Agora, novamente, esta é uma caneta que você não precisa conectar e geralmente é usada para replicação e codificação multijogador. Mas isso realmente nos permite definir uma variável dentro do ator. E se formos para a nossa esfera aqui, você pode procurar pelo dono. E isso nos dá a propriedade do projeto. Agora, se definirmos isso quando estávamos gerando o projeto, ele retornará, esse nó retornará sempre que conectamos ao pino do proprietário quando o geramos, podemos realmente acessar o instigador também. Então, se eu voltar aos meus exemplos para ela, podemos obter instigador e podemos obter essa variável também. E isso retornará sempre que conectarmos ao pino instigador quando gerarmos esse projeto. Essas são todas as entradas padrão que vêm com esse nó. Mas podemos realmente adicionar o nosso próprio se voltarmos ao nosso exemplo, então aqui, e eu seleciono minha variável de exemplo nessas configurações para ele, podemos usar a opção exposed on spawn. Agora, antes de assumirmos isso, precisamos ter uma instância editável. Então, podemos assumir exposições no local. E se compilarmos e voltarmos para o ThirdPersonCharacter Blueprint, compilaremos isso também. Deveríamos ver esse alfinete em um alfinete. Agora não apareceu para mim. Então, vou clicar com o botão direito do mouse no nó e atualizar o nó. Você pode ver que os pinos apareceram. Às vezes, isso acontece e você só precisa atualizar o nó. Às vezes, quando você recompilar a caneta simplesmente aparece. É só que é meio aleatório. Mas, como você pode ver, agora temos a entrada de variável de exemplo. Então, podemos definir isso como verdadeiro ou falso. E isso realmente será definido quando os atores gerarem esse valor inicial variável. E fizemos isso com um booleano, mas você pode fazer isso com qualquer variável que quiser. Se quiséssemos dizer ter um flutuador e quiséssemos que isso fosse chamado de, digamos, dano. Poderíamos fazer isso e podemos definir isso para incent disse que é spool não exposto no componente spawn. Volte para o nosso personagem em terceira pessoa. Você pode ver se consigo pesquisar, ainda não está aparecendo, mas vou clicar com o botão direito do mouse em atualizar. Agora. Você vê que agora temos uma caneta de venda prejudicial também. Então, agora estamos realmente prontos para gerar nossa esfera. Então, vou conectar o pressionado ao nosso exemplo aqui. E agora precisamos definir um local em que queremos dividi-lo. Agora eu quero gerar minha esfera na direção em que minha câmera está olhando, digamos, três metros na frente do meu personagem. Então, o que faremos é clicar com o botão direito do mouse e obter rotação de controle. Agora, esta é a rotação da nossa câmera. Eu vou arrastar para fora disso e eu vou fazer a rotação, rotação x vetor, e isso obtém a direção para frente para nós, para nossa câmera. Então você multiplica isso por, queremos mudar essa caneta para um flutuador. Então, se você se lembra, clicamos com o botão direito. Nós os convertemos e mudamos para um flutuador. Eu vou fazer precisão dupla. Então, aqui é onde definimos o quão à frente queremos que nossos objetos batam. Então eu vou fazer 300. E isso está em centímetros, o que faz recuar um pouco. Então, temos um pouco mais de espaço. E então precisamos nos arrastar novamente e fazer um acréscimo. Agora precisamos adicionar a localização atual do nosso ator, porque atualmente estamos apenas movendo uma direção 300 centímetros Ford, mas não temos local de partida. Então, vamos conseguir a localização do ator. Vamos conectar isso aqui. Agora, esse local gerado do nosso Add Node será nosso local de acesso. Mas Ford 300 centímetros em qualquer direção que nossas câmeras olhem. Então, podemos conectar isso agora à nossa localização aqui em cima. Agora eu não tenho que fazer a rotação porque é justo. E eu vou deixar a escala em um por enquanto para que ela seja compilada. E agora podemos experimentar. Vou pular para o nível. Vou apertar play. E se eu apertar um, você pode ver que estamos desovando em nossa esfera onde quer que eu esteja olhando, mas 300 centímetros à nossa frente. Então é assim que você gera novos atores em um mundo. Em seguida, mostrarei como destruir atores. Então, para isso, vou realmente reutilizar nosso gatilho da nossa última lição. Se você não tiver isso ou se for um, podemos excluir esses nós e o código. E aqui, tudo isso é, é uma caixa de colisão que colocamos aqui, eu disse que o oculto está marcado, e é isso. Então, temos um evento que começa a se sobrepor aqui. O que vamos fazer é verificar se o ator sobreposto é um conjunto de exemplos. Se for, então vamos destruí-lo. Então, podemos nos arrastar e podemos fazer o custo do exemplo, uma esfera como esta. Agora custa mais útil para quando realmente precisamos obter informações de um projeto. Porque na verdade não precisamos obter nenhuma informação desse blueprint que só queira verificar, é um exemplo em que podemos realmente arrastar e obter aulas como esta. E isso leva a aula de atores. Então, ele obtém qual tipo de blueprint é do nosso navegador de conteúdo. E a partir disso, podemos arrastar quando podemos realmente fazer iguais. E podemos verificar se é igual à esfera do exemplo. E se for, então queremos destruí-lo. Então, usaremos um nó f como esse. E vamos nos afastar de outro ator e destruir. E há um nó chamado Destroy Actor e que mata ou destrói nosso ator no mundo assim. Então, isso nos salva do elenco. São alguns nós extras, mas a transmissão exige um pouco de desempenho. Então, se não precisarmos, então, idealmente, não queremos escalar. Então, agora queremos experimentar isso. Vou para o mapa da terceira pessoa e vou adicionar nosso gatilho. Vou colocá-lo aqui e torná-lo um pouco maior. Aumente um pouco a escala. E vamos apertar play. E eu nasci em uma esfera. Então, desovando aqui. E eu posso chutar por aí porque temos a física habilitada. Basta empurrá-lo para dentro dessa caixa e você verá que ele é destruído instantaneamente. Agora, há outra maneira de destruir atores. Se voltarmos ao nosso acionador, podemos excluir esse nó Destroy Actor. Podemos nos arrastar e definir a expectativa de vida assim. Agora, o nó de vida útil definido nos permite dizer a um ator que queremos que ele destrua após um certo período de tempo. Então eu posso definir isso para dizer um. Agora, 1 segundo após a esfera se sobrepor ao gatilho, ela será destruída. Então, podemos experimentar isso e clicar em Play. Eu posso gerar em uma esfera. Vou colocar isso em nossa caixa e você verá que ainda não destruiu e depois destrói depois de um segundo. Poderíamos mudar esse valor para dizer três só para que fique um pouco mais óbvio. Pressione um novamente, empurre isso para dentro. Você pode ver que ele realmente saiu do outro lado. E depois destrói porque pediu para esperar três segundos. Então é isso para esta lição. Espero que agora você entenda como gerar e destruir atores no mundo. 32. Aulas adicionais (organização do código): Olá pessoal, Nesta lição, falarei sobre alguns dos recursos de organização de código incorporados ao mecanismo. Agora, eu acabei de juntar alguns códigos aqui. É só por exemplo, você não precisa copiar isso sozinho. É só para que eu possa demonstrar os diferentes recursos que podemos usar para organizar nosso código. Então, para começar, temos nós de redirecionamento. Agora, se eu clicar duas vezes em uma linha branca aqui, podemos criar esses nós de redirecionamento. Agora, isso nos permite controlar para onde a caneta realmente irá. E eles não têm nenhum propósito funcional. Eles não afetam a forma como o código é executado. Tudo o que eles fazem é ajudá-lo a manter seu código organizado. Assim, você pode clicar duas vezes em uma linha branca ou em uma luz variável. Por exemplo, uma linha amarela aqui embaixo. Posso clicar duas vezes nisso e criar nós de redirecionamento para isso. Ou você pode clicar com o botão direito do mouse, rolar até o final aqui, e você pode usar a nota de redirecionamento do AD aqui que cria uma nova caneta de redirecionamento também. Portanto, isso pode ser útil se você quiser contornar algum código que esteja no caminho. Então, por exemplo, eu poderia adicionar um F sem gorjeta. E talvez eu quisesse que esse código fosse executado se algo fosse verdade, mas eu queria um código aqui para executá-lo se não fosse verdade. Então eu poderia copiar e colar isso e você colocar um C lá. Então, em vez disso, o que eu poderia fazer é arrastar de falso para o meu ato de desova para anotá-lo, clicar duas vezes nesta linha branca, arrastá-los para baixo. Agora temos um bom código de aparência limpa. Esse código será executado se for verdadeiro, então vamos apenas ziguezaguear em torno dele e executar esse código se for falso. Em seguida, temos comentários. Agora, os comentários são muito importantes para manter seu código organizado. E também se você estiver trabalhando com outras pessoas ou comentários são importantes para que eles possam ver seu código com facilidade e rapidez e ver quais partes dele fazem. Então, para criar um comentário, podemos destacar alguns nós e pressionar a tecla C no teclado. E isso criará um novo comentário. Podemos adicionar algum texto a isso para que eu possa escrever create player, HUD. Então, agora eu posso apenas olhar para este comentário. Eu sei que esses nós aqui criam a cabana do jogador. Agora podemos controlar a cor das caixas de comentários. Então eu posso mudar isso para dizer vermelho. Posso aumentar ou diminuir o tamanho da fonte com esse valor aqui, posso mostrar uma bolha. Então, se diminuirmos o zoom, pode ser um pouco difícil ver o texto com os textos borbulhados do programa. Você pode ver que temos essa pequena bolha aqui que é redimensionada quando diminuímos o zoom. E se selecionarmos a caixa de comentários novamente, você pode ver que temos a bolha de cores que nos permite mudar a cor da bolha aqui. Então temos o modo de movimento. Agora, se movermos a caixa com nós dentro dela, ela trará esses nós com ela. Mas se quisermos desligar isso, podemos mudar isso para comentar. E agora apenas a caixa de comentários se moverá. Se você quiser editar o texto, você sempre pode clicar duas vezes nele dessa maneira. Ou se você selecioná-lo, você pode alterar o texto do comentário aqui também. Outra maneira de criar comentários como se você clicasse com o botão direito do mouse até a parte inferior. Há uma opção de adicionar comentário aqui na qual você pode clicar e isso apenas nos cria um novo nó de comentário. Também podemos redimensionar o nó de comentário apenas arrastando a borda em qualquer direção que você quiser e você pode redimensioná-la. Você também pode usar caixas comuns dentro de caixas. Então, se eu fizer isso um pouco maior, se eu apenas selecionar, digamos esses nós, eu posso adicionar um novo comentário a isso. E eu posso adicionar alguns textos para que eu possa criar widget, por exemplo. Outra coisa boa sobre os comentários é se eu posso fazer, se eu fizer o Controle F, isso nos permite pesquisar o plano por frases-chave. Se eu pesquisar, digamos, criar HUD do jogador, que é o que está no meu comentário, você pode ver que realmente encontra o comum e me diz o que está nesse comentário. Se eu clicar duas vezes nele, ele me levará para a caixa de comentários. Em seguida, daremos uma olhada na nota recolhida. Portanto, se diminuirmos o zoom aqui e selecionarmos esse código, por exemplo, se eu clicar com o botão direito do mouse em um dos nós, posso selecionar Recolher nós. Se eu clicar nele, receberemos aqui esta nova nota que eu posso nomear. Então é legal, esse fogo, por exemplo. Agora, tudo o que é feito é pegar as notas que selecionamos e compactá-las em um nó aqui. Então, se eu clicar duas vezes nisso, você pode ver que todos os nossos nós ainda existem. Eles estão aqui e ainda funcionarão quando pressionarmos um, ainda assim gerou uma esfera. É que agora todos esses nós estão contidos nesse único nó. Agora podemos adicionar entradas e saídas ao nosso nó de colapso, se quisermos, semelhante a uma função ou macro. Assim, poderíamos adicionar uma entrada, digamos, uma saída de pino de execução e uma saída de execução. Também poderíamos adicionar uma saída booleana, por exemplo. E se abrirmos nosso colapso, conheça T, Você pode ver que o nó de entrada agora tem essa entrada de execução. Também temos essa saída de execução e nossa caneta booleana. Agora, ao contrário de uma macro ou função, não precisamos executar esses pinos para que o código dentro do nó de colapso seja executado. Porque nossa nota de imprensa aqui está dentro do nosso nó de colapso. Ele ainda funcionará sem que passemos esses pinos fora do nó de colapso. Agora, pessoalmente, a maneira que eu gosto de usar isso é agrupar o código. Então, por exemplo, temos todo esse código aqui. Isso é basicamente apenas para o movimento do personagem. Então poderíamos clicar com o botão direito do mouse, fazer o nó colapsado, e então eu poderia chamar isso de movimento. Agora todo o meu código de movimento está em um lugar onde eu posso ir, isso está tudo aqui. E talvez eu tivesse um nó de colapso para minha mecânica de tiro e escalada e várias outras coisas. Dessa forma, você não tem apenas toneladas de código e seu gráfico de eventos. Se você quiser desfazer ter seu código em um gráfico de colapso, podemos sempre clicar com o botão direito do mouse no gráfico recolhido e podemos fazer o nó de expansão que realmente excluirá nossos aplausos e traga todo o nosso código de volta para o Event Graph. Agora você deve ter notado a outra opção de colapso. Então, se clicarmos com o botão direito, há um colapso para funcionar e Collapse to Macro. Agora tenha em mente que esses eventos aqui não podem existir dentro de uma função ou macro. Então, se eu clicar com o botão direito do mouse e fazer a função de colapso, você verá que recebemos um erro, mas o código aqui poderia realmente existir dentro de uma função. Então, se eu selecionar isso e eu fizer a função recolhida, você pode ver que ela cria essa nova função, na verdade adiciona automaticamente a entrada para nós também. Se abrirmos isso, você verá que nosso código está lá. Se voltarmos ao nosso gráfico de eventos aqui, também há a opção de vários gráficos de eventos. Então você pode ver que só temos um. E se clicarmos na seta para baixo aqui, podemos realmente ver nossa nota de colapso do fogo que também nos dá uma lista de todos os eventos atuais no gráfico de eventos. Podemos criar novos gráficos de eventos e criar um novo. Eu poderia chamar isso de movimento sexual, por exemplo. Em nosso novo gráfico de eventos de movimento, poderíamos simplesmente copiar e colar ou eu vou cortar, assim como o Controle X. E eu vou colar isso em nosso gráfico de movimento. E agora todos esses nós estão em nosso gráfico de movimento. Eles ainda funcionam exatamente como se estivessem no Gráfico de Eventos, mas agora estão dentro de um novo gráfico. Podemos usá-los para, novamente, organizar seu código. Agora também podemos organizar nosso painel My Blueprint aqui. Então, vamos começar com variáveis. Se clicarmos em uma de nossas variáveis aqui, temos algumas opções. Portanto, essa variável vem com uma dica de ferramenta porque vem com o modelo de terceira pessoa. Se eu selecionar minha variável de saúde, por exemplo, em C, podemos definir a descrição. Então eu posso definir isso para dizer que os jogadores atuais, assim serão compilados. Então, agora, quando eu passar o mouse sobre minha variável aqui, diz que a saúde atual do jogador. E se eu for para os padrões de classe e encontrar minha área de saúde, mas que, como você pode ver, se eu passar o mouse sobre ela, diz a saúde atual dos jogadores. Também podemos categorizar nossas variáveis. Então, se eu selecionar minha variável de saúde aqui novamente, e eu descer para a categoria, podemos definir uma nova categoria. Então, atualmente, podemos configurá-lo para câmera ou personagem padrão, mas podemos criar novos. Então, se eu apenas selecionar o texto e excluí-lo, podemos dar um nome a ele. Então, vou chamar isso de categoria de saúde. Pressione Enter. Você verá que agora nossa variável está em sua própria categoria de saúde. E podemos arrastar outras variáveis para essa categoria de saúde apenas arrastando-a assim. Ou se eu arrastar de volta, podemos mudar a categoria aqui agora para ajudar. E ele simplesmente sobe variável para essa categoria para nós. Agora, se formos para nossos padrões de custo, você verá que teremos uma nova categoria para saúde. Então, vamos compilar primeiro. Em seguida, vamos para os padrões da classe. Você pode ver que agora temos uma categoria de saúde. Temos nossa saúde inicial e nossa variável de saúde lá. Agora também podemos adicionar subcategorias. Então, se eu selecionar minha variável de saúde aqui, e eu clicar no texto, se eu clicar para que ainda tenhamos saúde lá. Mas vou adicionar uma linha vertical. Agora, esta é a chave no canto inferior esquerdo acima da tecla Windows. Pode estar em um local diferente para outros layouts de teclado, mas é aí que está para mim. Se eu segurar shift e fizer uma linha vertical, agora posso escrever outro nome de subcategoria. Poderia fazer, digamos começando, por exemplo, se eu apertar Enter, você verá que agora nossa variável de saúde está dentro da categoria de saúde, dentro da categoria inicial. Então, agora temos uma subcategoria. Agora, também podemos fazer a mesma coisa para as funções. Então, se eu selecionar minha função func new aqui que eu criei quando eu colapsei e nós. Podemos dizer uma descrição para essa função. Então eu poderia chamar isso, essa é uma função de teste. Função. Agora, quando eu passar o mouse sobre ele, você pode ver que ele lê isso como uma função de teste. Então, temos uma dica de ferramenta. Podemos definir uma categoria de limite. Então você pode ver que ele realmente tem acesso às nossas categorias variáveis. Então eu poderia definir isso para dizer na categoria saúde. Agora temos isso dentro de uma categoria de saúde. E podemos fazer a mesma coisa com macros. Então, se eu criar uma nova macro e selecioná-la, você pode ver que eu posso dizer Categoria, digamos a categoria da câmera, por exemplo, podemos mudar sua cor também. Então, se eu for para o Gráfico de Eventos, nós o arrastaremos para dentro. Vou apenas adicionar algumas entradas rapidamente para que fique um pouco maior. Então, adicione algumas entradas. Agora podemos realmente mudar a cor. Então, se eu selecionar isso, podemos alterá-lo para ficar vermelho. Você pode ver agora que temos um título vermelho, mas também podemos definir uma descrição, se quisermos. Então isso é um teste, correto? Não está correto. Se eu passar o mouse sobre isso, você pode ver que diz Esta é uma macro de teste. Agora, eles são úteis, especialmente se você estiver trabalhando com outras pessoas. Você pode fornecer descrições detalhadas sobre o que as funções fazem e as variáveis também. Também pode ser útil se você estiver trabalhando em um grande projeto por conta própria, porque você pode ter centenas ou até milhares de variáveis em vários projetos. E você pode esquecer o que uma variável faz ou como ela funciona. Portanto, é sempre bom ter uma breve descrição do que suas variáveis fazem. Por fim, podemos dizer a descrição do projeto. Então, se formos até as configurações de custo, podemos definir a descrição do blueprint atual. Então você pode ver no momento que diz Character Blueprint que contém lógica de movimento. Se formos para o Navegador de conteúdo e passarmos o mouse sobre nosso plano, você poderá ver que obtemos essa descrição quando passamos o mouse sobre ele e o navegador de conteúdo, podemos alterar isso para o que quisermos. Poderíamos mudar isso para dizer que, este é o personagem principal. Agora, quando eu compilar, passar o mouse sobre ele e o navegador de conteúdo, você pode ver que esse é o personagem principal. Portanto, essas são praticamente todas as principais maneiras de organizar o código no Unreal Engine, é realmente importante manter seu código organizado, pois ele pode realmente reduzir quanto tempo leva para corrigir um bug ou adicione um novo recurso ao seu projeto. E especialmente se você estiver trabalhando com outras pessoas, comentários e dicas de ferramentas para suas funções e variáveis são realmente importantes. Então isso vai ser tudo para esta lição. Espero que você tenha aprendido um pouco mais sobre como manter seu código de blueprint limpo e organizado. 33. Aulas adicionais (ferramentas de depuração): Olá pessoal. Nesta lição, vamos dar uma olhada em algumas das ferramentas de depuração de blueprint que acompanham o mecanismo. Então, antes de começarmos, eu criei um novo projeto de modelo de terceira pessoa, só para termos um novo começo para esta lição. Agora, uma das coisas que torna os blueprints realmente poderosos é a rapidez com que eles são para depurar. Porque podemos ver qual código está sendo executado em tempo real. Podemos verificar os valores das variáveis facilmente enquanto o jogo ainda está em execução. E também podemos usar pontos de interrupção para pausar o jogo quando um determinado código é executado. Então, para começar, mostrarei como podemos ver qual código está sendo executado enquanto estamos jogando no editor. Então, vou clicar em Play para entrar no editor do plano. Se pressionarmos F8, você pode ver que agora tenho o controle do meu mouse e posso selecionar coisas no meu navegador de conteúdo ou no editor. Então, vou abrir meu ThirdPersonCharacter aqui. Você pode ver que temos o editor aberto, mas ele não está nos mostrando qual código está sendo executado no momento. Isso porque precisamos dizer qual projeto queremos verificar. Então, aqui no menu suspenso, temos os diferentes projetos que existem no nível. Portanto, há apenas um ThirdPersonCharacter e eu vou nivelar. Então, só temos uma opção. Então, vou selecionar isso. Agora. Se suas janelas forem menores, se eu fizer a minha um pouco menor assim, você pode ver que não tenho o menu suspenso. Tudo bem. Você pode simplesmente clicar nesta pequena seta aqui. E isso lhe dará as opções que não cabem na barra de ferramentas. Você pode ver que também podemos selecionar nosso personagem aqui. Então, agora com nosso personagem selecionado, você pode ver que as linhas de execução em vários de nossos nós estão acesas e isso é porque elas estão em execução no momento. Agora. Atualmente, podemos ver que vários nós estão sendo executados dentro do nosso ThirdPersonCharacter. E a razão para isso é que eles são nós de entrada de acesso e eles executam todos os quadros. Agora, além de poder ver qual código está sendo executado, também podemos verificar os valores das variáveis se formos para as entradas do mouse aqui e eu der uma olhada na pesquisa reduzida da entrada do mouse. Temos um valor de eixo. E se eu passar o mouse sobre isso, podemos ver o valor atual, que no momento é 0. E isso é porque eu não estou movendo minha câmera no jogo no momento. Mas talvez eu queira ver qual é esse valor enquanto estou realmente movendo minha câmera. Então, o que posso fazer é clicar com o botão direito do mouse e observar esse valor. E temos esse pequeno balão de fala que diz o valor atual dessa caneta. Então, se eu assumir o controle do meu personagem apenas selecionando a janela de visualização, eu começo a mover minha câmera. Você pode ver que o valor desse balão de fala está sendo atualizado. Essa é uma ferramenta muito útil para poder ver quais são as variáveis enquanto jogamos o jogo. Agora, ele tem algumas limitações. Normalmente, ele não funciona dentro de uma função. Portanto, se você estiver trabalhando dentro de uma função, normalmente o valor do relógio não funcionará dentro dessa função. Ele só funcionará dentro de um gráfico de eventos ou em uma macro. Agora, você também pode ter vários do mesmo blueprint e seu nível e querer ver qual código está sendo executado em cada um desses blueprints. Então, se eu estiver fora de jogo agora e eu arrastar um ThirdPersonCharacter e apenas colocá-lo aqui. Então eu clico em play e vejo que atualmente ele está nos mostrando qual código está sendo executado, mas apenas dentro do personagem que estamos controlando atualmente. E se quiséssemos ver o código que está sendo executado dentro do nosso caractere alfa. Bem, se formos ao menu suspenso agora, você pode ver que temos outro personagem aqui em nossa lista de projetos. Agora, você pode ter centenas de um plano em seu nível, então é difícil saber qual deles nesta lista é o plano que você deseja verificar. Então, o que podemos fazer é enquanto somos ejetados, podemos selecionar, ou se pressionarmos F8, podemos selecionar outro projeto como nosso personagem aqui. Volte para o nosso ThirdPersonCharacter, clique no menu suspenso. Você pode ver que, na verdade, temos esse prático selecionado entre colchetes, e isso nos diz qual deles na lista selecionamos no nível. Assim, podemos selecionar isso e , em seguida, visualizar o código que está sendo executado para esse ThirdPersonCharacter. Agora, como esse caractere não está sendo controlado, nenhum de seus códigos está em execução no momento. Agora, seguindo em frente, queremos dar uma olhada nos pontos de interrupção. Agora, se eu voltar ao meu personagem gerado aqui no menu suspenso para que possamos ver que o código está sendo executado. Sabemos que temos os projetos certos selecionados. O que vamos fazer é sair dos planetas, sair e eu vou deletar meu personagem aqui, então eu vou deletar isso. Agora. Vamos criar uma nota de início de jogo. E eu vou apenas arrastar para fora e fazer uma impressão. E se clicarmos com o botão direito do mouse nesse nó, você verá que podemos adicionar um ponto de interrupção. E se fizermos isso em C, obteremos esse pequeno ponto de exclamação aqui e compilaremos, apenas nos livremos desse ponto de exclamação. Portanto, esse símbolo vermelho significa que esse nó tem um ponto de interrupção. Agora, os pontos de interrupção interrompem o código ou param o jogo quando o nó é executado. Então, se eu clicar em jogar agora, você pode ver que os jogos foram interrompidos no momento. E está nos dizendo, Ei, esse nó com o ponto de interrupção sendo executado. Agora, essa é uma ferramenta muito útil se você quiser verificar se um pedaço de código está sendo executado. Agora, se quisermos continuar jogando e editando, podemos clicar neste pequeno botão play aqui em cima e podemos assumir o controle de nosso personagem normalmente. Agora, nossos pontos de interrupção também têm alguns outros recursos que podemos usar. Então, se sairmos do avião agora, vou apenas adicionar alguns nós para imprimir string ou adicionar um F. E vamos adicionar um nó flip-flop. E a partir disso, adicionaremos, digamos, algumas strings de impressões em cada uma das saídas, assim. Agora, se jogarmos com um editor, você pode ver que nosso ponto de interrupção é executado. Agora. Podemos retomar como fizemos antes. Tudo o que podemos usar o botão próximo quadro, e isso nos levará a cada nó do nosso código. Então, se eu pressionar isso, você pode ver que ele executa o nó da ramificação. Se eu pressioná-lo novamente, ele nos levará ao nó do flip-flop. E a razão pela qual a caneta verdadeira está em execução é porque nossa condição em nosso nó de ramificação está marcada. Então, é verdade. Agora, com os nós flip-flop selecionados, se eu clicar no botão próximo quadro novamente, você pode ver que ele realmente nos leva a um plano totalmente novo. Temos esses códigos aqui que na verdade não escrevemos. A razão para isso é o nosso nó flip-flop como uma macro embutida no motor. Então, ele nos levará através seus nós em seu próprio código. Então, vamos passar por isso e podemos selecionar para cada um deles. Agora, quando chegamos ao final e eu pressiono novamente, ele nos leva de volta ao nosso ThirdPersonCharacter da entrada a do nó flip-flop e executa o nó da string de impressão. Esse é outro recurso realmente útil dos pontos de interrupção. Podemos examinar nosso código um nó de cada vez enquanto o jogo está em execução para ver qual código está sendo executado. Agora, existem alguns outros controles para nossos pontos de interrupção. Se aumentarmos um pouco nossa janela aqui, você verá que temos algumas opções adicionais. Então, o que eu vou fazer é reiniciar nosso editor de planos. Agora voltamos ao nosso ponto de interrupção original. Agora temos algumas opções diferentes, então temos que entrar no próximo nó a ser executado. Isso funciona praticamente da mesma forma que nosso quadro único avançado. Agora, se pressionarmos isso e você ver, isso nos moverá para o próximo nó. Agora, se eu pressionar isso de novo, você pode ver que nos leva ao nosso nó flip-flop. Agora, talvez eu não me importe que o que está acontecendo neste nó seja um nó embutido no mecanismo. Eu sei que está funcionando. Então, talvez eu só queira pular esse nó e o código dentro dele. O que podemos fazer é pressionar próximo botão e isso vai realmente ignorar o código dentro desse nó. Então, podemos simplesmente acertar isso e ver que isso não nos leva para as macros padrão. Nós simplesmente pulamos isso e podemos usar isso com funções também. Então, se você tem uma função em seu código e não quer passar por todos os nós que estão dentro da função, você pode simplesmente usar esse botão para ignorá-la e ver qual é o resultado. Também podemos usar essa pequena lupa para nos levar aos nós atualmente selecionados. Então, se eu estivesse olhando ao redor meu código e quisesse ver onde eu estava, eu poderia simplesmente clicar aqui e ele nos leva até lá. É assim que podemos navegar enquanto usamos nossos pontos de interrupção. E se sua janela for menor, então suas janelas assim, não se esqueça de que você sempre pode encontrar essas configurações no menu suspenso aqui se sua barra de tarefas for muito pequena. Em seguida, vamos dar uma olhada na janela do depurador do blueprint. Portanto, se formos para o menu suspenso de depuração e clicarmos no depurador de blueprint aqui, você poderá ver que temos esse painel e isso nos dá algumas informações sobre o blueprint que selecionamos atualmente. Então você pode ver se eu clicar na seta para baixo aqui ao lado do nome do meu projeto, você pode ver que a variável que definimos para assistir, se formos aqui abaixo, esse valor do eixo também está listado aqui. Então, talvez se você tivesse muitos valores diferentes que estava observando, você poderia abrir essa janela e ver todos eles aparecerem aqui embaixo. Também podemos ver os pontos de interrupção. Então é aqui que temos pontos de interrupção no código que nos diz o nó. E se clicarmos nele, ele realmente nos levará a esse nó. Então, talvez se você tiver um ponto de interrupção em seu código e tiver esquecido onde o colocou, você sempre pode simplesmente clicar nele você sempre pode simplesmente clicar para levá-lo para onde está o ponto de interrupção. Por fim, temos o rastreamento da execução. Agora, isso nos diz o que está sendo executado atualmente em nosso projeto. Então, agora você pode ver que o evento começa a tocar e imprimir cordas. Isso ocorre porque o ponto de interrupção está sendo executado. Portanto, todo o nosso código está congelado no momento. Mas se eu clicar no botão Continuar, você verá que agora temos nossos eventos de eixo de entrada, e eles estão sendo executados a cada quadro, então eles serão atualizados continuamente. Agora, se sairmos do nosso editor de planos e clicarmos em Reproduzir novamente, ponto de interrupção será acionado. E se formos para a pilha de chamadas aqui, podemos realmente ver o que exatamente fez esse ponto de interrupção disparar. Agora, no momento, estamos apenas acabando e começando. Portanto, é muito fácil de ver. Você pode ver que está nos dizendo no ThirdPersonCharacter, o início do evento no Gráfico de Eventos é o que está desencadeando nosso ponto de interrupção. Mas você pode ter uma situação em que talvez você tenha um evento personalizado que executa algum código e esse cliente pode ser executado em vários lugares diferentes. Talvez outros projetos também. E talvez esse código esteja sendo executado quando você realmente não quer, mas você não sabe qual evento em qual blueprint o está chamando para ser executado. É aqui que a pilha de chamadas pode ser realmente útil. Então, se sairmos do editor de avião por enquanto, vou dar um exemplo. Então, se eu criar um novo evento para o cliente, criar um evento personalizado, chamarei esse exemplo. Vou conectar isso ao nosso código aqui. E vamos retomar nota de reprodução e chamaremos esse evento, então vou chamá-lo de exemplo. Agora, talvez também tenhamos outros lugares que estão chamando nosso exemplo de evento também. Então, se eu clicar com o botão direito do mouse e pesquisar eventos de entrada um, copiarei e colarei isso. E vou definir essa entrada para dois, por exemplo, apenas clicando no pequeno botão do teclado aqui e pressionando tubo. E também chamaremos esse evento a partir dessas entradas, assim. Então, copie e cole isso, e então vamos compilar. Então, agora, quando clicamos em Play para planejar o editor, você pode ver que nosso ponto de interrupção está sendo executado e agora está nos dizendo o código que está chamando esse ponto de interrupção. Podemos ver que no ThirdPersonCharacter, o evento começa a jogar. Então, se passarmos para o nosso evento, o jogo começará no Gráfico de Eventos e isso está esfriando o evento de exemplo em nosso gráfico de eventos. E então eu vou quebrar o ponto como sendo chamado. Mas se continuarmos a jogar e eu assumir o controle do meu personagem. Você pode ver no fundo que eu estou me movendo pela câmera. Se eu pressionar um, você pode ver que nosso ponto de interrupção está sendo executado e agora está nos dizendo que a única entrada está sendo pressionada. Isso é legal. E isso está no gráfico de eventos. Isso é, então, resfriar nosso cliente exemplo, então é isso que está acionando nosso ponto de interrupção. E o mesmo para se eu pressionar também, você pode ver que em nossa pilha de chamadas é alterado para dois no gráfico de eventos, resfriando o evento de exemplo, e isso também está no gráfico de eventos. Agora, isso também pode funcionar para funções. Portanto, se você adicionar um ponto de interrupção dentro de uma função, sempre que isso for chamado, ele também aparecerá na pilha de chamadas quais eventos fizeram essa função ser executada. E isso é muito útil em projetos maiores, porque você pode ter funções e eventos que estão sendo chamados em muitos lugares diferentes. E se esse código estiver sendo executado quando você não quiser, pode ser muito difícil rastrear exatamente onde ele está sendo resfriado. Portanto, usando uma pilha de chamadas e o ponto de interrupção, você pode descobrir rapidamente quais eventos estão realmente chamando essa função ou evento. Agora, a última coisa que acho realmente útil ao depurar código é o nó da string de impressão. Agora, estamos usando muito isso em nossas lições anteriores, mas vou mostrar alguns dos usos para quando você estiver depurando código. Então, o que faremos é sair do nosso editor, e vou fechar nosso depurador de blueprint para maximizar nosso ThirdPersonCharacter e fechar as macros padrão. Agora, imprima strings ou algo que eu uso o tempo todo quando estou depurando código. Podemos adicioná-los às cadeias de eventos para saber quando um evento está sendo executado, podemos usá-los para imprimir valores variáveis. Também podemos usá-los apenas para fornecer informações sobre algumas de nossas configurações. Então, por exemplo, digamos que eu tenha começado de forma saudável. Então eu posso chamar isso de saúde inicial. E eu poderia ter um cheque e começar o placode, por exemplo, eu poderia fazer é maior que 0. E nós poderíamos fazer um nó F. Conecte isso assim. Então, provavelmente, queremos que nossa ajuda inicial seja sempre maior que 0. Então, o que podemos fazer é se a saúde do sinal não for maior que 0, podemos adicionar uma string de impressão e podemos simplesmente colocar o início é 0. Agora, se jogássemos um editor e começássemos com 0, se continuarmos após esse ponto de interrupção, você pode ver que está nos dando um aviso dizendo, Ei, você está começando a saúde é 0. Assim, você pode usá-los para avisar a si mesmo sobre talvez uma configuração não estar correta ou algo não estar sendo definido. Isso também pode ser muito útil se você estiver trabalhando com outras pessoas. Talvez eles estejam ajustando uma configuração e a alterem incorretamente. Então, quando eles reproduzem um editor, você pode ter uma configuração de aviso que dirá a eles, ei, essa configuração está incorreta, você precisa alterá-la. Agora, vou imprimir string também tem algumas outras opções. Então, se clicarmos na seta para baixo aqui, temos a tela da impressora. Agora, se estiver marcado, ficará visível no jogo na tela do jogador. Temos que imprimir um registro. Agora, se isso for verdade, ele também será adicionado ao log de saída. Assim, você pode encontrar a janela de login de saída, ir até o log de saída aqui e marcá-lo. Você pode ver que temos nosso registro de saída. Se eu jogar um editor, agora vou remover nosso ponto de interrupção aqui apenas para que ele não seja executado. Portanto, para remover um ponto de interrupção, basta clicar com o botão direito do mouse no nó que tem o ponto de interrupção e selecionar Remover ponto de interrupção. Agora, quando clicamos em play, você pode ver que nosso texto está sendo impresso. E se você olhar no log de saída, também temos mensagens de usuário no blueprint do log. Recebemos essas mensagens de nossas cordas impressas. Agora temos algumas outras configurações para nossos nós Print String. Também temos a cor do texto. Isso mudará a cor que aparece na tela. Então, temos a duração. Isso é quantos segundos ele aparecerá na tela. Agora, é algo que eu gosto de fazer com meus nós Print String é quando os estou usando em torno do meu código. Eu também crio uma variável chamada show debug text. E podemos pesquisar apenas para obter nossa loja de valor padrão. Agora, costumo conectar isso à tela da impressora e imprimir um registro aqui. Então, agora, se eu quiser desligar todas as minhas sequências de impressões, talvez eu esteja fazendo capturas de tela ou vídeo ou algo assim. Eu não quero que minha string impressa apareça. Eu posso simplesmente entrar no projeto. Posso selecionar meus textos de depuração de exibição no ticket ou ativá-lo, e isso ativará ou desativará todas as minhas strings de impressão, desde que eu as tenha, essa variável conectada ou minhas strings de impressão como esta. Você também pode simplesmente selecionar tudo isso para funcionar. Podemos chamar essa função de algo como erro. Textos assim. Vamos abri-la. Então, agora aqui temos nossa string de impressão com nosso texto de depuração show. Podemos arrastar da string para o nó de entrada para adicionar um pino. Podemos fazer o mesmo com a duração e a cor dos textos. Compile isso. E agora, em nosso gráfico de eventos, temos nosso nó de texto de erro. Podemos dizer que adicione uma mensagem dizendo que o início é 0. Podemos definir a duração, economizar três segundos e os textos a serem lidos. E enquanto nosso texto de depuração do programa estiver marcado, se eu clicar em play, você pode ver que nosso texto está aparecendo aqui. Mas agora, se eu quisesse esconder todas as minhas impressões digitais, eu poderia desmarcar isso. E se eu estivesse usando essa função em vez desses nós Print String, então eu tinha uma, talvez uma mensagem aqui. Vamos dizer exemplo, corra. E poderíamos mudar a cor para azul, e excluiremos essas sequências de impressões. Então, agora, se nossos textos de depuração do programa estiverem marcados com esse rum branco. Mas se assumirmos, agora podemos ver essas mensagens. Então isso vai ser tudo para esta lição. Espero que agora você entenda algumas das ferramentas incorporadas ao mecanismo que ajudam a depurar seu código. 34. Aulas adicionais (cronogramas): Olá pessoal. Nesta lição, vamos dar uma olhada no nó das linhas do tempo. Então, para começar, vou criar um novo projeto no qual possamos entrar. Então, vamos criar uma classe de blueprint definida como ator. E eu vou chamar meu cubo. E vamos abrir isso. Eu só vou arrastar o meu até o topo aqui e ir para o Gráfico de Eventos. Então, apenas para dar uma breve explicação sobre o que os nós da linha do tempo fazem, eles nos permitem mudar seus valores lentamente ao longo do tempo. Eles são muito bons para animar coisas como, por exemplo, uma porta. Ou se você quiser que um ator mude de um local para outro, mas você quer fazer isso de forma agradável e sem problemas. Então, para criar uma nova linha do tempo, basta clicar com o botão direito do mouse em nosso Gráfico de Eventos aqui e pesquisar a linha do tempo. E você pode ver que temos uma opção para Adicionar linha do tempo. Agora, você não pode adicionar linhas de tempo em funções e não pode adicionar linhas de tempo em componentes. Portanto, isso é algo a ter em mente ao usar linhas do tempo. Então, clicaremos em Adicionar linha do tempo e você pode ver que temos esse novo nó aqui e eu posso nomeá-lo. Então, vou chamar meu exemplo de linha do tempo. Assim. Agora, analisaremos todas essas entradas e saídas em um momento. Mas o que faremos é clicar duas vezes no nó da linha do tempo, e isso abrirá essa nova janela que não vimos antes. E é aqui que definimos quais valores queremos que nossa linha do tempo seja capaz de mudar. O que faremos é criar uma nova faixa. Você pode ver que podemos selecionar entre carros alegóricos, vetores, eventos e cores. Vamos começar com um simples flutuador, então adicionaremos uma pista flutuante e podemos nomeá-la. Então eu vou chamar o meu Float, Float, saída assim. Agora, aqui temos uma linha do tempo que essencialmente nos diz qual será o valor de nossa saída de fluxo. Hora específica. Portanto, atualmente não adicionamos nenhum ponto de dados ainda. Portanto, nosso valor flutuante será 0 o tempo todo em que nossa linha do tempo for reproduzida. Mas se quisermos adicionar novos pontos, podemos segurar Shift e clicar. Você pode ver que agora tenho um novo ponto na minha linha do tempo aqui. E aqui em cima podemos definir a hora em que esse ponto termina. Então, vou definir o meu como 0. Então, isso está bem no início da linha do tempo. E então podemos definir um valor. Se eu fosse definir isso para dizer um, você pode ver que eu não consigo mais ver meu ponto de vista. Bem, você pode fazer é clicar neste pequeno botão aqui, e isso trará todos os pontos que estão no seu gráfico à vista. Assim, você pode ver meus pontos por trás desses botões com esse valor um e no momento um. Mas também podemos adicionar pontos adicionais. E é isso que nos permite mudar nosso valor ao longo do tempo. Então, se eu mudar o clique novamente aqui, você pode ver que eu adicionei um novo ponto e nós temos um novo tempo. Então, vou definir isso como um. Vou deixar o valor em um, e selecionaremos nosso ponto original aqui e definirei seu valor como 0. Agora, você pode ver que quando nossa linha do tempo começa, a primeira está em 0, então seu valor será 0. Mas conforme o tempo avança, você pode ver no topo aqui que temos o vale do tempo, uma vez que chega ao valor de um, e esse é o nosso tempo, o valor de saída do nosso flutuador será um. Se voltarmos ao nosso gráfico de eventos aqui, você verá que realmente temos uma nova saída em nosso nó, e essa é a nossa saída flutuante. E é isso que retornará esse valor da nossa linha do tempo. Agora, atualmente, nossa linha do tempo será executada por cinco segundos depois de ser instruída a ser executada. E a razão para isso está aqui em cima, diz comprimento cinco. Agora, se eu fosse mudar isso para dizer um, você pode ver que nossa linha do tempo aqui ficou um pouco menor. E isso porque a área destacada é o tempo que a linha do tempo será executada porque gravamos por 1 segundo, você pode ver que agora está parando em 1 segundo. Então, agora, essencialmente, quando dizemos à nossa linha do tempo para jogar, ela produzirá um valor começando em 0, que será um ponto flutuante. E então, conforme o tempo passa , você pode ver, se passarmos o mouse sobre, você pode ver o valor aumentar com o passar do tempo. E isso é porque nosso segundo é aqui na uma. Então, isso nos dá um aumento linear no valor. Então, agora vamos realmente aprender como podemos executar nossa linha do tempo se voltarmos ao Gráfico de Eventos aqui, você pode ver que temos um jogo e jogo desde o início. E é isso que diz à linha do tempo para jogar. E geralmente será reproduzido desde o início da linha do tempo. Então, quando dissermos para jogar, ele começará no tempo 0 e começará, nosso valor é o valor 0. Então temos que parar, o que interromperá a linha do tempo por dinheiro e seu ponto atual. Nós invertemos, o que reverterá a linha do tempo em execução em qualquer ponto atual. Então, por exemplo, se nossa linha do tempo estava em 0,2 segundos de execução e depois dissemos para ela reverter. Ele reverteria de 0,2 segundos de volta para 0. Em seguida, revertemos do final, o que significa que a linha do tempo reverterá dos pontos finais. Portanto, as probabilidades são de 1 segundo, então reverteria de um para 0. E, finalmente, temos o novo horário definido. E isso nos permite dizer à linha do tempo a hora exata a partir da qual queremos que ela seja executada. Agora, quando nossa linha do tempo estiver realmente em execução, o que acontecerá é que temos esses dois nós de saída aqui. Agora, a atualização executará todos os quadros em que a linha do tempo estiver executando. Portanto, se nossa linha do tempo estiver configurada para ser executada por 1 segundo, o que é atualmente, isso será executado por 1 segundo a cada quadro. E depois que a linha do tempo terminar de ser executada, o PIM finalizado será executado. Agora também temos uma direção. Agora, nossa linha do tempo pode estar indo para frente ou para trás. Para saber de que forma está funcionando. Podemos sair da nossa direção e usar uma nota de igual. Podemos usar ânion igual. E aqui podemos apenas verificar se está indo para frente ou para trás? E isso só retornaria um verdadeiro ou falso, dependendo do nosso valor. Também podemos usar um switch para que possamos arrastar e procurar por switch. Você vê que podemos criar um nó de comutação que produzirá para frente ou para trás, dependendo de qual é a nossa direção atual para nossa linha do tempo. Então, por fim, temos nosso valor de saída de fluido. E, como eu disse antes, isso aumentará lentamente ao longo do tempo à medida que nossa linha do tempo for reproduzida por causa desses dois pontos que temos em nosso gráfico. Então, o que faremos agora é criar um exemplo de como isso funciona. Então, vamos apenas executar o jogo a partir do Begin Play. E vou adicionar uma string impressa à nossa atualização. Então, agora nossa string de impressão, cada quadro que nossa linha do tempo está reproduzindo produzirá o valor flutuante atual. Então, se clicarmos em Compilar, volte para o nosso mapa. Vou arrastar o cubo porque atualmente não tenho um no meu nível. Se clicarmos em Play, você pode ver que agora está aumentando gradualmente de 0 para um. Agora vou mostrar como podemos realmente mover o cubo usando esse valor. Então, vamos voltar para o nosso cubo. Na verdade, vou para a janela de visualização e apenas adicionar um componente de cubo para que possamos vê-lo no mundo e compilar, voltar ao Gráfico de Eventos. Então, agora queremos realmente mover nosso cubo. O que faremos é usar um nó de localização de ator definido. E a partir disso, vamos fazer um local principal ou criar um vetor assim. Então, eu só vou aumentar o valor Z. Agora, poderíamos, em nossa nota da linha do tempo aqui, definir esse valor para o que quisermos que nosso cubo aumente. Então eu poderia definir isso para dizer 300. E podemos clicar neste pequeno botão para ajustar os pontos e verticalmente. E voltaremos ao nosso gráfico de aluguel. Poderíamos conectar isso diretamente ao nosso valor z aqui, conectar a atualização a isso. E queremos obter a localização atual dos atores. A partir disso, usaremos um nó de interrupção. Agora, tudo o que estamos fazendo aqui é que estamos obtendo seus locais y e x atuais porque queremos que eles permaneçam os mesmos, mas depois aumentamos sua localização z. Então, se clicarmos em play agora, você verá que os cubos se movem lentamente para cima conforme nossa linha do tempo é colocada. Se quiséssemos, poderíamos fazer isso um pouco mais devagar para que eu pudesse abrir minha linha do tempo aqui. Eu poderia definir a duração para dizer quatro segundos. Agora, precisamos mudar nosso último ponto aqui. Então, precisaremos alterar o tempo para quatro segundos. Então agora nosso cubo ou lentamente se move para cima ao longo de quatro segundos. Então, clique em Play. Você pode ver agora que está subindo muito mais devagar do que antes. Agora, outra maneira de usar nossa variável float para alterar a localização, e isso é um pouco mais prático se mudarmos nosso valor n. Então, o que eu vou fazer é clicar no botão Zoom To Fit Horizontal. Então, isso só traz a linha do tempo. Para mostrar todos os nossos pontos. Posso selecionar nosso ponto aqui e, na verdade, vou alterar o valor de volta para um. Então, agora nosso primeiro valor é 0 e nosso último valor é um. E faremos o Zoom To Fit Vertical também, para que possamos ver isso acontecendo lá. Então, agora vamos voltar para o gráfico de eventos. E em vez de apenas dizer diretamente o cubo ou o fluxo de saída, será alto. Podemos usar isso para mover r em cubos entre dois locais. Portanto, ele excluirá esse código aqui por enquanto. E vamos sair do nosso novo local e procurar o laboratório. Se você se lembrar disso em nossa lição de vetores, esse nó nos permite ir gradualmente do local a, local B, e essa quantidade é determinada pelo Alfa. Portanto, 0 seria apenas a saída desse nó seria o valor a. E se isso fosse definido como 0,5, então seria um valor entre os locais a e b. E se esse fosse um, então seria apenas o local B completo que está sendo devolvido. E se você se lembra, nosso valor flutuante agora sai começando em 0 e terminando em um a quatro segundos. Então, podemos usar isso para controlar nosso linfonodo para mover nosso cubo entre dois locais diferentes. Então, o que podemos fazer agora é criar algumas variáveis ativas. Então, eu vou chamar isso de ator inicial. E vamos definir isso para um tipo de ator. Selecione os dois aqui embaixo, referência de objeto, e então vamos duplicar isso ou apenas clicar com o botão direito do mouse e duplicar. Chamaremos esse ator assim e enfrentaremos esses gelo para podermos editá-los no nível. Para o nosso ator estadual. Queremos saber sua localização. E vamos conectar isso ao valor a. Então faremos a mesma coisa com nosso indutor. Vá para o local. Vamos conectar isso ao valor b aqui e vamos compilar isso. Então, agora vamos para o nosso nível e podemos criar um novo ator. Então, eu vou apenas criar uma classe de blueprint. Vamos chamá-lo de ator e chamaremos esse ponto de referência, por exemplo. Assim, colocará um no nível aqui e outro aqui. E, na verdade, vou selecionar os dois apenas segurando Control. E eu vou movê-los para cima para que possamos vê-los um pouco mais facilmente. Então, agora, quando clicarmos em play, o que acontecerá se selecionarmos nosso cubo? Precisamos contar aos atores iniciais e finais. Então eu vou definir meu começo para esse cara aqui e o fim para o outro ponto de referência. E agora, quando eu clico em play ou cubo ou apareço instantaneamente sobre ele aponte e me mova lentamente para esse ponto final. Então, se clicarmos em Play, você pode ver que está se movendo lentamente entre esses dois pontos de referência. Isso está acontecendo porque, se você se lembrar, nosso valor flutuante está indo de 0 para um. E então eu deixei o nó está recebendo um local que é a localização de nossos atores principais. E lentamente, gradualmente movendo isso para a localização dos atores finais, que é o valor b. E então estamos dizendo ao nosso ator para se mover entre esses dois pontos. Portanto, essa é uma maneira melhor de controlar a localização dos atores usando um nó da linha do tempo, em vez de apenas colocar manualmente a localização dentro da linha do tempo. Agora também podemos adicionar diferentes tipos de saídas variáveis à nossa linha do tempo. Se abrirmos e seguirmos para o rastreamento, você pode ver que podemos realmente adicionar uma armadilha vetorial. Então, vou clicar nisso. Você verá que agora temos um novo gráfico aqui embaixo. Vou apenas clicar na seta ao lado da nossa saída flutuante aqui apenas para ocultá-la para que possamos ver nossa nova faixa um pouco melhor. Vou dar um nome a isso também. Ou se você clicar com o botão direito do mouse e selecionar Renomear, podemos nomear isso para uma saída vetorial como essa. E se compilarmos e formos para o Event Graph, você pode ver que agora temos uma saída vetorial em nosso nó da linha do tempo. Agora, isso funciona exatamente da mesma forma que nosso valor flutuante, é que temos valores de flutuação livre sendo controlados neste gráfico, um para nossos z, y e x. Então, se quiséssemos, poderíamos gradualmente produz um vetor de nossa nota de linha do tempo que começa em um valor e termina e outro, assim como fizemos com nosso flutuador. E se quisermos adicionar novos pontos, podemos clicar com a tecla Shift pressionada para adicionar um novo ponto aqui. Agora, se eu mover isso, veja que isso está realmente no valor x, mas nossos Y e Z não têm um ponto e eles ainda estão em 0. Então, se quisermos trabalhar em apenas um desses valores, digamos que eu queira apenas adicionar um valor ao z. Podemos ocultar o y e o x, e podemos clicar com a tecla Shift pressionada em nosso z. E agora podemos definir um valor z. Talvez agora eu quisesse adicionar um valor y. Posso ocultar meu valor z e exibir o valor y. E você pode ver que agora posso me mover sobre esse ponto. E isso só torna um pouco mais fácil se você tiver todos esses pontos visíveis, pode ficar um pouco confuso. Então, agora eu tenho todos eles visíveis. Posso alterar esses pontos como quiser e podemos adicionar outro valor de 1 12º y aqui. E podemos mover isso. E poderíamos fazer o mesmo pelo nosso valor z. Agora, os valores iniciais para cada uma dessas saídas. E se você se lembra, um vetor é apenas flutuadores livres combinados. Então, se quebrarmos, use o nó de vetor de quebra. Você pode ver que temos um X, Y e Z. Quaisquer que sejam os valores em que nos sentamos aqui para x, y e z, valores da linha do tempo, isso é o que será gerado naquele momento específico em nossa linha do tempo. E podemos usar esse vetor de saída como qualquer outro vetor. Então, se eu quisesse, eu poderia realmente conectar isso ao meu nó de volta, por exemplo, no ponto final. Então, agora, quando compilarmos, em vez de ir para o ponto final, ele irá para qualquer local de saída da nossa linha do tempo. Se você se lembrar que o local de saída realmente mudará porque temos esses pontos aqui que estão alterando os valores x, y e z dependendo do tempo. Então, se clicarmos em Play, veremos nosso cubo realmente movido do local de início. Está indo em direção a 0, então vai para essa direção. Agora, existem outros resultados que nossa linha do tempo pode fazer. Então, se voltarmos à nossa nota da linha do tempo aqui e abrirmos, podemos realmente ter a saída e evento em determinados momentos em que está sendo executado. Então, se adicionarmos uma nova faixa aqui, vou apenas adicionar uma pista de ventilação. Agora vou esconder minha saída vetorial apenas clicando na pequena seta aqui. E renomearemos nossa faixa de eventos para saída de eventos. Assim. Agora, como nossos tipos de saída anteriores para Shift-clique, podemos adicionar um ponto à linha do tempo. Mas a única diferença está aqui. Não temos, o valor aqui não importa. Tudo o que importa é o tempo. Então, se eu definir isso para dizer 1.5, se clicarmos novamente, podemos adicionar outro ponto e podemos ter essa execução em, digamos, 2.5. Então, agora o que acontecerá é a saída do evento em nosso nó da linha do tempo será executada em 1,5 segundos e depois 2,5 segundos. E se voltarmos ao nosso evento gra, você verá que agora temos uma nova saída de evento. Então, se adicionarmos uma string de impressão a isso, e veremos esse hello now impresso dois momentos em que nossa linha do tempo estiver em execução. Então, temos um em 1,5 e depois outro em 2,5. Em seguida, o último tipo de saída para nossa linha do tempo, se voltarmos para esse nó, ocultará nossas saídas de eventos clicando na seta ao lado dele. Novamente, adicionaremos uma nova faixa e podemos adicionar a faixa de cores. Agora, isso nos permite produzir uma cor em um determinado momento. Então, novamente, como antes, podemos clicar nessa cor aqui para adicionar um novo ponto. Então, acabei de adicionar um novo ponto aqui e podemos movê-los como quisermos agora, porque eles são brancos, não está realmente mudando o valor. Mas se eu clicar com o botão direito do mouse no topo, podemos escolher uma cor. E posso definir isso para dizer vermelho, por exemplo. Agora, em cerca de 2,5 segundos, a cor de saída será vermelha. Mas podemos mover isso e mudar severidade com que a cor muda dependendo desses outros valores. Se os movermos e vermos agora em 2,5 segundos, obteremos uma cor vermelha clara. Se quisermos, podemos alterar os padrões que acompanham nossa linha do tempo para que possamos clicar com o botão direito do mouse nessa e escolher uma cor diferente. Podemos mudar isso para dizer, um azul assim. E agora você pode ver que temos uma cor azul aqui que será produzida em 0,5 segundos. Mas com o passar do tempo, muda lentamente para uma cor púrpura rosada e depois passa para o vermelho. Diferente de antes. Se voltarmos à nossa linha do tempo, você pode ver que agora temos uma nova saída. Eu não dei um nome, então vamos dar um nome aqui rapidamente. Vou chamá-lo de cor. Se voltarmos ao Gráfico de Eventos, você pode ver que agora temos acesso ao nosso tipo de variável de cor, e você pode conectá-lo qualquer outra entrada de cor que desejar. Então, se quiséssemos, poderíamos realmente conectar isso em nossa string impressa. Podemos inserir a cor na cor do texto aqui, por exemplo, basta clicar em play e veremos algumas cores diferentes para nossos textos. Você pode ver como roxo e agora é como um vermelho. Então, esses são todos os tipos de resultados que nossa linha do tempo pode fazer. Então você pode realmente usar linhas para fazer muitas coisas diferentes. Agora, talvez você quisesse que sua linha do tempo realmente fosse para frente e para trás para fazer um loop. Eu posso te mostrar como você pode configurar isso. Então, o que faremos é usar nossa localização do indutor novamente aqui para nossa entrada B. E pegaremos a caneta pronta. E, na verdade, nos arrastaremos de todas as direções e procuraremos por switch. Quando você liga a direção da linha do tempo, isso será conectado ao final. Então, agora queremos ser capazes controlar o que nossa linha do tempo fará, mas não queremos ter que conectá-los às entradas aqui. Então, o que você pode realmente fazer é usar uma variável para controlar essa linha do tempo. Se formos para os componentes aqui embaixo, você pode ver que temos um exemplo de linha do tempo. Podemos obter essa variável. E podemos usar isso para controlar nossa linha do tempo. Então, digamos mais tarde em nosso código que queríamos que nossa linha do tempo fosse reproduzida, mas sem precisar conectar a essa entrada, podemos usar essa variável. Podemos nos arrastar e procurar por brincadeiras. Você vê que podemos chamar uma função chamada play. E isso realmente fará com que nossa linha do tempo seja reproduzida. Para fazer nossa linha do tempo girar para frente e para trás, o que podemos fazer é usar o inverso. Então, se nos arrastarmos, procuramos o inverso. Podemos usar a opção inversa. Portanto, se estiver jogando para frente, queremos que ele seja reproduzido ao contrário assim que terminar. E então, se estiver retrocedendo, queremos que seja reproduzido desde o início. Então, vamos apenas jogar. Bem, podemos jogar desde o início assim. Então, agora nosso cubo vai se mover da localização do ator estrela para o final e depois de volta para o fim, para o início. E continuaria fazendo um loop e fazendo isso. Então, excluiremos essa nota. Não estamos mais usando isso. Então, vamos compilar e clicar em Play. Podemos ver nossos côvados se movendo do início ao fim. E agora está voltando do final para o início. E isso vai continuar fazendo isso agora e voltando. Por fim, veremos o dramaturgo. Agora, o dramaturgo controla a rapidez com que a linha do tempo será reproduzida. Então, agora, nossa linha do tempo está definida para quatro segundos. Esse é o tempo que vai levar para jogar. A taxa de reprodução está atualmente definida como um porque esse é o padrão. Agora, se aumentarmos o dramaturgo dois, isso faria com que o tempo eu corresse duas vezes mais rápido. Então eu vou te mostrar como podemos fazer isso. Podemos pegar nosso exemplo de variável de linha do tempo, arrastar e definir a taxa. Então, agora podemos definir a sala de jogos. Então, talvez eu queira que isso seja executado duas vezes mais rápido. Então, se conectarmos isso aqui para jogar, e jogarmos agora, você verá que está rodando muito mais rápido do que antes. Se aumentarmos novamente para dizer quatro, ele será executado quatro vezes mais rápido. Portanto, agora nossa linha do tempo será concluída em 1 segundo, mesmo que dentro do comprimento seja quatro, porque estamos dizendo para jogar quatro vezes mais rápido. Então, se apertarmos o play agora, você verá que ele está completando isso agora em 1 segundo. Agora, há algumas outras configurações pelas quais eu queria passar rapidamente dentro do nó da linha do tempo. Então, se voltarmos ao nosso plano de fila e abrirmos nossa linha do tempo. Aqui temos algumas bandas no topo que podemos usar para controlar o que nossa linha do tempo faz. Então, para começar, temos reprodução automática, e se ativarmos isso, basicamente significa que não precisamos executar a caneta de reprodução para que nossa linha do tempo esfregue. Ele será executado apenas no início do jogo ou sempre que nossa Cuba aparecer. Então, se eu conectar o pino play e apertarmos play, agora, você pode ver que ele está tocando automaticamente, mesmo que eu não esteja realmente dizendo isso. Também há uma opção de loop. Se voltarmos ao nosso cubo e depois à nossa linha do tempo, você verá que há um botão de loop. Agora, isso não fará a mesma coisa que fizemos aqui embaixo, onde uma vez que o cubo chega ao local final e depois volta para o local inicial. Esse loop fará com que a linha do tempo comece do início todas as vezes. Então, se ativarmos isso , eu desconectarei o que eu terminei e compilamos e clicamos em Play. Você verá que ele chega ao fim e, em seguida, começa novamente a partir do nosso local de início. Então isso é um par de oxigênio que ela pode achar útil se você estiver usando linhas do tempo no futuro. Agora também podemos mudar a maneira como nossos valores e nossos gráficos aqui vão um para o outro. Então, se eu selecionar meus dois pontos aqui, apenas segurando Control, eu posso selecionar os dois. Se eu clicar com o botão direito do mouse, há algumas opções diferentes para a interpolação. Então, se eu configurá-lo para dizer auto, e você vê que agora, em vez dessa linha reta indo entre os valores, temos uma curva que significa que o valor inicial aumentará lentamente cada vez mais rápido. E então ele diminuirá lentamente cada vez mais rápido até atingir seu valor alvo. Podemos usar essas pequenas alças aqui para controlar a rapidez ou lentidão com que o valor se aproximará do valor alvo também. Então, se eu selecionar meu ponto aqui, mova-o para cima assim. Eu tenho valor aumentará lentamente do que mais rápido e mais rápido até chegar a este ponto em que ele realmente será maior do que nosso valor n, porque você pode ver que a linha vai acima dele, mas então ele voltará ao nosso valor V1. Agora, há algumas opções diferentes. Quando destacamos esses pontos, você pode escolher entre usuário automático, quebra, linear e constante. Tão constante, por exemplo, apenas uma linha reta até o ponto e depois vai instantaneamente para esse valor. Podemos usar linear, que é o padrão. Ele vai desse ponto até o ponto final exatamente na mesma taxa o tempo todo. Podemos usar essas configurações dentro da nossa saída vetorial aqui. Então você pode ver se eu seleciono esses dois pontos aqui, eu já defini como automático, mas podemos defini-lo de volta para linear, por exemplo. Ou, se você quiser, podemos levá-lo de volta ao automático. Podemos controlar esses pontos como fizemos antes com nosso flutuador. E também podemos fazer isso com cada um dos nossos valores x, y e z. Então, poderíamos fazer o mesmo com nosso valor y, por exemplo. Poderíamos ajustá-los para realmente aumentar ou diminuir como quisermos. Então é isso para nossa aula de cronogramas. Espero que você tenha uma melhor compreensão de como eles funcionam agora e para que você pode usá-los em seus projetos no futuro. 35. Aulas adicionais (socos): Olá pessoal. Nesta lição, vamos dar uma olhada nos soquetes. Soquetes ou como podemos conectar atores a outros atores ou componentes a outros componentes. Agora podemos adicionar soquetes às malhas esqueléticas. Então são malhas que podem animar como, por exemplo, o manequim que estamos usando para nosso personagem. Ou podemos adicionar soquetes a malhas estáticas. Então, essas são medidas como os cubos que estamos usando. Então, para começar, mostrarei como podemos adicionar um novo soquete a um esqueleto. Então, vamos para a pasta Personagens aqui, depois para malhas de manequins. E aqui você pode ver que temos nossas malhas esqueléticas de manequim e também o esqueleto que os manequins usam. Abriremos o manequim SK. Aqui dentro. Você pode ver no lado esquerdo que temos uma lista de todos os ossos que são incluídos no esqueleto. Agora, é aqui que selecionamos um osso específico ao qual queremos adicionar um soquete. Digamos, por exemplo, que estávamos adicionando um chapéu ao nosso personagem. Vamos querer que o chapéu siga o osso da cabeça. Então, ele percorrerá e encontrará o osso da cabeça que deve estar próximo ao fundo aqui. Se eu continuar. Aqui vamos nós. Temos os dois ossos do pescoço e depois o osso da cabeça. Então, se selecionarmos o osso da cabeça, clique com o botão direito do mouse e adicione soquete, isso nos adicionará um novo soquete ao osso da cabeça. Se formos para o painel Detalhes, você pode ver que podemos renomear esse soquete. Vou ligar para minha tomada de chapéu assim. Agora, com o soquete selecionado, você pode ver que eu tenho a opção de girá-lo aqui. E se eu pressionar W enquanto estiver selecionado na janela de exibição, também posso mover o soquete. O soquete está atualmente se você olhar aqui no painel Detalhes em zeros são 0 local. Isso significa que está na localização exata do osso da cabeça, mas podemos mover isso para que possamos mover isso para cima. Então, agora nosso encaixe está acima do osso da cabeça. O que isso significa é mesmo quando os personagens que animam esse soquete permanecerão a essa distância do osso da cabeça. E isso é útil porque, se estivermos colocando um chapéu nesse soquete, gostaríamos que ele acompanhasse o osso da cabeça, mesmo quando os personagens estiverem animando. Agora, se quiséssemos visualizar como seria quando estiver conectado a um soquete. Nós podemos fazer isso. Então, podemos clicar com o botão direito do mouse em nosso soquete cardíaco aqui, ir até Adicionar ativo de visualização e podemos realmente selecionar uma malha para anexar ao nosso soquete. Agora, tenha em mente que isso é apenas para visualização. Então, mesmo se colocarmos algo aqui agora, não o veremos no jogo. Isso é apenas para visualização quando estamos assistindo animações ou em nosso editor esquelético. Para mim, vou selecionar apenas o, selecione o cilindro aqui. E você pode ver que meu cilindro está girado na direção errada. Então, vou girar meu soquete e você pode ver em tempo real ou o cilindro gira. Agora, obviamente isso não é um chapéu, é apenas um cilindro, mas vamos usar isso como exemplo. E podemos ver como será a aparência do nosso cilindro enquanto estiver conectado ao nosso soquete. Então, agora, se formos assistir uma animação que usa esse esqueleto, veremos essa prévia e veremos se mover junto com a animação. Então, se voltarmos para o hit do navegador de conteúdo, eu vou para a pasta de manequins. Em seguida, as animações vão para o dinheiro. E vamos dar uma olhada no salto, por exemplo. Vamos clicar duas vezes nisso e trarei essa animação até aqui. Você pode ver que enquanto nossa animação de salto está sendo reproduzida, R hat ainda está acompanhando nosso osso da cabeça. Agora, voltando ao nosso esqueleto de manequins, se quiséssemos nos livrar dessa prévia, podemos sempre clicar com o botão direito do mouse, remover todos os ativos anexados e isso apenas nos livrará de todas as visualizações para nós . Podemos, se quisermos adicionar vários soquetes ao mesmo osso. Então, se quiséssemos outro soquete que talvez tivesse um local diferente para talvez um tipo diferente de chapéu. Nós poderíamos fazer isso também. Basta clicar com o botão direito do mouse em Adicionar um novo soquete, e isso nos permitiria adicionar um soquete adicional ao osso da cabeça. Se você quiser remover um soquete, mouse e selecione a opção Excluir aqui. Agora também podemos adicionar soquetes a malhas estáticas. Então, se voltarmos para o navegador de conteúdo aqui, eu vou apenas para a pasta de prototipagem de nível e duas malhas. Acabamos de ter algumas malhas de pilha simples aqui. Mas se abrirmos o cubo com shampoo, por exemplo, aqui temos alguns detalhes sobre a malha e a malha na janela de exibição. E se formos até o painel do Windows aqui, deve haver um gerenciador de soquetes e suas mentes marcadas. Se o seu não for, você vai querer clicar nele. E você pode ver isso para mim, está aqui. E isso nos permite adicionar novos soquetes à nossa malha estática. Então, basta clicar neste pequeno botão de adição aqui. Podemos nomear nosso soquete. Vou ligar para o meu soquete de novo. Assim. Ao contrário de antes, podemos posicionar nosso soquete. Poderíamos dizer que se arrume aqui. E agora, onde quer que essa malha se mova, esse soquete estará 90 centímetros de seu centro, mesmo durante o jogo. Ao contrário do esqueleto, também podemos adicionar uma prévia. Então, se formos até o conjunto de opções, podemos clicar em Avançado e dizer uma malha de pilha anterior para que possamos selecionar o cilindro que tínhamos antes ou o cilindro aqui e ver que temos isso mesmas malhas que tínhamos antes. E podemos visualizar como seria quando realmente se conectasse ao soquete. Agora você sabe como criar soquetes e adicioná-los a malhas esqueléticas e estáticas. Agora vou mostrar como podemos realmente usar esse soquete durante o jogo e anexar coisas a ele. Então, ele voltará para o nosso Navegador de conteúdo, para a pasta Personagens ou para a pasta de conteúdo. Em seguida, vá para os projetos de terceira pessoa e abriremos nosso Projeto de Personagem de Terceira Pessoa. Agora eu tenho algumas variáveis extras e uma função aqui de uma de nossas lições anteriores. Se você não fizer isso, não se preocupe com isso, não os usaremos de qualquer maneira. Portanto, antes de começarmos a gerar atores e anexá-los aos soquetes, primeiro vou mostrar alguns dos nós mais comumente usados com soquetes. Então, primeiro começaremos obtendo nossa malha de caracteres do nosso painel de componentes. E se você se lembra, podemos clicar duas vezes para abrir a janela de visualização. Esta é a nossa malha animada em nosso personagem. Então, voltando ao Gráfico de Eventos, vou ampliar aqui. Podemos pegar nosso componente de malha. Se nos arrastarmos para fora disso e procurarmos por get socket location, você pode ver que obtemos esta nota aqui. Isso nos permite fornecer um nome de soquete como r hat socket. E se essa malha, então, se nossa malha de caracteres aqui tiver esse soquete usando esse nome, ela retornará uma localização mundial para esse soquete. Agora também podemos usar esse nó get socket location com malhas estáticas. Então, se eu adicionei uma nova malha estática, fazendo isso como um exemplo porque nosso personagem não tem um componente de malha escalonado. Vou adicionar isso. E se eu arrastar isso para o nosso gráfico de eventos aqui, também posso inserir isso nesta nota. E agora, se a malha de pilha que definimos para esse componente tiver um soquete, obteremos sua localização mundial atual. Agora, existem algumas outras notas que funcionam assim. Podemos arrastar para fora da nossa malha e obter rotação do soquete. Isso nos dará a rotação mundial de qualquer nome de soquete que colocarmos aqui que esteja em nossa malha de caracteres. Ou podemos excluir esses nós, podemos arrastar e pesquisar obterá transformação de soquete, e isso obterá a transformação de qualquer nome de soquete que definimos aqui. E se você se lembra da nossa lição de transformação, podemos simplesmente arrastar para fora daqui, usar um nó de quebra e isso nos dá acesso à localização, rotação e escala do soquete. Agora, isso também nos dá uma opção de transformar espaço. Agora, se isso for definido como mundo RTS, isso significa que ele obterá a rotação mundial, localização e escala de qualquer nome de soquete que colocarmos aqui. Supondo que nossa entrada de malha tenha esse soquete. Agora, se clicarmos nos espaços de transformação, algumas opções diferentes, podemos selecionar o ator. Agora, isso fará com que os soquetes se transformem em relação à localização central do ator. E o que quero dizer com isso, se formos para a janela de visualização, se selecionarmos nosso componente de malha de estaca que adicionamos, se eu movê-lo para cá e imaginar que este é o soquete. A transformação relativa do ator sockets seria esse local que temos aqui. Então, se isso fosse um soquete e estivéssemos obtendo transformação desse soquete usando a opção de ator aqui, ele retornaria o local fornecido aqui. Agora, a próxima opção se voltarmos ao nosso nó de transformação é o componente. Observe que agora isso fará com que os soquetes se transformem em relação ao se transformem em relação ao componente ao qual está conectado. Então, se novamente, se eu voltar para nossa janela de visualização e imaginarmos que a malha de pilha aqui é um soquete em vez de um componente. Se eu fosse anexar isso a essa medida, você pode ver que nossa localização realmente mudou. Agora, esta é a transformação de seu componente. Se eu pegá-lo de volta e anexá-lo de volta ao componente da cápsula, veja que a localização é diferente porque esta é a transformação do ator. E se o movermos de volta para o componente, você verá que agora é a transformação do componente. Então, novamente, se nosso soquete ou desculpe se nossa malha de pilha fosse um soquete e tivéssemos que obter sua localização usando o espaço de componentes, ele retornaria esse valor aqui uma vez que fosse anexado a algo como a malha Componente. E por último, se voltarmos à nossa Transformação agora, teremos o espaço do pai Bowman. E se voltarmos ao nosso manequim aqui, selecionamos nosso osso. Seu espaço ósseo pai seria o valor que configuramos aqui. Agora, não se preocupe muito se você achou isso um pouco confuso. Na maioria das vezes, quando você estiver usando esse nó, você usará apenas a opção World de qualquer maneira, porque normalmente é a mais útil, sendo capaz de obter a localização mundial do soquete. Agora, existem algumas outras notas que são úteis ao trabalhar com soquetes. Então, vamos excluir esses nós agora e eu vou arrastar para fora da nossa variável de componente de malha, vou procurá-lo. O soquete existe? E isso apenas verificará se o nome do soquete que fornecemos existe na malha ou na malha estática que conectamos ao focinho e, em seguida, retorna um valor verdadeiro ou falso. Se isso acontecer. Também podemos obter uma lista ou uma matriz de todos os nomes de soquetes existentes em um determinado componente. Assim, podemos arrastar e procurar por get socket, obter todos os nomes de socket. E isso apenas nos fornecerá uma variedade de nomes. E esses serão todos os nomes de todos os soquetes nessa malha de pilha específica. E isso funcionará novamente com nossa malha esquelética também. Podemos simplesmente conectar isso como nossos nós anteriores. Então, agora vamos realmente conectar algo a um soquete durante o jogo. Então, vamos começar apenas excluindo essas notas e clicando em compilar. Vamos para o Navegador de conteúdo. Eu vou criar um novo ator que será anexado ao nosso personagem. Então vamos clicar com o botão direito do mouse na classe Blueprint. Vamos criar um ator, vou chamar o meu chapéu de sublinhado BP , ou abrir isso. E então aqui eu vou apenas adicionar um novo componente de malha estática como esse. E vamos defini-lo. Malha. Então, abrimos aqui o menu suspenso de malha de pilha. E vou definir isso para o cilindro que estávamos usando antes, assim, irá compilar e salvar isso. Em seguida, voltaremos ao nosso ThirdPersonCharacter. E vou clicar com o botão direito do mouse e pesquisar o evento de entrada. E usaremos um evento de entrada um. Então, se você se lembra, esses nós são executados sempre que eu pressiono um no meu teclado. Então, a primeira coisa que vamos fazer quando pressionarmos um é gerar um novo ator de chapéu. Então, vou me arrastar da geração social e pressionada ativa da aula. Vamos definir a classe para r hat assim. Agora, porque vamos colocar imediatamente nosso chapéu na cabeça do nosso personagem. Poderíamos nos safar apenas arrastando daqui usando um nó de transformação e apenas gerando o chapéu em 0 no mundo. E então ele ficará instantaneamente preso à cabeça do nosso personagem de qualquer maneira. Mas o problema com isso às vezes é para alguns quadros, você pode ver o chapéu aparecer no centro do mundo e, de repente, encaixar no soquete. Então, o que eu gosto de fazer é obter os soquetes que o local atual de spawn está naquele local e, em seguida, anexá-lo. Então, em vez de usar o nó de transformação, vamos obter a localização dos soquetes. Então eu vou pegar a malha vai arrastar para fora e fazer o soquete. Usaremos a transformação get socket. Colocaremos nossos nomes de soquetes e isso precisa ser exatamente o mesmo que o soquete que criamos em nosso esqueleto. Então, se você se lembra quando chamamos isso de tomada de chapéu, precisamos usar o nome exato de maneiras que não encontrarão nosso soquete de chapéu de futebol. Vamos deixar isso no mundo RTS porque queremos que o mundo se transforme. E vamos apenas arrastar isso para fora, conectá-lo à transformação de spawn como essa definirá o tratamento de colisão para sempre gerar ignorar colisão, porque nós só queremos que ele apareça neste local. Não queremos que ele tente ajustar nosso extra de forma alguma. Então agora vamos definir r hat actor para uma nova variável apenas para que possamos editá-la se quisermos mais tarde arrastar para fora, vamos promover uma variável para criar uma nova variável para nós. Vou chamar esse chapéu assim. Agora, temos um chapéu que surgirá em nosso local de encaixe quando jogarmos novamente. Então, se pudermos Paul apertar play e se eu apertar um, você pode ver que nosso coração está surgindo em cima da minha cabeça. Mas se eu me mudar em C, ele permanece lá porque ainda não o anexamos ao nosso personagem. Estamos apenas dizendo a ele para aparecer no local do soquete. Portanto, ele sairá do editor de avião e voltará para o ThirdPersonCharacter aqui. Em seguida, vamos colocar nosso chapéu no nosso personagem. Então, para fazer isso, vamos arrastar para fora do componente de malha até aqui, criar uma nova variável mash, arrastar para fora. Vou procurar por isso. Anexar. Agora, há duas notas anexadas que temos anexar ator ao componente, que é o que vamos usar hoje porque estamos anexando todo o ator do coração a um componente, que é o nosso componente de malha. Mas também podemos anexar componentes a outros componentes. Então, por exemplo, se dentro do chapéu R, nós seguramos um componente que queríamos anexar à malha, mas não queríamos anexar todo o ator do chapéu à nossa malha. Poderíamos usar esse anexo de componentes, componente. Mas, por enquanto, usaremos apenas anexar ator ao componente. E vamos conectar isso ao nó definido. Agora temos um alvo, e este é o ator que vamos realmente anexar à nossa malha, que é o pai. Então, vamos conectar isso ao alvo aqui. Então precisamos definir o nome do soquete. Agora isso vai ser o soquete do chapéu. Novamente, isso sempre precisa ser exatamente o mesmo que o soquete que criamos em nosso esqueleto. Caso contrário, não prenderá o ator ao futebol. Em seguida, temos as regras de localização, rotação e escala. Agora, isso é o que o motor vai fazer com o ator cardíaco quando eu realmente o conectar ao mash. Agora, por padrão, é manter relativo, e eu vou te mostrar o que isso faz na jogabilidade. Então, se eu apertar play, eu pressiono um. Você pode ver, eu nem consigo ver meu chapéu aqui. Mas se eu pressionar F1, eu olho para baixo. Você pode ver que os chapéus, na verdade, ali, estão presos à tomada, mas tem uma distância muito grande. E basicamente essa é a distância que o soquete está do Centro Mundial, que fica aqui. Então, se eu passar meu personagem aqui e apertar um, agora, devemos ver o chapéu muito mais perto do personagem. Essa é a distância relativa que o soquete está longe do centro do mundo. Agora, o próximo, se voltarmos ao nosso ThirdPersonCharacter aqui, é manter o mundo, que se colocarmos tudo isso em direção ao chapéu, se conectará ao soquete. Atualmente, a distância é da tomada. Agora, se usarmos isso e pressionarmos um agora, você realmente verá que está logo acima da cabeça do nosso personagem e permanece conectado ao conjunto de caracteres. Mas se eu voltasse ao meu personagem e estivesse atrasado , digamos dois segundos. Se eu apertar play agora e apertar um e passar para cá. Você pode ver que agora está conectado porque está se movendo com a animação, mas é a distância que estávamos longe dela quando a geramos. Por fim, se voltarmos para ThirdPersonCharacter, podemos mudar isso para encaixar no alvo. E isso fará com que nosso coração se encaixe diretamente na tomada. Então, novamente, se pudermos pesquisar, vamos nos livrar desse atraso aqui e clicar em Jogar. Se eu pressionar um, você pode ver nossos chapéus presos ao soquete e ele permanece lá, não importa o que façamos. E se eu realmente adicionar esse atraso assim. Agora, antes, se pressionássemos um e depois nos afastássemos, ficaria a essa distância do nosso livro. Depois de dois segundos, ele simplesmente se encaixa diretamente no soquete como você esperaria. Agora você pode querer separar um ator de outro ator, o que eu vou te mostrar como fazer agora, se voltarmos para o personagem de terceira pessoa aqui, eu vou adicionar novos eventos de entrada. Então, vamos procurar por evento de entrada, e eu vou adicioná-lo para eventos de entrada 0, por exemplo. Aqui em cima, vamos pegar a variável de chapéus que criamos anteriormente que está sendo definida quando geramos o chapéu, podemos arrastar para fora e podemos procurar por desanexar. E podemos usar a opção desanexar da actina aqui. E executaremos isso quando nosso 0 for pressionado. Agora, o padrão é manter relativo. Agora, isso fará a mesma coisa que quando prendemos o chapéu. Ele manterá a localização relativa do chapéu do centro do mundo, o que geralmente não é muito útil. Então, na maioria das vezes, você mudará isso para manter um mundo assim. Então, quando o chapéu se desprender, ele permanecerá no local que estava quando lhe dissemos para se separar. Então, se eu clicar em Compilar agora, clicar em play, eu pressiono um chapéu de gerador. Ainda temos esse atraso? Então, se eu voltar ao nosso código aqui, vamos apenas remover isso. Então, ele irá compilar, clique em Play. Quando eu pressiono um, você pode ver que nosso coração está ligado ao nosso personagem como estava antes de eu poder pular e ele ainda está lá. Se eu pressionar 0, você pode ver que ele não está mais se movendo com nosso personagem. E está mantendo o local exato em que estava quando pressionei 0 para desconectá-lo. Por fim, existem algumas outras notas que você pode querer usar ao usar o anexo. Então, se voltarmos ao nosso ThirdPersonCharacter aqui, podemos arrastar para fora do chapéu e nos apegar. E isso realmente nos dará o ator em anexo. Então, se usarmos esse nó enquanto estamos ligados ao nosso personagem, ele retornaria uma referência ao nosso personagem. Também podemos nos arrastar e nos apegar. E isso nos dará os atores em anexo. Então, isso nos dá uma variedade de todos os atores que estão presos ao chapéu atualmente. Um exemplo de como isso pode ser útil é, talvez, quando seu personagem morre e você destrói seu corpo, você quer destruir todas as coisas que possam estar ligadas a ele. Essa pode ser uma boa maneira de conseguir todos os atores que estão ligados ao seu personagem e destruir todos eles também. Então o último, se arrastarmos para fora e procurarmos for anexado novamente, você pode ver que há o nome do soquete dos pais anexados. E isso dirá a qual soquete R hat está conectado no momento, se estiver conectado a um soquete. Agora, se você quiser encontrar qualquer um desses nós pelos quais passamos, você sempre pode simplesmente arrastar para fora de um componente como a malha aqui. Se eu fizer um novo componente de malha aqui em cima, arraste para fora, você pode procurar por anexo para encontrar esses nós anexados. Você pode procurar por soquete para encontrar os nós do soquete. E você também pode pesquisar por fica anexado para obter esses modos anexados. Agora, uma última coisa que eu queria mencionar antes de terminar esta lição é que você precisa ter cuidado e anexar atores ao seu personagem, porque eles podem interferir na colisão de seus personagens. E isso pode fazer com que seu personagem voe para o ar ou tenha problemas se mover porque o ator que você anexou a ele está bloqueando sua colisão. Uma coisa para ter certeza quando você anexa coisas ao seu personagem é uma boa ideia passar por qualquer um de seus componentes? Eu tenho uma colisão como um chapéu. Temos nosso componente de malha de pilha aqui. Descemos e encontramos as predefinições de colisão. Atualmente está definido para bloquear ou dinâmico, o que inclui nosso personagem. Portanto, é sempre uma boa ideia mudar isso para personalizado e garantir que **** esteja configurado para ignorar para que o r hat não interfira em nada com a colisão de nossos personagens. Então é isso para a nossa aula de soquetes. Espero que agora você entenda como eles funcionam e como você pode usá-los em seus projetos futuros. 36. Aulas adicionais (componente de movimento): Olá pessoal. Nesta lição, vamos dar uma olhada no Componente de Movimento do Personagem. E para aqueles que estavam acompanhando nossas lições anteriores, acabei de criar um novo modelo de terceira pessoa que possamos começar do zero para esta lição. Agora, o componente de movimento do personagem está incorporado em qualquer tipo de projeto de personagem. Então, aqui dentro do nosso ThirdPersonCharacter Blueprint, você pode ver no painel Componentes, que temos o Componente Movimento de Personagem. Agora, o componente de movimento do personagem é o que permite que nosso personagem realmente se mova. E também nos fornece várias configurações adicionais que podemos usar para ajustar como nosso personagem se move e que tipo de movimento ele está fazendo. Portanto, se formos em frente e selecionarmos o componente Movimento do personagem, você poderá ver no painel Detalhes, temos todas as configurações desse componente. Se você não tiver o painel Componentes ou o painel Detalhes, você sempre pode ativá-los indo até o menu suspenso de janelas aqui e selecionando no painel Detalhes e também o Painel de componentes aqui. Agora, não vamos passar por todas as configurações do componente de movimento, porque existem algumas delas, mas vamos passar pelas principais e explicarei o que elas fazem e como você pode ajustá-los. Se você esquecer o que uma configuração faz, você sempre pode simplesmente passar o mouse sobre ela e ela fornece uma dica de ferramenta razoavelmente boa sobre o que essa configuração específica faz. Então, para começar, temos a escala de gravidade. Agora, isso é o quanto a gravidade é aplicada ao nosso personagem. Rápido para definir isso para algo muito maior, como cinco, e vamos compilá-lo e clicar em play. Quando eu pulo, você pode ver que meu personagem não pula muito alto. E isso porque estamos aplicando cinco vezes a gravidade normal ao nosso personagem. Agora tenha em mente que esse valor de gravidade afeta apenas o personagem, nenhum outro objeto no mundo. Em seguida, voltando ao nosso ThirdPersonCharacter e selecionando o movimento do personagem, temos a aceleração máxima. Agora, esta é a rapidez com que o personagem acelerará até sua velocidade máxima de movimento. Quanto maior esse valor, mais rápido o personagem estará nessa aceleração, e quanto menor, menor será. Em seguida, temos o fator de atrito de ruptura. Agora, quanto maior esse valor, mais rápido o personagem irá parar quando soltarmos todas as teclas de entrada de movimento. Em seguida, temos a meia altura agachada. Agora, essa é a altura que nosso componente cápsula terá quando nosso personagem estiver agachado. E se formos para nossa janela de visualização, você pode ver nosso componente de cápsula aqui. Agora, nosso componente cápsula é o que os textos, o que nosso personagem está encontrando. Agora, quando você está agachado, normalmente você quer que isso seja mais curto porque seu personagem está agachado, e é isso que permitiria que você se movesse sob objetos inferiores. Então, agora vamos voltar para o Gráfico de Eventos e vou criar um exemplo rápido de como podemos dizer ao componente de movimento que estamos agachados. Então, se avançarmos para cá, vou criar um novo evento de entrada, registrar a busca por eventos de entrada C. E eu vou apenas rolar para cima e tentar encontrar essa entrada. Então, isso está aqui para mim. Eu só vou configurá-lo para que, quando eu pressionar C, nosso personagem vai se agachar. E quando eu realmente vejo nosso personagem andando agachado, agora tenha em mente, nosso personagem não vai realmente reproduzir uma animação agachada porque não configuramos o lado da animação disso. Mas o que faremos é dizer ao componente de movimento que queremos que ele use as configurações de agachamento para dizer ao nosso componente de movimento que estamos agachados se arrastará da busca de Preston por agachamento. E selecionaremos a função de agachamento aqui. E então vamos sair do lançamento e procurar e agachar assim. Agora, essas são funções incorporadas aos projetos dos personagens. Se você tentar usar essas funções e dizer, apenas um ato aleatório de projeto, você não seria capaz de encontrar essas funções. Agora, há uma outra configuração que precisamos ativar e que, na verdade, está dentro do nosso Componente de Movimento do Personagem que precisamos dizer que nosso personagem pode realmente se agachar na busca. vamos apenas procurar por can crouch. E você verá que sob as capacidades de movimento, pode agachar-se realmente marcou. Então, vamos pegar esse. Agora podemos testar isso no jogo, então basta compilar e ir para o mapa da terceira pessoa e nós vamos jogar. Agora, antes de apertar C, vou pressionar a tecla Til, que é a tecla do lado esquerdo do instável. Vou procurar por show space collision. Eu pressionei Enter. Então agora podemos ver toda a colisão em nosso nível, incluindo nossa colisão de cápsula, que você pode ver é o contorno vermelho do nosso personagem. Agora, se eu segurar C e ver que minhas cápsulas ficaram menores, essa é a meia-vida de nossas cápsulas, que é de 40 centímetros. E se eu tentar me mover e ver que meu personagem também está se movendo mais devagar e minha câmera está se movendo para baixo. Agora, tudo isso está acontecendo porque dissemos ao componente movimento que estamos entrando no modo de movimento agachado. Então, agora, se voltarmos para o ThirdPersonCharacter Blueprint e selecionarmos o componente de movimento aqui. E se procurarmos por agachamento e barra de pesquisa aqui, podemos encontrar as outras configurações de agachamento. Portanto, temos a velocidade máxima de caminhada agachada. Agora, é assim que o personagem se move agachado, e esse valor está em centímetros por segundo. Agora também temos uma configuração chamada can walk off ledgers quando se agacha. Se isso decolar, posso mostrar o que isso faz. Vamos jogar, correr até nossa borda aqui. E se eu segurar o assento agachado em C, isso não me permitirá sair da borda enquanto estou agachado. Agora, se tivéssemos que habilitar essa configuração, isso nos permitiria sair das bordas enquanto nos agachamos. Então, em seguida, vamos nos livrar da busca da multidão e continuaremos com as configurações gerais. Agora temos o modo padrão de movimento terrestre e o modo padrão de movimento da água. Agora, modos de movimento ou como dizemos ao componente de movimento quais configurações queremos que ele use. Então, por padrão, quando estamos em terra, estamos dizendo que queremos usar as configurações de caminhada encontradas aqui em baixo. Quando estamos na água, queremos usar as configurações de natação que são encontradas mais abaixo. Agora, quando o componente de movimento estiver no modo natação, ele não começará a usar animações de natação repentinamente. As animações são tratadas separadamente. O que ele faz é dizer ao componente de movimento que queremos usar as configurações de natação em vez de, digamos, as configurações de caminhada. Agora, passando para as configurações de caminhada, temos a altura máxima do degrau. Agora é o quão alto é a vantagem que seu personagem não poderia subir sem ter que pular. Agora, por padrão, são 45 centímetros, mas talvez você tivesse uma escada e o personagem não pudesse simplesmente subir normalmente, você teria que pular. Você pode ter que aumentar esse valor um pouco para permitir que o personagem suba uma altura maior. Em seguida, temos o ângulo do piso caminhável. Agora, este é o quão íngreme de uma ladeira nosso personagem pode subir. Se você quiser que seu personagem suba encostas mais íngremes, você precisa aumentar esse valor. Em seguida, temos nossa velocidade máxima de caminhada. Agora, essa é a velocidade máxima nosso personagem percorrerá enquanto caminha. Então, se quisermos que nosso personagem ande mais rápido, aumentamos esse valor e se quiséssemos que eles andassem mais devagar com diminuição, então temos a velocidade máxima de caminhada para agachado. Já explicamos isso antes. Essa é a velocidade que nosso personagem se moverá agachado. Então temos a velocidade mínima de caminhada analógica. E isso é usado para se você tiver um balde, um gamepad stick. Essa é a velocidade mínima que seu personagem pode atingir com a entrada do stick de entrada. Em seguida, temos a desaceleração da frenagem andando. Agora, essa é a quantidade de força de desaceleração aplicada ao personagem quando você não está mais andando em uma direção. Portanto, quanto maior esse valor, mais rápido seu personagem diminuirá a velocidade. Em seguida, temos a lata de sair das saliências. Se isso for verdade, ele se comporta como R pode andar de livros quando agachado, permite que nosso personagem saia da borda ao caminhar. E se isso for falso, nosso personagem não será capaz de sair dos livros. Agora, rolando para baixo, vamos para as configurações de salto aqui. Agora temos os saltos, a velocidade. Essa é a quantidade de força aplicada quando um personagem realmente pula. Então, se formos definir isso é algo realmente alto, como os anos 2000. E podemos puxar, se apertarmos o play e saltarmos nossos personagens agora pulando muito alto. Agora, voltando ao ThirdPersonCharacter e selecionando o movimento do nosso personagem, temos algumas outras configurações para o nosso salto. Não vou passar por todos eles, mas alguns dos principais são o controle aéreo. Agora, isso é quanto controle sobre a direção que seu personagem está se movendo que o jogador terá, quanto maior esse valor, mais controle ele terá. Agora, descendo, não abordaremos as configurações de rede nesta lição porque elas são muito mais avançadas do que o que esta lição abordará. Mas se continuarmos descendo, você encontrará as configurações de natação. E aqui você pode definir a velocidade máxima de natação. Podemos definir coisas como flutuabilidade. E isso só é relevante se o seu personagem estiver no modo natação. Então nós temos que voar. Novamente. Podemos definir a velocidade máxima do fluxo. Essa é a velocidade que o personagem se moverá enquanto estiver no modo de movimento voador. Agora, descendo para as configurações de rotação do movimento do personagem, você pode ver que temos uma taxa de rotação. Essa é a rapidez com que o personagem girará para ficar de frente para a direção que deveria. Então, se eu fosse definir isso de 500 para 50, e compilarmos e clicarmos em play. Agora, se eu olhar na direção aqui e pressionar W, você pode ver meu personagem girando lentamente nessa direção. Essa configuração é como controlamos. Quão rápido é a rotação do personagem. Agora também temos algumas outras configurações de rotação aqui. Agora temos a rotação orientada para o movimento, que significa que o personagem ficará voltado a direção em que estamos nos movendo. Se desligarmos isso, caímos e apertamos play, e vemos que se eu começar a me mover nessa direção, nosso personagem continua voltado para a frente porque não estamos mais girando para a direção do nosso movimento. Agora, em nosso componente de movimento, também temos outra configuração chamada use controller desired rotation. Agora, se ligarmos isso, nosso personagem ficará voltado para a direção de nossas câmeras. Agora definimos nossa taxa de rotação para 50. Vou aumentar isso de volta para 500. E se compilarmos e clicarmos em Play, você pode ver que agora, sempre que eu mover minha câmera, nosso personagem se voltará para a direção. Agora você pode ver se eu me impediu de sair do meu personagem rapidamente, nosso personagem tem um pouco de atraso. Isso é por causa da velocidade de rotação. Então, podemos diminuir ou aumentar esse valor para fazer nosso personagem girar mais rápido nessa direção. Agora, algo a ter em mente, usamos a rotação desejada do controlador é que não funciona se você também tiver marcado a rotação orientada para o movimento. Se ambos estiverem marcados aqui ou usarem o controlador, rotação desejada não funcionará. Então, essas são a maioria das configurações principais que você ajustará e o componente de movimento do personagem. Mas também podemos ajustá-los no jogo. Então, se quisermos acessar quais são esses valores atualmente, todos os alteram. Sempre podemos arrastar nosso Componente de Movimento de Personagem e podemos pesquisar por um valor específico. Digamos, por exemplo, que estávamos fazendo um sistema de sprint e queremos que ele mude a velocidade máxima de movimento de nossos personagens. Poderíamos pesquisar a velocidade máxima de caminhada definida, e isso nos dá acesso à nossa velocidade máxima de caminhada e à nossa velocidade máxima de caminhada agachada também, onde usamos a velocidade máxima de caminhada. Vou definir a velocidade máxima de caminhada para dizer 1500. E vamos copiar e colar esse nó, conectar o backup do alvo deles ao movimento do nosso personagem aqui. E criaremos uma nova entrada. Então, ele procurará por entrada, depois shift, criará uma entrada de deslocamento para a esquerda. Quando pressionados, queremos que nossa velocidade máxima de caminhada aumente para 1500 e, quando liberada, mudaremos para 600. Então, agora, quando compilamos e eu pressiono Play, se eu andar sem pressionar shift, temos nossa velocidade normal de caminhada. E se eu mantiver a tecla Shift pressionada, você pode ver nosso personagem fica muito mais rápido. Agora voltando para o ThirdPersonCharacter Blueprint, também podemos alterar o modo de movimento ou personagem em que se encontra. Então, novamente, se conseguirmos o movimento do nosso personagem, podemos arrastar e definir o modo de movimento. E podemos usar a função de modo de movimento SAT aqui para alterar o modo de movimento atual do nosso personagem. Assim, podemos configurá-lo para cair ou nadar dependendo do modo de movimento em que queremos que nosso personagem esteja atualmente. Agora, se você se lembra, habilitamos agachamento em nosso componente de movimento, mas você também pode ativar e desativar outros modos de movimento. Então, se rolarmos até o final aqui, deve estar sob o movimento naff. Podemos soltar, clicar no menu suspenso para ver as capacidades de movimento. Então, aqui você pode ver que podemos realmente ativar e desativar todos os diferentes tipos de modos de movimento que seu personagem pode entrar. Agora também podemos acessar se eles estão ou não ativados ou desativados em nosso código. Assim, podemos pesquisar por can crouch, por exemplo. Isso nos permitirá verificar se nosso personagem está agachado atualmente? Agora, usando nossa variável de movimento de personagem, também podemos ajustar qualquer uma de nossas outras configurações. Assim, poderíamos arrastar e procurar conjuntos, usar a rotação desejada do controlador. E podemos ativar ou desativar isso dependendo do que estamos fazendo em nosso código. Também podemos aumentar ou diminuir a taxa de rotação. Assim, podemos pesquisar por rotação, aluguel e podemos definir uma taxa de rotação que queremos usar em vez de ter que defini-la dentro de defini-la dentro nossas configurações de rotação de movimento de personagem aqui. Agora, há configurações que não abordamos nesta lição simplesmente porque existem muitas delas e algumas delas são muito mais avançadas e bastante específicas para determinadas necessidades. Mas você pode encontrar na maioria das categorias e opções avançadas que lhe darão acesso a algumas informações adicionais. E se você quiser saber o que essas variáveis fazem, você sempre pode simplesmente passar o mouse sobre. Isso lhe dá uma boa explicação sobre o que eles fazem. As últimas configurações que vamos abordar estão, na verdade , nos padrões de classe do personagem. Portanto, se clicarmos em padrões de classe e rolarmos para cima aqui, você deve encontrar o controle de uso das opções de rotação, inclinação, guinada e rolagem aqui. Agora, como a configuração de rotação desejada pelo controlador do usuário que temos no movimento do personagem, isso faz com que o personagem fique voltado a direção que a câmera está apontando. Mas a diferença está nessas configurações, se elas estiverem ativadas, o personagem enfrentará essa direção instantaneamente. Isso não leva em consideração a taxa de rotação que temos dentro do nosso Componente de Movimento de Personagem. Se voltarmos para as configurações de rotação, ele ignorará essa taxa de rotação. Se desligarmos a rotação desejada do nosso controlador de uso e voltarmos aos padrões de nossa classe, role para cima. Na verdade, podemos habilitar essas configurações para ver como elas funcionam no jogo. Então, para começar, apenas permitirá a rotação da Europa. Então, isso é lado a lado. Vamos compilar, clicar em Play. Você pode ver agora que quando eu giro minha câmera, o personagem instantaneamente está voltado para essa direção. Agora, normalmente para um personagem baseado no solo como nosso ThirdPersonCharacter aqui, você usaria apenas o, sua opção, mas você pode habilitar as outras configurações nos padrões da classe. Se rolarmos para baixo para encontrá-los, você pode ver que temos pitch and roll. Agora, se ativarmos os dois e clicarmos em Compilar, você verá que quando clicarmos em play, podemos mirar nosso personagem em qualquer direção que nossa câmera esteja voltada. Mas, novamente, normalmente você não usaria essas duas configurações para um personagem baseado no solo como esse. Agora, por fim, como nossas variáveis em nosso componente de movimento de personagem, podemos defini-las usando o código para que possamos clicar com o botão direito do mouse, podemos pesquisar e definir a rotação do controlador. Podemos usar o conjunto, usar o controle de rotação, inclinação, rolo e guinada. E podemos ajustar essas configurações usando o código. Então isso vai ser tudo para esta lição. Abordamos a maioria das configurações mais usadas com o componente Movimento do personagem. Então, espero que agora você entenda como isso funciona e como você pode ajustar como seus personagens se movem. 37. Aulas adicionais (efeitos de áudio): Olá pessoal. Nesta lição, vamos dar uma olhada em como podemos reproduzir sons usando nós Blueprint. Agora, o Unreal Engine Five precisa de sistemas de som. Atualmente, você tem o sistema de sinalização de som e o sistema de som Meta. E ambos os sistemas usam os mesmos nós do Blueprint para realmente reproduzir os sons. E é por isso que vamos dar uma olhada nos dois nesta lição de hoje. Agora, o sistema de som Meta está atualmente na versão beta, o que significa que precisamos habilitá-lo. Então, vamos até a opção de edição, vamos para plugins e vamos pesquisar por matéria. Vamos assumir a opção de metal aqui. Se o seu já está marcado , então isso é ótimo. Você já o ativou. Se não, o que vai continuar, vamos clicar em sim e, em seguida, precisamos reiniciar o motor rapidamente. Agora estou de volta ao motor e habilitei o sistema de som do metrô. Agora ainda podemos usar o sistema de som de fila também. Acabamos de ativar o sistema de metrô também. E o que podemos fazer para garantir que esteja ativado é clicar com o botão direito do mouse no Navegador de conteúdo, aqui podemos ir para a opção de som e garantir que temos a opção de fonte de som Meta aqui. Agora vou explicar a principal diferença entre sinais sonoros, sons de metal e ondas sonoras. Então, o que vamos fazer é ir para a pasta do motor. E se você não tiver isso, você pode ir para Configurações e, em seguida, ir para a categoria de conteúdo e garantir que o conteúdo do mecanismo de exibição esteja marcado. E isso deve mostrar essa pasta aqui. Agora, com a pasta do mecanismo selecionada, vamos adicionar um novo filtro, vai até o som. Vamos encontrar a opção de onda sonora que deve estar aqui embaixo. Vamos assumir isso. E agora estamos vendo todas as ondas sonoras embutidas no motor. Se passarmos o mouse sobre um, podemos realmente jogá-lo. Então, se eu bater, você deve ser capaz de ouvir esse som. E a onda sonora é basicamente o arquivo de som que você obterá ao importar um novo som para o mecanismo. Pense nas ondas sonoras é apenas um arquivo de som básico. Na verdade, ele não tem muitas opções de personalização. Abra uma dessas ondas sonoras agora que nos levam à minha outra tela aqui, você pode ver que temos algumas configurações aqui. Principalmente sob o som é o que você estaria ajustando. Há configurações adicionais, mas não vamos abordá-las nesta lição apenas porque elas são um pouco mais avançadas. Mas você pode fazer coisas como ajustar o tom do volume e também pode ativar ou desativar o loop para essa onda sonora. Mas, além disso, não há uma tonelada de opções aqui para personalizar o som. Agora é aqui que entram os sinais sonoros e o sistema de som Mehta. Por isso, ele fechará nossa onda sonora por enquanto e voltará para o navegador de conteúdo. E vamos nos livrar dos nossos quadris de filtro. Então, removeremos a onda sonora, adicionaremos um novo filtro e procuraremos os sons que surgirem. Então, queremos a opção de sugestão de sons aqui. E agora você pode ver todos os sinais sonoros incorporados ao motor, como as ondas sonoras. Assim, podemos passar o mouse sobre um e tocar no play e ouvir o som, aquela sugestão de som ou tocar. Se clicarmos duas vezes em uma sugestão de som, podemos abrir o editor de sugestão de som. Agora, eu não vou passar por todas as coisas que você pode fazer em um editor de dicas de som porque existem muitas delas. Se você clicar com o botão direito do mouse, verá que há muitos nós diferentes que fazem coisas diferentes para controle de som. Mas, essencialmente, o que uma sugestão sonora faz é pegar um som de onda. Então, se selecionarmos esta nota aqui, você pode ver que ela está realmente representando a onda falhada compilada. E podemos mudar isso se quisermos. E então ele envia esse som para o nó de saída. Qualquer som que conectamos essa saída é o que será reproduzido sempre que tocarmos nossa sugestão de som com falha de compilação. Agora, se quiséssemos, poderíamos ter vários sons de ondas em uma única sugestão de som. E a maneira como podemos fazer isso como se clicássemos com o botão direito do mouse em busca do wave player. Podemos selecionar esse novo nó e definir a nova onda que queremos colocar para que possamos compilar com sucesso. Agora, talvez quiséssemos, toda vez que dissemos a essa sugestão sonora para tocá-la para escolher aleatoriamente entre duas ondas sonoras diferentes. Poderíamos fazer isso apenas arrastando a busca por aleatório. E poderíamos conectar essas duas ondas sonoras nessa carga aleatória e, em seguida, a saída em nosso nó de saída. E agora, toda vez que tocamos esse Q, ele escolhe aleatoriamente um desses sons como esse. Agora há algumas coisas aqui à esquerda. Há o volume multiplicar e multiplicar o tom. E isso afetará todas as ondas que estão neste cubo. Então, em vez de ter que ir para cada onda que nossos usuários da fila, poderíamos apenas controlar o volume e o tom aqui. Agora temos as configurações de atenção. Agora, eu não vou abordar isso em detalhes nesta lição porque eles são um pouco mais avançados. Mas, basicamente, os projetos de configuração de atenção contêm apenas um monte de configurações que controlam a distância que um som viaja e também o quanto o volume do som diminui à distância. Se você quiser ver as configurações incluídas, esse blueprint, você pode usar essa opção aqui. E eu vou te mostrar todas essas configurações. Eu não vou passar por isso porque há muitos deles e eles são bastante complexos. Se você quiser saber mais sobre esses épicos, na verdade , tem uma documentação muito boa sobre atenção sonora. Então, agora abordamos as diferenças básicas entre uma onda sonora e uma sugestão sonora. Agora, as ondas sonoras novamente, são apenas o arquivo de som básico que você importa para o motor. E, em seguida, sinais sonoros. Podemos fazer coisas como pegar ondas sonoras aleatoriamente. Podemos ajustar coisas como o tom através desses nós aqui. Agora, por fim, vou explicar como criamos uma sugestão sonora. Então, o que podemos fazer é se formos para o nosso navegador de conteúdo aqui, eu vou me livrar do meu filtro de sugestão de som apenas clicando com o botão direito do mouse e removendo a sugestão de som. E adicionaremos um novo filtro. E vamos para sons e vamos apenas pegar sons. E isso vai nos mostrar todos os tipos de som. Então, vamos continuar com isso e vamos encontrar ondas sonoras. Então, temos o obturador da câmera aqui. Agora, para criar uma nova sugestão de som, basta clicar com o botão direito do mouse em uma onda sonora. E aqui, você pode subir para criar um cubo e clicar nele, e isso nos criará uma nova sugestão de som. Se abrirmos essa nova sugestão de som, você verá, se eu a trouxer para a tela. Você pode ver que ele realmente tem uma onda do obturador da câmera. E foi nisso que clicamos com o no Navegador de conteúdo. E ele se conecta à nossa saída para nós dentro do nosso novo obturador da câmera q. Você também pode criar sinais sonoros. Se formos até a pasta Personagens aqui, vou me livrar desses filtros, basta clicar com o botão direito e remover todos os filtros. Em seguida, também podemos criar sinais sonoros clicando com o botão direito do mouse. E aqui vá para o som e você pode encontrar a sugestão de som. E o que isso fará é criar uma sugestão de som vazia para nós. Então, se abrirmos isso, você verá que na verdade não há entrada aqui porque não dissemos qual onda queremos que ele use. E se você quiser adicionar uma onda, basta clicar com o botão direito do mouse e pesquisar por wave, wave player. E você pode definir uma sugestão de som aqui e conectá-la à saída. Então, em seguida, vamos passar para o sistema de som de metal. E o sistema de som de metal apenas substitui o sistema de sinalização sonora. Então, se formos para o navegador de conteúdo, vou clicar com o botão direito do mouse em sons e vamos criar uma nova fonte de som metro. Agora, isso é o equivalente à nossa sugestão de som aqui. Então, o que faremos é criar uma nova fonte sonora de medida. Vamos chamar esse novo som assim, e vamos abrir isso. Então, agora temos uma nova interface de usuário. É parecido com o nosso sistema de filas, mas tem algumas diferenças. Primeiro, temos uma entrada aqui, e esse tipo de trabalho como pendências de execução fazem dentro de plantas. Isso será executado quando o som do metrô for instruído a tocar. E então terminamos. Então, queremos executar isso assim que terminarmos de executar nosso código e, em seguida, temos essa saída e é isso que conectamos para o nosso som. Agora, atualmente diz nosso tomate, porque nossa configuração para nosso som Meta é na verdade definida como mono. Se você quiser mudar isso, o que normalmente você provavelmente faz, você deseja clicar neste menu suspenso e selecionar estéreo. E agora você pode ver que temos uma opção para nossas saídas esquerda e direita. Agora, ao contrário do sistema de sinalização sonora, não vou entrar em detalhes com esse sistema, porque se você clicar com o botão direito, verá que há muitas e muitas funções. É um sistema muito grande. Mas o que faremos é criar um novo plano Wave. Então, se você clicar com o botão direito do mouse e procurar por Wave Claire, podemos usar esse nó para reproduzir nossos sons de onda. Você pode ver que temos entradas de reprodução e parada. E, novamente, eles funcionam como entradas de execução em um nó de blueprint. Foi assim que seguramos essa nota para tocar um som ou parar de tocar um som. Podemos definir uma onda de ativos. Então é aqui que definimos nosso som de onda que queremos que ele toque. Para que pudéssemos escolher, digamos, um arquivo compilado. Podemos definir uma hora de início. Então, se quiséssemos, poderíamos iniciar o som em um horário diferente de 0. Podemos mudar o tom. Podemos configurá-lo para loop. Podemos definir a hora em que o loop começa. E podemos definir quantas vezes ou por quanto tempo, desculpe, o loop vai. Loop para. duração do loop é definida como menos um. Isso significa apenas que se a flauta estiver marcada, ela fará um loop para sempre. Agora, esse nó tem muitas saídas e não vamos cobrir todas elas, mas abordaremos como realmente tocar esse som. Então, a partir de nossa opinião, queremos executar nossa peça em nossa onda Claire, é isso que diz a ela para começar a tocar um som. E então, a partir de nossas saídas, queremos , eu terminei, e vamos conectar isso ao nosso som de metal acabado aqui. Isso é o que diz a eles em um som que nossa onda terminou de tocar. Então temos essa tomada e imediatamente, e vamos conectá-las às nossas saídas aqui. Para o nosso som de metal. É isso que fornece uma saída de áudio esquerda e direita para o nosso som. Então, agora, se apertarmos o play, devemos ouvir um som. Agora, a diferença com os metazoários é que temos esses pinos de execução nos nós. E aqui, o que poderíamos fazer em vez de apenas executar o nó de saída inacabado, é se quiséssemos, poderíamos ter vários sons reproduzidos um após o outro. Assim, podemos copiar nosso player de ondas aqui, colá-lo aqui embaixo. Agora, quando nosso primeiro som terminar, talvez queiramos tocar outro som para que possamos conectar esse pino acabado com muita educação. Nós inserimos um novo som ou o configuramos para dizer sucesso na compilação. Mas agora queremos conectar nossa esquerda e nossas partes a esses pinos de saída que possamos realmente ouvir o som. Mas se os substituirmos, você pode ver que isso desconecta nossos primeiros. Então, o que precisamos agora é de um mixer. Então, clicaremos com o botão direito e procuraremos por mixer. Você vê que temos muitas mixagens diferentes, dependendo de quantas entradas ele tem, vamos usar um mixer estéreo. Então, vamos fazer mixagem estéreo ou duas. Isso significa que podemos conectar nossa esquerda e nossa direita daqui, e nossa esquerda e nossa direita a partir daqui. E isso nos dará apenas uma saída para a esquerda, para a direita. Então, a partir do nosso final , nosso gráfico de segunda onda conectará isso à saída. Então, agora o que vai acontecer é quando dissermos ao nosso remédio para jogar, ele vai jogar são compilados, falharam. Assim que terminar de jogar, ele será um sucesso compilado. E ele emitirá o áudio esquerdo e direito de ambos os nós o mixer e, em seguida, emitirá o resultado para o nosso som de metal. E podemos testar isso apenas apertando Play. Você pode ver os dois sons serem reproduzidos um após o outro. Então esse é apenas um exemplo simples das coisas que você pode fazer com o novo sistema de som metro. Agora, existem algumas outras configurações. Se formos para as configurações de origem aqui, você pode ver que podemos definir uma configuração de atenção exatamente como nossas dicas de som. E, novamente, este é o modelo que controla a distância em que o som pode ser ouvido e quanto o volume do som diminui ao longo da distância. Então, a seguir, vou mostrar a vocês como podemos tocar todos esses diferentes tipos de som usando plantas. Então, o que faremos é ir para o nosso ThirdPersonCharacter, voltar para nossa pasta de conteúdo aqui. Vou apenas esconder a pasta de conteúdo do nosso mecanismo. Iremos para a pasta da terceira pessoa, abriremos os projetos e acessaremos o ThirdPersonCharacter. E se você ainda não percebeu, eu criei um novo projeto em terceira pessoa a partir de nossos últimos projetos, então temos um novo começo aqui. Então, agora vamos apenas criar um exemplo de como podemos tocar alguns sons. Então, vou adicionar o nó de jogo se arrastará disso e fará um cronômetro por eventos. Do cafetão do evento. Vamos criar um evento personalizado. Vamos chamar isso de som de M. E arrumar isso rapidamente. E eu vou fazer esse loop, digamos a cada dois segundos e nós vamos fazer o loop também. Então, agora há quatro nós principais para reproduzir sons. Se nos arrastarmos do nosso evento sonoro aqui e a pesquisa reproduzirá o som. E você vê que temos que reproduzir som, 2D e reproduzir som no local. A diferença entre eles é reproduzir som. Um 2D é realmente útil para coisas como sons de interface do usuário. Ele simplesmente reproduz no computador dos jogadores locais. Ele não reproduz o som em um local específico do mundo. Depois, temos que reproduzir som no local, que reproduz um som em um local específico no mundo. Então, vamos começar com o local na terça. Aqui você pode ver que podemos definir um som. Na verdade, isso pode ser uma onda sonora, uma sugestão sonora ou um som de metal. Então, se procurarmos nosso assunto, você pode ver que podemos configurá-lo para o nosso novo som de mascarador. Podemos definir a fila de som agudo ou podemos definir uma onda sonora. Agora, é uma boa prática usar sinais sonoros ou sons meta puramente porque você só tem mais controle sobre como eles são executados. Mas, por enquanto, vou usar nossos novos sons Meta. Então, eu procurei por um novo som de metrô e vamos selecioná-lo novamente. Você pode selecionar um Q se quiser. Ele funcionaria exatamente da mesma forma que nosso som de metrô. Ele será compilado e tocará em play. E devemos ouvir esse som tocar. E está pagando esses dois sons. Porque se você se lembra, em nosso som de metal, nós acorrentamos esses dois sons juntos. Agora, voltando ao nosso ThirdPersonCharacter, clicaremos neste pequeno menu suspenso aqui e ele nos dará algumas configurações que podemos usar para controlar esse som que está sendo reproduzido. Podemos alterar o volume e o tom. Podemos definir uma hora de início. Então, talvez você tivesse um som muito longo e quisesse que começasse em cinco segundos, você poderia colocar cinco aqui, e esse é o momento em você poderia colocar cinco aqui, que o som pararia de tocar. Temos configurações de simultaneidade. Agora, isso é mais ou menos como o plano de atenção. Mas esse tipo de projeto contém as configurações de quantos desses sons podem ser reproduzidos ao mesmo tempo. Eu não vou entrar nisso nesta lição porque é um pouco mais avançado, mas é para isso que é usado e é o mesmo para possuir ator aqui, ambos são usados para simultaneidade. Mas, por enquanto, podemos deixá-los em branco e nosso som tocará muito bem. Então, a seguir, vamos dar uma olhada no local do som de reprodução agora. Então, vamos nos livrar da nossa casa na terça. Basta compilar, arrastar para fora do nosso som aqui e procurar o som de Platão em. Não tocaremos som no local. Agora, esse nó terá algumas opções extras. Então, podemos dizer som. Desta vez, escolheremos, digamos, fila do obturador das câmeras, por exemplo. Podemos dizer localização. Então, vou usar a localização de nossos personagens. Então, usamos a localização do ator. Conecte-o ao pino de localização. E se compilarmos, devemos ouvir esse som tocar cada dois segundos. Exatamente assim. Se voltarmos ao nosso projeto de terceira pessoa, se clicarmos na seta para baixo aqui, você verá que temos algumas novas opções, bem como algumas das mesmas do nó anterior. Podemos definir uma rotação, se quisermos. Também podemos alterar o tom do volume e os horários de início como antes. Mas agora temos uma opção para a configuração de atenção. Agora, se você deixar isso em branco, ele usará a configuração de atenção que você definiu dentro do cubo. Então, se você se lembra disso definido aqui, agora, isso é como uma opção de substituição. Então, talvez desta vez, quando você toca o som, você queira usar diferentes configurações de distância para saber até que ponto o som pode ser ouvido. Então, isso é como uma configuração de substituição. Normalmente, se você estiver usando a atuação de som, você deseja realmente defini-los dentro das dicas de som, em oposição aos nós aqui. Então, como antes, temos as configurações de simultaneidade e os pinos de nosso ator proprietário aqui também. Agora, ambos os nós que estamos usando até agora, acabei de ser colocado em nós e eles são ótimos para apenas tocar um som e esquecê-lo. Mas podemos querer reproduzir um som e pausar esse som ou lúpus ou reproduzi-lo. Então, há alguns outros nós que podemos usar para isso, se nos arrastarmos para fora do nosso som agora e procurarmos por som de spawn em C, que temos som de spawn 2D, som spawn no local e som de spawn anexado. Agora eu não vou cobrir o som 2D do spawn porque é basicamente o mesmo que nossa nota 2D anterior. Mas o que faremos é usar o local da sonda de desova. Agora, se criarmos isso, você pode ver que temos todas as mesmas opções que tínhamos antes, além de termos uma nova chamada destruição automática. O que isso significa é que, quando o som que definimos terminar de tocar, ele destruirá automaticamente esse componente de som. Então, dependendo do que você está planejando fazer com esses sons, você pode querer desligá-lo. Talvez você planeje repeti-lo ou pausá-lo e depois reproduzi-lo novamente mais tarde. Você provavelmente gostaria de desligar essa configuração. Agora você pode ver que também temos uma saída, e esta é uma saída de componente de áudio, e é isso que podemos usar para controlar o som deles. Então, se nos arrastarmos, podemos promover isso para uma variável. Assim, podemos selecionar a opção promotes Variable que criará uma nova variável chamada componente de áudio. E podemos definir um nome. Então, vamos configurá-lo para dizer um componente de som como esse. E agora, usando essa variável de componente de som, podemos chamar várias funções diferentes para realmente controlar o som que definimos. Então, se obtivermos nossa variável de componente de som aqui, arrastamos, podemos fazer coisas como pausar nós mesmos para que possamos pesquisar por Definir pausa. E podemos definir se o som está pausado ou não ou se queremos alterar o volume do nosso som, podemos arrastar para fora e definir o volume. Poderíamos alterar o volume, multiplicar usando esse nó. E quando terminarmos com nosso componente de som, talvez quiséssemos destruí-lo. Podemos simplesmente arrastar a busca por destruir, e podemos usar o nó do componente destruir aqui. Agora, na verdade, existem algumas configurações que podemos usar com nosso componente de som. Se você arrastar e pesquisar áudio, poderá encontrar todas as funções relacionadas ao áudio que podem ser usadas com nosso componente de som. Agora, o próximo nó que abordaremos é o som anexado ao nó. Então, se excluirmos esse código por enquanto, vamos movê-lo um pouco para que tenhamos um pouco mais de espaço. Vamos sair do nosso evento sonoro e procuraremos o som do spawn. E queremos a nota anexada ao som do spawn aqui. Agora, em vez de um local, ele realmente nos dá um componente qual podemos nos conectar. Isso é útil para coisas como talvez você tivesse um carro, se você tivesse um ruído no motor do carro, você realmente gostaria que ele seguisse o carro. Então você gostaria de anexar esse som a um componente. Poderíamos anexá-lo para dizer, o componente de malha do nosso personagem aqui. Poderíamos conectar isso e agora o som seguirá junto com nosso componente de malha. E, claro, podemos definir nosso som que possamos definir isso para ser o clique no botão Q aqui. Agora, se clicarmos na seta para baixo aqui em nosso nó anexado ao spawn realmente nos dará algumas novas opções. Eu só vou mover isso para cima. Então, temos um pouco mais de espaçador. Também podemos configurar um soquete para conectar nosso som. Então, se nossa malha tivesse dito, um soquete em sua cabeça, podemos definir o nome do soquete aqui e eu soaria realmente conectado a esse soquete e seguiria junto com nossa malha. Em seguida, temos as configurações de localização e rotação. Agora, eles fazem algo diferente, dependendo da configuração do tipo de local aqui. Então, se isso for definido para manter o deslocamento relativo, diríamos que defina nosso valor Z como 50. Bem, atualmente nosso som está ligado à nossa malha. Então, se formos para a nossa janela de visualização, localização das malhas é bem aqui e este ponto de articulação. Então, como adicionamos 15, o som z r seria anexado à malha, mas seria mais ou menos essa altura, 50 centímetros acima da localização da malha. Em seguida, se voltarmos ao nosso nó, temos a opção de manter a posição girada. Agora, se eu deixasse isso em dizer, zeros são 0, o som r surgiria no centro do mundo e depois seria anexado à nossa malha de caracteres. Agora, dependendo de quão longe nossa malha de personagens estava do centro do mundo, segura, por exemplo, estava 500 centímetros na direção x. O som sempre ficava 500 centímetros na direção x do nosso personagem, mas ainda assim acompanhava nosso personagem à medida que se movia. Então, por fim, temos as duas opções de encaixe. Agora, há dois desses. Não importa qual você seleciona para sons. Então, encaixado no alvo significará apenas que o som está ligado às raízes das malhas. Então, aqui mesmo em nossa malha, outra nova configuração que esse nó tem é a parada quando anexado ao destruído. E isso basicamente significa que nosso som, se estiver marcado, pararemos de tocar quando nossa malha for destruída. Se estiver marcado, o som r continuará sendo reproduzido mesmo se a malha for destruída. Em seguida, abaixo disso, acabamos de obter todas as mesmas configurações que tínhamos para nossos nós anteriores quais eu já passei. E, claro, temos um nó de saída do componente de áudio. E podemos definir nossa variável de componente de áudio que criamos anteriormente. E podemos usar todas essas mesmas funções que acabei de mostrar com essa variável de componente de som. Agora também podemos adicionar componentes de áudio às plantas. Então, se formos para o painel Componentes e procuramos por áudio, você pode ver que ele realmente diz Áudio e, em seguida entre parênteses sugestão do obturador da câmera. Para mim, a razão pela qual está fazendo isso é que, se eu for para o Navegador de conteúdo, eu realmente selecionei isso. Então, se eu desmarcar isso, voltamos ao nosso componente aqui e procuro por áudio. Devemos apenas ver o nome do áudio para que possamos clicar nele. Isso cria um novo componente de áudio. E esse componente é anexado ao nosso personagem automaticamente. E no painel Detalhes, você pode definir todas as coisas que dissemos nesses nós antes, podemos definir o som que queremos usar. E isso pode ser uma onda, uma fila ou um som de metal. Para que pudéssemos escolher nosso novo som de metrô. E isso funcionará muito bem com nossos novos componentes de áudio. Podemos definir coisas como o volume, o tom, podemos ajustar as configurações de atuação. E podemos controlar esse componente de áudio da mesma forma que controlamos nosso componente de áudio aqui em baixo. Podemos nos arrastar para fora, podemos pausar, por exemplo. Podemos removê-lo se quisermos. Poderíamos usar uma destruição. E ele se comporta exatamente da mesma forma nossa variável de componente de som que usamos anteriormente. Agora podemos testar esse componente de áudio. Vou apenas desconectar esse código aqui para que ele não reproduza nada. E se compilarmos e clicarmos em Play, você verá nosso som de áudio tocar no Stan Lee porque esse componente faz parte do nosso personagem. Agora, talvez você não queira que o som seja reproduzido instantaneamente, você queira reproduzi-lo mais tarde, o que poderíamos fazer é voltar ao nosso ThirdPersonCharacter, selecionar nosso componente de áudio, rolar para baixo até o auto ative e marque isso. Agora, quando compilamos e apertamos play, nosso som não toca. Mas poderíamos adicionar algum código para ativar esse componente. Para que pudéssemos clicar com o botão direito do mouse em pesquisar Podemos pesquisar, digamos, o evento de entrada um. E quando pressiono um dos meus teclados, quero ativar meus sons para que possamos arrastar o componente de áudio e ativar e usar a nota de ativação aqui. Conecte isso ao nosso prensado. E agora podemos compilar e clicar em play. E quando eu pressiono um, o som toca. Agora eu posso reativar isso toda vez que eu quiser apenas pressionando um. Isso abrange praticamente as principais maneiras pelas quais você pode reproduzir sons usando projetos. Agora também podemos reproduzir sons dentro de animações. Então, o que faremos é tirar X do editor do plano. Vou voltar para a pasta de conteúdo aqui, para a pasta personagens, depois para os manequins e depois para as animações. Quinn, vamos abrir uma corrida para a animação aqui. E aqui você pode ver que temos uma barra notificada. Agora, as notificações são basicamente partes do código que podem ser executadas em um momento específico em uma animação. Então, se clicarmos com o botão direito do mouse em nossa barra de notificação, podemos adicionar um novo notificado e há alguns embutidos aqui, mas vamos usar o som de reprodução. Se adicionarmos isso, podemos arrastar isso para qualquer ponto que quisermos na animação, digamos aqui. E agora, sempre que a animação começar a tocar, neste momento, ela tocará o som que sentamos. E aqui no painel Detalhes é onde podemos nos definir. Então isso pode ser novamente, um som de onda, sugestão de som ou os novos sons do medidor. Assim, podemos selecionar essa célula para o obturador da câmera, ou podemos configurá-la para o nosso novo som de metrô. E isso vai funcionar bem. Também temos configurações para coisas como tom de volume, e podemos ativar se o som segue ou não a malha. Isso pode ser muito importante se você estiver fazendo um som que deseja acompanhar junto com o personagem, você gostaria de continuar. Agora, quando nos arrastamos para o nosso som do metrô aqui, vamos ver. Vou tocar sempre que a animação atingir esse ponto. Também podemos adicionar vários sons, notificar para que possamos clicar com o botão direito do mouse e outro clique em reproduzir som. E agora temos um lugar adicional e notificamos. Podemos adicionar um som totalmente diferente, digamos que a câmera disparou de forma aguda. Então, agora, quando chegamos a esse ponto, tivemos aquela câmera filmada em jogo. E então, quando chegamos a esse ponto, são feitos para tocar sons. Então, agora estamos realmente prontos para testar isso no jogo. Vamos até o nosso mapa e clicamos em play. Então, agora, quando eu corro para frente, devemos ouvir nossos sons tocando na hora da animação em que ficamos sentados lá. Então, isso vai ser praticamente tudo para esta lição. Espero que agora você entenda um pouco mais sobre como podemos reproduzir sons e o mecanismo usando projetos e também notificações de animação. Apenas como uma nota lateral, você pode estar se perguntando se deve usar sinais sonoros ou sons metta. Isso vai depender de quando você estiver assistindo a este vídeo. Atualmente, os sons de metal estão em beta, e é por isso que temos que ir ao menu de plugins e ativá-lo. Mas se você está assistindo a esta lição e ela não diz mais Beta ao lado do plugin de sons de metal, você provavelmente deveria estar usando o sistema de som metro. 38. Aulas adicionais (efeitos de partículas): Olá pessoal. Nesta lição aprenderemos como gerar efeitos de partículas do Niágara usando plantas. Então, antes de começarmos para aqueles que estavam acompanhando na lição anterior, eu criei um novo modelo de terceira pessoa, só para que tenhamos um novo começo para esta lição. Agora, o modelo de terceira pessoa não inclui nenhum efeito de partícula do Niágara para usarmos. Então, vamos usar um gratuito do mercado. Eu vou usar o pacote Niagara footstep VFX do estúdio side arm é totalmente gratuito, então você pode simplesmente pegá-lo no mercado, selecionar Adicionar ao projeto e, em seguida, selecionar seu projeto e ele irá faça o download automático de tudo para você. Assim que terminar o download, você deve encontrar uma nova pasta e seu navegador de conteúdo para onde possamos acessar. E aqui estarão todos os efeitos de partículas que acabamos de baixar. Então, vamos para a pasta Niagara Effects e vamos para sistemas de partículas. E aqui você pode ver que temos todos os nossos efeitos de partículas de Niágara. Agora podemos selecionar um desses para dar uma olhada mais de perto. Vou abrir a sujeira , por exemplo. E eu vou trazer isso da minha outra tela. Pode demorar um pouco para compilar, então deixe fazer isso antes que possamos ver uma prévia. Agora o meu terminou de compilar. Se eu ampliar um pouco, você pode ver que temos uma partícula de sujeira perfeita tocando aqui. Agora, não vamos cobrir o Editor do Niágara nesta lição simplesmente porque é um sistema enorme que poderia ter um curso inteiro focado apenas nele. Mas o que faremos é usar esses novos efeitos que importamos para o nosso projeto e os geraremos durante o jogo. Então, vamos começar indo para o personagem em terceira pessoa. Então, vamos para nossa pasta de terceira pessoa, depois blueprints do ThirdPersonCharacter e inherit, que vai configurar um cronômetro em Begin Play para gerar nosso efeito de partícula. Então vamos clicar com o botão direito. Então, esqueça de começar a jogar. Arraste para fora daqui e faremos o cronômetro por eles. Vamos arrastar para fora do pino do evento e procurar um evento personalizado. E vamos chamar esse efeito de desova assim. E vamos configurá-lo para aparecer a cada 1 segundo. E queremos que isso dê um loop. Então eu vou enfrentar o looper. Agora, existem alguns nós diferentes que podem gerar efeitos de partículas do Niágara. Vamos nos concentrar nos dois principais desta lição. Então, se nos arrastarmos do efeito spawn e procurarmos pelo sistema de spawn, você pode ver que temos quatro nós, mas vamos dar uma olhada no sistema de spawn no local e no sistema de spawn anexado. Agora, a diferença entre esses dois, observe que o sistema de spawn no local apenas gerará nosso efeito em um determinado local e ele permanecerá lá. Enquanto o sistema de desova anexado, podemos usá-lo para anexar nosso efeito de partícula a algo. E se isso se mover, seguirá junto com esse objeto. Então, começaremos com o sistema de spawn na nota de localização e criaremos. Agora, começando do topo, temos o modelo do sistema. Esse é o efeito Niagara que vamos gerar usando esse nó. Então, podemos clicar aqui. Você pode ver que eu tenho todos os meus efeitos do nosso pacote de ativos passo a passo. Assim, podemos selecionar um desses. Vou selecionar, digamos, o efeito grama aqui. E isso significa que agora, quando executarmos esse nó, ele gerará o efeito de partícula de grama. Ele pode querer compilar alguns shaders, apenas deixe fazer isso. Em seguida, temos a localização. Agora, este é o local em que nosso efeito de partícula será gerado. Nós temos a rotação, esta é a rotação, será gerada isso. E então temos a escala também. Agora temos a destruição automática. Agora, o que isso fará é destruir nosso componente de efeito de partícula quando terminar de reproduzir seu efeito de partícula. Então, normalmente, você provavelmente gostaria de ter isso ativado. Também temos a ativação automática, o que basicamente significa que, quando geramos o efeito de partícula, ele começará a ser reproduzido automaticamente. E temos o método de agrupamento. Agora, o pool é quando o motor basicamente armazena uma carga de efeitos de partículas desativadas. E então, quando dizemos para gerar um efeito de partícula, em vez de criar um novo, ele pode reutilizar um desativado. Agora, para este exemplo, que pode deixar isso como nenhum. Então, agora vamos gerar nosso efeito de partícula nos locais de nossos personagens. Então, vamos conseguir a localização do ator. E vamos conectar isso diretamente à nossa variável de localização aqui. Vou deixar a rotação e a escala como estão. Agora podemos compilar e experimentar isso. Então, vamos apertar play. E se olharmos para o centro de nossos personagens aqui porque essa é a localização do ator de nossos personagens, você pode ver que temos um efeito de partícula tocando a cada 1 segundo. Agora, se eu começar a me mover, você verá que os efeitos das partículas permanecem onde estavam quando foram gerados. Na verdade, não está ligado ao nosso caráter. Então, o que podemos fazer agora é dar uma olhada no nó anexado. Em vez disso. Isso excluirá nosso sistema de spawn no local. E vamos sair do efeito de spawn e procurar pelo sistema de spawn. Queremos usar o sistema de spawn anexado. Agora, isso tem muitas das mesmas configurações do nosso nó anterior, mas na verdade também tem algumas novas. Então, começando do início, podemos definir nosso efeito Niagara e o modelo do sistema. Podemos escolher um diferente desta vez, talvez as folhas. Também podemos fornecer um componente anexado. Agora, isso é o que nos permite especificar a qual componente queremos anexar nosso efeito de partícula. Poderíamos pegar o componente de malha aqui, e podemos conectá-lo diretamente aos dois componentes conectados. Isso fará com que nosso efeito de partícula seja anexado ao nosso componente de malha. Agora, se nosso componente de malha tivesse soquetes, poderíamos especificar o nome do soquete aqui e isso faria com que os efeitos das partículas fossem anexados a esse soquete. Agora temos a localização e a rotação. Eles farão algo diferente, dependendo do tipo de local definido. Se estiver configurado para manter o deslocamento relativo, então se formos para a janela de visualização, se formos definir esse valor, digamos 250 no Z, o que aconteceria é que nossos efeitos de partículas seriam gerados no 0 localização da nossa malha. Então esse é o ponto aqui em que o pivô está. Isso adicionaria 50% à sua altura. Portanto, ele ainda estaria preso à malha, mas estaria 50 acima do ponto de articulação da malha. Em seguida, é a opção manter a posição girada. Então, se mudarmos isso para a configuração de posição do teclado, o que acontecerá agora é qualquer local que definirmos aqui é onde os efeitos de partículas serão gerados. E então nós o prendemos à malha. Então, se seus personagens disserem 500 centímetros de distância do centro do mundo, então o efeito de partícula seria anexado ao personagem a 500 centímetros de distância. E manteria essa distância de 500 centímetros do personagem ao qual está ligado. Por último, temos o encaixe para mirar. Agora, isso fará com que o efeito de partícula se encaixe no que quer que estejamos anexando. Portanto, se o estivermos anexando à nossa malha, ele será anexado diretamente ao seu ponto de articulação aqui. Então, para este exemplo, vamos manter nosso conjunto para encaixar no alvo para que nosso efeito de partícula apareça exatamente em nossa malha de personagem. E depois disso, acabamos as mesmas configurações que tínhamos antes. Temos destruição automática, uma ativação automática e, em seguida temos o método de agrupamento também. Eu vou assumir também destruído porque eu realmente quero meu efeito de partícula destrua depois que terminar de jogar. Então, agora podemos testar isso novamente. Podemos apertar play e você pode ver que nosso efeito de partícula está sendo reproduzido em nosso local de malha agora, vez de no centro de nosso personagem. Agora, você pode querer controlar qual efeito de partícula será qual efeito de partícula reproduzido, dependendo de uma variável. Então, o que podemos fazer é voltar ao nosso personagem de terceira pessoa aqui, e vamos criar uma nova variável que podemos conectar ao nosso modelo de sistema para dizer ao nó que tipo de efeitos que queremos jogar. Então, vamos criar uma nova variável, vou chamar de efeito de mina. Podemos mudar o tipo de variável para o sistema Niagara. Queremos referência de objeto do sistema Niagara, então vamos compilar e agora na classe padrão. Então você pode ver que podemos selecionar qualquer um dos nossos efeitos de Niágara. Eu posso escolher, digamos, gelo, por exemplo. Em seguida, basta arrastar isso e conectá-lo ao nosso modelo de sistema e compilá-lo antes de testar novamente, vamos deixar os sombreadores terminarem de compilar. Agora isso acabou. Então, podemos clicar em Play. Você pode ver que agora podemos ver nosso efeito de partícula de gelo tocando em vez de nossas folhas. Agora, todos os efeitos de partículas que estamos usando são bem curtos, mas talvez no futuro você esteja trabalhando com um que toca por um longo tempo em um determinado ponto, talvez você queira destruí-lo para qualquer coisa razão. Bem, você pode fazer isso também. Se voltarmos para ThirdPersonCharacter, teremos uma saída aqui, e este é um componente do sistema de partículas Niagara. E isso nos permite controlar o que queremos que esse sistema de partículas faça depois de gerá-lo. Assim, podemos arrastar, podemos usar a opção Variável do promotor que apenas criará uma nova variável com o tipo de componente do sistema de partículas Niagara, como você pode ver aqui, vou chamar meu e efeito gerado assim. E vamos compilar. Em seguida, usando essa variável, podemos acessar algumas funções úteis. Então, se eu obtiver a variável, podemos arrastar e usar a pausa. Podemos usar o posto fixo. E isso nos permite pausar o efeito de partícula ou refazê-lo dependendo de quais valores booleanos você sentou na nota aqui, podemos saber se é ou não portas atualmente. Portanto, podemos fazer uma pausa porque esses relatórios farão uma pausa e isso retornará se o efeito da partícula está ou não pausado no momento. E então, se quisermos destruir os efeitos das partículas, podemos simplesmente arrastar a busca por Destruir. Podemos usar o nó do componente destroy aqui. Agora também podemos adicionar efeitos de partículas como componentes em vez de gerá-los com um nó. Então, se eu disser que queria adicionar um efeito de partícula à minha malha aqui, eu poderia ir para adicionar a pesquisa por Niagara. Poderíamos adicionar um componente do sistema de partículas Niagara a ele. Com esse sistema de partículas selecionado, você pode ver aqui, podemos definir um sistema de partículas que queremos usar. Então, digamos o cascalho, por exemplo, se formos para a nossa janela de visualização em C que quando eu entrei na vista, mas isso nos deu uma prévia rápida. Mas podemos definir o local e ele realmente nos mostra como será quando estiver tocando naquele local. Isso se comportará da mesma forma que um efeito de partícula anexado. Então, isso está anexado agora ao nosso componente de malha. Então, onde quer que eu vá para o componente de malha, nosso efeito de partícula seguirá. E também podemos usar esse componente da mesma forma em nosso gráfico de eventos. Então, se obtivermos nosso componente Niagara, podemos conectá-lo, digamos, ao componente destruído. Se quiséssemos destruir esse componente. Também podemos usar os nós de poros que acabei mostrar com nosso componente Niagara também. Agora, outra maneira de gerar efeitos de partículas usando o sistema de animação. Então, se formos para uma animação agora, eu vou para personagens, manequins do que duas animações. E vamos para a pasta Quinn porque é isso que nosso personagem é. E vamos abrir a animação de Rumford aqui. Agora, inspire, podemos adicionar notificações que são como pedaços de código que são executados em um determinado ponto de uma animação. Isso nos permite reproduzir sons ou efeitos de partículas enquanto nossa animação está sendo reproduzida no momento exato em que queremos reproduzir uma partícula ou um efeito sonoro. Então, o que podemos fazer é mouse em nossa linha do tempo de notificação aqui. Vá para Adicionar notificado e você verá que temos algumas notificações incorporadas aqui. Agora vamos usar o efeito de partícula de jogo Niagara. Então, vamos selecionar isso e isso nos cria um novo efeito de partícula notificado. E podemos arrastar isso para que ele seja reproduzido a qualquer hora que quisermos durante a animação. Então eu poderia colocar o meu em 40, digamos, aqui. Com isso notifica selecionado. Você pode ver aqui que podemos definir qualquer sistema Niagara. Então eu poderia definir isso para ser, digamos, nosso efeito de partícula. Agora, se formos à nossa notificação aqui, você deve ver um par de efeitos de partículas de sujeira. Agora, se o seu não fizer isso, você pode receber um pequeno pop-up dizendo que está compilando shaders, apenas permita que ele termine de fazer isso e então você verá seus efeitos de partículas funcionarem assim. Agora, atualmente, o efeito de partícula reproduz a raiz do personagem, que está bem aqui embaixo. Mas se quiséssemos, poderíamos definir um local diferente. Então, poderíamos usar o deslocamento de localização aqui para adicionar, digamos, um 50 e a altura. Então, agora, quando tocamos os efeitos de partículas, você pode ver que é mais até os joelhos do personagem. Agora. Também podemos definir o deslocamento de rotação, que é a rotação dos efeitos das partículas. E também podemos definir a escala. Também podemos anexar o efeito de partícula a um encaixe ou a um osso. Por exemplo, se eu quisesse que meu efeito de partícula de sujeira se fixasse na cabeça, poderíamos definir o quadril do osso da cabeça, selecionar a cabeça. E vou definir o deslocamento de localização para 0 e z. Então, agora, quando executarmos o efeito de partícula, você verá que o efeito de partícula agora está sendo executado no local do osso da cabeça. Também podemos adicionar vários efeitos de partículas. Se quiséssemos, poderíamos clicar com o botão direito do mouse em Adicionar, notificá-lo e adicionar outra notificação do Niagara. E aqui podemos definir isso para outro local. Podemos definir um efeito de partícula diferente para salvar os efeitos das partículas de gelo. E podemos fazer com que os dois sejam reproduzidos nesta animação e ver que ela está sendo reproduzida aqui embaixo. Agora, apenas uma dica rápida ao trabalhar com notificações. Se você tiver apenas uma barra aqui, ela pode ficar bem entupida se você tiver muitas notificações e uma animação. Então, o que você pode fazer é clicar no menu suspenso aqui para adicionar a faixa de notificação. Não apenas fornece uma nova faixa de notificação à qual você pode adicionar notificações como outro efeito de partícula, por exemplo. E funcionará exatamente da mesma forma que adicioná-los à primeira faixa. Isso só ajuda você a organizá-los um pouco melhor. Então, agora temos todos esses efeitos poderosos em nossa animação. Na verdade, podemos verificar se eles estão jogando no jogo. Então, o que faremos é salvar, voltaremos ao nosso personagem de terceira pessoa aqui. E, na verdade, vou excluir o componente Niagara que acabamos adicionar e vamos desconectar. Eu começo a jogar nó. Então, agora nosso ThirdPersonCharacter não está gerando nenhum efeito de partícula. E podemos testar isso e jogar. Então, agora, quando clicamos em play, devemos ser capazes de correr e ver os efeitos de partículas que adicionamos à nossa animação. Você pode ver que os outros efeitos de partículas estão sendo reproduzidos e nossos efeitos de partículas ICER também estão sendo reproduzidos. Um pouco difícil de ver, mas você pode ver isso correndo lá aos pés. Essa é apenas uma visão geral básica de como gerar e adicionar efeitos de partículas do Niágara às animações. Se você estiver interessado em efeitos visuais e em como criar novos efeitos de partículas com o sistema Niagara, eu definitivamente recomendo conferir os cursos que são especificamente focados nesse sistema. 39. Widgets (geral): Olá pessoal. Nesta seção do curso, vamos dar uma olhada nos widgets. Agora, widgets ou o tipo de blueprint que usamos para adicionar IU à tela de nossos jogadores, coisas como sistemas de menu, sistemas inventário, barras de saúde. Tudo isso normalmente seria feito com widgets. Agora, que é um sistema bem grande por conta própria. Você provavelmente poderia fazer um curso inteiro apenas para widgets. Então, nesta seção, vamos apenas passar por algumas das noções básicas. Você aprenderá como criar novos widgets, como editar seus layouts, como vincular coisas como variáveis e funções. Para começar nesta lição, vamos dar uma olhada no layout da interface do usuário do widget. Também vamos aprender como criar um widget e depois adicioná-lo à tela do player. Então, para começar, vamos criar um novo widget. Para fazer isso, basta clicar com o botão direito do mouse em nosso navegador de conteúdo, encontrar a interface do usuário, abrir e descer até Widget Blueprint. E vamos selecionar o widget de usuário comum aqui. E vamos chamá-lo de bp underscore, HUD, assim. Agora precisamos realmente escrever algum código para gerar que esteja quente e depois adicioná-lo à nossa tela do player. Então, eu vou fazer isso no ThirdPersonCharacter Blueprint, que nos traz da minha outra tela aqui. Agora, você também pode fazer isso dentro do controle do player, se quiser. Estou apenas fazendo isso dentro do ThirdPersonCharacter porque esse é o plano que tenho neste modelo. Então, o que faremos é clicar com o botão direito do mouse e procurá-lo para começar a jogar. E a partir disso, vamos nos arrastar e pesquisar por Create Widget. E isso vai nos dar esse novo nó aqui. E é um nó específico projetado para gerar widgets. Então, a primeira coisa que vamos fazer é definir uma classe e vamos selecionar nosso novo HUD BP que acabamos de criar. Agora também precisamos fornecer um jogador proprietário, e esse é um tipo de controlador de jogador. Então, o que faremos é clicar com o botão direito do mouse e procurar pelo controle do jogador gap. Podemos simplesmente conectar isso diretamente em nossa oração de abertura. Então agora estamos gerando ou BP HUD, mas ainda não o estamos adicionando à tela do jogador. Então, o que precisamos fazer primeiro é criar uma variável para armazenar uma referência ao nosso HUD. Então, se quisermos acessá-lo mais tarde, podemos simplesmente arrastar para fora do valor de retorno, clicar na variável promotes, e isso criará uma nova variável BP HUD santa. Eu só vou chamar o meu HUD. E podemos arrastar isso até aqui. Agora. Vamos arrastar para fora da saída do nó definido e vamos procurar por Add to Viewport. E agora esse nó será adicionado à janela de visualização de nossos jogadores. Agora em Begin Play, criamos nosso BP HUD, disse que é Possuir Jogador para o controle de nossos jogadores. Definimos a variável HUD para o caso de querermos acessá-la mais tarde. E então adicionamos nossa cabeça à tela do nosso jogador. Mas se apertarmos o play agora, na verdade não veríamos nada. E isso porque nosso HUD bp está vazio. Então, vamos para lá agora. Vamos compilar isso e abrir nosso HUD bp. Agora estamos dentro da nossa visão de designer bp HUD. E é aqui que nós realmente definimos a aparência de nossos widgets. Agora, aqui em cima, à esquerda, temos o paladar, e é aqui que você encontrará todos os tipos de widget integrados que vêm com o mecanismo. Temos coisas como botões, imagens, barras de progresso e muitas outras que analisaremos em lições futuras. Agora, essencialmente, a criação de novos widgets para o nosso HUD é feita usando os widgets integrados que vêm com o mecanismo, coisas como a barra de progresso nos tipos de widget de imagem. Nós os personalizamos para se comportarem da maneira que quisermos. Então, se quiséssemos barra de saúde, normalmente usamos nossa barra de progresso e a personalizaríamos para se comportar como uma barra de saúde. Ou se estamos construindo um sistema de menu, talvez possamos usar o widget de botão e o widget de imagem e usá-los em combinação para abrir novos menus e alterar configurações, por exemplo. Então essa é a nossa seção de paletas aqui. Também temos a seção da biblioteca. Isso é novo e o Unreal Engine cinco. Essa é uma espécie de visão mais amigável da visão do paladar. Você pode ver que, na verdade, tem as mesmas opções aqui. Ele apenas dá uma pequena prévia do ícone aqui. Portanto, é um pouco mais fácil ver o que esses widgets individuais fazem. E mais tarde, quando criarmos nossos próprios widgets, encontraremos aqueles sob os criados pelo usuário. Então, se eu clicar nesse menu suspenso, você pode ver que não há, não há nenhum widget aqui além deste embutido. Mas quando criamos nossos próprios widgets, podemos encontrá-los aqui e usá-los dentro de nossos outros widgets. Você pode usar a vista do paladar ou da biblioteca como preferência totalmente pessoal. Agora, descendo para a hierarquia aqui também, podemos ver os widgets atuais que estão no widget da barra lateral agora são aleatórios porque não colocamos nenhum m. Mas se eu dissesse, pegue isso e apenas solte isso, você pode ver que agora temos um livro didático que está aparecendo. Podemos usar essas configurações aqui para alternar sua visibilidade. Agora, isso é útil se, talvez mais tarde, você tiver muitos widgets ativados e, na maioria das vezes, eles não estarão visíveis ao mesmo tempo. Você pode ocultá-los assim para facilitar o trabalho no widget. Em seguida, há os widgets de vinculação. Agora, isso tem mais a ver com animações de widget e não vamos abordar animação neste curso apenas porque é um pouco mais avançado. E o que vamos cobrir. Em seguida, temos nosso painel Detalhes. Agora, porque eu tenho minha caixa de texto selecionada aqui em nosso painel de hierarquia, está nos dando as configurações para nossos textos. Então, por exemplo, o que eu poderia mudar o que o texto diz. Então eu poderia dizer, Olá, Este é um teste e atualiza nossos textos. Podemos definir coisas como cor, mas se estivéssemos usando outra coisa, se eu excluir meus textos aqui e adicionar uma imagem, você pode ver quando eu seleciono nossa imagem, nós realmente obtemos configurações diferentes. E isso nos permite definir coisas como uma imagem do tamanho da nossa imagem e coisas assim. Se em algum momento alguma dessas janelas estiver fechada, você pode ir para a guia Windows aqui e você pode pegar qualquer uma delas aqui em cima. Em seguida, temos a visualização gráfica. Agora é aqui que colocamos o código que será executado e que é relevante para o nosso widget. Se formos para a visualização gráfica agora, você deve notar que ela parece praticamente a mesma dos editores de você deve notar que ela parece praticamente a blueprint com os quais estamos trabalhando. Você tem o painel Blueprint do seu microfone. Aqui você tem as funções, macros, variáveis e despachantes de eventos. Temos nosso painel Detalhes, que dependendo do que eu selecionar, se eu criar uma nova variável, por exemplo, você pode ver que ela nos fornece todos os detalhes da nossa variável como você esperaria. E, claro, se eu arrastar essa variável quando pudermos obtê-la e defini-la, podemos executar o código normalmente como se fosse um blueprint normal. Agora temos alguns avisos diferentes, então temos a construção do evento que você pode ver. Está meio esmaecido. Agora, se excluirmos isso e apenas procurarmos por ele, podemos pesquisar por Event Construct. Você pode simplesmente criá-lo normalmente. Agora, isso funciona muito bem como começar a jogar fora sempre que nosso widget é criado. Agora também temos esse evento pré-construído. Na verdade, isso será feito toda vez que pudermos extrair o projeto. Então, para dar um exemplo, talvez pudéssemos esconder nossa imagem que outra semana a levantaria. Você percebe que, na verdade, temos uma variável de imagem aqui em nossas variáveis. E isso está se referindo à imagem que adicionamos ao projeto. E a razão pela qual temos isso acessível em nosso Gráfico de Eventos é se voltarmos ao nosso designer, selecionamos a imagem. Você pode ver que aqui está marcado para é variável. Isso significa que podemos acessar esse código de frutas de imagem por meio de uma variável. Então, o que faremos é pegar essa imagem, arrastar uma só para definir a visibilidade. Vamos conectar isso ao nosso pré-construído assim. Então, quando eu posso retirá-lo, podemos ver que está definido como Visível. Então, se eu for ao meu designer, podemos ver nossa imagem. É apenas uma imagem branca agora. Mas se voltarmos para o Gráfico de Eventos e eu mudar isso para oculto, agora quando eu compilar, voltar para o designer, você pode ver que ele não está mais visível porque nós o definimos como oculto, e esse evento realmente é executado toda vez que compilamos nosso código. Agora, nossos widgets podem realmente esfriar o código dentro do nosso gráfico de eventos. Então, o que podemos fazer é voltar ao nosso designer aqui. Vou deletar a imagem por enquanto e vamos pegar um botão e arrastá-lo para o nosso Hud. Você pode arrastá-lo direto para aqui ou pode arrastá-lo para a hierarquia. Ele faz a mesma coisa. Então, vamos apenas arrastá-lo com nossos botões selecionados no painel Detalhes. Se descermos até o final, temos algumas dessas opções de eventos. Agora, se clicarmos nesse botão de adição, ele realmente nos criará um novo evento e o gráfico de eventos. Então, talvez eu queira que esse botão execute algum código. Quando clicado, podemos clicar neste pequeno botão de adição aqui, e isso realmente nos cria um novo evento dentro do gráfico de eventos. Agora, esse evento ocorrerá sempre que pressionarmos esse botão durante o jogo. Agora, algo a ter em mente ao codificar em widgets, é uma boa prática não colocar o código do jogo dentro de um widget. Na verdade, você deveria apenas ter seu widget para exibir informações e, em seguida, receber informações de, digamos, coisas como pressionar botões. E então esse widget deve dizer a outros projetos, como atores de blueprint ou blueprint do seu personagem, o que foi pressionado, você não deveria realmente estar fazendo nenhuma codificação de jogabilidade dentro de um widget . Então, por exemplo, se esse botão matou meu personagem, por exemplo, poderíamos simplesmente clicar com o botão direito do mouse em pesquisar, esquecer jogador, personagem, arrastar daqui e executar Destroy Actor. Agora, quando eu pressiono esse botão, isso destruiria meu personagem e isso funcionaria bem. Mas não é uma prática particularmente boa fazer isso. O que realmente você deve fazer é que devemos custar também. Ou um personagem de terceira pessoa como esse excluirá o nó do ator destruído. E então, dentro do nosso ThirdPersonCharacter, deveríamos ter eventos separados. Então, vou criar um novo cliente. Então podemos chamar esse jogador da morte. Então isso rodaria Destroy Actor. Assim. Voltaríamos ao nosso HUD, saíamos do nosso ThirdPersonCharacter e chamaríamos que os eventos chamariam de matar jogador. Então, agora nosso widget não é realmente o modelo que está executando o código do jogo. É só pegar a entrada ButtonClicked. Está dizendo ao ThirdPersonCharacter: Ei, você precisa executar este evento. Agora, isso não importa muito para a codificação em jogos para um jogador. Mas mais tarde, se você quiser se ramificar para a codificação multijogador, essa é uma prática muito importante a seguir. Você não quer que os widgets executem nenhum código de jogo, apenas para dizer ao código de jogo dentro de outros projetos o que aconteceu. Agora. Por fim, se realmente compilarmos nosso HUD, você verá que recebemos alguns erros. Isso porque excluímos nossa imagem na Visualização do Designer e a substituímos pelo botão. E se nos mudarmos para cá, ainda temos uma referência a essa imagem antiga. Então, o que podemos fazer é excluir esses nós, compilar e isso eliminará as setas. Agora terminamos esta lição. Em nossa próxima lição, vamos dar uma olhada mais de perto Visualização do Designer e, em seguida, como podemos controlar o layout do nosso widget. 40. Widgets (layouts): Olá pessoal. Nesta lição, vamos aprender como podemos realmente controlar um layout de widgets. Então, para começar, em nossa última lição, criamos esse HUD BP e adicionamos algum código ao nosso ThirdPersonCharacter, que basicamente cria esse HUD e adiciona à tela de nossos jogadores no Begin Play. Agora também adicionamos em nossa última lição ao BP tem um widget de botão. Agora, atualmente, isso está ocupando todo o nosso hub bp. Então, o que vamos fazer é selecioná-lo no litro da hierarquia. Então vamos compilar e isso nos dará um aviso. Então, vamos para a visualização gráfica, que excluirá esse código aqui. E a razão pela qual estamos recebendo esse aviso é porque esse evento deve ser executado quando o botão que acabamos de excluir é pressionado e não existe mais. É por isso que agora estamos recebendo esse aviso, excluiremos isso e compilaremos. Agora vamos passar para o design da visualização e , na verdade, vamos dar uma olhada em alguns dos tipos de painel de widget. Então, vamos para a paleta de toque aqui, e eu vou selecionar o painel. E aqui temos alguns tipos diferentes de painéis, e eles são úteis para controlar layouts com widgets. Mas vamos começar com o painel de tela. Então, vamos apenas arrastar isso para o topo da nossa hierarquia de widgets aqui e apenas liberar isso. E agora temos um painel de tela. E você pode pensar em um painel de tela. É como uma representação da tela inteira dos jogadores. Se adicionarmos algo como um botão aqui, podemos simplesmente arrastá-lo e soltá-lo em nosso painel de tela. Se compilarmos e clicarmos em play, veremos nosso botão aqui na tela de nossos jogadores. Então, agora vamos sair do editor do avião e voltar para o nosso hardware. Agora, você deve ter notado que temos esse botão aqui embaixo que podemos arrastar e que nos permite redimensionar nossa janela de visualização aqui. Agora, é importante ter em mente que tudo isso está fazendo é alterar a visualização do nosso widget para que possamos ver como seria o nosso HUD, digamos nesta resolução, ou talvez um diferente resolução como aqui embaixo. Mas isso não está mudando o tamanho do nosso widget. Tudo o que isso está fazendo é mudar a visualização. Podemos ver como nossos widgets realmente se parecem em tamanhos de tela específicos. Outra maneira de fazer isso é com a opção de tamanho da tela aqui, e isso oferece várias visualizações para diferentes dispositivos. Então, se você estiver trabalhando em um dispositivo móvel, você pode escolher um dispositivo aqui para visualizar a resolução exata da tela. Mas para a maioria das pessoas, você provavelmente usará um monitor de dez ADP. Assim, podemos ir até os monitores e selecionar o monitor de 21,5 a 24 polegadas. E isso vai mudar para dez ATP para nós. E você pode ver essa resolução aqui embaixo. Agora, nosso painel de tela é realmente especial em comparação com nossos outros painéis. Quando arrastamos coisas como botões ou imagens para ele, podemos realmente arrastá-los e movê-los para lugares diferentes dentro do painel de tela, também podemos redimensioná-los. Então, se eu quiser aumentar meu botão, eu posso simplesmente arrastá-lo para fora e torná-lo maior. Agora, porque eu tenho meu botão selecionado e ele é filho do nosso painel de tela. E o que quero dizer com criança é que está diretamente contido dentro do nosso painel de tela. Como você pode ver aqui sob nosso painel de tela, temos nosso botão, que é filho do painel de tela. Agora, por causa disso, também temos algumas configurações em nossos botões, detalhes que são exclusivos quando está dentro de um painel de tela. Para começar, temos âncoras e vou explicar um pouco sobre isso em um momento. Mas também temos a posição x. Então esta é uma posse de lado a lado, posse y, que é a posição para cima e para baixo, então temos seu tamanho. Então esse é seu tamanho e largura e seu tamanho e altura. Agora, nossa âncora é basicamente o ponto central desse widget. Então, se eu fosse definir isso para 0 no x e 0 no y. Você verá que vai até o canto superior esquerdo, porque atualmente é onde estão as âncoras. Mas se eu fosse mudar essa âncora para dizer o centro, você pode ver que é a posição x e y. Ela realmente subiu. E isso porque agora sua posição 0 estaria no centro da tela. Então, se eu fosse definir isso para 0 novamente, você verá que o widget realmente vai para o centro da tela. Agora, o alinhamento é como a posição do ponto de articulação do nosso widget. Então, atualmente 00 significa que estará no canto superior esquerdo. Se eu alterar isso para 0.50.5 ou o centro do nosso widget agora estiver no centro. E é por isso que o widget agora se moveu para a posição central, mesmo que a posição x e y ainda seja 0. Depois, temos o tamanho do conteúdo, que explicarei mais adiante na lição. Temos a ordem z, que basicamente controla se temos dois widgets sobrepostos um ao outro, aquele com a ordem de visualização mais alta estará no topo. Então, se eu pegar outro botão aqui, terei que ampliar para vê-lo. Se eu arrastar isso para cima do nosso widget, você pode ver que ele está realmente acima do nosso widget inferior. Mas se eu selecionar meu widget inferior e aumentar isso para um, você pode ver que agora ele vai além disso. Estamos a jato porque a ordem é 0. Agora, descendo no painel Detalhes, temos algumas opções de aparência e elas serão diferentes dependendo do widget que você tem atualmente. Então, como estamos em um botão, se considerarmos o estilo, você verá que temos opções para normal pairado e pressionado. Agora, é assim que o botão ficará quando estiver normal, nada está acontecendo com ele. Então, quando o mouse passa o mouse para cima e, em seguida, quando ele está realmente sendo pressionado para baixo. E se abrirmos uma dessas opções, digamos a opção normal, podemos mudar coisas como a imagem ou a tonalidade, ou se ela é desenhada como uma caixa arredondada ou apenas uma caixa normal. E você vê isso agora. Não tem mais os cantos arredondados, ou podemos alterá-lo como tenso. Então eu poderia mudar isso para dizer ser vermelho. E você pode ver agora que está destacado em vermelho. Agora, como você pode ver, há muitas opções diferentes e cada tipo de widget tem opções diferentes. Então, eu não vou passar por todas essas configurações. Se você quiser descobrir o que eles fazem, você pode passar o mouse sobre eles e isso lhe dá uma pequena dica de ferramenta. Ou você pode simplesmente brincar com a mudança cores e tamanhos e coisas assim. Mas, apenas como uma visão geral, quando você seleciona um widget, é aqui que você encontrará todas as configurações de sua aparência real. Então, em seguida, vamos realmente excluir esses botões aqui. Vamos dar uma olhada em algumas das outras opções de painel que temos. Então, vamos começar com uma caixa vertical. Então, se arrastarmos isso, vou diminuir um pouco mais o zoom. Agora, como você pode ver, isso é apenas um widget vazio. Não há aparência visual para nós. Mas o que podemos fazer é adicionar outros widgets a ele. Se eu rolar para cima e pegar, digamos, o texto, eu posso simplesmente arrastá-lo para cima da caixa vertical aqui ou podemos soltá-lo sobre ele na hierarquia. Então, podemos deixar isso cair. Você pode ver que agora foram adicionados nossos textos para nós aqui. Agora, porque não adicionamos nossos textos ao painel da tela. Quando eu seleciono, não consigo movê-lo ou redimensioná-lo. Como se eu adicionasse alguns textos diretamente no painel da tela. E a razão para isso é que nossa caixa vertical é o que assume o controle do tamanho do nosso texto será sua posição. Então, se adicionarmos outro texto em nossa caixa vertical, veja que agora ele começa a empilhá-los verticalmente. E esse é o principal recurso de uma caixa vertical. À medida que adicionamos novos widgets a ele, eles serão adicionados em uma pilha vertical. Agora, se selecionarmos nossa caixa vertical aqui, você pode ver que atualmente é desse tamanho. Se o movermos, ainda podemos movê-lo em nosso painel de tela porque está anexado ao painel de tela, enquanto o texto é anexado dentro da caixa vertical. Mas se você olhar para uma caixa de ferramentas, não é realmente do mesmo tamanho que nossos textos. Textos como vazamentos. Agora, é aí que entra o tamanho da opção de conteúdo. Se eu assumir isso, você pode ver que agora minha caixa vertical ficou maior e agora é do tamanho de tudo o que colocamos dentro dela. Portanto, essa é a principal característica do conteúdo do site. Qualquer widget que tenha widget filho dentro dele. Se você marcar essa opção para esse widget, ele será redimensionado para ter apenas o tamanho dos widgets que estiverem dentro dele, como nossa caixa vertical. Agora, se selecionarmos alguns dos textos que estão atualmente dentro de nossa caixa vertical e rolarmos até o topo aqui, você verá que agora temos configurações que são chamadas de boxplot vertical. Isso é em vez do slot do painel de tela que tínhamos quando colocamos nosso texto diretamente dentro do painel de tela. Agora, esses são alguns dos controles que podemos usar para ajustar nossos textos enquanto estão dentro de uma caixa vertical. Então, para começar, temos preenchimento. O preenchimento é basicamente quanto espaço existe entre nossos textos e a parte externa da caixa vertical. Então, se mudarmos isso para dizer dez, o que ele fará é dar aos nossos textos dez pixels entre sua borda e a borda das caixas verticais que você pode ver aqui. Agora é feito em todas as direções para este texto porque acabei de colocar dez no hit principal. Mas se clicarmos na seta para baixo, podemos especificar esquerda, direita, superior e inferior. Em seguida, temos o tamanho e os alinhamentos. Agora, atualmente, nossa caixa vertical mudará seu tamanho para o que estiver dentro dela. Agora, para realmente testar as configurações, teremos que desabilitar isso. Então, vamos desativar o tamanho do conteúdo e aumentar nossa caixa de texto. Então, agora é realmente maior do que nossos textos precisam. Então, se eu selecionar meu texto aqui, atualmente, ele está configurado para ocupar o máximo de espaço vertical e horizontalmente possível. Então, o que podemos fazer é se eu quisesse que meu texto fosse centralizado, poderíamos configurá-lo para um alinhamento central, e agora ele está centralizado no meio da nossa caixa vertical. Se eu redimensionar minha caixa, você pode ver que ela muda de centro. Ou podemos selecionar nosso texto novamente e configurá-lo para ser alinhado à direita. E isso significa que o texto agora está anexado ao lado direito da nossa caixa vertical. Em seguida, também temos o alinhamento vertical, e isso nos permite controlar a posição vertical do nosso texto. Agora, atualmente, ele está configurado para preencher verticalmente, mas também temos seu tamanho definido como automático. Portanto, o texto vai usar o espaço necessário verticalmente. Mas digamos que eu queria que meu texto ficasse mais no centro da nossa caixa vertical. O que podemos fazer é dizer que nosso tamanho seja preenchido. E isso significa que nosso texto está basicamente dizendo à caixa vertical que ela quer usar o máximo de espaço possível. Então, podemos usar nosso alinhamento vertical. Poderíamos definir isso para dizer centro, e isso será centralizado no espaço que ele tem disponível. Agora, essas configurações podem ser um pouco confusas para começar, e na maioria das vezes você só precisa brincar com elas para obter o resultado que está procurando. Mas eles podem ser muito úteis ao trabalhar em coisas como caixas verticais. E o comportamento dessas configurações dependerá do widget que você selecionou. Então, se tivermos que pegar um botão e soltá-lo dentro da caixa vertical aqui, você pode ver que ele está realmente se estendendo até o tamanho total que tem disponível na largura. E a razão para isso é por causa de nossos alinhamentos. Agora, se eu fosse definir meu alinhamento horizontal para o centro, você verá que meu botão fica muito menor. E isso porque se formos para Estilo no menu suspenso normal aqui, nosso tamanho de imagem é definido como 32 por 32. Então, se eu fosse aumentar isso, você pode ver que meu botão realmente fica maior. Ou se eu fosse aumentá-lo no valor X, você pode ver que fica mais longo. E se eu fosse definir meu tamanho aqui para preencher, você vê que meu botão fica muito maior. Agora não está ocupando todo o espaço disponível porque nosso texto aqui também está configurado para ser preenchido. Então, se eu fosse definir isso como automático e ver que agora minha caixa está empurrando todos esses textos para fora de seu caminho e está ocupando máximo de espaço possível verticalmente. E isso porque nossa vertical está configurada para preencher verticalmente para que possamos preencher horizontalmente, você verá que agora um botão ocupa todo esse espaço. E apenas como uma nota lateral, se você estiver alterando o tamanho de um botão em seu estilo normal, você provavelmente vai querer fazer o mesmo tanto para passar o mouse quanto para pressionado, porque você tem que se lembrar que quando você passar o mouse sobre um botão, ele começará a usar essas configurações. E se o seu tamanho for diferente do tamanho normal, seu botão diminuirá sempre que você passar o mouse sobre ele. Não se preocupe muito se essas configurações passaram pela sua cabeça, a melhor maneira de aprender widgets é apenas brincar com eles, tentar fazer pequenas coisas e fazê-los funcionar e dispostos da maneira que você quiser usando esses botões aqui. E também as configurações de preenchimento e alinhamento que você tem disponíveis selecionando o widget individual. Agora estamos usando o painel vertical, mas também há painéis horizontais. Então, se formos para nossa opção de painéis, você pode ver que temos a caixa horizontal. E se arrastarmos isso, isso se comporta exatamente da mesma forma que nossa caixa vertical, mas em vez disso é horizontal. Então, se eu pegar, digamos, um widget de texto, nós apenas o arrastamos para nossa caixa horizontal. Você pode ver que ele foi adicionado dentro da nossa caixa horizontal aqui embaixo. Se eu fosse adicionar outro à nossa caixa horizontal, você pode ver que ele foi adicionado, mas agora está movendo-os horizontalmente em vez de verticalmente. Agora, o legal desses painéis é que podemos usá-los juntos. Então, se diminuirmos um pouco o zoom aqui, vou deletar tudo isso na minha caixa vertical. E vamos adicionar uma caixa horizontal dentro da caixa vertical. Então, vamos descer dois painéis, encontrar uma caixa horizontal. E vamos colocar isso dentro da nossa caixa vertical assim. Agora, dentro da nossa caixa horizontal, podemos adicionar algo como textos, adicionaremos alguns textos. E talvez eu queira uma imagem também. Então, se imaginarmos que talvez seja uma lista de itens, gostaríamos dos itens Imagem e, em seguida, alguns textos para o nome. Então, adicionaremos uma imagem também à nossa caixa horizontal assim. Agora, podemos alterar a ordem em que estão, dentro da nossa caixa horizontal. Podemos selecioná-los e você pode usar essas pequenas setas apenas para movê-los. Ou no painel de hierarquia, podemos simplesmente arrastá-lo. E temos essa pequena linha azul que nos diz se estamos movendo para que possamos movê-la acima do nosso texto. E agora está acima do nosso texto ou na frente dos nossos textos para a caixa horizontal. Agora diga que eu realmente não gostei do jeito que isso parece. Eu queria algum espaço ou talvez eu quisesse minha caixa de texto do outro lado do nosso painel aqui. Eu seleciono meu texto. Poderíamos configurá-lo para preencher e eu vou configurá-lo para alinhar à direita horizontalmente. E agora meu texto está aqui e minhas imagens ainda estão no lado esquerdo. Então agora podemos copiar e colar ou caixa horizontal. Então vamos selecioná-lo, fazer Control C, então vamos selecionar nossa caixa vertical e fazer Control V. E agora podemos colar em algumas de nossas caixas verticais. Você pode ver agora que temos uma lista de caixas horizontais dentro de nossa caixa vertical. E então essas caixas horizontais têm nossas imagens e nossos textos. Assim, podemos selecionar nosso texto e alterá-lo. Poderíamos mudar isso para dizer espada, isso para ouro, e isso para bebida saudável, por exemplo. Agora temos uma lista vertical de caixas horizontais que têm essas informações dentro. Agora, talvez quiséssemos mudar a distância da borda da nossa caixa horizontal até a borda da caixa vertical. Podemos fazer isso usando nosso preenchimento. Assim, podemos definir nossos preenchimentos, digamos dez. E isso realmente nos dará algum espaço entre nossas diferentes entradas e também as bordas de nossa caixa vertical. Para que pudéssemos fazer isso com cada um. Podemos definir isso para dez também. E o mesmo com isso, só para arrumar um pouco assim. Agora, se quiséssemos, poderíamos definir uma imagem para eles. Então, se eu selecionar uma das imagens aqui, podemos definir uma imagem. Agora eu só tenho as imagens que vêm com o motor. Então vamos, vamos usar, dizer este. Isso realmente definiu nossa imagem que poderíamos sentar e ter 12 aqui para que possamos rolar para baixo, encontrar uma imagem diferente, talvez este ícone do Android, você pode ver. Agora podemos definir imagens para cada uma de nossas linhas aqui. Outra maneira de usar o preenchimento é, digamos, dentro de uma caixa vertical aqui. Talvez eu quisesse que meu texto ficasse desse lado, mas queria um pouco de espaço entre a imagem e o texto. O que poderíamos fazer é mudar isso de volta para automático, então é desse lado. Então, poderíamos usar o preenchimento. Para que eu pudesse abrir o preenchimento em um preenchimento esquerdo de, digamos, 50. E você vê agora que nosso texto está a 50 centímetros, ou seja, 50 pixels de distância da nossa imagem. Ou se nos livrarmos disso rapidamente, podemos usar um widget espaçador. Então, se procurarmos por espaço, podemos usar um widget espaçador e podemos colocá-lo entre nossa imagem e nossos textos na hierarquia. Basta selecionar o espaçador e definiremos seu tamanho aqui. Queremos que o x seja horizontal, então aumentamos para dizer 100, e isso nos dá 100 pixels entre nossa imagem e nossa espada. Agora, até agora, temos olhado para painéis e painéis em sua maior parte podem ter filhos ilimitados. Assim, podemos adicionar quantos widgets quisermos ao nosso painel de tela ou à nossa caixa vertical ou à caixa horizontal. Mas alguns widgets não têm essa liberdade. Se nos livrarmos de nossa pesquisa aqui e adicionarmos, digamos, um botão, podemos adicionar uma criança a um botão. Então, se eu pegar, digamos, alguns textos, posso arrastar isso para cima aqui para adicioná-lo como uma criança ou simplesmente soltá-lo no botão no painel de hierarquia. E você pode ver agora que temos o texto e isso é um filho do nosso botão. Mas se eu fosse pegar, digamos, mais alguns textos, eu não posso mais adicionar isso ao nosso botão porque nosso botão só pode ter um filho. Então, uma boa maneira de contornar isso é se removermos os textos do nosso botão, podemos usar um painel como nossa caixa horizontal. Podemos adicionar isso ao nosso botão. E agora nossa caixa horizontal como filho do botão. Mas podemos adicionar quantas crianças quisermos, a caixa horizontal. Assim, poderíamos pegar, digamos, algum texto, adicioná-lo ao nosso botão, também podemos pegar uma imagem. Então, podemos adicionar isso ao nosso botão. Agora, atualmente está vazando de um botão. Mas o que podemos fazer é selecionar o botão, podemos redimensioná-lo para que nosso conteúdo fique dentro do botão. Ou, se você se lembra, podemos clicar em Dimensionar para o conteúdo. Na verdade, o Button se redimensionará para qualquer espaço necessário para o conteúdo dentro dele. Então, essa é uma maneira muito fácil. Você pode criar widgets que só podem ter um filho, ter quantos filhos quiser apenas usando as caixas do painel aqui embaixo. Agora, uma coisa que pode ser desafiadora ao trabalhar com essas caixas de painel é dizer que eu queria meus textos ou essa entrada aqui em nossa caixa vertical fossem maiores. Não há opção de tamanho que possamos controlar. Mas o que podemos fazer é envolver elementos individuais com uma caixa de tamanho. Então, digamos, eu queria que essa imagem fosse realmente muito maior. O que podemos fazer é selecionar nossa imagem aqui. Poderíamos encerrá-lo clicando com o botão direito do mouse, fazer rap com. E basicamente isso significa que estamos dizendo para a imagem estar contida em outro widget. Então, vamos selecionar, digamos, a caixa de tamanho. E agora nossa imagem que você pode ver está dentro de uma caixa de tamanho. Essa caixa de tamanho ainda está dentro de nossa caixa vertical , basta colocar nossa imagem nessa caixa de tamanho para nós. Também podemos fazer isso com nossas caixas. Então, se eu selecionar minha imagem aqui, por exemplo, poderíamos embrulhar isso com, digamos, uma caixa vertical, se quiséssemos. Você pode ver que temos caixa vertical ou caixa horizontal ou qualquer uma dessas opções que você tem aqui. Voltando à nossa caixa de tamanho que acabamos de criar. Você pode ver que temos algumas opções de tamanho aqui. Então, o que podemos fazer é selecionar essas opções para ativar as substituições de tamanho. Se eu inserir um texto aqui, digamos 100 por 100. Você pode ver que agora está forçando essa imagem a ter esse tamanho. Portanto, isso pode ser muito útil ao trabalhar com caixas verticais porque às vezes você só quer forçar um widget a ter um determinado tamanho. E os controles aqui podem ser um pouco restritivos. Então, usando uma caixa de tamanho, podemos forçar um tamanho específico. Existem algumas outras opções aqui também. Portanto, se desmarcarmos ou substituirmos as opções, e a razão pela qual as estou aceitando é porque elas basicamente forçam o widget a ter esse tamanho. Nenhuma dessas opções será melhor se você tiver essas opções tectônicas. Então, vamos apenas tirar isso por enquanto. Também podemos definir um tamanho mínimo e máximo. E isso basicamente nos diz que queremos que nosso widget seja pelo menos 50 por 50. Mas ele pode se redimensionar para dizer, outro site. Então, digamos 200 por 200. Você vê que atualmente é 50 porque nossas imagens são apenas uma imagem pequena. Mas se nossa imagem fosse maior, ela realmente usaria esse espaço adicional de até 200 pixels. E então a imagem não ficaria maior que 200 porque dizemos tamanho máximo. Agora, no momento, acabamos adicionar widgets manualmente arrastando homens para nosso painel de tela ou nossa caixa vertical, por exemplo. Mas em nossa próxima lição, vamos aprender como criar widgets usando código, adicioná-los a essas caixas. Também vamos olhar para a caixa de rolagem, então vou trazê-la aqui. E basicamente a maneira como a caixa de rolagem funciona é quando os widgets dentro dela, as crianças dentro dela ficarem maiores do que seu tamanho atual, terão uma barra de rolagem aqui em cima, serão capazes de percorrer o conteúdo dentro da caixa de rolagem. 41. Widgets (criando widgets): Olá pessoal. Nesta lição, vamos aprender como criar widgets usando código, em vez de ter que arrastar e soltar manualmente esses widgets em nosso painel aqui. Também vamos olhar para a caixa de rolagem. Agora, eu explicaria isso um pouco em nossa última lição. Mas, essencialmente, quando o conteúdo de nossa caixa de rolagem fica maior do que a caixa realmente é, isso nos dará uma pequena barra de rolagem que podemos usar para percorrer seu conteúdo. Então, para começar, o que vamos fazer é criar uma tabela de dados que conterá algumas informações sobre alguns itens. E então vamos fazer com que nosso código de widget crie uma lista para cada um desses itens, e vamos armazená-los dentro da nossa caixa de rolagem aqui. Então, para começar, vamos para o Navegador de conteúdo e vamos criar um novo widget. E este será um widget personalizado qual vamos gerar no qual vamos gerar e usar para exibir nossos itens de informação. Então, vamos clicar com o botão direito do mouse, ir para a opção de interface do usuário e criar um novo widget. Vamos selecionar o widget do usuário. E vamos chamar isso de BP na lista de itens de pontuação assim. E vamos clicar duas vezes nele para abrir. E eu só vou arrastar o meu até o topo aqui assim. Agora, a diferença com a criação deste widget em comparação com o nosso HUD, que é que não vamos usar um painel de tela porque nosso widget de listagem de itens será adicionado a outro painel . Da mesma forma que fizemos nossas imagens e nossos textos, a lista de itens não ocupará toda a tela de nossos jogadores. Portanto, não vamos usar um painel de tela, na verdade, vamos usar diretamente uma caixa horizontal para começar. Então eu só vou pegar uma caixa horizontal , colocar isso aqui. Isso nos permitirá traçar as coisas na direção horizontal. Podemos pegar uma imagem para encontrarmos a opção de imagem. Bem, vou adicionar alguns textos para o player ou o nome do item, e também adicionarei outro texto. Talvez tenhamos um valor de custo. No momento, isso parece um pouco estranho, porque se você se lembra, ainda estamos visualizando isso se os widgets forem adicionados a uma tela ATP de 120 por dez. Mas o que podemos fazer para nos dar uma prévia é ir para o tamanho da tela ou a tela inteira aqui para personalizar. E isso nos permite inserir manualmente um tamanho de pixel para nosso widget. Agora lembre-se, isso é apenas para visualização. Na verdade, esse não é o tamanho do nosso widget. Então, isso só nos dá uma ideia de como será a aparência do widget em um determinado tamanho. Vou definir o meu para dizer 350. E o comprimento, ou talvez façamos 400 e o comprimento, talvez AT, e a largura. Então, agora temos uma ideia um pouco melhor de como nossos widgets realmente serão assim que realmente serão assim adicionarmos a uma caixa de rolagem, como fizemos no vídeo de layout, você pode passar um pouco de tempo se movendo ao redor, adicionando espaços, alterando as fontes ou cores, se desejar. Vou colocar meu custo para que fique contra este lado, então vou configurá-lo para alinhar ao lado direito e vamos filmar. Então, agora nosso texto está deste lado do nosso widget. Agora, também precisaremos alterar os valores desses widgets no código. Então, o que vamos fazer é selecionar cada um dos nossos widgets aqui e renomeá-los. Então, vou renomear a imagem para Ícone do item. E temos a variável is ativada, o que é bom porque precisaremos acessar nossa imagem no Event Graph. Agora, se selecionarmos nosso livro didático, você pode ver que ele não tem realmente esse TikTok. Então, vamos assumir isso. E eu vou definir este para o nome do item. E este também assumirá isso, e chamaremos esse item de custo. Então, agora, se formos para nossa visualização gráfica e compilação, você verá que agora temos variáveis para cada um dos nossos tipos de você verá que agora temos variáveis para widget. Usando isso, podemos realmente obtê-los como variáveis e podemos definir informações sobre eles. Então, se eu quiser alterar nosso texto de custo do item, posso definir texto. Podemos usar o nó set text, e isso realmente me permite alterar o texto que está sendo exibido pelo nosso texto de custo do item. Agora, excluiremos esses nós porque na verdade, precisamos configurar nossa tabela de dados. Por isso, salvaremos nossa lista de itens por enquanto e voltaremos ao navegador de conteúdo. Antes de criarmos uma tabela de dados, precisamos primeiro criar uma estrutura para que essa tabela de dados use. Então, vamos clicar com o botão direito do mouse e vamos para plantas e depois estrutura. E eu vou chamar o meu item S underscore. E vamos abrir isso. E aqui vamos adicionar algumas novas variáveis. Então, vou adicionar uma nova variável. O primeiro, vamos chamar de nome. Vamos mudar isso para um valor de texto. Então esse será o nome do nosso item. Poderíamos definir um custo, então chamaremos esse custo e definiremos isso como um número inteiro. E poderíamos adicionar outro valor, digamos, para uma textura, procuraremos por textura 2D. E queremos a textura 2D aqui, referência de objeto. Eu só vou chamar esse ícone assim. E vamos salvar isso. Agora vamos voltar ao nosso navegador de conteúdo e vamos criar uma nova tabela de dados usando nossa estrutura de item de sublinhado S. Então, vamos clicar com o botão direito do mouse, ir para a opção miscelânea aqui, selecionar tabela de dados e, em seguida, vamos selecionar nosso item S no menu suspenso aqui e clicar em Ok, então chamaremos nossa lista de itens da tabela de dados assim. Então, agora precisamos abrir a lista de itens e adicionar alguns itens a ela. Então, vamos abrir isso. E adicionaremos algumas novas linhas. Então, vou adicionar uma nova linha. Vou chamar isso de espada. Espada, espada. E vamos definir o nome para classificar. Vamos definir o custo para dizer cinco. Agora eu não tenho nenhum ícone para itens, mas podemos usar algumas texturas aleatórias. Então, talvez eu escolha a textura da câmera para este. Bem, eu não tive uma briga. Vamos chamar isso dizer escrito errado de novo. Então esse é o ACS. Em seguida, definiremos o nome para nossos atos da linha dois do AKS também. Vamos definir o custo de, digamos, 20 definirá outra textura. Então eu vou escolher essa cara verde. Vamos adicionar outro, e eu vou definir isso para ser olá, bebida. Eu escrevi isso errado de novo. Beba assim. E, novamente, definiremos o nome para ajudar a beber, definiremos o preço para dizer ou o custo para dois. E vamos escolher outra imagem. Então, vou escolher, digamos, o ícone do Android aqui. Isso vai servir por enquanto. Vamos adicionar um pouco mais para que possamos fazer nossa caixa de rolagem funcionar um pouco mais tarde. Mas, por enquanto, isso fará isso. Voltaremos ao nosso widget de listagem de itens. Agora precisamos criar uma função que realmente configure essa listagem e defina essa listagem e defina nosso ícone de custo de item e nomes para esse widget. Então, para fazer isso, vou criar uma nova função. Vou ligar para essa lista de configuração. Vamos adicionar uma entrada, então selecionaremos o nó de entrada aqui. E sob as entradas, adicionaremos uma nova entrada. E eu vou definir isso para F underscore item. Agora, essa é a estrutura que usamos para nossa tabela de dados. Se você se lembrar, poderemos inserir uma estrutura de item para essa função. Então, definiremos isso e definiremos o nome para item. Agora, vamos usar as informações dessa entrada de struct para realmente definir nossos widgets. Se arrastarmos, podemos quebrar nossa estrutura de item e podemos acessar o nome custar um ícone. Então, para começar, vamos pegar o nome do item Widget, Obter essa variável e, em seguida, arrastar para fora e definir o texto. E faremos o nó setText. Conecte isso à nossa entrada. E vamos pegar o nome e inseri-lo no texto. Em seguida, obteremos o custo do item. Faça a mesma coisa. Então, defina o texto, pegue esse nó. Conecte isso ao nosso SetText anterior e nós pegamos o custo. Também podemos conectar isso diretamente aos nossos textos. Isso nos dará esse nó que apenas converte um inteiro em texto. E por último, vamos definir o ícone. Então, vamos pegar o ícone do item e vamos arrastar para fora disso e definir o pincel. Queremos definir um pincel de textura assim. E isso nos permite basicamente dizer qual é o nosso widget de imagem, qual textura você queria usar. Então, vou pegar nosso ícone aqui, conectar até a textura. Então, agora, quando executarmos essa função, definiremos o custo do nome do item e o ícone ou para qualquer estrutura que forneçamos à entrada. Agora podemos compilar e salvar isso e voltaremos ao nosso HUD. Agora, eu tenho a caixa de rolagem de nossas lições anteriores. Então, na verdade, vou fazer isso um pouco maior porque é bem pequeno no momento. Então, é só um pouco maior lá. E também vamos adicionar uma caixa vertical à nossa caixa de rolagem. Agora, podemos simplesmente adicionar nossos widgets diretamente à caixa de rolagem. Mas o problema com isso é que você pode ter alguns problemas de dimensionamento e também há algumas opções que faltarão. Então, se rolarmos para baixo, vou pegar uma caixa vertical e adicioná-la à caixa de rolagem aqui. Agora, se eu fosse apenas, por exemplo, dizer pegar um botão e adicioná-lo à caixa de rolagem. Se eu selecionar esse botão, você pode ver que estamos realmente perdendo essas opções de preenchimento e automático. Enquanto se eu adicionar isso à caixa vertical, você pode ver que recuperamos essas opções. É por isso que vou adicionar , podemos excluir esse botão. Agora. Na verdade, vou adicionar nossos widgets à caixa vertical em vez de diretamente na caixa de rolagem. Mas não se preocupe, a caixa de rolagem ainda se comportará como deveria, uma vez que nossa caixa vertical dentro da caixa de rolagem ficar muito grande para a caixa rolagem receberá uma pequena barra de rolagem e poderemos rolar por meio do conteúdo. Por enquanto, precisamos ser capazes de acessar essa caixa vertical em nosso código. Então, vamos fazer como fizemos antes na lista de itens, vamos selecionar a caixa vertical que adicionamos à caixa de rolagem. E vamos dizer o nome dele na lista de itens. E precisamos assumir a variável e depois compilar. Em seguida, vamos para o modo gráfico e vamos usar o nó de construção agora, o seu pode estar acinzentado. O meu não é porque eu mudei mais cedo, mas eu disse que está esmaecido. Tudo bem. Você ainda pode se arrastar e funciona bem. Então, o que faremos é primeiro obter todas as entradas da nossa lista de itens. Então, vamos clicar com o botão direito do mouse e obter tabela de dados. E queremos obter nomes de linhas da tabela de dados. E isso nos permite definir uma tabela de dados e nos dará todos os nomes de linha da nossa lista de itens. Então, ele nos dará todos esses nomes aqui. Então, em seguida, voltaremos ao capô e definiremos nossa tabela de dados como Lista de Itens, conectaremos isso à nossa Construção de Eventos. Então, a partir dos nomes finais, vamos fazer um loop. Então eu vou arrastar para fora e procurar por loop. Agora, eu realmente tive um bug durante as filmagens desta lição em que meus nós de loop estão surgindo. Portanto, se você tiver esse problema em que eles não estão aqui, acesse o Navegador de conteúdo encontre a pasta do mecanismo. Se não estiver lá, você pode mostrá-lo acessando as configurações. Clique em Mostrar conteúdo do mecanismo, depois vá para o mecanismo, pesquise por padrão. E você quer macros padrão, basta abrir isso. E então, se você voltar para o widget para sua Baía de Hudson, arrastar para fora, você deve ser capaz de encontrá-los. Espero que você não tenha esse bug, mas no caso de você conseguir, foi assim que eu consertei. Então, basta fazer isso. Agora, espero que você tenha esses nós de loop aparecendo. Então, vou procurar por loop e queremos fazer um loop foreach. E isso vai percorrer todas as entradas diferentes da nossa tabela de dados. E usando o nome da linha, vamos obter os dados ou obter a estrutura da nossa lista de itens. Então, vamos obter tabela de dados. Não obteremos a linha da tabela de dados. Definiremos a tabela de dados para a lista de itens. E você pode ver que temos o nome do nosso papel. Então, vamos apenas conectar isso ao elemento do array porque, se você se lembrar, isso está nos fornecendo todos os nomes das linhas. Então, cada vez que isso for executado, ele nos dará um dos nomes de linha da nossa lista de itens. Vamos conectar isso ao corpo do loop. Em seguida, vamos criar nosso widget de listagem de itens. Então, vamos criar widget. Vamos definir a classe para a nossa lista de itens Jogador Proprietário. Podemos simplesmente arrastar e obter o Owning Player porque estamos dentro de um widget, podemos apenas fornecer nosso novo widget. Temos nossos widgets atuais Owning Player. Em seguida, conectaremos a linha encontrada para criar o nó do widget. Então, a partir do valor de retorno, queremos configurar esse novo widget de listagem de itens. Para fazer isso, vamos usar a função de configuração que acabamos de criar. Então, isso foi configurado. E queremos a função de listagem de configuração , que pode pegar a linha ou o encerramento de nossa lista de itens e conectá-la para configurar a listagem. Por fim, precisamos realmente adicionar um novo widget que criamos aqui à nossa lista de itens. Então, vou pegar a lista de itens. E vamos nos arrastar para fora disso e fazer Adicionar filho. Queremos que nosso filho na caixa vertical conecte isso à nossa lista de configuração aqui. E então, para o conteúdo, precisamos do widget que estamos adicionando à lista de itens. Então, vamos pegar o valor de retorno e nos conectar a um conteúdo como esse. Então, agora, apenas para resumir o código que acabamos de escrever, o que acontece quando o widget é criado é que ele obtém todos os nomes de linha da nossa lista de itens. Então, vou pegar essas três linhas da nossa lista de itens. Em seguida, ele percorrerá cada um deles. Então, esse código aqui que temos destacado 13 vezes. E cada vez que for executado, ele será executado com um nome de linha diferente da nossa lista de itens. Isso significa que obteremos as diferentes informações de estrutura da nossa lista de itens. E isso configura ou cria um novo widget de listagem e fornece informações diferentes para cada listagem de widget que criamos. E então, para cada um, nós os adicionamos ao widget da lista de itens que adicionamos à nossa caixa de rolagem e aqui. Então, agora podemos realmente testar isso no jogo. Vou apenas excluir esses widgets antigos então adicionamos em nossa lição anterior. Então, vou apenas selecionar a caixa vertical aqui, excluir isso, excluir o botão. Selecionaremos essa caixa horizontal aqui. Exclua isso e excluiremos essa caixa de texto apenas para que possamos ver nossa caixa de rolagem um pouco mais fácil. Vou mover a caixa de rolagem até o canto superior esquerdo. Então, ele compilará isso. E agora estamos realmente prontos para testar isso, então vamos clicar em Play. E agora você pode ver que, na verdade temos todos os itens que adicionamos à nossa lista de itens em nossa tela. E tudo isso está sendo feito via código. Atualmente, não temos a pequena barra de rolagem porque há apenas três entradas, portanto, não ocupa espaço suficiente para realmente fazer com que a barra de rolagem exista. Mas o que podemos fazer é se sairmos do editor de avião, podemos simplesmente ir para a Lista de Itens. Você pode adicionar itens individuais se quiser. Mas eu vou pegar o machado aqui e vamos duplicar isso algumas vezes e depois fazer o mesmo com a bebida saudável, que é duplicar isso algumas vezes. Agora, quando clicamos em play, espero que tenhamos essa barra de rolagem. Agora, atualmente, não consigo interagir com a barra de rolagem. E isso porque nosso mouse está travado na câmera de nossos jogadores. Então, a seguir, mostrarei como podemos configurar um pouco de código que nos permite liberar o mouse do controle da câmera para que possamos interagir com nossos diferentes elementos da interface do usuário. Então, para começar, vamos para o projeto do nosso personagem. Então, vou apenas para, vamos nos livrar dessa pesquisa, vamos para a pasta de conteúdo da pessoa e, em seguida, plantas. E vamos ao ThirdPersonCharacter e abriremos isso. Agora ainda temos alguns códigos das lições anteriores. Obviamente, temos o código aqui que realmente cria nosso HUD e o adiciona à tela. Então, queremos manter isso. E podemos excluir esse código de jogador morto porque eu não estou mais usando isso. Então, o que vamos fazer é adicionar uma entrada, então eu vou clicar com o botão direito do mouse e procurar por evento de entrada. Eu faria um turno. Você saiu do turno. Assim, toda vez que pressionarmos o Shift esquerdo, alternaremos entre controlar a câmera de nossos personagens e, em seguida, ter o mouse realmente livre para interagir com a interface do usuário. Então, para começar primeiro, precisamos chegar a qualquer lugar em que nosso mouse esteja controlando a câmera ou não. Então, vamos conseguir o controlador do jogador. A partir disso, vamos arrastar para fora e obter Mostrar cursor do mouse. Isso será verdadeiro ou falso se o cursor do mouse estiver ou não visível no momento. Então, faremos um F. Isso nos permitirá controlar qual código executamos se o cursor do mouse estiver visível no momento do que queremos ocultá-lo. Então vamos fazer ou copiar, vou pegar o controlador do jogador. Vamos arrastar para fora disso e definir o modo de entrada. E queremos definir o modo de entrada para o jogo apenas porque estamos trocando. Se o cursor do mouse estiver visível no momento, estamos mudando para o modo de ganho, então queremos apenas controlar nossa câmera. Então, vamos nos conectar com o verdadeiro. E então também queremos esconder o cursor do mouse. Então, vamos arrastar para fora e mostrar o cursor do mouse. E queremos que isso seja falso assim. Então, se o cursor do mouse não estiver visível no momento , queremos defini-lo visível. Mas primeiro queremos configurá-lo para ganhar modo e interface do usuário. Então, vamos definir o modo de entrada, jogo e saber por que a razão pela qual estamos usando o jogo e a interface do usuário e não apenas a interface do usuário é se fôssemos configurá-lo apenas para a interface do usuário, nenhuma de nossas entradas e nosso personagem funcionariam mais. Então, se pressionássemos o shift esquerdo novamente, não seríamos capazes de sair do modo Y porque esse nó não seria executado. Então, em vez disso, usamos o modo de entrada definido, jogo e gy. E vamos conectar isso ao falso. E então vamos pegar nossa variável que realmente criamos em uma lição anterior. Você pode ver que o código aqui embaixo é exatamente onde criamos o HUD. Nós a definimos como uma variável e depois a adicionamos à nossa janela de visualização. Então, vamos usar essa variável para definir o widget e focar assim. Por fim, queremos mostrar nosso cursor. Então, vou arrastar para fora do comando get player novamente para definir o cursor do mouse. Queremos assumir isso e conectar isso à nossa produção aqui. Então, agora tudo isso está configurado quando pressionamos Shift, ele libera o mouse do controle da câmera e nos permite controlar a interface do usuário. E então, quando pressionarmos novamente, ele retomará o controle da câmera de nossos jogadores. Então, podemos compilar isso e testar isso. Vamos apertar play. Atualmente, estou controlando minha câmera. Se eu apertar Shift, você pode ver que agora tenho meu mouse. Não estou mais controlando a câmera. Na verdade, também posso usar nossa pequena barra de rolagem aqui para percorrer todas as entradas diferentes. Agora, nesta lição, tudo o que fizemos foi usar a caixa horizontal para adicionar à nossa caixa de rolagem. Mas se quiséssemos, poderíamos editar o widget de listagem de itens o quanto você quiser. Para que pudéssemos ir até o designer. Talvez eu quisesse que isso fosse realmente um botão. O que podemos fazer é clicar com o botão direito no Boxer horizontal. Poderíamos fazer rap com e selecionar um botão. Então poderíamos tê-lo para que, quando esse botão for pressionado, ele execute algum código. Assim, podemos selecionar o botão aqui, rolar para baixo até a parte inferior e desclicar. Isso nos cria um novo evento. Portanto, sempre que esse botão listagem for pressionado, ele imprimirá um. Poderíamos fazer uma string de impressão e podemos fazer com que essa string de impressão imprima o valor atual do nome do item para que poderia obter itemName, obter texto. Nós usaríamos o GetText. Observe isso. Então, agora, sempre que clicarmos nesse botão, o nome do item que clicamos será impresso. Então, vamos para o jogo, clique em Jogar. E agora você pode ver que esses são botões. Então, atualmente eu tenho o controle da minha câmera. Se eu pressionar Shift, tenho meu mouse agora, agora quando clico neles, você pode ver que ele está realmente imprimindo o nome do item. Então é isso para esta lição. Espero que agora você entenda como você pode realmente criar widgets e depois adicionar esses widgets usando código. 42. Widgets (vinculativas): Olá pessoal. Nesta lição, vamos dar uma olhada nas vinculações de widgets agora, que nos permitem controlar certas propriedades de nossos widgets usando variáveis ou funções. Então, para dar um exemplo, se eu arrastar uma imagem aqui e eu vou torná-la um pouco maior. Se você olhar no lado direito do painel Detalhes, verá essa opção de no lado direito do painel Detalhes, vinculação para algumas das diferentes propriedades que nossa imagem possui. Agora, essas são, na verdade, configurações que podemos controlar com uma variável ou uma função. Então, um bom exemplo disso é a opção de visibilidade aqui. Agora, isso basicamente define se o widget está visível ou não. Então, se deixarmos como vegetal, podemos pausar e apertar play. Veremos que temos nossa imagem aqui. E se voltarmos ao capô e eu definir a visibilidade para compilação oculta e depois clicarmos em Play. Você pode ver que não está mais visível. Mas também podemos controlar essa configuração com uma variável. Então, se voltarmos ao nosso HUD, selecione nossa imagem aqui, você pode ver que temos uma opção de vinculação ao lado da visibilidade. E agora só temos a opção Create Binding, e vou explicar isso em um minuto. Mas se formos para nossa visualização gráfica aqui e criarmos uma nova variável, e isso vai ser chamado, vamos chamá-la de visibilidade de imagem. E vamos definir seu tipo para estado, desculpe, visibilidade de ardósia. Então, queremos visibilidade de Eastlake. Esse é o tipo de variável que precisamos usar quando estamos vinculando a uma configuração de visibilidade. Então eu vou fazer como componente. E se você vir aqui embaixo, o valor padrão é na verdade, as mesmas configurações que temos em nossa visualização de design se eu clicar no menu suspenso para visibilidade aqui. Agora que criamos essa variável, podemos vinculá-la a essa imagem é visibilidade. Então, podemos clicar em bind e você vê que agora podemos ver essa variável aqui. Se eu selecionar isso agora, nossa imagem agora está usando essa configuração de variável para determinar se ela está visível. E você pode ver que isso realmente ficou esmaecido. Agora, se formos para o Gráfico de Eventos e selecionarmos a variável que criamos, ela está atualmente definida como Visível. Então, se clicarmos em Play, você verá que está visível. E se voltarmos e definirmos essa variável agora como oculta em C, isso agora está oculto. E isso nos permite controlar a visibilidade das imagens usando apenas essa variável. E podemos mudar essa variável, se quisermos, então, por exemplo, podemos defini-la, podemos defini-la para dizer, oculta após um certo período de tempo. Então, podemos acrescentar, digamos, um atraso aqui. Depois de dois segundos, vou definir nossa imagem como oculta. E vamos definir o padrão para visibilidade para que fique visível no início. Depois de dois segundos , será definido como oculto. Se clicarmos em Play, você verá que está visível agora, e depois de dois segundos ele fica oculto. Agora também podemos controlar outras propriedades de nossos widgets usando variáveis. Então, se voltarmos ao nosso HUD, vá para a Visualização de design e teremos nossa imagem selecionada. Você pode ver que também podemos vincular uma variável ao pincel. Portanto, podemos usar uma variável para controlar todas essas configurações aqui. Então, se formos para o gráfico e eu criar uma nova variável, vou chamar minhas configurações de pincel assim. Vamos mudar o tipo para pincel de ardósia. E vamos escolher a melhor opção aqui. E se compilarmos, você verá que essas opções aqui realmente correspondem ao que temos no design da visualização para nossas configurações de pincel de imagem. E se clicarmos no bind, também podemos definir essa variável de configurações de pincel aqui também. Agora podemos controlar nossas configurações de pincel de imagens usando a variável que acabamos de criar. Então, se selecionarmos Configurações de pincel e, em seguida, aqui podemos escolher uma nova imagem. Por exemplo, vou escolher essa cara verde. E se compilarmos e clicarmos em Play, você verá que agora estamos usando essa face verde. E ainda desapareceu por dois segundos. Porque se você se lembra, temos nossa variável de visibilidade aqui, e é isso que controla a visibilidade de nossas imagens. Assim, você pode ter várias vinculações para as diferentes configurações aqui, para o mesmo widget também. Até agora, acabamos de usar variáveis para controlar esses vínculos, mas você também pode usar funções. Então, se formos dizer a opção de visibilidade aqui, se apenas clicarmos no bind e se você quiser remover um bind, você pode simplesmente clicar aqui e remover a vinculação, e isso irá redefini-la para usar essa configuração aqui. Então, agora está definido como oculto. Então, se eu fosse apertar Play, você verá que está escondido. E mesmo depois de dois segundos, isso não mudará porque agora estamos usando essa configuração de visibilidade aqui novamente, e não a variável. Mas também podemos usar funções. Então, se clicarmos na opção aqui e clicarmos em Criar vinculação, isso realmente criará uma nova função e ainda estamos dentro do nosso HUD bp, aqui você pode ver que o valor de retorno será qualquer que seja a vinculação requer. Porque estamos usando a opção de visibilidade. Isso nos dá uma saída de visibilidade do nosso nó. Se eu fosse criar um para o nosso pincel, por exemplo, se eu remover essa vinculação, então criaria uma nova vinculação. Você verá que agora o valor de retorno é um pequeno valor de pincel porque essa é a variável necessária para essa associação. Mas, por enquanto, vou definir isso de volta para nossa variável de configuração de pincel aqui. Então, ele usará essa variável que criamos anteriormente novamente aqui e voltando para nossa nova função. Então, se formos para funções, você verá que agora temos uma opção de obter visibilidade. E essa é a função que criamos quando criamos essa vinculação aqui. Agora podemos adicionar código aqui normalmente para controlar qual será a visibilidade. Então, por exemplo, poderíamos obter o controlador do jogador. A partir disso, poderíamos fazer o mouse, obter, Mostrar, cursor do mouse. E podemos nos arrastar do nosso valor de retorno, você leva um tapa. Plugue. Mostra o cursor do mouse no indexador. Então, se o cursor do mouse for verdadeiro, então vou definir nossa imagem como visível. E se for falso, então vamos defini-lo como oculto. Se você se lembra em nossa lição anterior no ThirdPersonCharacter, configuramos esse código aqui, o que basicamente nos permite alternar o controle da câmera ou o controle do mouse. Agora, quando apertamos o play, vocês podem ver, eu não consigo ver o imaturo, mas estou assumindo o controle da minha câmera. Mas se eu apertar Shift, você pode ver agora que eu tenho meu mouse e minha imagem é realmente mostrada. E se eu apertar Shift novamente, você pode ver que agora está escondido. E a razão pela qual está fazendo isso, é porque em nosso HUD, essa função está sendo executada para determinar a visibilidade de nossas imagens. Isso quer dizer que se o cursor do mouse estiver visível ou se essa variável for verdadeira, então a definimos como visível. E se for falso, ele o define como oculto. Agora, há outro exemplo que eu queria dar a vocês e que é usar a barra de progresso. Agora, as barras de progresso são normalmente usadas para coisas como barras de saúde e barras de fome ou tela de carregamento e barras. Então, o que faremos é ir para a visualização de design e obteremos a barra de progresso do palete. Arrastar isso para dentro. Eu vou fazer o meu um pouco mais longo assim. Agora temos algumas configurações para coisas como o estilo que controla a aparência. Mas vamos nos concentrar no valor percentual aqui. E se for 0, significa que a barra de progresso está vazia. E se for um, você pode ver enquanto eu o movo para cima, agora está cheio. Portanto, nossa porcentagem sempre será um valor entre 01 e isso determina quão cheia a barra de progresso realmente está. Agora também podemos usar uma associação para essa propriedade. Então você pode ver que temos a opção bind aqui, então podemos definir uma variável ou função para controlar esse valor. Agora, atualmente, no momento da filmagem, há um bug no mecanismo em que você não pode vincular isso a uma variável e dar um exemplo. Normalmente, você seria capaz de vincular esse valor a uma variável flutuante. Então, se eu for e eu criar uma nova variável flutuante em C, você diz amount e define como um float como esse. E vamos apenas compilar. Se eu voltar para a visualização de design e clicar na opção de vinculação aqui, você poderá ver que nosso fluxo não está aqui e deveria estar. Se sua variável estiver aqui, isso é ótimo. Você está usando uma versão mais recente do mecanismo e o bug foi corrigido, então você não precisa se preocupar com isso. Mas se você não o tem aqui e ainda não foi corrigido, há outra maneira de contornar isso, que é apenas usar a função. Então, em vez de apenas selecionar a variável, podemos simplesmente criar vinculação. E aqui você pode ver que o valor de retorno é um flutuador. E podemos simplesmente pegar nossa variável amount, conectá-la ao valor de retorno. E agora podemos usar esse flutuador para controlar a quantidade. Então eu posso configurá-lo para dizer 0,2. Podemos clicar em Compilar e, em seguida, clicar em Jogar. Você pode ver que agora está em 0,2 na barra de progresso. Agora podemos configurar outro widget que controla a variável de quantidade que acabamos de criar e que atualizará nossa barra de progresso aqui. Então, se sairmos do jogo, vá para o HUD. Podemos adicionar, digamos, um controle deslizante aqui. E vamos tornar isso um pouco maior. Vou mudar esse ponto de ancoragem para o canto superior direito porque esse é o ponto mais próximo. Então eu vou mudar a âncora para isso. E podemos mudar o estilo só para ser um pouco maior. Então, vou fazer a espessura da bola dizer para que seja um pouco mais fácil de ver no jogo. Em seguida, vamos compilar. E aqui embaixo você pode ver que temos um valor próprio alterado. E se clicarmos no botão Mais, isso nos criará um evento que nos permitirá definir uma variável usando o que quer que o slide esteja atualmente definido como sendo, basta pegar nossa variável de quantidade aqui, conecte isso. E agora, quando movemos nosso controle deslizante no jogo, você pode ver que está aqui. Se eu apertar Shift para entrar no modo mouse aqui, você pode ver que nossa imagem ainda está aparecendo. Não podemos arrastar um controle deslizante e você pode ver que nossa barra de progresso está sendo atualizada com nosso controle deslizante. Isso é basicamente sobre como você pode vincular variáveis e funções às propriedades do widget. Se voltarmos para o coração aqui, eu vou apenas sair dos planetas para ir para a visualização do Gráfico se você quiser encontrar alguma função de ligação. Então, criamos, quando clicamos na opção bind e terminamos de criar vinculação, você pode encontrá-los na guia de funções. Assim como qualquer função normal. O mecanismo apenas fornece esses nomes automaticamente para que você possa renomeá-los se quiser. E você também pode excluí-los se não os estiver usando, apenas tome cuidado. Se você excluir um que está usando em uma vinculação de widget, isso causará um erro, então tenha cuidado com isso. É isso para esta lição. Espero que agora você entenda um pouco mais sobre como as vinculações e os widgets funcionam e como você pode usá-los em seus projetos futuros. 43. Widgets (bordas, sobreposições e grelhas): Olá pessoal. Nesta lição, vamos dar uma olhada em mais alguns tipos de widget. Vamos dar uma olhada na sobreposição de borda e no painel de grade uniforme. Mas antes de começarmos, vamos apenas limpar nosso projeto um pouco da nossa última lição. Então, vou selecionar esses três widgets aqui, excluí-los, ir para o Gráfico de Eventos. Vou pegar meu nó de construção, conectar isso a este nó aqui. Em seguida, excluiremos esses nós que não estamos usando e também excluiremos esse controle deslizante. E se compilarmos, tudo ficará bem. Agora, voltando ao design da visualização, primeira coisa que veremos é o painel de grade uniforme. Se arrastarmos isso para dentro. E eu só vou fazer o meu um pouco maior aqui. Esse painel funciona de forma semelhante à caixa horizontal. A caixa vertical. A única diferença é que ele pode ter filhos verticais e horizontais. Então, para dar um exemplo rápido, se eu apenas pegar, digamos, uma imagem aqui e adicioná-la ao painel de grade uniforme. Você pode ver isso. Está no canto superior esquerdo. Vou adicionar uma imagem adicional aqui. Você vê que ainda está, ambos ainda estão neste canto superior esquerdo. Mas você diz que se eu selecionar um deles, eu realmente pego essas setas e posso posicioná-las em locais diferentes, seja para baixo ou horizontalmente assim. Agora também podemos controlar isso no painel Detalhes, aqui você pode ver que atualmente esse widget Row está definido como um e sua coluna está definida como 0. Mas se eu fosse definir a coluna para dizer três, você pode ver que ela então a move para a terceira coluna. Agora, ao contrário das caixas horizontais e verticais, você também pode alterar o alinhamento. Então, aqui no painel Detalhes, se quiséssemos dizer B no canto inferior direito, poderíamos fazer isso usando essas opções de alinhamento. Agora também podemos adicionar widgets ao nosso painel de grade uniforme usando código. E é aqui que eles se tornam realmente poderosos porque podemos usar painéis de grade uniformes para criar coisas como inventários ou listas mais avançadas. Então, para dar um exemplo de como você faria isso, vou criar um novo widget que também podemos usar a borda e a sobreposição n. Então vamos para o Navegador de conteúdo. Vou apenas clicar no botão Adicionar, ir para a Interface do usuário e o Widget Blueprint selecionará usar um widget e ele descerá. E nós fomos para casa e S2, BP e Scott grid slot. E vamos abrir isso. Eu só vou arrastar o meu até o topo aqui assim. Então, para começar, vamos adicionar o widget de borda à hierarquia, assim mesmo. Com ele selecionado, você pode ver as configurações da nossa borda no painel Detalhes. E aqui é onde podemos definir coisas como se quiséssemos usar uma imagem e isso basicamente transformará nossa borda em uma imagem. Também podemos definir a cor. Então, por exemplo, se eu quisesse que fosse cinza, eu poderia simplesmente transformar a cor aqui em um cinza mais escuro assim. E também nos dá opções de preenchimento. Portanto, isso afetará todas as crianças que adicionarmos a essa fronteira. Agora, as fronteiras só podem ter um filho. É muito útil atuar como uma espécie de plano de fundo ou contêineres para outros widgets. E um desses widgets é a sobreposição. Então, se pegarmos a sobreposição e adicionarmos isso à nossa borda assim, agora, se eu quiser adicionar outra criança à borda, não posso. Então, se eu pegar a imagem, você pode ver que ela não me deixa adicioná-la à borda, mas nossa sobreposição pode ter quantos filhos quisermos. Então, vamos adicionar nossa imagem à nossa sobreposição assim. Agora, com a sobreposição selecionada, você pode ver que ela realmente não tem nenhuma das suas próprias configurações. E isso é porque ele realmente não faz nada visual. Tudo o que ele faz é nos permitir adicionar vários widgets a ele. E esses widgets se sobrepõem uns aos outros para que não sejam movidos em uma direção horizontal ou vertical diferente. Eles estavam todos empilhados um em cima do outro. Portanto, antes de começarmos a criar esse widget, vamos alterar o tamanho da nossa visualização aqui porque atualmente é 1920 por 1080, o que é muito grande. Então, vamos mudar a opção de tela cheia aqui para desejada assim. Agora, o que isso faz é basicamente dizer ao widget para ocupar tanto espaço quanto o conteúdo dentro dele. Então, no momento, é muito pequeno porque nossa imagem ocupa apenas uma quantidade muito pequena de espaço. Mas se selecionarmos nosso widget de imagem e definirmos a imagem para outra coisa. Então eu vou escolher esse rostinho verde. Você pode ver que ele fica maior porque nossa imagem é maior do que poderíamos aumentar esse tamanho se quiséssemos, digamos 128 por 128 assim. Agora você pode notar, se aumentar o zoom, que a parte superior está mais próxima da borda e do lado. E isso porque se voltarmos para a nossa fronteira, o preenchimento é definido como 42. E se clicarmos no menu suspenso, você pode ver que os valores esquerdo e direito ou quatro pixels. Portanto, está a quatro pixels da borda da nossa imagem. E então a parte superior e inferior são duas. Então, se quiséssemos que isso fosse tudo a mesma coisa, poderíamos fazer isso. Então, vou definir o meu para dizer dez assim. Portanto, temos apenas uma lacuna de dez pixels entre nossa borda e aquele widget de sobreposição que está contido dentro de nossa borda. Então, agora temos nossa imagem de ícone aqui. Vamos adicionar alguns textos também. Então, vamos pegar algum texto e adicioná-lo à nossa sobreposição. Veja que ele apenas se sobrepõe à nossa imagem. Agora, nosso texto é bem grande no momento, então vou selecioná-lo e apenas alterar o tamanho da fonte para dizer 16 ou talvez 40. Assim. Vou mudar o texto para dizer apenas 99, por exemplo. E vamos configurá-lo para alinhar ao canto superior direito, então usaremos a linha certa e depois faremos, na verdade, vamos apenas deixá-la como linha superior. Então, agora está no canto direito. Agora, talvez quiséssemos adicionar, digamos, uma barra de progresso ao nosso espaço de grade. Nós podemos fazer isso. Então, vamos pegar nossa barra de progresso para a sobreposição também. Agora eu quero isso na parte inferior central aqui. Então, vou selecionar o alinhamento central e, em seguida, o alinhamento inferior, assim. Agora podemos alterar o tamanho da nossa barra de progresso usando uma caixa de tamanho. Então, se clicarmos com o botão direito do mouse e pudermos fazer rap com, então faça rap com caixa de tamanho. Isso nos permitirá definir o tamanho exato que queremos que nossa barra de progresso supere. Assim, podemos alterar a largura e a altura, definir a largura para algo como 95 e a altura para talvez dez. E agora temos uma barra de progresso adicionada à nossa sobreposição. Esses são os tamanhos exatos que queremos usar. Agora, talvez eu queira empurrá-lo um pouco de baixo aqui. Poderíamos usar o preenchimento para fazer isso. Com nossa caixa de tamanho selecionada. Podemos clicar no menu suspenso de preenchimento e preenchê-lo das bombas, digamos, cinco pixels assim. Então, agora temos nosso widget de slot de grade todo disposto usando uma sobreposição, apenas nos permite sobrepor todos esses widgets diferentes no mesmo espaço, enquanto nos dá o controle do preenchimento e alinhamento. configurações. Então, agora vamos compilar e realmente adicionar esses slots de grade à nossa grade uniforme dentro de nosso capô usando código. Então, antes de fazer isso, vamos excluir essas imagens que adicionamos à grade uniforme. Com nossa grade uniforme, vamos selecioná-la. Vamos chamar isso de grade. Agora. Precisamos assumir a variável é que possamos acessar essa grade no código, compilar e seguir para a visualização do gráfico. Então, para começar, vamos mover esse código para cima e para fora do caminho. E vamos adicionar uma sequência agora só para que possamos ter as duas partes do código um. Então, isso executará esse código primeiro e depois adicionaremos o resto do nosso código aqui. Então, começaremos arrastando e procurando por loop. Queremos a opção for-loop aqui em baixo. E isso nos permite basicamente especificar o índice inicial e final, que controla quantas vezes o corpo do loop realmente será executado. Então, vou definir meu último índice. Você diz nove? Então isso agora será executado dez vezes porque 0 é essencialmente um. Então, para cada vez que esse loop for executado, queremos criar qualquer widget. Então, vamos arrastar para fora do corpo do loop e criar um widget assim. Então, como antes, precisamos de um lugar para se apropriar. Então eu vou me arrastar para fora e conseguir o Owning Player. Agora vamos apenas fornecer o Jogador Proprietário do HUD. E então precisamos definir a classe, então vamos definir isso para o slot da grade. Em seguida, precisamos obter nosso painel de grade e adicionaremos esse novo widget ao nosso painel de grade. Agora, porque os filhos de uma grade uniforme podem ter uma linha e uma coluna que define o quão longe, vertical e horizontalmente lá. Precisaremos fazer algumas contas para determinar onde nossos novos espaços de grade devem ser posicionados. Então, ele será arrastado para fora do painel de grade. Você adicionaria criança à grade do uniforme? E vamos conectar isso ao widget de criação lá. Agora, o conteúdo será apenas o novo widget que criamos, mas também temos uma linha n e depois na coluna, agora queremos me mostrar como isso funciona. Então, o que vamos fazer é primeiro armazenar o índice. Então, vou apenas arrastar para fora do valor do índice em nosso loop for e promover a variável. Eu só vou mantê-lo chamado índice. E vamos conectar isso ao nosso loop aqui assim. Agora também precisamos saber quantas colunas de largura nosso painel de grade terá. Então, vamos criar uma nova variável para isso. Vou chamar minhas colunas assim. E vai ser um número inteiro. Então, basta defini-lo como inteiro, então vamos compilar. E então precisamos dizer valor padrão. Então, vou definir o meu para três. Então, para começar, nosso painel de grade terá três widgets de largura. Agora, usando nossos valores de índice e coluna, podemos determinar em quais slots de grade de linha e coluna devem estar. Ele pegará nosso índice e dividiremos isso por nossas colunas. Então, divida, conecte-se em até n linhas. E queremos dividir isso por nossas colunas assim. Agora, a razão pela qual isso funciona é porque quando dividimos o índice pelas colunas, se esse valor do índice estiver abaixo do valor da coluna. Portanto, se for um ou dois, o retorno sempre será 0 porque dois dividido por três é 0, porque esses são inteiros. Portanto, só há números inteiros até que esse índice seja gratuito. Assim, o valor de retorno do nó de divisão r será 0. Isso significa que nossos widgets permanecerão na altura vertical 0 até que esse índice seja liberado. E então esse nó realmente retornará um porque três dividido por três é um. Então, isso realmente moverá nosso widget agora para a próxima linha vertical. Então temos as colunas. E isso realmente funciona de forma semelhante. Então, copiaremos essas duas variáveis e arrastaremos para fora do meu índice e faremos o símbolo de porcentagem. Então esse é o símbolo de porcentagem, quadril. Agora, esse é o modo. Então, o que isso faz essencialmente ainda é dividir esses dois valores um pelo outro. Mas em vez de nos dar o resultado, ele nos dá o restante. Então, se conectarmos isso a colunas, se você imaginar que o índice é um e as colunas estão livres. Bem, se estivéssemos dividindo-os, o resultado seria 0. Mas como estamos recebendo o restante, o restante será um. Se nosso índice for dois e nossas colunas forem três, e nosso restante será dois. E é isso que empurra nosso widget ao longo do eixo horizontal. Agora, na verdade, terminamos nossa configuração para gerar nossas grades e adicioná-las ao widget de grade uniforme para que possamos compará-lo e realmente ver como isso fica no jogo. Então, vamos apertar play. Veja que agora temos nossa grade. Você pode ver que são três web e, em seguida, está adicionando dez widgets. Então, temos nove e depois dez na parte inferior aqui. Agora, atualmente, está um pouco apertado porque nossa grade uniforme real é muito pequena para caber em todos esses widgets. Então, o que podemos fazer é voltar ao nosso HUD, ir para o design da visualização, e com nossa grade uniforme selecionada, podemos simplesmente assumir o tamanho do conteúdo em C, ficou muito pequeno porque atualmente ele não tem nenhum conteúdo. Mas quando compilamos, clicamos em Play. Você verá que agora todos os nossos widgets estão no tamanho correto. Se quiséssemos, poderíamos voltar ao nosso HUD. Poderíamos alterar o valor das colunas agradável e fácil apenas alterando o valor, é bom dizer cinco. E então, quando eu compilar e clicar em Play, você verá que agora tem cinco de largura. Agora, talvez você queira um pouco de espaço entre seus widgets que estão dentro da grade. Nós poderíamos fazer isso também. Assim, podemos voltar para o HUD. Em seguida, no design da visualização, selecione o painel de grade. E aqui podemos definir o preenchimento do slot. Então, podemos definir isso para dizer cinco. E teremos cinco pixels agora entre a ordem dos filhos da grade uniforme. Então, vamos apertar o play novamente. Você pode ver que agora temos uma boa lacuna entre esses widgets. Se você se lembra, como nossa lista, podemos alterá-los para botões. Atualmente, são apenas imagens estáticas, mas podemos alterá-las para serem botões, como fizemos com nossa lista vertical aqui também. Então, se voltarmos para o nosso slot de grade, podemos embrulhar nossa sobreposição aqui em um botão, então vamos embrulhar com o botão du. Você pode ver que agora temos um botão e, como ainda estamos usando a borda como plano de fundo, você pode ver que o botão realmente tem essa lacuna de dez pixels. Então, se quisermos nos livrar disso, podemos simplesmente selecionar nosso botão, preencher e definir isso como 0. E você vê que agora nosso botão está indo direto para a borda da nossa fronteira. Mas ainda temos um pouco de preenchimento estranho nas laterais do nosso widget. E isso porque se selecionarmos um botão aqui e rolarmos para baixo, você encontrará na seção Acredito que esteja instalado. Sim. Se abrirmos o estilo, você verá que temos preenchimento normal e preenchimento de pressão agora porque temos 12 aqui. Se abrirmos isso, você verá à esquerda e à direita, temos 12 padrões e é isso que está nos dando essa grande lacuna. Se quisermos mudar isso para ficar par em todos os lados, podemos simplesmente mudar esse número superior aqui, digamos cinco, e então faremos a mesma coisa com o preenchimento de imprensa também. Mude isso para cinco e depois compilaremos. Você verá que agora temos a quantidade correta de preenchimento de cada borda do nosso widget. Agora adicionamos um botão ao nosso widget de slot de grade. Podemos executar o código quando esse botão é pressionado para que possamos rolar até o final aqui, temos nossos botões selecionados. Podemos adicionar eventos onclick, para que possamos adicioná-los. E quando o coletamos, podemos executar algum código. Então, vou apenas adicionar uma string impressa aqui. Agora, quando compilarmos isso e clicarmos em Jogar, você verá que temos nossos slots de grade que são destacados como um botão. E se eu pressioná-los, você pode ver que a string de impressão está sendo executada. Agora, nosso painel de grade uniforme também pode funcionar em uma caixa de rolagem. Se sairmos dos planetas para bater de cabeça para o hub, então se selecionarmos nosso painel de grade e clicarmos com o botão direito, faça rap com e queremos a caixa de rolagem assim. Agora, nossa caixa de rolagem, nós realmente queremos definir um tamanho, porque se tivermos até o tamanho, conteúdo nunca abrirá essa pequena barra de rolagem porque ela continuará ficando maior. Então, queremos desmarcar isso e escolher um tamanho. Então, eu vou fazer o meu um pouco mais largo assim, mas eu vou torná-lo mais curto. Então, temos nossa barra de rolagem. Em seguida, vamos compilar. E só queremos garantir que nosso painel de grade esteja configurado para preencher horizontalmente e verticalmente. Então vamos apertar play. Devemos ver que temos nossa caixa de rolagem vertical aqui. E podemos, se eu pressionar Shift, podemos percorrer nossa grade assim. Agora, talvez você queira adicionar um plano de fundo a essa caixa de rolagem. Podemos fazer isso usando fronteiras. Então, se sairmos agora e voltarmos ao nosso HUD, podemos selecionar nossa caixa de rolagem e envolvê-la com uma borda. Então, vamos fazer fronteira. Então, agora nossa caixa de rolagem está contida dentro da borda. Se aumentarmos o zoom, você pode realmente ver que tem um pouco daquele preenchimento estranho acontecendo. Então, se selecionarmos nossa borda aqui e encontrarmos o preenchimento, vou definir o meu para realmente vendê-lo para dizer dez. Agora nos dará uma grande fronteira. E depois mudaremos a cor. Assim, com nossa borda selecionada, podemos ir até as configurações do pincel. E, novamente, você pode definir uma imagem aqui se quiser. Só vou usar a cor do pincel. E podemos definir isso para dizer ser essa cor vermelha aqui. Agora, quando compilamos e clicamos em Play, você verá que agora temos aquela bela cor de fundo que selecionamos e ainda podemos percorrer nossa lista perfeitamente. Então é isso para esta lição. Espero que agora você entenda um pouco mais sobre todos esses três tipos de widget. 44. Widgets (arrastar e soltar): Olá pessoal. Nesta lição, vamos dar uma olhada nas operações de arrastar e soltar usando widgets. Agora, se você não acompanhou nossa lição anterior, criamos essa grade aqui. Temos esses widgets diferentes e os colocamos dentro de uma caixa de rolagem. Eu recomendo fortemente seguir essa última lição, porque na verdade vamos usar esses widgets para arrastar e soltar. Então, só para começar, vou tornar isso um pouco maior, então temos um pouco mais de espaço para trabalhar. Então, vamos até o capô e eu vou pegar nossa caixa de rolagem ou, na verdade, desculpe, nossa borda aqui, o que vai tornar isso um pouco maior assim. Em seguida, entraremos na visualização Gráfico e adicionarei mais alguns slots também. Então, vamos definir isso para dizer 19. Portanto, teremos 20 slots desta vez, podemos testar isso, clicar em Play. Você pode ver que temos todos os nossos slots aqui e nossa barra de rolagem também está funcionando corretamente. Então agora podemos X fora do editor de avião e vamos para o nosso widget de slot de grade, depois vamos para o modo gráfico. Agora, aqui nas funções, temos algumas funções que podemos substituir. E essas são funções que todos os widgets têm embutidos. Como você pode ver, há muitos deles. Não vamos passar por tudo isso porque alguns deles são um pouco mais avançados. Mas se você passar o mouse sobre eles, receberá uma pequena dica de ferramenta que diz pelo que essas funções são responsáveis. E há alguns que são úteis para se familiarizar. Então, temos coisas como o botão do mouse pressionado. Então, isso vai ser executado se você pressionar o botão do mouse enquanto o mouse passa sobre o widget e o jogo, temos coisas como as funções de arrastar aqui. Vamos usá-los hoje para criar um sistema de arrastar e soltar. Também há funções para entrar e sair do mouse. E isso é, eles serão executados sempre que nosso mouse passar sobre nosso widget e parar de passar o mouse sobre nosso widget. Mas vamos começar com o e arrastar detectado. E essa será a função que detecta quando pressionamos o mouse enquanto ele está sobre esse widget e começamos a movê-lo. É quando ele detecta um arrasto e essa função estará errada. Então, vamos clicar nisso para substituir essa função. E aqui temos algumas entradas e saídas. Então, apenas para cobrir rapidamente essas entradas, você tem minha geometria e isso basicamente fornece informações sobre posição do mouse em relação à localização da tela e coisas assim. Você provavelmente não usará isso com muita frequência. Mas o que você pode estar usando com muito mais frequência é o evento pointer. Isso nos permite baixar coisas como o botão do mouse, por exemplo. E podemos usar isso agora para verificar qual botão do mouse foi realmente pressionado quando o medicamento foi detectado, porque podemos arrastar com os dois botões do mouse à esquerda, à direita e ao meio. Então, se quiséssemos que esse código fosse executado apenas para, digamos, o botão esquerdo do mouse, então gostaríamos de verificar se o botão de cliques, o botão esquerdo do mouse. E tudo o que fiz foi clicar no pequeno botão e clicar no botão esquerdo do mouse para configurá-lo para o botão esquerdo do mouse. Também podemos usar esse evento pointer para obter o nome do botão que foi pressionado. Então, poderíamos começar a afetar o botão. E a partir daqui podemos fazer gets display, e podemos obter o nome de exibição da chave. E isso apenas nos dirá qual chave exatamente foi pressionada quando esse medicamento foi detectado. Mas, por hoje, vamos usar o botão do mouse para baixo. Então, basta realçá-los e excluí-los, e eu vou fazer com que esse código só seja executado quando deixarmos o botão do mouse arrastado. Então, vou adicionar um if aqui, conectar isso ao nosso nó inicial aqui. E então vamos conectar o resto do código ao nosso verdadeiro. Então, agora estamos prontos para realmente usar as notas da operação Criar arrastar e soltar, vamos clicar com o botão direito do mouse e pesquisar por Criar, Criar, arrastar. E queremos uma operação de arrastar e soltar como essa. E vamos conectar isso com o verdadeiro assim. Agora, podemos usar um widget existente, mas na verdade vou criar um novo widget que será usado basicamente para seguir o mouse quando arrastarmos e soltarmos. Então, vamos criar um novo widget. Então, vamos compilar e salvar isso por enquanto. E clicaremos com o botão direito do mouse no Navegador de conteúdo, vá para Interface do usuário. Faça o Blueprint do Widget. Use um widget e role para baixo e chamaremos esse BP. Mova o widget assim. E abriremos isso, seja o que for. Eu só vou arrastar o meu até o topo aqui assim. Agora, quando realmente arrastamos do nosso widget de slot de grade, esse será o widget que será criado e seguirá nosso mouse enquanto movemos o mouse. Então, vamos querer, digamos, uma imagem para isso. Então, vamos começar com uma sobreposição. Então ele vai pegar uma sobreposição, colocar isso aqui, então eu vou pegar uma imagem. O motivo pelo qual estou começando com uma sobreposição é apenas para que possamos ter vários widgets, como uma imagem e algum texto, por exemplo. Então, vamos pegar algum texto também, que é ampliado aqui. Agora vou definir o tamanho da minha visualização para o desejado para que possamos ver exatamente o tamanho do widget. Vou mudar a imagem para dizer 64 por 64. Vamos configurá-lo para ser, faça com que seja essa carinha vermelha. Em vez disso, mudaremos nossos textos para um pouco menores, então faremos como 14. Agora nossa imagem ainda é um pouco. Lá vamos nós. Queremos mudar seu tamanho novamente. Nós mudamos para 64 por 64, assim, e vamos tornar nossos textos um pouco menores, ainda assim, como 12. E vamos configurá-lo para apenas escrever, por exemplo. Agora eu quero que meu texto esteja no canto direito, para que ele use o alinhamento correto. E isso parece bom para mim. Novamente, este é apenas um exemplo rápido, mostrando apenas como podemos configurar um widget e arrastá-lo. Agora vamos voltar para o nosso espaço de grade. E no on drag detectado, nós realmente precisamos criar aquele widget que acabamos de criar. E então forneceremos isso para nossa operação de arrastar e soltar. Então, isso os moverá um pouco. E vamos arrastar e pesquisar por widget de criação. E queremos definir o Jogador Proprietário para a classe proprietária. Então, procuraremos por um jogador proprietário, conectaremos isso e definiremos a classe para o widget de movimento que acabamos de criar. Em seguida, pegaremos nosso valor de retorno de nossa nota Criar Widget e conectá-lo ao visual de arrastar padrão. E conectaremos nossa operação Create drag drop ao nó retornado. E queremos usar o valor de retorno para fornecer a operação ao retorno. Observe aqui. Agora temos alguns pinos adicionais em nossa nota de operação de arrastar e soltar aqui temos uma classe. Eu não vou cobrir isso porque isso é principalmente C mais coisas e você praticamente sempre está usando o padrão de qualquer maneira, você pode adicionar algumas tags. Assim como em nossa lição sobre tags, você pode adicionar algumas tags diferentes a isso. E então, do outro lado, quando realmente soltarmos nosso widget, digamos que outro widget será capaz de ler essas tags. E então temos carga útil. Agora, a carga útil pode ser qualquer objeto que você quiser. Pode ser um ator ou o que quer que seja. E esse objeto pode ser usado para armazenar variáveis ou funções. E, novamente, teremos acesso a isso em qualquer widget em que soltarmos a operação. Assim, você pode, se estiver passando informações desse widget para o widget em que as colocamos. Você pode incluir algumas tags ou até mesmo um objeto que tenha apenas uma tonelada de informações que você pode ler nesse outro widget. Agora, por enquanto, não vamos usá-los porque eles são um pouco mais avançados. Mas também temos uma opção de pivô. Agora, é basicamente aqui que o widget será bloqueado quando estiver no mouse. Portanto, se estiver no centro, significa que nosso mouse, se ficar parado, o widget estará ao redor do mouse com o mouse no centro. E à medida que o arrastamos, o mouse sempre fica no centro do nosso movimento, que à medida que nos movemos. E há algumas opções diferentes aqui que você pode escolher. Eu só vou manter meu centro de saúde. E então você tem alguns deslocamentos para que você possa adicionar alguns deslocamentos de pixel. Talvez você quisesse que o mouse estivesse no centro do widget de movimento, mas queria adicionar, digamos, um deslocamento de dez pixels para a esquerda. Você poderia fazer isso usando esses valores. Agora, atualmente, esse código nunca será executado. E isso porque precisamos dizer ao widget quando há algo sendo arrastado. Então, para fazer isso, nós realmente precisamos ir para a substituição e precisamos descer até o botão do mouse para baixo. Agora, isso será executado sempre que o botão do mouse for pressionado na parte superior do nosso widget. Então, para começar, primeiro queremos verificar qual botão do mouse foi pressionado. Então, vamos sair daqui e começar a afetar o botão. E a partir disso, podemos realmente nos arrastar e fazer iguais. E isso nos permite verificar se esse botão é igual ao botão que definimos aqui. Então, vou clicar no pequeno botão do teclado aqui e depois com o botão esquerdo do mouse. Então, ele o define para o botão esquerdo do mouse. E adicionaremos um nó if. Então, vai funcionar se assim for. Agora podemos ter, se você quiser, se você adicionar o código para o qual deseja que ele seja executado quando o botão esquerdo do mouse clicar em nosso slot de grade. E o código diferente que é executado quando escrevemos o clique do mouse, você gostaria de adicionar isso aqui para que pudéssemos copiar e colar esse nó, conectá-lo ao botão de efeito, e então podemos mudar isso para mouse branco. Então poderíamos ter outro se, se o botão esquerdo do mouse fosse pressionado o pino verdadeiro aqui seria executado. E se o botão direito do mouse foi pressionado e a tropa, e aqui estamos bêbados. E então você pode ter um código diferente dependendo de qual é pressionado. Agora, porque eu só quero que minha operação de arrastar e soltar seja executada quando deixarmos o botão do mouse, vamos adicionar esse código aqui. Então, vamos sair do verdadeiro e vamos procurar por detecção de arrasto. Queremos detectar drogas se pressionadas, então precisamos dos eventos do ponteiro. Então, vamos pegar o evento do mouse e conectar até o ponteiro de m. E, em seguida, a tecla de drogas, que vai clicar no teclado e clicar com o esquerdo do mouse para configurá-lo para o botão esquerdo do mouse, como isso. E esse nó basicamente vai detectar, é o mouse atualmente arrastando nosso widget. E se for, queremos passar isso para o nó retornado e o valor de retorno para o valor de retorno. E isso é, na verdade, o que fará com que a função de texto seja executada e, em seguida, faça com que todo o código que adicionamos aqui seja executado também. Então, voltando para você com o botão do mouse para baixo, sempre queremos que todos os pinos retornem um valor aqui que é importante para o manuseio do mouse e coisas assim. Então, o que faremos é copiar uma nota escrita, colar aqui embaixo. E talvez quando clicarmos com o botão direito do mouse no widget, desculpe, queremos que algo mais aconteça, então vou apenas adicionar, digamos, imprimir string aqui. Podemos conectar isso ao valor de retorno e, em seguida, ele copiará e colará aqui embaixo. Então, se não for o botão esquerdo do mouse nem o botão direito do mouse, talvez seja o botão do meio do mouse, por exemplo. Só não queremos que nada aconteça. Agora, não queremos deixar esses pinos de valor de retorno vazios assim. Precisamos fornecer um manipulado ou não manuseado. Então, se arrastarmos e procurarmos por manipulados, agora, se retornarmos uma alça que basicamente diz ao mecanismo, Ei, nós lidamos com a entrada do mouse. Não deixe que nenhum outro widget lide com isso. Portanto, não execute mais eventos porque o mouse foi pressionado. Então, poderíamos usar isso para, digamos, esse código no botão direito do mouse pressionado, mas talvez não para o nó aqui embaixo. Para que possamos nos arrastar e fazer sem tratamento. E isso só diz ao motor, Ei, não fizemos nada com a entrada do mouse. Se outra pessoa quiser usar essa entrada, então permita. Então, usamos sem tratamento aqui. Então, deve ficar assim. Agora, há uma mudança que precisamos fazer designer. Então, se voltarmos lá, se você se lembra, adicionamos um botão que basicamente estamos usando como plano de fundo que nos permitiu pressionar esse widget. Agora precisamos remover esse botão. E a razão para isso é que os botões substituem o código que adicionamos aqui. Então, se estivéssemos pressionando este botão ou o botão do mouse para baixo, na verdade não correríamos porque o widget de botão lida com isso. Então, para remover esse botão, é realmente uma maneira muito fácil de fazer isso. Podemos simplesmente clicar com o botão direito do mouse no widget aqui e podemos descer para substituir por, e há uma opção para substituir por filho. E basicamente o que isso faz é simplesmente excluir o botão e depois dizemos à sobreposição para substituí-lo. Então, vamos substituir por substituído por criança. E você pode ver que nosso botão sumiu e estamos de volta à sobreposição com todos os seus widgets. Agora, se quiser, você pode adicionar um pouco mais de preenchimento de volta à sobreposição. Então, vou acrescentar cinco ou dez, na verdade, parece um pouco melhor. Agora temos um pouco mais de preenchimento entre a sobreposição na borda. Então, agora podemos compilá-lo e podemos realmente testar isso. Acabamos de receber um aviso porque eu apaguei esse botão. Podemos simplesmente acessar o Gráfico de Eventos e você pode ver que ainda temos um evento desse botão, então podemos apenas destacá-lo, excluí-los e não teremos mais um aviso. Então, agora podemos realmente ir e testar isso. Então, vamos tocar em Play. Você pode ver que nossos widgets estão um pouco apertados porque as caixas de rolagem são um pouco pequenas demais, mas tudo bem. Não precisamos nos preocupar com isso no momento. Se clicarmos e arrastarmos um deles, você pode ver que realmente exibimos nosso widget. E eu tenho o controle da minha câmera no momento. Mas se eu apertar Shift, você pode ver que eu posso arrastar e se eu soltar, ele desaparece. Agora, atualmente não estamos fazendo nada com essas informações de operação de arrastar e soltar, mas agora podemos realmente arrastar fora de qualquer um desses widgets. E isso nos dá nosso pequeno widget de movimento aqui também. E se eu tentar arrastar do meu botão direito do mouse, você pode ver que nós realmente imprimimos os textos de saudação. Então, está imprimindo hello porque adicionamos essa string hello print ao evento press button. Então, agora temos a configuração de arrastar. Queremos poder passar informações entre esses diferentes widgets. Então, o que faremos é exalar planetas e voltar para a grade do quadril lento. E vamos criar uma nova variável, e chamaremos isso de tem item. E vamos deixá-lo como um tipo booleano e vamos compilar. Em seguida, vamos até o designer e vamos definir nosso pequeno ícone de rosto aqui para ser escondido se o booleano for falso. Então, vamos para a visibilidade aqui embaixo, usaremos um fichário. Então, vamos criar vinculação. E aqui vamos retornar, se o item for falso, retornamos que está oculto. Então, vamos nos arrastar do valor de giro. Faça um item selecionado dos EUA como índice. E se o item for falso, queremos ser escondidos. Se for verdade, queremos que seja visível. Então, podemos compilar isso. Agora, se voltarmos para jogar o jogo, você pode ver que todos os nossos ícones de rostinhos estão realmente faltando agora porque todos eles, por padrão, não têm item. Em seguida, vamos para o nosso HUD e, na verdade, vamos alterar o código aqui para que o primeiro slot sempre tenha seu item definido como true. Então, vamos arrastar para fora daqui e fazer um F. Queremos verificar se o índice é igual a 0. E nos conectaremos à condição. E se falso, que conecta isso até aqui. E se verdadeiro, queremos obter o valor de retorno do nosso nó Create Widget. E nós queremos fazer set has item e vamos defini-lo como true. Em seguida, conectaremos o final de volta ao nó Adicionar filho assim. Então, tudo o que estamos fazendo aqui é verificar, esse é o primeiro índice no loop? Se for, então definimos que tem item como true. E se conseguirmos fazer isso e clicar em Jogar, você verá que agora nosso primeiro slot tem um pequeno ícone de rosto, mas os outros não. Agora, em seguida, queremos verificar antes de fazer a operação de arrastar, se o sal do qual estamos realmente arrastando tem o item. Então, vamos tirar o X do quadril, voltar para o espaço da grade, e vamos para o mouse para tocar, arrastar os textos, adicionar um novo cheque, apenas mover isso para fora do caminho. Vamos arrastar e fazer se quisermos verificar se o item é verdadeiro, então permitiremos que a cooperação seca seja criada. E se não, não faremos nada. E também podemos testar isso rapidamente. Então vamos apertar play e eu pressiono Shift para soltar meu mouse. E você pode ver que, se eu me arrastar desses tipos, isso não cria uma cooperação seca. Mas se eu me arrastar desse lixo, ele faz. Em seguida, precisamos armazenar uma referência ao slot original do qual arrastamos. Porque quando o soltarmos em outro espaço que não tem o item, precisaremos atualizar o espaço anterior que tinha o item para dizer que ele não tem mais esse item. Portanto, precisamos de uma referência a esse slot original. Então, para fazer isso, vamos agir fora de jogo e vamos passar para a aposta Move, depois para o gráfico de eventos, e vamos criar uma nova variável. Vamos chamar esse widget antigo. E definiremos seu tipo para ser o widget de slot de grade que criamos. Então, esse é o mesmo em que estamos trabalhando. E vamos defini-lo como uma referência de objeto. E vamos pegar o pequeno olho aqui só que seja editável por instância e vamos compilar. Então, vamos voltar para a lixeira da grade. Aqui nas detecções de arrastar, queremos definir essa variável para o novo widget de movimento que acabamos de criar. Então, aqui podemos arrastar para fora, podemos definir widget antigo. Queremos definir esse widget antigo para ser próprio porque estamos nos configurando para ser o widget mais antigo. Então, vamos nos arrastar para fora disso e fazer a nós mesmos. E vamos conectar isso assim, e então vamos compilar. Então, agora precisamos de uma função que será executada quando realmente soltarmos ou arrastarmos para cima do nosso slot de grade. Então, vamos para a substituição e queremos encontrar a função drop aqui e vamos criá-la. Agora você pode ver que temos as mesmas entradas que tínhamos para nossas funções anteriores, mas temos uma nova agora chamada operação. E essas são basicamente todas as informações que fornecemos ao arrastar e detectar todas as informações que fornecemos aqui, podemos acessar agora no lançamento. Então, se eu arrastar e procurar por drag visual, você pode ver que posso obter uma referência ao visual da droga, e isso é uma referência ao widget que nós conectamos aqui. Então, usando isso, podemos realmente arrastar o custo para o widget de movimentação porque o nosso é um widget de movimentação. Se você se lembra quando o colocamos no medicamento, este é o widget de movimentação. Então, vamos custar para isso. E usando esse custo, podemos realmente acessar o widget antigo, obtém o widget antigo. E isso nos dá uma referência ao widget do qual originalmente arrastamos. Agora também podemos acessar as tags e a carga útil para que possamos sair da operação e obter tags. E isso nos dá a variável tags e também as plaquetas. Se obtivermos carga útil, também podemos adicionar acesso à referência de objeto que podemos fornecer aqui no nó de operação Criar arrastar e soltar. Então, agora voltando para a função On dropped, podemos excluir essas variáveis porque não vamos realmente usá-las. Em seguida, ele definirá os widgets antigos como item. Então, ele procurará por conjunto tem item. Precisamos definir isso como false porque ele não tem mais o item que precisamos definir R tem item como true, assim como item. Vamos definir isso como verdadeiro, assim. E vamos conectar isso até que o valor de retorno assumirá o valor de retorno porque processamos nosso código. Então, o que faremos, é verdade, e queremos conectar isso ao nosso custo aqui. Então podemos compilar isso e testar isso. Então, se formos para o mapa, pressionamos Play, eu vou apertar Shift para soltar meu mouse. Se eu começar a arrastar, você pode ver que nossa operação de arrastar e soltar está funcionando. Se eu soltá-lo em outra meia e ver que esse slot agora está visível e tem seu item definido como true e o anterior está definido como false. Podemos fazer isso com qualquer um dos nossos slots aqui, arrastando essa nova operação para os outros widgets. Se eu pegar meu widget e lançá-lo aqui, digamos, por exemplo, sobre esses outros widgets, você pode ver que nada realmente acontece porque não configuramos funções de soltar para esses outros widgets. Então, nada vai acontecer quando realmente liberarmos a operação descartada em cima deles. Então é praticamente isso para esta lição. Esperamos que agora você entenda como criar operações de arrastar e soltar com widgets e também como transferir informações de um widget para outro usando o visual de arrastar ou a referência do objeto de carga útil. 45. Blueprints de animação (visão geral): Olá pessoal. Nesta seção do curso, vamos dar uma olhada nos projetos de animação. Agora, Animation Blueprint. Então, como dizemos a uma Malha Esquelética quais animações queremos que ela reproduza? Agora, uma malha esquelética é geralmente uma malha que foi manipulada a um esqueleto em um programa de modelagem 3D. Então, uma vez no motor, podemos fazer com que o esqueleto reproduza uma animação e isso, por sua vez, faz com que a malha seja animada. Agora, nesta lição, vou mostrar uma rápida visão geral do editor Animation Blueprint, bem como a configuração de animação que vem com o modelo de terceira pessoa. Agora, antes de começarmos, alguns de vocês podem estar acompanhando as lições anteriores. Tudo o que fiz aqui foi criar um novo modelo de terceira pessoa. Então, temos um começo limpo para esta seção do curso. Então, para começar, vamos para o Animation Blueprint, que está dentro da pasta do personagem, depois manequins, animações. Você pode ver que temos dinheiro e Quinn Animation Blueprint. Então, nesta lição, vamos usar o dinheiro Animation Blueprint. E a razão para isso é que o projeto de animação de Quinn realmente usa o dinheiro como seu projeto pai. Então, toda a funcionalidade está dentro do nosso dinheiro Animation Blueprint. Então, vamos abrir isso. E eu vou arrastar o meu até a barra superior aqui assim. Agora você pode ver que atualmente estou interpretando um editor, então vou clicar no pequeno botão de parada aqui para parar isso. E agora abrimos nosso projeto de animação. Você pode ver que temos o gráfico de eventos. Se o seu não estiver aberto, você sempre pode abri-lo aqui na guia na parte superior. Ou você pode clicar duas vezes no gráfico de eventos aqui para abrir nossa animação. gráfico de eventos é o mesmo que qualquer outro gráfico de eventos que você usou e outros blueprints. Temos nosso código aqui em nosso gráfico de eventos. Temos nosso painel Meu Blueprint, onde podemos criar e encontrar nossas funções, variáveis, despachantes de eventos e macros. Agora, o objetivo principal do nosso Gráfico de Eventos dentro do Art Animation Blueprint é definir variáveis que são usadas dentro do nosso gráfico Anim. Então, para abrir isso, vamos para o painel Meu Blueprint aqui e clique duas vezes e eu sou gráfico e isso nos levará ao nosso gráfico Anim. Agora, isso realmente mudou um pouco desde a versão quatro do Unreal Engine. Portanto, você pode notar algumas diferenças se já usou o mecanismo de ML antes, mas começaremos indo apenas para a máquina de estado de locomoção aqui. Então, vamos clicar duas vezes nisso. Você pode ver que temos um estado e é aqui que podemos definir animações para jogar. Então, temos um estado ocioso e, em seguida, temos um estado de corrida de barra de caminhada. Se abrirmos nosso estado ocioso, você pode ver que temos uma animação aqui usando um reprodutor de sequência de animação que está realmente produzindo uma animação ociosa. Podemos ver qual animação ele está realmente reproduzindo pelo nome do nó na parte superior aqui. Ou, se o selecionarmos, podemos ir para a sequência e passar o mouse sobre a entrada e você pode ver que diz MM, sublinhado ocioso. Também podemos clicar neste pequeno botão de navegação no Navegador de conteúdo que nos levará à animação que está sendo usada lá. Podemos ver que esta é a animação que está sendo reproduzida sempre que nossos personagens estão nesse estado ocioso. Agora, voltando para nossa máquina de locomoção, você pode ver que podemos clicar na locomoção aqui na barra superior. Agora, na verdade, leve-nos para lá. Também temos um estado de corrida de barra de caminhada. Agora, se clicarmos duas vezes para abri-lo, você pode ver que temos um tipo diferente de nó que está sendo usado para reproduzir animação, senhor. Este é um nó de espaço de mistura e nos permite inserir uma variável como um float, por exemplo, e ter animações diferentes reproduzidas dependendo desse valor de fluxo diferente. Então, se selecionarmos este nó e seguirmos para a sequência ou a opção de espaço de mesclagem, desculpe, podemos ver que ele está atualmente definido como BSIMM walk run, e este é o espaço de combinação para nossa caminhada e corrida animações. Podemos ir para isso agora clicando no botão Navegar até o conteúdo. Isso nos levará ao espaço de mistura. E se abrirmos isso aqui, agora os espaços de mesclagem nos permitem adicionar várias animações e que elas façam uma transição suave entre si usando uma variável. Então você pode ver aqui que temos um valor de velocidade começando em 0. Esta é a animação que será reproduzida quando nosso valor de velocidade for 0. E se eu segurar Control e começar a mover meu mouse, você pode ver que a velocidade de visualização realmente aumenta e começamos a aumentar a velocidade de caminhada de nossas animações até chegarmos a esse ponto. Agora, este ponto aqui está definido para seguir em frente. Então você pode ver quando eu movo o ponto de visualização aqui, nossos personagens reproduzindo uma animação de caminhada para frente. À medida que continuo aumentando, começamos a receber essa animação em execução. E quando chegamos ao final, você pode ver que está definido para a corrida, e é isso que seremos jogados quando estivermos na velocidade 500. Assim, podemos usar isso para fazer uma transição suave entre animações de caminhada e corrida. Quando voltamos ao nosso Animation Blueprint, controlando qual animação está sendo reproduzida em nosso lado, nosso espaço de mistura usando essa variável de velocidade do solo que é então conectada a esse espaço de mistura nó. E dependendo da velocidade que temos, produziremos uma animação diferente para nossa pose de saída aqui. Voltando ao nosso gráfico Anim. E eu só vou clicar neles. Segure a barra superior aqui. Qualquer animação que sai da nossa locomoção é então inserida nesse dinheiro da locomoção. Agora, isso basicamente salva a animação atual que está sendo produzida pela nossa locomoção, para que possamos usá-la mais tarde. Agora voltando para a máquina de estado de locomoção, você pode ver que temos essas setas que vão entre nossos dois estados. Agora, essas são regras de transição e é assim que verificamos se devemos estar no estado ocioso. Ou o estado walk slash run. Então, se passarmos o mouse sobre um, você pode ver que temos essa variável que aparece na dica da ferramenta. E basicamente está dizendo que essa regra está definida para a variável should move. Então, se essa variável for verdadeira, então faremos a transição do nosso estado ocioso para a execução da barra de caminhada. E então, se eu passar o mouse sobre o de baixo aqui, é o mesmo que deve mover variável, mas com um não. Então, se essa variável for falsa, então faremos a transição de volta da corrida de barra de caminhada para o ídolo. E podemos clicar duas vezes neles para realmente ver o código. Você pode ver que é apenas uma variável conectada ao resultado. E então podemos fazer o mesmo com o código para a função que vai da caminhada ao estado ocioso. Então, se clicarmos duas vezes nisso, você pode ver que temos a mesma variável com um nó nó e, em seguida, isso é conectado ao resultado. Agora, essa variável deve mover é definida dentro nosso gráfico de eventos usando algum código e veremos isso um pouco mais tarde. Mas se voltarmos para a locomoção usando esses dois estados e essas duas regras, escolhemos se nosso personagem deve ou não reproduzir uma animação ociosa ou uma animação de caminhada ou corrida. Em seguida, produzimos esse valor do estado de locomoção para o caixa de locomoção. Então, podemos usar essa animação mais tarde. Agora, em nosso gráfico Anim aqui, se formos para o lado direito, temos esse nó de pose de saída. Agora, esta é a animação que realmente veremos no jogo. Portanto, qualquer animação que se conecte aqui é o que veremos quando estivermos jogando nosso jogo. Agora, atualmente, esses dois nós aqui em cima não estão realmente conectados a nenhuma dessas cadeias aqui embaixo. Mas se abrirmos nossa máquina estatal principal aqui, agora nossa máquina de estado principal é exatamente a mesma que nossa máquina de estado de locomoção. Eles fazem a mesma coisa. É só que nossos estados principais, máquina estatal tem estados internos diferentes. E se dermos uma olhada no estado da locomoção aqui, se clicarmos duas vezes nisso, você pode ver que estamos usando uma locomoção de pose de dinheiro. Agora, esta é a pose do dinheiro que definimos em nosso gráfico Anim. Então, se você olhar aqui, estamos configurando isso aqui, e então estamos usando-o neste estado de locomoção dentro nossa máquina de estado principal. Então é assim que esses nós aqui em cima estão realmente conectados ao resto do código. Agora, voltando para a máquina estatal principal, você pode ver que temos alguns estados aqui em cima que não estão realmente conectados ao nosso estado aqui embaixo. Agora, a razão para isso está no Unreal Engine cinco, temos esses novos aliases de estado, nós, e eles nos permitem conectar estados sem realmente ter regras se conectando a eles. Agora temos dois pseudônimos aqui. Temos os dois caindo e os dois pousando. Agora você pode dizer que é um alias pelo pequeno ícone no lado esquerdo. A forma como isso funciona é se eu selecionar os dois aliases em queda, por exemplo, você pode ver aqui no painel do lado direito, temos a locomoção em estados terrestres, tectônica. Agora, você terá uma caixa de seleção para cada estado que existe em sua máquina de estado. Então temos um para locomoção, que é aqui, salto que está aqui em cima, loop completo que está aqui, e depois pousar que tem aqui. Agora, se tivéssemos estados adicionais, eles também seriam listados. Agora, porque a locomoção e a terra de ambos os textos neste nó executarão todas as regras conectadas a ele enquanto estivermos na locomoção ou nesses estados terrestres. O que significa que essas duas regras aqui serão executadas cada quadro se estivermos jogando atualmente no estado de locomoção ou no estado terrestre. E é o mesmo para o nó terrestre R2 aqui. Este também é um alias e você pode ver que ele está marcado jump for-loop, que significa que se estivermos no estado de salto ou no estado for-loop, essa regra estará executando todos os quadros. E se em algum momento essa regra se tornar verdadeira enquanto estivermos em qualquer um desses estados. As duas terras nos farão a transição de qualquer um desses estados para nossa paisagem. E é assim que esses estados aqui em cima estão conectados aos estados aqui embaixo. Agora, apenas para cobrir as regras que estão acontecendo aqui enquanto o estado de locomoção está em execução e isso será executado sempre que nosso personagem estiver ocioso, andando ou correndo. E isso porque, se você se lembra, estamos usando esse cache de locomoção, que foi configurado pela máquina de estado de locomoção. E isso faz com que nossas animações ociosas e de corrida de barra de caminhada estejam sentadas lá. Então, enquanto esse estado de locomoção aqui está funcionando, os dois que estão caindo executarão todas as suas conexões para ver se as suas conexões para ver se uma dessas regras é verdadeira. E se a qualquer momento começarmos a cair, se cair se tornar verdade, faremos a transição da locomoção para o loop. E se estivermos caindo e houver uma velocidade maior que 100 no z. Então, se estivermos caindo além de uma certa velocidade, usaremos o estado de animação de salto em vez de apenas ir para o loop for. E então, na verdade, temos uma regra que vai entre nosso salto e nosso loop de fora-loop. E isso só verifica, nossa animação de salto está quase terminada. E se for, então nos fará a transição do nosso salto para o nosso loop de for-loop. E a razão pela qual ele faz isso é porque temos essa opção marcada aqui, que basicamente apenas verifica é a animação que estamos verificando. Quase terminei. Se for, então faremos a transição para o estado em que estamos verificando. Agora, a qualquer momento quando estivermos jogando ou pulando ou uma animação for loop permanece. Isso para pousar também estará funcionando. Ele estará verificando se está caindo falso? Se for, então isso nos fará a transição de Eva, o loop de quatro, ou saltará para a terra, e depois da terra para nossa locomoção novamente. Então esse é o básico de como nossos estados principais, máquina de estado, realmente funciona. Se voltarmos ao nosso gráfico Anim agora. Produza qualquer animação que estamos reproduzindo atualmente em nossa máquina de estado. Então, se estivermos apenas em nosso estado de locomoção, isso produzirá nossa animação de locomoção. Se disséssemos cair, isso tocaria nosso loop de for-loop. Então essa seria a saída que iria para isso, que é um slot de montagem. Agora, teremos uma lição inteira sobre montagens no futuro. Mas isso é apenas um slot que nos permite jogar uma montagem. Montage nos permite sobrepor uma animação em cima de nossas animações de movimento. Mas se nenhuma montagem estiver sendo reproduzida no momento, tudo o que acontecerá é que nossas animações de movimento entrarão no slot de montagem. Ele verifica se uma montagem está sendo reproduzida. Caso contrário, ele simplesmente passa e nenhuma alteração é feita. A menos que uma montagem esteja tocando. Em seguida, isso vai do nosso slot de montagem para o nosso equipamento de controle. Agora, eu não vou entrar muito na plataforma de controle neste curso simplesmente porque é um sistema enorme por si só, que poderia ter um curso completamente separado, mas podemos ver qual plataforma de controle está sendo executada. Então, vamos selecionar o nó. E no painel Detalhes, role para baixo, você pode ver que temos uma classe de plataforma de controle. Aqui. Está definido para o pé básico do manequim IK. E podemos encontrar isso clicando no navegador Procurar ativos e conteúdo. E podemos abrir esse controle, Rick, e você pode ver todo o código que está sendo executado por esse equipamento de controle. Agora, novamente, eu não vou passar por todos esses nós porque o equipamento de controle é um sistema bastante avançado. Mas basicamente o que isso faz é nossos pés para nós. Posso dar um exemplo rápido do que quero dizer. Então, vamos interpretar um editor. E se eu correr até essa rampa e colocar uma em meus pés para cima, você pode ver que o pé realmente aumenta sua altura porque a altura do solo é mais alta nesse ponto. Essa é apenas uma visão geral rápida do que plataforma de controle faz neste projeto aqui. E todo esse código está acontecendo dentro desta nota da plataforma de controle aqui. Então, ele pega em nossas animações de movimento, aplica essas novas posições dos pés para a altura do solo. E então ele coloca isso em nossas postagens de saída aqui para nossa animação final que vemos no jogo. Agora, à medida que passamos pelo gráfico Anim, você deve ter notado algumas variáveis como R está caindo variável aqui, toda a velocidade do solo dentro do estado de corrida da barra de caminhada. Essas são apenas variáveis normais que foram configuradas dentro do nosso gráfico de eventos. Assim, podemos usá-los em nosso gráfico Anim. Então, se formos para o Gráfico de Eventos agora apenas clicando nele no painel Meu Blueprint, como você pode ver, estamos dizendo algumas dessas variáveis que usamos no gráfico Anim. Então, temos nossa velocidade de solo aqui, que é apenas obter a velocidade do nosso componente de movimento. Em seguida, convertemos isso em um flutuador e definimos isso para a velocidade do solo. Temos outra variável chamada should move, que determina se devemos ser um estado de animação de ídolo ou nosso estado de animação de execução de barra de caminhada. E então temos a variável r está caindo aqui embaixo, que usa apenas os componentes de movimento é variável descendente que está embutida. E então pegamos isso e definimos isso como a variável está caindo. E tudo isso é definido pelo evento aqui chamado animação de atualização do modelo de evento. Isso executará todos os quadros e atualizará essas variáveis conforme necessário. Então, aqui em cima, temos a animação de inicialização do blueprint. Agora isso será executado de forma semelhante a um começar jogar notas. Então, isso será executado quando o jogo começar ou quando nosso projeto de animação for criado. Isso só pega o ator proprietário, que geralmente é o modelo do personagem. Nós causamos à variável de caractere do blueprint do personagem. E então também pegamos seu componente de movimentação de caracteres e o definimos como uma variável para que possamos usá-lo aqui para definir essas variáveis. Agora mostre onde realmente definimos qual Animation Blueprint nossos personagens estão usando. Vamos para o ThirdPersonCharacter. Então, para fazer isso, vamos para o Navegador de conteúdo e, em seguida, os blueprints de terceira pessoa abrirão o ThirdPersonCharacter Blueprint. Em seguida, podemos selecionar o componente de malha aqui no painel Componentes. E se clicarmos duas vezes nele, ele nos levará à janela de visualização. Agora superaqueça e o painel Detalhes. Contanto que o modo de animação esteja definido para usar o blueprint de animação, você deve ter essa opção Anime Class. E você pode ver aqui que está atualmente definido para o oito BP Quinn Animation Blueprint. Então, se você quiser mudar isso, basta clicar no menu suspenso aqui e encontrar seu novo plano de animação. Existem alguns que estão embutidos no motor, mas você normalmente não usará nenhum deles. Você usaria, por exemplo, nosso projeto de animação de dinheiro ou nosso Quinn aqui. Então, por último, como uma nota lateral, talvez no futuro você crie um personagem NPC que não se mova para lugar nenhum, e você só queira que ele reproduza uma única animação. Você pode fazer isso selecionando o modo de animação aqui para usar o ativo de animação. E então você pode definir uma única animação que você deseja que ela reproduza sem ter que ter um projeto de animação inteiro. Mas para personagens de jogadores, você sempre vai querer que isso seja configurado para usar o projeto de animação. E você quer ter certeza de que a aula de anime está definitivamente definida para o seu projeto de animação. Então, para nós, esse é o ABP Quinn aqui. Então é isso para esta lição. Não se preocupe muito se você não entender tudo. Em nossas próximas lições, abordaremos cada sistema com muito mais detalhes. 46. Blueprints de animação (Montagens): Olá pessoal. Nesta lição, vamos dar uma olhada nas montagens de animação. Montagens de animação, ou como contamos nosso projeto de animação, a animação específica que queremos que ela reproduza. Por exemplo, se seu personagem recarregar ou balançar uma arma branca, você usaria montagens de animação para reproduzir essas animações. Agora, nesta lição sobre algumas de nossas futuras lições, vou usar animações que não estão realmente incluídas no modelo de terceira pessoa. Na descrição da aula, colocarei um link para baixar as animações que eu uso nesta lição e também em nossas futuras lições. Depois de baixar e extrair esses arquivos, você deve acabar com uma pasta parecida com esta. Agora vamos adicionar esses arquivos aos nossos projetos. Então, vamos clicar no editor aqui, clicar com o mouse em nossa pasta de conteúdo e ir para mostrar no Explorer. Isso nos mostrará uma pasta de conteúdo. E queremos mover nossas animações de aula aqui para a pasta de conteúdo dessa forma. Agora você pode ver que isso é exibido dentro do nosso navegador de conteúdo. Agora, se abrirmos, se as animações não estiverem lá, não se preocupe. Tudo o que você precisa fazer é fechar e reabrir o projeto. Então, agora eu reiniciei meu projeto. E você pode ver dentro das animações da aula, todas as nossas animações estão aparecendo corretamente agora. Agora, vamos usar apenas uma dessas animações nesta lição. Essa será a animação de recarga. Portanto, se na pasta de animações de lições você procurar recarregar, verá que temos uma animação de recarga. Agora vamos usar isso para criar uma montagem. Para fazer isso, vamos clicar com o botão direito do mouse e ir até Criar, depois selecionar Criar e uma montagem. E vamos manter o mesmo nome. Então, eu só vou pressionar Enter. Agora temos uma nova montagem. Agora, se abrirmos nossa montagem de animação, você pode ver que realmente se parece muito com uma sequência de animação. Eu só vou arrastar o meu até aqui assim. Agora, a principal diferença é que temos esse slot de montagem e uma cena de montagem é como dizemos ao Animation Blueprint qual montagem queremos jogar. Então, se formos para o nosso projeto de animação de dinheiro, se você se lembrar que está em personagens, vamos nos livrar dessa pesquisa, ir para a animação de manequins e abrir um dinheiro da BP. Então, dentro do nosso gráfico Anim, se você se lembra, temos esse slot e ele está atualmente definido como slot padrão. Agora, se olharmos para trás em nossa montagem de recarga, isso também é definido como troca padrão. Agora, isso significa que se jogássemos nossa montagem de recarga, I Animation Blueprint seria capaz de reproduzi-la. Agora, atualmente, nossa montagem e nosso slot de montagem dentro de nosso projeto, ou ambos usando a mesma inclinação. Mas se selecionarmos o espaço aqui no painel Detalhes, você pode clicar no botão para baixo e ver que há alguns tipos diferentes incluídos no modelo de terceira pessoa. Agora, se mudássemos esse slot para usar um slot diferente e jogar, nossa montagem. Montage não jogaria mais porque teria um slot diferente do slot aqui. Agora, a principal razão pela qual podemos ter vários slots é porque você pode realmente fazer com que um personagem jogue mais de uma montagem ao mesmo tempo. Mas cada slot só pode jogar uma montagem. É por isso que podemos ter vários slots e ter montagens atribuídas a diferentes slots. Mas, para esta lição, vamos continuar com os slots padrão. Portanto, certifique-se de manter este slide definido como a opção padrão. E de volta à nossa montagem , certifique-se de que o slot padrão e o nome do slot estejam marcados aqui. Então, agora vamos escrever algum código para tocar nossa montagem. Então, vamos para o Navegador de conteúdo, vamos para a pasta de blueprint de terceira pessoa e, em seguida, abrir o blueprint de ThirdPersonCharacter. E aqui podemos adicionar um pouco de código que diz à nossa malha de caracteres para realmente reproduzir uma montagem. Então vamos clicar com o botão direito. Vou pesquisar o evento de entrada um e criaremos essa entrada deles. Então vamos pegar nosso componente de malha aqui, arrastar para fora dele e procurar por montagem de jogo. E isso vai nos criar esse novo nó aqui. Agora vou mostrar algumas das entradas e saídas desse nó. Comece com, temos montagem para jogar. É aqui que dizemos qual montagem queremos tocar. Então, vamos selecionar nossa montagem de recarga aqui. Temos o dramaturgo. Então, se isso for definido como um, a animação será reproduzida em sua velocidade normal. Mas se fôssemos definir para dizer que a animação seria reproduzida duas vezes mais rápido. Em seguida, temos a posição inicial, agora isso permite que você defina a hora exata em que deseja a montagem comece a ser executada. Então, por exemplo, se você tivesse uma montagem de 10 segundos e quisesse começar em dois segundos, então você definiria a posição inicial para dois. Em seguida, temos a seção inicial. Agora vou explicar isso um pouco mais adiante na lição. Então, vamos pular isso por enquanto. Então, para saídas, temos a saída de execução normal. Isso só será executado assim que o nó terminar de ser executado. Então, ficamos incompletos. Agora, isso será executado quando a animação terminar. Então nós temos que nos misturar. Agora, uma coisa legal sobre as montagens é que elas se misturam quando as tocamos. Assim, você obtém uma transição suave da animação original que estava tocando para a montagem. E então, quando a montagem estiver quase terminada, ela fará a transição de volta para a animação original. E essa mistura será executada quando a animação começar a transição. Aborde um pouco mais sobre as transições em um momento, mas seguindo em frente, fomos interrompidos. E isso será executado se cancelarmos ou pararmos nossa montagem. E vou explicar como podemos fazer isso um pouco mais tarde na lição. Por fim, temos algumas saídas de execução de notificação e um nome de notificação. Não vou cobrir notificações nesta lição porque, na verdade, teremos uma aula inteira apenas para notificações. Então, vamos pular isso por enquanto. Então, agora vamos terminar de configurar nosso código para realmente reproduzir sua animação. Na verdade, vou criar uma nova variável. Vamos chamar isso de recarregamento. Vou usar isso para que, se enviarmos spam para a única entrada, ela não reinicie nossa montagem repetidamente. Então, o que faremos é primeiro verificar se o recarregamento é verdadeiro. E se não for verdade, então vamos definir o recarregamento como verdadeiro assim. E vamos conectar isso à montagem da peça. Em seguida, queremos definir o recarregamento como falso. Quando a URA, ele termina de reproduzir a animação de recarga ou é interrompido assim. Agora estamos prontos para realmente testar isso, então vamos compilar e clicar em Play. E agora, quando eu pressiono um no meu teclado, nada realmente acontece. Agora, a razão para isso é que, quando importamos nossas animações de aula, elas realmente vieram com seu próprio esqueleto. Agora, mesmo que esses dois esqueletos sejam exatamente iguais, há dois recursos de esqueleto agora em nosso projeto, um que nossos personagens estão usando, um que nossas novas animações estão usando. Se expirarmos, temos editor simples e vamos para as animações da lição, abra o manequim, depois vá para malhas. Você verá que temos o manequim SK. Agora, este é o esqueleto ou menos que a animação. Então usando, mas se formos para a pasta Personagens, então para malhas de manequins, você verá que temos outro manequim SK. Agora, este é o esqueleto que são malhas de personagens usando. É por isso que nossas animações estão jogando, mas há um novo recurso e roupas íntimas no Jim Five chamado esqueletos compatíveis. Então, se formos para o esqueleto aqui dentro de nossa pasta de personagens, abra isso, vá para as janelas e queremos encontrar os detalhes do ativo e assumir isso. Agora, aqui você pode encontrar esqueletos compatíveis. Então, vamos adicionar uma nova entrada. Vamos selecionar o menu suspenso aqui. Vamos encontrar o esqueleto que está em nossa animação de aula. Então, se você passar o mouse sobre, você pode ver que diz menos do que animações, manequins cortados cortam malhas. Então, vamos clicar nesse. Então, vamos economizar. Agora, todas as animações que funcionam para a nossa aula. esqueleto de animação funcionará com nosso personagem. Então, se voltarmos ao nível aqui, aperte play. Agora, quando eu apertar um, você verá nossas montagens tocando muito bem. Se eu enviar um spam, você pode ver que ele não vai tocar a montagem a novamente até terminarmos de tocar a montagem original. E isso é por causa do booleano que configuramos para impedir que isso aconteça. Agora, uma coisa que você pode notar é enquanto tocamos a montagem, ou os pés não se movem com nosso corpo. Tudo está tocando essa montagem. Agora, em nossa próxima lição, examinaremos a mistura de ossos e isso nos permite separar partes do corpo umas das outras. Por exemplo, enquanto reproduzimos nossa animação de recarga, podemos ter as pernas. Eles poderão reproduzir as animações de movimento e abordaremos isso na próxima lição. Agora, outra coisa que você pode notar é se formos até a rampa aqui, você pode ver que minhas pernas para cima na rampa. E se eu apertar um, você pode ver que as pernas ainda permanecem levantadas e a rampa, mesmo que essa montagem esteja tomando conta de todo o corpo. Agora, a razão pela qual isso está acontecendo é porque nossa montagem aqui é tocada antes da plataforma de controle ser aplicada. Então, a montagem é tocada aqui. Em seguida, aplicamos o equipamento de controle, que lida com o posicionamento do pé, e então produzimos a pose final. É por isso que nossas animações de movimento estão sendo assumidas pela montagem, mas a colocação do pé não. Então, se eu fosse mover meu slot padrão aqui por um momento, dois, na frente do meu equipamento de controle assim. E conecte tudo isso. Agora, quando eu compilar, apertar Play, se eu correr para a rampa, você pode ver que o posicionamento do meu pé ainda está funcionando, mas se eu pressionar um, você pode ver que ele para de você pode ver que o posicionamento do meu pé ainda está funcionando, mas se eu pressionar um, você pode ver que funcionar enquanto eu estou tocando uma montagem. Então, ele voltará ao nosso Animation Blueprint e definirá esse backup como estava. Então, ele apenas avançará aqui, conectará isso e conectará nosso backup de montagem aqui. Assim. Se você sempre quis adicionar um novo slot de montagem ao seu gráfico anim, basta clicar com o botão direito do mouse em pesquisar por slot, rolar para cima aqui. Você pode usar o slot padrão do slot e selecioná-lo. E se você quiser usar um nome de slot diferente, você pode mudar isso aqui. Mas, por enquanto, podemos simplesmente excluir esse nó e compilar nosso gráfico de animação. Agora, as montagens também têm outros recursos. Podemos adicionar várias animações a uma montagem. Então, aqui, temos o navegador de ativos. Se você não tiver o seu, você sempre pode ir até o Window e acessar o navegador de ativos aqui. Agora, usando o navegador de ativos, podemos arrastar animações para usar com nossa montagem. Então, por exemplo, poderíamos usar o rifle estão ociosos no quadril longe. Vamos apenas arrastar isso. Agora você pode ver que temos as duas animações em nossa montagem. Agora, atualmente, ambos estão configurados para usar a seção padrão. Então, o que acontecerá é recarregar ou jogar o rifle, e então nossa animação ociosa do rifle será reproduzida. Mas usando seções, podemos dividir nossa montagem em seções diferentes e reproduzi-las de forma diferente. Então, para fazer isso, podemos clicar com o botão direito do mouse na barra na parte superior aqui e clicar em nova seleção de montagem. E poderíamos chamar isso de seção de loop. Agora temos essa linha roxa e podemos escolher onde essa seção começa. Então, se eu colocar isso aqui, nossa seção agora para a seção de loop é toda essa área aqui. E então nossa seção padrão é toda essa área aqui. Agora, atualmente, tudo o que acontecerá é nossa seção padrão será reproduzida e, em seguida, nossa seção de loop será reproduzida. Mas se formos para as seções de montagem aqui, você pode ver que temos alguns controles sobre como podemos reproduzir essas diferentes seções. Agora, novamente, se você não tiver essas seções de montagem, você pode ir até o Windows e marcar isso aqui. No momento, você pode ver que ele está reproduzindo a seção padrão no momento. Em seguida, ele passará para a próxima seção, que é nossa seção de loop. Eu só vou fazer minha janela um pouco maior aqui. Você pode ver que o botão está agora no lugar certo. Agora, se quiséssemos, poderíamos ter essas seções completamente separadas. Se clicarmos nesta seta aqui e removermos o link, você pode ver que agora essas são duas seções separadas, então apenas nossa seção padrão será reproduzida agora. Porque dissemos para não fazer nada depois de terminar de jogar. Agora, se quisermos que ele reproduza nossa seção de loop novamente, clique nesta pequena caixa e faça a seção de loop. E agora ele reproduzirá nossa seção de loop depois que a seção padrão for concluída. Agora também podemos fazer seções em loop. Então, se clicarmos nesta caixa ao lado de nossa seção de loop aqui, podemos selecionar a seção de loop novamente, e isso fará com que nossa seção loop aqui faça um loop repetidamente. Assim que nossa seção padrão terminar o loop, vamos jogar e isso continuará repetindo repetidamente. Como você pode ver agora. Agora, isso pode realmente ser útil para coisas diferentes. Digamos, por exemplo, que você estava fazendo uma animação de recarga para uma espingarda. Agora, normalmente você pode carregar balas individuais em uma espingarda. Então, talvez quando você estiver jogando recargas, só faltem duas balas na espingarda. Você só quer que a seção de loop seja executada duas vezes para colocar a bala duas vezes. Mas talvez, às vezes, quando o personagem recarregar, eles precisem colocar seis balas. Então, agora você precisa de uma seção de loop para executar seis vezes. Agora podemos fazer isso com a seção de loop e usando blueprints para controlar quantas vezes ela é executada. Então, se voltarmos para o ThirdPersonCharacter, mostrarei alguns dos nós que podemos usar para realmente controlar as diferentes seções que a montagem vai tocar. Então, vamos voltar para o personagem de terceira pessoa aqui e começar com, se você se lembra, temos essa seção inicial. Agora, se quiséssemos, poderíamos fazer nossa montagem tocar essa seção de loop imediatamente em vez de tocar a seção padrão primeiro, poderíamos fazer um loop aqui. Agora, se o compilarmos e jogarmos, ele nem reproduzirá mais o recarregamento. Então, ele pressionará um e você poderá ver que ele simplesmente pula seção padrão e vai direto para nossa seção de loop. Então, podemos voltar para o nosso ThirdPersonCharacter aqui. Agora, para ter acesso às nossas diferentes funções de montagem, precisamos obter uma referência a para nosso projeto de animação. Para fazer isso, vamos arrastar para fora dos componentes de malha, pesquisar, por exemplo, e usar o nó get anime instance. Agora, isso nos dá uma referência ao Animation Blueprint que estamos usando. Então, para nós, esse é o dinheiro da ABP. Agora, se eu me arrastar, eu posso realmente apenas obter variáveis que existem neste blueprint. Para fazer isso, precisaríamos custar para isso. Então, poderíamos custar dinheiro ABP. Então, a partir disso, poderíamos obter variáveis que são armazenadas dentro disso ou funções, se quiséssemos. Por exemplo, get deve se mover. Essa é uma variável que existe dentro do nosso projeto de animação aqui. Mas, para controlar nossas montagens, não precisamos custar, porque essas funções são incorporadas em todos os projetos de animação. Portanto, podemos excluir essas funções por enquanto, e podemos arrastar para fora do valor de retorno e procurar por montagem. E isso nos dará acesso a todas as diferentes funções que podem ser usadas para controlar montagens. Agora, um dos nós mais usados com seções é o salto para a nota de seção. Então, se criarmos isso, você pode ver que obtemos uma entrada de nome de seção. Então é aqui que colocaríamos em qual seção queremos que nossa montagem mude. Também podemos especificar uma montagem. Agora, se não especificarmos uma montagem aqui, o que acontecerá é se você tiver várias montagens tocando ao mesmo tempo, e todas elas tiverem os mesmos nomes de seção. Isso mudará todas as suas montagens para a seção que colocamos nela. Agora, se você quiser que isso aconteça com uma montagem, digamos, nosso rifle recarregar, nós apenas especificaríamos a montagem, queremos que isso aconteça também, para que possamos selecioná-lo aqui. E agora só mudaremos essa seção para esta montagem. Para que pudéssemos fazer uma demonstração rápida. Se clicarmos com o botão direito, procure por entrada Vamos adicionar isso e vamos colocar isso pressionado na montagem saltada para a seção. E vamos mudar isso para o padrão. Padrão assim. Agora, quando compilamos e pressionamos Play, se eu pressionar um para jogar, nossa montagem pode ver que está pulando direto para a seção de loop. Mas se eu pressionar também, você em C, verdade, agora está reproduzindo a seção padrão. Agora, há muitas outras coisas que podemos fazer com essas funções. Então, se voltarmos para o ThirdPersonCharacter e excluirmos essa montagem, pulamos para a seção. Podemos arrastar e pesquisar por toque. Eu não vou passar por tudo isso. A maioria deles é bastante autoexplicativa. E se você precisar de uma dica de ferramenta, basta passar o mouse e ela lhe dará uma boa explicação do que eles fazem. Mas um importante é parar a montagem. E isso nos permite dizer uma montagem para parar de tocar. Então, se clicarmos em parar montagem aqui, obteremos um nó que nos permite definir o tempo de mistura. Então, talvez você só queira que a montagem pare instantaneamente aqui. Você pode simplesmente definir isso como 0 e a montagem irá parar completamente instantaneamente. Ou talvez você quisesse que se misturasse lentamente. Você poderia colocar um tempo aqui e ele se misturará lentamente com essa montagem. Agora, novamente, você pode definir uma montagem aqui. Se você não fizer isso, isso simplesmente interromperá todas as suas montagens que estão sendo reproduzidas no momento. Se você fizer isso, você pode simplesmente especificar qual montagem deseja que ela pare. Então, se conectarmos isso às nossas duas entradas aqui, dissemos para parar a montagem de recarga. Então, vamos compilar, apertar Play, pressionar um para reproduzir essa montagem. E se eu pressionar para, ele interrompe instantaneamente o plano de montagem. Agora, por fim, eu queria mostrar como você pode ajustar os tempos de mesclagem e mistura para suas montagens. Para que possamos testar isso. Vamos para nossa montagem aqui, e eu vou realmente excluir nossa seção de loop e excluir essa animação também. Só para termos a recarga agora tocando aqui em nossos detalhes de ativos. E, novamente, se você não tiver isso, basta ir ao Window e encontrar detalhes do ativo para assumi-lo. Temos os tempos de mistura e mistura. Agora, quanto mais altos forem esses valores, mais tempo levará para que a animação os misture completamente e depois se misture totalmente. Então, se eu fosse definir isso para dizer 00 assim, voltaremos ao nosso modelo de terceira pessoa aqui. Eu só vou me livrar dessa seção de estilo. E não vamos parar a montagem, que é meio que deixá-la terminar sozinha. Então, vamos apertar play. E se eu apertar um, você verá que ele começa instantaneamente. Não há transição de uma ferramenta e ela também termina instantaneamente. Então, pressionaremos um e você verá que ele termina e começa muito rapidamente. Mas se quisermos transições mais suaves em nossa animação, podemos aumentar esses valores. Então diga 0,30.3 aqui também. Se voltarmos, clicarmos em Play, e agora, quando eu pressionar um, você verá a transição muito mais suave de e para a animação. Então, essas são configurações que você provavelmente usará bastante com montagens, porque se você tiver uma montagem rápida, você pode querer que os tempos de transição de entrada e saída sejam mais curtos. E se você tiver uma montagem longa, você pode querer outras mais longas. A última coisa que eu queria cobrir era o gerente da loja de anime. Então, se sairmos do editor de avião aqui e abrirmos nosso manequim SK, vá para o Windows e abra o gerenciador de slots de anime que abrirá o gerenciador de slots de animação. Agora, aqui é onde podemos adicionar novos slots ou excluir ou renomear slots existentes. Agora você pode notar que o nome mostrado aqui é , na verdade, o mesmo nome. Tão nítido quando selecionamos o slop, sem gorjeta. Esses são os slots definidos em nosso esqueleto. Então, é aqui que gerenciamos todos esses slots. Agora, algo a ter em mente com slots e grupos é um grupo só pode ter uma montagem jogando em todos os seus slots de cada vez. Então, por exemplo, se o slot de montagem de corpo inteiro estivesse tocando uma montagem, e então eu tocasse outra montagem usando o slot da parte superior do corpo que realmente cancelaria a montagem de corpo inteiro. E a razão para isso é que ambos estão no mesmo grupo. Então, se eu quisesse que minha montagem de corpo inteiro e minha montagem da parte superior pudessem tocar ao mesmo tempo, eu precisaria mover minha parte superior do corpo para um grupo diferente. Assim, eu poderia criar um novo grupo ou movê-lo para um existente. Se você quiser mover um slot para um grupo existente, basta clicar com o botão direito do mouse, configurar um grupo de corpos dois, e isso lhe dará uma lista de todos os grupos existentes que você pode mover nesse slot dois. Agora é isso para esta lição, mas também usaremos montagens muito mais em nossas futuras lições. 47. Blueprints de animação (códigos de mistura): Olá pessoal. Nesta lição, vamos dar uma olhada nos nós de mistura. Agora, os nós de mesclagem nos permitem jogar várias animações em nosso personagem ao mesmo tempo. Eles também nos permitem usar variáveis para controlar qual seção do nosso gráfico Anim está sendo reproduzida. Então, antes de começarmos, vou reutilizar algumas das coisas que montamos em nossa última lição, a aula de montagens. E se você se lembra dessa lição quando apertamos play e pressionamos um para realmente reproduzir nossa animação, se começarmos a nos mover, nossa metade inferior do nosso corpo não se move. E isso é porque eu recarrego animação está realmente ocupando todo o corpo. Então, hoje vamos usar um blend know para dividir nosso corpo ao meio para que possamos ter nossas animações de movimento reproduzidas na metade inferior enquanto a animação de recarga é reproduzida na metade superior. Então, começaremos saindo do editor de planos. Em seguida, vamos para o nosso gráfico de animação. Então, vamos para personagens do que manequins, animações, e vamos abrir o projeto de animação de dinheiro ABP. Agora, aqui em nosso gráfico de animação, o que está acontecendo é que nossa máquina de estado de locomoção está produzindo um ídolo ou uma animação de corrida. Estamos armazenando em cache essa animação neste nó de pose de locomoção seguida, dentro de nossa máquina de estado principal ou estado de locomoção como reprodução. E isso é apenas jogar o que guardamos no dinheiro da locomoção. Então, se voltarmos ao gráfico Anim, essa locomoção armazena em cache a saída de nossa máquina de estados principais neste slot de montagem. E se você se lembra da montagem é lição, isso é o que está realmente tocando nossa montagem. Agora, uma vez que a montagem tenha sido instruída a tocar, isso só produzirá nossa animação de montagem. Ele não vai mais jogar está ocioso ou executando animações. Então, por último, ele entra em nosso equipamento de controle e é por isso que a colocação do pé ainda funciona quando estamos tocando a montagem, porque isso acontece depois que a montagem foi ensinada a tocar, e então produzimos a pose final. Então, basicamente, o que precisamos fazer é aqui, precisamos adicionar um modo de mesclagem que nos permitirá misturar a metade superior do corpo tocando o slop de montagem e a metade inferior do corpo tocando o dinheiro de locomoção. Então, para fazer isso, vamos clicar com o botão direito do mouse e pesquisar por blend PER. Queremos uma mistura em camadas por osso assim. Então, agora precisamos conectar isso. Eu só vou mover esses nós trás um pouco assim. E arrastaremos esse nó aqui e desconectaremos esses dois nós. Estou apenas segurando Alt e clicando em menos caneta aqui. Então, primeiro vamos pegar o pino de saída e conectá-lo ao nosso equipamento de controle assim. Vamos movê-los para cima. Agora, a entrada da pose básica aqui serão as animações que serão reproduzidas na metade inferior do nosso corpo. Então, na verdade, não queremos que esse seja o dinheiro da locomoção, porque isso não terá nossas animações de salto. Precisamos de dinheiro dos nossos principais estados. Então, para fazer isso, vamos desconectar o slot aqui, mover isso para baixo. Nós rastreamos a partir dos pilares. Vou procurar dinheiro e clicar em Novo, economizar dinheiro pose. E podemos selecionar esse nó e chamá-lo como quiser. Vou ligar para os meus, digamos, estados principais, dinheiro assim. Então eu vou movê-los para cá. Então, eles estão um pouco mais fora do caminho. Então vamos compilar. Agora, não se preocupe se entramos em uma T-Pose aqui ou que temos uma nota aqui Isso é só porque não temos nenhuma vinheta de plug de animações. Então, agora estamos armazenando em cache ou pose principal. Podemos arrastar para fora do nosso pôster base, pesquisar o principal. E podemos usar a pose de uso em cache , dinheiro básico como esse. Então queremos copiar isso, colar. E agora queremos conectar isso à fonte do nosso slot e conectá-lo à pose de mistura é 0. Agora a pose de mesclagem é 0, ou serão as animações que serão reproduzidas na metade superior do nosso corpo. Agora, tudo o que estamos fazendo aqui é que estamos recebendo nossa animação básica. Então, nossas principais animações de estado, essas são nossas animações de corrida e salto ociosos. Eles sempre serão jogados na metade inferior do nosso corpo. E então, para a metade superior do nosso corpo, estamos dizendo, se estivermos tocando uma montagem, use a montagem para a metade superior. Mas se não estivermos jogando uma montagem, só queremos usar a mesma animação em dinheiro do estado principal. Então, novamente, animações de corrida e salto ociosos. Agora podemos compilar apenas para nos livrarmos dessa nota aqui e você pode ver que nossas animações estão sendo planejadas novamente. Mas agora, nossa animação não vai se dividir como queremos. Eles não vão se dividir no meio. Na verdade, precisamos configurar isso na configuração da camada aqui. Portanto, se selecionarmos o nó, vá para Configuração da camada e clique nesses pequenos menus suspensos. Você pode ver que temos alguns filtros e é aqui que realmente definimos em qual osso queremos que nosso corpo seja dividido. Então, vamos adicionar uma nova entrada aqui e clicar no menu suspenso do índice. E é aqui que realmente definimos o osso que queremos que a divisão aconteça. Então, para nós, queremos ativar nossos nomes ósseos. Podemos encontrar exatamente qual osso queremos usar. Então vamos para Personagem, depois até ossos e queremos mostrar nomes de ossos. Então, vamos assumir isso. E agora podemos ampliar e queremos que a divisão aconteça na coluna vertebral. Então, vamos ampliar um pouco aqui. E eu acho que a espinha um é provavelmente a melhor opção. Nossas animações de logotipo serão exibidas abaixo da lombada um. Então, nossas animações da parte superior do corpo serão reproduzidas acima disso. Agora, dependendo do seu personagem, você pode ter nomes diferentes no futuro, então nem sempre coloca a espinha um. Você precisaria verificar quais são os ossos da coluna para o seu personagem específico. Então, por enquanto, vamos usar a espinha um e precisamos ter certeza de que escrevemos o nome exatamente da mesma forma que está no esqueleto. Então, sublinhado 01 da coluna vertebral, assim. Agora, existem algumas outras configurações para esta nota que abordarei daqui a pouco. Mas, por enquanto, vamos apenas compilar e testar isso e jogar, então vamos jogar. E se eu pressionar um para reproduzir nosso recarregamento e começar a me mover, você pode ver nossa animação de recarga sendo reproduzida e nossas animações da parte inferior do corpo tocando. E quando não estamos reproduzindo, a animação de recarga ou as animações da parte superior do corpo estão sendo reproduzidas normalmente. Agora, este é apenas um exemplo simples de como podemos configurar animações diferentes para jogar em diferentes partes do corpo. Agora, para explicar um pouco sobre a profundidade da mistura, isso é basicamente como um efeito de mistura. Então, atualmente é 0, o que significa da coluna um e incluindo a coluna um osso, todos os ossos acima dele. Vamos usar essa saída de animação aqui. Quando eu recarrego, a montagem está tocando 100% de todos os ossos acima. Vamos usar essa montagem e somente aquela montagem. Agora, se tivéssemos que definir isso para dizer três, por exemplo, o que aconteceria seria nossa coluna vertebral. Um deles estaria usando cerca de 33 por cento dessas saídas de animação. Portanto, 33% de nossa montagem de recarga, então a coluna dois usaria 66% de nossa montagem de recarga e 33% apenas do nosso cache de estado principal. E então, por espinha , estaria usando totalmente a montagem para recarregar. Então, você pode basicamente usá-los como uma forma de misturar os efeitos do nó de mistura entre vários ossos. Agora, se quiséssemos excluir parte da parte superior do corpo de realmente tocar a montagem de recarga, poderíamos fazer isso. Então, se adicionarmos outro filtro de ramificação, abra isso e configure isso para dizer antebraço. Então, vou dizer sublinhado mais baixo. Eu defini a profundidade óssea de dois menos um. O que isso significa é que estamos dizendo à nota de mistura que não queremos que o osso do braço ou qualquer osso abaixo dele use nossa pose de estado de mistura 0, queremos que ele use nossa pose base. Então, se clicarmos em compilar e testar isso, se eu pressionar Y e você puder ver que meu braço direito não está mais se movendo com nossa animação de recarga. É só ficar lá. Agora, o braço, a parte superior do braço ainda está se movendo porque estamos afetando apenas a parte inferior do braço. Mas você pode ver que ele não anima mais da maneira que deveria. Então é assim que você pode excluir partes do corpo da reprodução de uma animação. Agora, não se preocupe muito se você não entender completamente que quando você está começando a animar, maioria das vezes sua profundidade óssea será apenas 0 e você realmente não estará usando isso menos uma opção com muita frequência também. Então, por enquanto, vamos apenas remover essa parte inferior apenas clicando na pequena seta para baixo aqui e fazendo Delete. Agora podemos adicionar várias poses de mesclagem de entrada. Então, se clicarmos em Adicionar pin, você pode ver que isso foi adicionado como uma nova postagem de pin de mesclagem. E se formos para os detalhes, então você pode ver que agora temos um novo índice aqui na configuração da camada. Isso só tem as mesmas configurações que são o índice 0 só que essas configurações agora para esta caneta. Então, talvez, por exemplo, você quisesse que as animações de recarga fossem reproduzidas na metade superior do corpo, mas você tinha uma segunda animação que queria tocar no rosto, por exemplo, você poderia em seguida, adicione isso aqui, adicione um novo bone ao filtro nos filtros de ramificação e, em seguida, faça com que a cabeça reproduza uma animação diferente. Em seguida, temos os pesos da mistura. Agora, essa é a quantidade em que a pose de mistura realmente afetará os postes de base. Então, por exemplo, atualmente é definido como um, o que significa que, se para qualquer bone que queira reproduzir a pose de mesclagem uma animação, ela será reproduzida em 100% dessa animação. Se eu fosse definir isso para 0,5, removeremos essa caneta de pose de mistura por enquanto. Então, clique com o botão direito do mouse e remova o pino de mistura. Em seguida, compilaremos se clicarmos em play agora e eu reproduzir nossa animação de recarga pressionando um, você pode ver que não está reproduzindo totalmente a animação. É basicamente usar metade do efeito disso em nossa pose base. Agora também podemos usar isso para desativar uma mistura, por exemplo. Então, poderíamos definir isso para dizer 0 e compilar. E agora, se pressionarmos Play e eu pressionar um, você pode ver que eles não são mais reproduções uma montagem porque definimos esse Alpha aqui para 0. Esta é apenas uma entrada flutuante normal. Assim, poderíamos arrastar, usar uma opção remota para flutuar, e isso apenas nos criará uma variável flutuante que podemos alterar e controlar dentro do nosso Gráfico de Eventos. Agora, seguindo em frente, se voltarmos ao gráfico Anim e selecionarmos a mesclagem de camadas por nó ósseo. Aqui temos uma opção para mistura de rotação baseada em malha. Isso basicamente significa que a rotação de nossos ossos ou usar o espaço da malha em vez do espaço local. Agora, essa opção pode ser útil se suas animações parecerem um pouco estranhas quando você as estiver reproduzindo. Na maioria das vezes, acho que realmente tenho isso ativado, mas vai depender do seu personagem e das animações que você está jogando. Isso faz a mesma coisa, mas nós escalamos para que ele use suas malhas, escala de ossos em vez da escala local. Na maioria das vezes você vai querer isso desligado. Agora, existem outros tipos de nós de mesclagem. Então, se excluirmos esse por enquanto e excluiremos essa variável, certo? Porque eu posso pesquisar pela ferramenta Blend e há poses de mesclagem por Boolean. Então, se criarmos isso, você pode ver que temos uma caneta verdadeira e uma falsa. Então, ele conectará nossa fonte, assim. Agora, isso nos permite controlar basicamente quais animações eles vão jogar dependendo de um valor booleano. Então, se esse valor ativo aqui for verdadeiro, que a animação esteja conectada até true será executada. E se isso for falso, a animação está conectada até que as pessoas sejam executadas. E podemos realmente ver isso na prévia aqui. Então você pode ver que o valor é falso. Então, apenas as animações vindas da caneta do nosso pessoal aqui estão sendo passadas para o nosso equipamento de controle. Se eu fosse assumir isso e compilar. Eu direi agora apenas a animação da nossa caneta verdadeira, está sendo passada para o nosso equipamento de controle. E então temos alguns momentos de mistura. Então, se você mudar esse valor durante o jogo, quanto mais altos esses valores são, mais tempo leva para que ele se misture suavemente das poses verdadeiras às poses das pessoas e depois volte de falso para verdadeiro para o tempo falso. Portanto, esse nó pode ser muito útil, por exemplo, se você tivesse um monte de animação, então só jogue quando seus personagens nadarem e depois outras animações quando o personagem estiver andando no chão, você pode ter uma variável chamada natação dele que se conecta a algo assim. E isso pode fazer uma transição suave entre as animações que você está andando no solo e as animações de natação sempre que o Boolean for definido como verdadeiro ou falso. Outro nó similar é a mistura. Então, se procurarmos por Blend e depois int, podemos usar as poses de mesclagem por int. Agora isso funciona de forma semelhante, mas em vez de um booleano, é um valor int. Portanto, podemos adicionar várias entradas agora, há apenas duas. Então, se eu fosse definir isso como um, então nosso único post seria usado. Assim, podemos conectá-los assim. Clique em Compilar e você verá que aquele está sendo usado. Mas se eu mudar isso para 0 e compilarmos novamente, você verá que agora as entradas 0 estão sendo usadas. E o bom disso é que podemos ter mais de duas entradas. Então, se clicarmos com o botão direito do mouse e fizermos, ou clicarmos com o botão direito do mouse no nó, desculpe, e adicionamos PIM Você pode ver que isso adiciona uma nova opção. Agora, se eu fosse apenas copiar e colar esses nós, colá-los, conectá-los até aqui. E agora vamos definir isso para dois, vai compilar. Você vê que agora os dois pinos estão sendo usados. Novamente, acabamos de fazer isso e eles funcionam da mesma forma que nosso nó booleano. Então, qualquer valor que você colocar aqui é quanto tempo levará para misturá-lo nessa pose. Agora também podemos usar um nó de mesclagem usando um enum. Então, se excluirmos isso e pudermos sair, deixaremos assim por um momento. Vamos criar um novo enum, então vamos clicar com o botão direito do mouse e ir para os blueprints, Em seguida, ir para enumeração. Vou chamar isso de tipos de animação de sublinhado E. Abriremos isso e criaremos um novo ânion. E vamos chamar isso de nadar. E adicionaremos outro para caminhar e outro para, digamos, carro. Agora, esses são apenas exemplos para que eu possa mostrar como o código funciona, mas vamos fechar isso por enquanto. Volte ao nosso gráfico de animação e, em seguida, pesquisaremos a animação de sublinhado da EA. Você vê no topo aqui que temos poses de mesclagem E tipos de animação de sublinhado. E isso é porque isso é o que chamamos de sindicato. Então, vamos criar isso. Você vê que temos esse nó aqui. E se clicarmos com o botão direito do mouse no nó, você verá que podemos adicionar pinos para nadar, caminhar e em custo. Então, faremos isso para cada um assim. E agora temos uma caneta aniônica em vez de um booleano ou um inteiro. Então, conectaremos a saída à nossa recapitulação de controle. E vamos conectá-los com segurança para nadar, caminhar e capos. Agora, atualmente, isso está definido como 0. Então, se compilarmos, ele apenas escolherá o poste de natação porque esse é o primeiro. Mas também podemos usar uma variável para controlar isso. Assim, podemos criar um novo ânion. Chamaremos esse modo de animação, por exemplo. E vamos configurá-lo para o tipo de animação de sublinhado E. Essa é a união que acabamos de criar. Vamos compilar. Agora podemos conectar essa variável em nosso nó. Na verdade, podemos controlar qual deles será usado usando essa variável. Então podemos dizer, eu quero no carro, compilá-lo e agora ele está usando a tinta. E podemos mudar isso durante o jogo em nosso gráfico de eventos aqui para controlar quais animações queremos que nosso gráfico reproduza. E por último, se excluirmos esse nó e procurarmos o terreno, podemos usar apenas um modo de mesclagem. Agora, este é um nó simples que basicamente pega uma entrada a e B e nos permite mesclar entre eles usando um valor alfa. Então, se isso for 0, será, a saída desse nó será apenas 100% de a. E se este for um, será a. 100% de B é 0,5, então será metade e metade de ambas as animações produzido. Por enquanto, vamos apenas excluir esse nó e, na verdade, estamos apenas recostando nossa mistura de camadas por nós ósseos. Então, vamos procurar por chumbo e podemos usar a marca de chumbo por osso para conectar isso aqui novamente, isso até nosso equipamento de controle. Excluiremos esses nós porque eles não os estão mais usando. Então, em nossa nota aqui, vamos apenas definir o backup do meio-fio do campo da filial para a espinha um. Então, isso vai definir isso para espinha, sublinhar um. E excluiremos essas variáveis aqui também porque não as estamos realmente usando e apenas compilamos. Então, agora, quando clicamos em play e corremos, podemos pressionar um e ele reproduzirá uma animação de recarga enquanto nossas animações de movimento ainda estão trabalhando com eles para esta lição, espero que agora você entenda um pouco mais sobre mesclar animações e como podemos reproduzir duas animações ao mesmo tempo em uma malha de personagem. 48. Blueprints de animação (Notifies): Olá pessoal. Nesta lição, vamos dar uma olhada nas notificações de animação. Agora, a animação notifica ferramentas realmente úteis porque elas nos permitem executar o código em um horário específico em uma animação. Agora, já analisamos algumas notificações no início do curso. Analisamos os efeitos de reprodução de som e reprodução, notificações que nos permitiram reproduzir sons ou reproduzir efeitos de partículas em pontos específicos de nossas animações. Vou repassar rapidamente essas coisas novamente nesta lição apenas para refrescar sua memória. Então, para começar, precisamos ir para uma sequência de animação ou uma montagem de animação. Podemos adicionar notificações a ambos. Então, vou usar a montagem de recarga que tocamos em nossas aulas anteriores. Então, vamos para as animações das aulas. E se você não tiver essa pasta, expliquei como adicioná-las nas lições de montagem. Então você pode querer dar uma olhada nisso. Agora, vamos rolar para baixo e encontrar nossa montagem de recarga, que está aqui na parte inferior. Vamos abrir isso. Agora. Aqui em baixo, temos nossa linha do tempo de notificações e é aqui que veremos todas as notificações para essa montagem específica. Para adicionar uma nova notificação, basta clicar com o botão direito do mouse nesta barra que diz uma e podemos adicionar uma notificação. Agora, o motor já tem algumas notificações embutidas. E é assim que podemos tocar sons ou reproduzir efeitos de partículas ou efeitos de partículas do Niágara. Agora, existem outras notificações, como você pode ver aqui para Simulação de Roupas e coisas assim. Eu não vou abordá-los nesta lição porque eles são bem específicos e um pouco mais avançados e o que vamos cobrir. Mas vamos apenas adicionar uma notificação de som de reprodução. E agora, com isso adicionado, podemos posicionar isso em qualquer ponto da animação. Então, digamos que queríamos tocar o som neste exato momento. Poderíamos adicionar nosso notificado a este ponto. Em seguida, no painel Detalhes, podemos definir modificadores de som, volume e tom. Podemos alterar a cor da notificação, e isso é apenas para a organização. Assim, você pode ver rapidamente o que é uma notificação por sua cor. Outra configuração útil aqui é a chance de gatilho. Agora, talvez você só quisesse que esses sons fossem reproduzidos às vezes quando essa animação fosse reproduzida aleatoriamente. Então, o que poderíamos fazer é, em vez de enviá-lo para um, que significa que o som sempre será reproduzido quando a animação for reproduzida. Poderíamos definir isso para dizer 0,1. Agora, esse som, só tocamos dez por cento do tempo que essa animação é reproduzida. Um exemplo de como isso pode ser útil é que talvez você tenha uma animação ociosa e queira adicionar um som de tosse a essa animação ociosa. Agora, você provavelmente não quer que esse som seja reproduzido toda vez que a animação ociosa for reproduzida. Assim, você pode definir a chance de disparo desse som notificar para 0,1, e esse som será reproduzido 10% do tempo em que a animação for reproduzida. Agora, seguindo em frente, podemos fazer a mesma coisa com efeitos de partículas. Então, vou excluir o som notificar aqui, clicar com o botão direito do mouse e adicionar notificação. Agora podemos adicionar um nove a cinco para Niagara, os efeitos políticos cairão em cascata. Vou selecionar Niagara só porque esse é um sistema mais novo. Então, clicaremos nele e selecionaremos essa notificação. Então, aqui em nosso painel Detalhes, podemos definir quais efeitos de partícula do Niágara queremos escolher. Atualmente não tenho nenhum dos meus projetos, então há um chegando aqui. Mas se você fizesse, é aqui que eles apareceriam. Em seguida, podemos definir a localização e a rotação. Agora, esse é o deslocamento da raiz. Portanto, a raiz do nosso personagem aqui está exatamente onde meu mouse está atualmente. Então, se adicionássemos, digamos, 50, Oi, nosso efeito de partícula se moveria para mais ou menos essa altura porque está aumentando a altura do efeito de partícula em 50 a partir da raiz. Agora, também podemos dizer se nosso fato político está ligado ou não a alguma coisa. Então, atualmente, ele está anexado e isso significa que ele vai apenas se anexar à raiz. Mas podemos especificar um nome de bot, se quisermos. Queríamos que os efeitos das partículas fossem anexados à cabeça. Poderíamos fazer isso procurando pela cabeça. E você pode ver que isso nos dá o osso da cabeça aqui. Então, agora, quando geramos esse efeito de partícula ou realmente estaremos presos ao osso da cabeça. Ao contrário de antes, podemos dizer notificar a cor. E também podemos alterar se a notificação será executada todas as vezes ou dizer metade do tempo se colocarmos 0,5, por exemplo. Agora, usando esse tipo de efeito Notificar para reproduzir, ele basicamente dirá ao efeito para ser reproduzido uma vez e, em seguida, o efeito será destruído. Mas talvez você quisesse os efeitos que você executa daqui até aqui na animação. Bem, nós podemos fazer isso. Então, vamos selecionar essa notificação, excluí-la, clicar com o botão direito do mouse e iremos para notificar o estado e ir para o tempo até o efeito Niagara. Ou se você estiver usando cascatas, tempo para efeito de partícula. Então, ele selecionará a opção Niagara aqui. E você vê que agora temos um 12. Na verdade, podemos arrastar isso para o valor aqui clicando no pequeno ponto na parte inferior e arrastando-o para fora. Então, podemos adicionar isso para dizer 50. Então, agora, os efeitos de partícula que definimos para esta notificação, eu pareio um do valor um para o valor verdadeiro. Agora, algo a ter em mente com isso é que seu efeito Niagara será, precisará ser configurado para fazer um loop. Se estiver configurado para ser executado apenas uma vez, os efeitos das partículas serão executados apenas uma vez e depois não serão mais executados. Então, você precisará do efeito de partícula de Niágara Isso está realmente configurado para fazer um loop para que isso funcione. Então, temos as mesmas configurações que fizemos com nosso tipo de notificação anterior. Temos o modelo que queremos usar. Então é aqui que definimos o efeito que queremos. Podemos escolher se ele se conecta ou não a um osso ou soquete. Podemos definir sua localização e deslocamentos de rotação. Podemos escolher se ele destrói ou não imediatamente. E basicamente o que isso significa é, digamos, seus efetores fazendo um loop enquanto reproduzimos a animação. Assim que chegar aqui, se destruir imediatamente está marcado. Não importa em que estágio o efeito de partícula está inserido no meio da corrida. Ele será destruído instantaneamente. Enquanto se isso estiver marcado, quando chegarmos a esse ponto, se o efeito da partícula estiver na metade, ele deixará terminar. Então, talvez seu pote, um efeito legal leve mais dois segundos para terminar, então ele permitirá isso. Portanto, cabe a você decidir se você tem ou não essa tectônica dependendo do tipo de efeitos que está usando. Agora, ao trabalhar com notificações, você pode acabar com uma linha do tempo bastante lotada se tiver muita coisa acontecendo em uma animação específica. Assim, você sempre pode simplesmente adicionar novas faixas de notificação. Então, podemos clicar neste pequeno menu suspenso aqui para adicionar a faixa de notificação. E isso nos dá uma segunda faixa que podemos adicionar notifica dois, não muda a forma como eles funcionam ou algo assim é puramente para a organização. Agora, até agora, estamos usando as notificações padrão que vêm integradas com o mecanismo, mas podemos criar nossas próprias que nos permitem executar em eventos e executar código quando uma notificação de animação é executada. Então, o que faremos é selecionar essa notificação e excluí-la. Agora, talvez eu quisesse um pedaço de código para rodar quando meu personagem diz pegar a revista ou colocar a revista da arma aqui. Bem, podemos fazer isso com notificações. Então, o que faremos é clicar com o botão direito do mouse e adicionar notificação. Em seguida, iremos para o novo notificado e isso nos permitirá nomear as notificações para que possamos chamar essa revista destacada assim. Você pode ver que agora recebemos uma notificação que se chama revista Touch. Podemos movê-lo como os anteriores, mas vou manter o meu aqui. Então, agora essa notificação nos permitirá chamar um evento dentro nosso blueprint de animação sempre que essa animação tocar esse ponto. Mas vamos ter um pequeno problema aqui, e mostrarei por que, se formos para o nosso Projeto de Animação, que, se você se lembrar, está em personagens, animação de manequins. E então abriremos dinheiro. Agora, normalmente se eu clicar com o botão direito do mouse e procurar meu destacamento, eu deveria encontrar um evento para nossa revista de desapego, mas eu não sou. E a razão pela qual isso está acontecendo é, se você se lembra, são menos do que animações e essa pasta aqui realmente tem seu próprio esqueleto. E então nosso personagem tem um esqueleto diferente. Agora é por isso que nossa notificação. Não está apenas aparecendo em nosso projeto de animação. Podemos consertar isso facilmente. Então, o que precisamos fazer é ir para nossa pasta de personagens, depois para nossos manequins, depois duas malhas e abrir o manequim SK. E aqui, vamos para a aba Notificações de animação. Se você não o tiver aberto, você pode ir até a janela e encontrar a animação, aqueles FISA e pegá-los. E vamos clicar com o botão direito do mouse e fazer o novo. Eu vou chamar essa revista, oh desculpe, desanexar revista. E precisa ser escrito exatamente da mesma forma que a notificação em nossa montagem. E agora adicionamos essa nova notificação ao nosso esqueleto. Então, agora, quando vamos para o nosso projeto de animação, podemos clicar com o botão direito do mouse para pesquisar o toque. E você pode ver que agora temos um anime notificado para a revista touch e podemos adicionar isso. Agora, se você adicionar uma notificação a uma animação que está usando o mesmo esqueleto, é o seu personagem. Então, para dar um exemplo, vamos para a pasta Personagens, manequins, animações. Então vamos para o dinheiro e vamos apenas encontrar a animação vai encontrar a terra por exemplo, eu abro isso. Agora, se eu clicar com o botão direito do mouse nas notificações aqui para adicionar notificação, nova notificação. E eu vou chamar isso de salto. E agora, se formos para o nosso Animation Blueprint, eu clico com o botão direito do mouse e procuro por salto. E você verá que isso acabou de aparecer imediatamente. E isso é porque eu pularia em terra, na verdade, usando apenas o mesmo esqueleto do nosso personagem. Agora, em nossa montagem de recarga, temos nossa revista destacada notificando, e então também dentro do nosso Animation Blueprint temos esse evento aqui também. Agora, esse evento acontecerá toda vez que essa montagem for tocada por nosso personagem e a animação chegar a esse ponto. Então, para testar isso, podemos simplesmente adicionar algum código a isso. Eu só vou arrastar para fora e fazer uma impressão. E vamos deixar isso cantado Hello. E vamos compilar, clicar em Play. E agora, quando eu pressionar um, você verá que obtemos a impressão de olá quando nossa animação de recarga chegar a esse ponto específico. E também podemos verificar se a extremidade do salto também está funcionando. Assim, podemos clicar com o botão direito do mouse na busca por salto, e isso nos cria um novo evento. Podemos nos arrastar para fora disso e fazer uma string de impressão para isso. E se compilarmos, saltamos quando pousamos, você pode ver que o Notify também está sendo executado. Agora, voltando ao esqueleto de nossos personagens por um segundo. Vamos para manequins do que malhas e abriremos o manequim aqui em nossa guia de notificações de animação. Aqui é onde você pode excluir notificações de animação. Você pode criar novos para que possamos clicar com o botão direito do mouse e fazer novos. Também podemos renomear. Assim, podemos clicar com o botão direito do mouse e selecionar Renomear para alterar o nome de uma notificação. Outra ferramenta útil é encontrar referências, e podemos usar isso para encontrar todas as animações que têm essa notificação nela. Então, se clicarmos nisso, você pode ver que está nos dando a animação exata que usa o salto e notifica. Podemos clicar duas vezes nisso e você pode ver que é a animação que foi notificada. Então pode ser, por exemplo, que você tenha uma animação em execução e notifique que você não quer. Você sempre pode simplesmente ir até o esqueleto, clicar com o botão direito do mouse em Notificar e encontrar a animação que está sendo reproduzida para notificar. Se você quiser se livrar da pesquisa aqui, podemos clicar com o botão direito do mouse nos filtros de remoção e você pode ver que agora está mostrando todas as nossas animações novamente. Agora também podemos criar nossas próprias notificações personalizadas ao trabalho um pouco como o efeito de reprodução de som ou de partículas de reprodução notifica. Então, se voltarmos para o navegador de conteúdo aqui, eu vou apenas para a pasta Blueprints. Então, plantas de terceira pessoa, clicaremos com o botão direito do mouse e clicaremos em Classe de Em seguida, vamos a todas as aulas e procuraremos por notificar. E queremos que a animação notifique aqui. Então, se clicarmos nisso e selecionarmos, isso nos criará um novo plano. Só vou chamar o meu exemplo. Notifique assim. E vamos clicar duas vezes para abrir isso. Eu só vou arrastar o meu até a barra superior aqui assim. Agora temos um novo layout de editor. Você pode ver que, na verdade, não temos um gráfico de eventos onde temos nosso Painel Meu Blueprint e , em seguida, o painel Detalhes aqui. Agora temos algumas funções incorporadas nesse projeto que podemos substituir. E essas são as funções que realmente serão executadas quando o Notify here for executado. Então, o que faremos é antes de tudo ir para nossa montagem de recarga. Se clicarmos com o botão direito do mouse em Notificar, mas for para adicionar notificação. Aqui você pode ver que agora temos esse exemplo de notificação. Então, se clicarmos aqui, você pode ver que temos um novo tipo de notificação. É o mesmo que o nome do nosso projeto e podemos posicioná-lo onde queremos dizer aqui, por exemplo. Então, agora, quando nossa animação chegar a esse ponto, ela executará os eventos dentro do nosso exemplo, notifique aqui. Então, usando isso, podemos executar um código personalizado dentro dessa notificação. Sempre que essa notificação recebe ROM, podemos substituir receber notificação. Esta função será executada sempre que eu notificar que nossa animação é executada. E isso nos fornece algumas informações úteis. Então, ele nos fornece a animação que realmente chamou de Notify e também o componente de malha. E o bom disso é que podemos acessar, digamos, nosso projeto de animação ou até mesmo o personagem que reproduziu a animação usando isso. Então podemos nos arrastar e conseguir o dono, assim. Agora, o dono da malha do personagem sempre será o Projeto do Personagem. Então, usando isso, poderíamos arrastar e fazer um custo para o personagem, por exemplo. E agora podemos acessar facilmente nosso projeto de personagem. Também podemos acessar nosso Animation Blueprint apenas arrastando para fora componentes da malha, pesquisando, por exemplo. E isso nos dará uma referência ao nosso Projeto de Animação. Então, só para dar um exemplo de como isso realmente funciona, excluiremos isso por enquanto. Eu só vou adicionar uma string impressa aqui. E vamos colocar “diga olá”. Isso é um teste. Vamos conectar isso até o valor de retorno como esse será compilado. E agora, quando clicamos em play e eu pressiono um, você verá aquele olá e também acaba olá, Isso é um teste e isso porque dentro eu recarrego a animação, temos nosso novo exemplo notificar. E por dentro, por exemplo, notifique. A notificação recebida deles é executada e executa nossa string de impressão aqui. Agora, um exemplo comum do que esses clientes ou a Pfizer usaram para nossos passos. Agora você pode estar pensando que pode usar o som de reprodução para notificar que está embutido no mecanismo. Mas o problema com isso é que, se você tiver diferentes tipos de sons para diferentes tipos de solo, você precisaria detectar que tipo de solo seu personagem está andando e, em seguida, jogar o som apropriado. Usando um cliente notificado assim, você pode escrever o código que talvez faça um rastreamento de linha abaixo seu personagem para detectar o chão e, em seguida, reproduzir o som correto para esse tipo de solo. Mas isso é apenas um exemplo. Você pode usá-los para todos os tipos de coisas em seus projetos. Também podemos adicionar configurações de personalização a eles. Então, se adicionarmos uma nova variável aqui e chamarmos isso de sons, por exemplo, iremos até o tipo de variável e procuraremos uma base sonora e selecionaremos a referência do objeto. Agora, vamos compilar e clicar no pequeno olho aqui. Ou você pode assumir instâncias editáveis aqui, fazer a mesma coisa, compilar. E agora, quando vamos para nossa montagem de recarga e selecionamos nossa notificação, você pode ver aqui nas configurações que agora temos a variável de sons que acabamos de criar. Podemos definir um som e, em seguida, dentro são recebidos a função de notificação. Poderíamos usar qualquer som definido dentro da montagem e tocá-lo. Então, para fazer isso, vamos apenas arrastar nossa nota de retorno aqui e vamos abrir algum espaço. Então, vamos nos arrastar e procurar o som de reprodução. Usamos o som de reprodução no local. Vamos pegar nosso valor sonoro e conectá-lo à variável de sons. E para localização obterá a localização do componente de malha. Então, obtemos a localização. Não conseguiremos a localização mundial. Conecte isso ao local. Então vamos compilá-lo e você notará, vou deixar meu som aqui como nenhum, e usaremos a montagem para realmente definir esses sons. Então, vamos selecionar o exemplo notificar aqui e pegar um som aqui. Então, vou escolher o som de falha na compilação. E você realmente notará que enquanto a animação é reproduzida aqui, ela realmente toca um som para ela. Então vamos parar este avião porque está ficando irritante. E vamos testar isso. Então, vamos apertar play e o jogo e pressionar um para reproduzir esse som, vamos reproduzir a animação. Você pode ver que nossa notificação está funcionando e está tocando aquele som que sentamos dentro de nossa montagem aqui. Você pode fazer isso com todos os tipos de configurações. Então, se você quiser, você poderia adicionar um booleano, por exemplo aqui. E contanto que você tome uma instância editável, isso estará acessível a partir de nossa montagem. Você pode ver que agora temos essa nova variável aqui, e posso acessá-la se selecionar minha notificação. E também podemos usar várias dessas notificações de animação. Então eu posso mover isso aqui, clique com o botão direito. Adicione um exemplo suficiente. Agora, se eu selecionar isso e agora podemos escolher outro som. Então eu poderia escolher o sucesso do compilador, por exemplo. Agora, quando apertamos play e eu pressiono um para reproduzir a animação, você deve ouvir os dois sons. Por fim, mostrei como criar novas notificações de animação, mas na verdade não mostrei como reutilizá-las. Então, se sairmos do editor de avião aqui, volte para nossa animação de recarga. Você pode ver que temos uma revista separada. Agora, talvez eu queira que esse evento seja executado também aqui, podemos clicar com o botão direito do mouse, adicionar, notificar, ir para Notificações de esqueleto. E aqui você pode ver que recebemos todas as nossas notificações existentes e estamos desanexados. A revista está logo abaixo aqui. Para que possamos criar isso. Agora, o evento dentro do nosso projeto de animação aqui será executado duas vezes para esta animação, uma aqui e outra aqui. E também podemos usar essa revista destacada notificada em outras animações, ela não está presa a essa animação. Então, se quisermos, podemos ir até a pasta Animações embaixo dos manequins, e depois ir para o dinheiro. E poderíamos adicionar isso à animação da terra, por exemplo. Assim, podemos clicar com o botão direito do mouse e notificar, o esqueleto notifica. E então podemos ir até a revista separada aqui. E agora esse evento também acontecerá quando jogarmos esse salto e essa animação também. Então é isso para esta lição. Espero que agora você entenda um pouco mais sobre notificações de animação e como você pode usá-las em seus projetos futuros. 49. Blueprints de animação (Estados): Olá pessoal. Nesta lição, vamos dar uma olhada mais de perto nos estados da animação dentro do nosso Animation Blueprint. Agora, em nossa primeira lição, fizemos uma rápida visão geral desses estados de animação. Mas neste, vamos dar uma olhada muito mais de perto como eles funcionam e como você pode adicionar novos. Então, para começar, basta abrir seu projeto de animação e ir para o gráfico Anim. Então, vamos abrir isso. Então vamos começar indo para a máquina de estado de locomoção aqui. E se você se lembra de antes, aqui é onde temos nosso estado ocioso e então eu vou andar no estado de corrida de barra. E dentro desses estados é onde realmente temos nosso lugar de animações. Então, no estado ocioso, temos a animação ociosa e , em seguida, a barra de caminhada. Temos nosso walk slash run, espaço em Londres. Então, para começar, vamos apenas adicionar um novo estado a essa máquina de estado de locomoção. Então, para fazer isso, basta clicar com o botão direito do mouse e clicar em estado. E isso nos criará um novo estado semelhante ao nosso estado ocioso e ao nosso walk slash run. Eu só vou chamar o meu objetivo e vamos criar um estado de mira hoje. Então, por que agora temos um novo estado chamado alvo, mas ele nunca será realmente chamado no momento porque não temos nenhuma regra que faça a transição para ele. Então, para criar uma nova regra, precisamos nos arrastar de um estado diferente para o nosso novo estribo. Então, vamos arrastar do ocioso para o objetivo. Isso vai nos dar uma flecha que aponta de ocioso para mirado. Porque essa regra determina se estamos no estado ocioso, se devemos ou não passar para o estado desejado. Agora precisamos realmente adicionar algum código à nossa regra para determinar quando o estado ocioso deve mudar para o estado desejado. Então, o que podemos fazer é clicar duas vezes neste pequeno botão aqui. E isso nos levará para dentro dessa regra. E dependendo se esse valor de retorno é verdadeiro ou não , é se vamos ou não fazer a transição do ídolo para o estado final. Então, vamos começar apenas criando uma nova variável. Vou chamar o meu de objetivo, ou desculpe, não podemos chamá-lo de objetivo porque temos um nome de estado, então vamos chamá-lo de mira assim. Vou mudar o meu para um booleano assim e vamos compilar. Agora você pode receber um aviso aqui. Tudo o que está fazendo é nos dizer que nossa regra aqui não tem código. E vamos adicionar um pouco de código a isso agora. Então, vamos clicar duas vezes nisso para abri-lo. E vamos pegar nosso objetivo e conectar isso ao resultado aqui. Então podemos compilar assim e devemos nos livrar desse aviso agora também. Em seguida, voltaremos para a locomoção. Então agora temos uma regra que nos permitirá fazer a transição do ídolo para o objetivo de saber se r é ou não alvo variável é verdade. Na verdade, podemos testar isso. Então, se eu assumir isso, você pode ver que nosso personagem T posa e está fazendo isso porque ainda não definimos uma animação em nosso estado. Então, agora vamos abrir nosso estado de destino e adicionar uma animação para que ele seja reproduzido. Então, vamos arrastar e procurar jogadores de jogo, e usaremos o Sequence player. Agora, isso nos permite apenas definir uma animação que nosso objetivo indica reclamação. E podemos fazer isso aqui no painel Detalhes, definiremos a sequência para algo como o ADS. E devemos encontrar o rifle ocioso ADS. Se você não tem essa animação, na verdade, explicamos como importá-la para seu projeto na aula de montagem. Então você pode dar uma olhada nisso e isso mostrará como adicionar essas animações. E agora definimos a animação se compilarmos, porque nosso objetivo ou objetivo está definido como verdadeiro, você pode ver que agora está reproduzindo uma animação com mira de rifle. Mas o problema agora é que, se voltarmos para nossa máquina de estado de locomoção, se eu fosse mudar ou se visasse falso, nossa animação não voltaria a ficar ociosa. Isso porque ainda precisamos criar uma regra que vá do nosso objetivo ao nosso ocioso. Então, vamos arrastar de apontado para ocioso, e isso será verificado sempre que estivermos dentro do estado de mira. Então, agora precisamos adicionar algum código a essa regra que nos faça mudar de nosso estado interno para nosso estado ocioso. Então vamos abrir isso. Vamos pegar a variável is aimed. Agora queremos que isso retorne verdadeiro se for falso. Então, vamos arrastar e procurar por nada, encontraremos o NOT Boolean aqui e conectaremos isso aos resultados. Portanto, se o objetivo for verdadeiro, isso o converterá falso e retornará um valor falso. E agora podemos testar isso. Então eu vou voltar para a visão da locomoção aqui. Vamos selecionar é direcionado e vamos tirá-lo e retirá-lo. Em primeiro lugar, precisamos compilar. Então, agora, quando o pegamos e o tiramos, você pode ver que está alternando entre nossos dois estados agora. Agora, nossos metais de transição têm algumas outras configurações. Eu não vou passar por todos eles, mas vou passar por alguns dos mais importantes que estão aqui. Então, para começar, temos a ordem de prioridade. Agora, quanto maior o valor aqui, maior a prioridade dessa função. Então, por exemplo, se você tem várias regras como as que temos aqui para o ocioso, nós temos esta e temos essa. Digamos que ambos fossem verdadeiros ao mesmo tempo, então o motor escolherá aquele que tem a maior prioridade aqui. Essa configuração pode ser útil se você tiver um sistema de locomoção muito mais complicado com muitas regras que vão de, digamos, um estado. Em seguida, temos a duração da transição. Agora, esse é o tempo que leva para a animação ociosa fazer uma transição suave para a animação desejada. Porque se você notar, quando selecionamos nosso nome para, ele não se encaixa instantaneamente. Conseguimos uma transição suave entre eles. Então, se aumentarmos esse tempo de duração aqui, digamos, a regra de transição de objetivo para ocioso, nós a mudamos para dizer uma. Agora, quando compilamos e selecionamos conforme o objetivo, se o desativarmos, você pode ver que obtém uma transição muito mais suave e lenta da animação direcionada para a ociosa. Também podemos fazer a mesma coisa para o nosso geral. Assim, podemos selecionar isso, definir a duração como um. E agora, sempre que assumirmos o AMG, teremos essa transição suave depois de compilarmos. Lá vamos nós. Então, tudo combinado agora. E você pode ver que agora temos transição muito mais lenta entre as duas animações. Em seguida, selecione nossa regra aqui. Nas configurações de mesclagem, temos um modo. Agora é assim que a animação fará a transição para a nova animação. Você teria que experimentá-los para ver como eles funcionam. Mas isso lhe dá efeitos diferentes de transição entre os dois estados. Em seguida, temos as notificações. Agora, eles realmente nos permitem executar eventos em nosso Gráfico de Eventos sempre que essa regra faz alguma coisa. Assim, podemos iniciar a transição e podemos ter um evento em nosso gráfico de eventos que será executado sempre que essa transição começar aqui. Então, sempre que a regra se tornar verdadeira, esse evento que nomeamos aqui será executado. Temos a transição final. Então, quando a transição estiver concluída e estivermos nos movendo para o novo estado, isso será executado. E então, se for interrompido, isso será executado. Então, se, por exemplo, passarmos 1 segundo da transição de ocioso para direcionado, e cancelamos. A regra tornou-se falsa e voltamos a ficar ociosos do que são interrompidos, o evento seria executado. Então, para dar um exemplo rápido, poderíamos escrever um teste aqui. Por exemplo, compile, vá para o Gráfico de Eventos e se eu clicar com o botão direito do mouse e procurar por teste, ou desculpe, teste de evento encontrará esse novo teste de sublinhado de notificação de anime e esse evento será executado sempre que nossa regra aqui começa sua transição de ídolo para MD. E se você não conseguir encontrar seu evento e o gráfico de eventos, não se esqueça de que você precisa compilar seu projeto depois de escrever um nome aqui. Agora temos configurações semelhantes para o nosso estado. Então, se eu realmente selecionar meu estado de mira aqui, você pode ver que temos essas mesmas configurações, então temos um evento personalizado que podemos executá-lo em nosso gráfico de eventos para quando nossa permanência de mira for inserida e também quando esse estado de mira é deixado. Então, novamente, como antes, se eu adicionar um novo evento, chamarei isso de objetivo iniciado. Vamos compilar, acessar o Gráfico de Eventos e procurarei o objetivo do evento. E você pode ver que nosso objetivo de evento também começou aqui. Então agora adicionamos um novo estado, então nossa locomoção, e adicionamos as regras para fazer a transição de e para esse estado, mas na verdade não configuramos nenhum código para controlar essa variável. Acabamos de alterá-lo manualmente aqui. Então, mostrarei algumas maneiras pelas quais podemos controlar variáveis em nosso projeto de animação a partir do Modelo do Personagem. Então, para começar, podemos ir para o Gráfico de Eventos. Ele encontrará o blueprint, atualizará a animação e executará todos os quadros e atualizará as variáveis que conectamos a ele. Assim, podemos adicionar uma nova ramificação aqui. Então vamos pegar nosso personagem porque queremos que algumas informações de nosso personagem se arrastem e podemos fazer o custo para a pessoa, conectar até a sequência dele. Agora, na verdade, precisamos adicionar um sistema de nomenclatura ao nosso personagem. Então, vamos compilá-lo e ir para o nosso projeto de personagem, que está nos planos de terceira pessoa do que no personagem de terceira pessoa. Agora, não se preocupe muito se você não tiver esse código. Isso é da nossa aula de montagens. Então, vamos rolar para cima aqui. Vou clicar com o botão direito do mouse e procurar o botão esquerdo do mouse. E vamos usar o botão esquerdo do mouse. E criaremos uma nova variável chamada is aimed. Assim. Queremos tirar esse arrasto e fazer f. E, se nosso objetivo é verdadeiro no momento, queremos defini-lo como falso. E se atualmente for falso e quisermos defini-lo como verdadeiro. Então, vou copiar e colar isso e me conectar com as pessoas e assumir aqui assim. E vamos compilar, voltar ao nosso Animation Blueprint. E agora podemos apenas obter r é direcionado a partir do nosso projeto de personagem. Use isso para definir R é direcionado em nosso projeto aqui. Em seguida, vamos compilar e agora podemos testar isso para que ele clique em Play. Se eu deixei o botão do mouse, você pode ver que fazemos a transição para essa animação e ainda temos aquele tempo de transição de 1 segundo. Então, está indo um pouco devagar. Então, voltaremos para nossa locomoção. É como a regra. Altere a duração, digamos 0 para fazer o mesmo com a outra regra. Então, 0,2 aqui também. Em seguida, vamos compilá-lo e agora podemos testá-lo novamente. E eu vou apertar o botão esquerdo do mouse. Você pode ver que agora estamos fazendo a transição para essa animação. Agora, isso funciona, mas talvez você tenha muito código acontecendo em seu projeto de animação. E você não precisa que esse código seja executado a cada quadro. Então, o que poderíamos fazer é se excluirmos isso, podemos definir o código de nosso ThirdPersonCharacter. Em vez disso. Vamos para o ThirdPersonCharacter. Pegaremos nosso componente Mesh, arrastaremos para fora dele e obteremos uma instância M. Se você se lembra, isso nos dá uma referência ao nosso projeto de animação, mas ainda precisamos custar ao nosso dinheiro de sublinhado ABP porque esse é o nosso plano de animação. E vamos fazer com que esses dois nós executem esse código. Portanto, não importa se miramos ou não temos nome. Então queremos nos arrastar para fora e queremos fazer o set ain't. Agora nos permite definir nossa variável direcionada. Esse é o projeto de animação. E nós só queremos obter r é direcionado a partir deste projeto e usá-lo para configurá-lo. Então agora podemos testar isso se eu puder puxar, apertar play e quando eu deixei o mouse clicando e ver que ele ainda está funcionando usando o novo código que acabamos de escrever. Agora você pode notar que se deixarmos o botão do mouse e começarmos a nos mover, não teremos mais nenhuma animação de movimento. Isso porque na verdade não estabelecemos nenhuma regra para fazer a transição do nosso objetivo. Se voltarmos para a locomoção do nosso objetivo para o nosso walk slash run. Então, ele ficará preso em nossa mira até que nos livremos do clique esquerdo do mouse e depois mude para ocioso. E se estivermos nos movendo, ele mudará para andar. Então, poderíamos adicionar algumas novas regras aqui que fazem a transição do objetivo para o walk slash rump. Então, vamos nos arrastar do alvo e ir para a corrida de barra assim. E vamos usar o mesmo código que usamos do nosso ídolo aqui, onde diz que deve se mover. Então, vamos abrir essa regra. Obteremos a variável should move. Isso será verdade. Se nosso personagem estiver se movendo, então voltaremos para a locomoção e compilaremos. E agora, quando apertamos Play, se eu deixei o botão do mouse, você pode ver que miramos e, se eu começar a me mover, voltamos para nossas animações de corrida de barra de caminhada. E você vê se eu sair da corrida de barra de caminhada, voltamos aos nossos objetivos e podemos desnomear, como fizemos antes. Agora, por fim, eu só queria cobrir pseudônimos de estadia. Então, se sairmos do editor de avião aqui e voltarmos para o nosso Animation Blueprint, aliases de permanência são realmente úteis para manter seus estados de animação um pouco menores. Então, vamos criar um exemplo rápido de um. Vamos clicar com o botão direito do mouse e usar um alias de estado e chamaremos isso de verificações direcionadas. Por exemplo, temos nossa verificação de objetivo selecionada aqui. Vamos nos conectar ao nosso objetivo. E vamos usar essa nova regra para determinar se devemos ou não entrar no estado pretendido. Então, vamos nos direcionar e conectar isso assim. Então, vamos excluir essas regras aqui que se conectam ao nosso ocioso, aos nossos objetivos. Também vamos excluir a regra que a conecta à corrida de faixa de caminhada. Então, agora esses dois blocos não estão conectados. Mas se selecionarmos nossas verificações de mira aqui, podemos assumir para quais estados queremos que ele concorra. Então, poderíamos ficar ociosos e levar para casa walk slash run. O que isso significa é que, se estivermos em nosso estado ocioso ou nossa barra de caminhada executar esse alias, executaremos essa verificação. Portanto, na verdade, não precisamos ter conexões diretas de nenhum desses estados. Dois são apontados porque agora estamos usando esse alias com esses dois estados tectônicos. Assim, quando estivermos nesses estados, isso executará qualquer uma das regras que estão conectadas a ele. Agora precisamos criar uma maneira de ir de nossas animações direcionadas para nosso ocioso ou nossa caminhada. Então, clicaremos com o botão direito em Adicionar um novo alias de estado. Vamos chamar isso de cheques de movimento. Usando isso, vamos criar uma regra para o nosso ocioso. E isso será, se visar, precisa ser falso. Então, vamos nos afastar de seus objetivos e não o faremos. E vamos rolar para cima e não ser membro e nos conectar aqui. E então, nosso movimento se arrastará e nos conectaremos à nossa corrida de barra de caminhada. E faremos a mesma coisa que queremos. É direcionado, é na verdade que vamos usar deve se mover. Porque quando começamos a nos mover, queremos apenas usar nossas animações de movimento para que o desejo mude para verdadeiro. Agora, uma coisa que precisamos adicionar à nossa regra, entrar em nosso objetivo, pois também precisamos acrescentar que não queremos que ele seja executado se estivermos em movimento. Então, vou abrir nosso aqui. Vamos apenas adicionar um fim. Então, faremos e conectaremos a saída aos nossos resultados. Então, queremos e devemos nos mover, deve ser verdade ou não deve ser verdade. Queremos que isso seja um NÃO, NÃO booleano assim. Portanto, nossa regra aqui só será verdadeira se for direcionada, for verdadeira e se o movimento for falso. Então, apenas para fornecer um resumo muito rápido do que isso faz quando estamos ociosos ou nossos estados de corrida de barra de caminhada têm como objetivo verificar a corrida. E fará isso porque temos esses dois estados marcados aqui. E ele executará todas as regras relacionadas a ele. Então, ele vai executar essa verificação. Ele verificará se o objetivo é verdadeiro e deve se mover como falso. E se for, então executaremos nossas animações direcionadas. E então, enquanto estamos mirando animações em execução, essas verificações de movimento serão executadas porque nós temos, oh, eu esqueci de realmente assumir isso. Vamos selecionar isso e marcar são nomeados. Então, como marcamos nosso objetivo sempre que estamos nesse estado, verificações de movimento serão executadas e isso verificará essas duas funções aqui para ver se o FEV1 é verdadeiro. Então, agora vamos testar isso. Vamos compilar, clicar em Jogar e agora podemos mirar. E se eu mirar e começar a me mover, você pode ver que começamos a executar essas animações de movimento. Se pararmos, entraremos nas animações direcionadas novamente. Essa é apenas uma breve visão geral dos aliases. Realmente não faz muito sentido quando temos uma pequena máquina de estado de locomoção como essa. Mas se você tem algo que está se tornando mais complicado, talvez você tenha muitas regras em todos os lugares. Você pode usá-los para organizar seus projetos de animação. Então é isso para esta lição. Espero que agora você entenda um pouco mais sobre estados e regras de animação. 50. Blueprints de animação (espaços de mistura): Olá pessoal. Nesta lição, vamos dar uma olhada mais de perto nos espaços de mesclagem de animação. Agora, se você se lembra da nossa lição de visão geral do Animation Blueprint, misture os espaços que eu estava para fazer a transição suave de uma animação para outra. E podemos dar uma olhada em um exemplo disso acessando nosso plano de animação de dinheiro. Então vamos para o gráfico Anim do que a locomoção, em seguida, andar slash run. E aqui temos um espaço de mesclagem por nó. Agora, esse nó assume um valor como nossa velocidade de solo aqui e usa isso para determinar qual animação ele deve reproduzir em nosso espaço de mesclagem. Se selecionarmos esse nó e passarmos para o painel Detalhes, podemos encontrar qual espaço de mesclagem ele está definido para usar aqui na opção de espaço de mesclagem. Se você passar o mouse sobre, salve o nome do espaço de mesclagem. Então o nosso é o MM walk run. Também podemos clicar neste botão aqui para nos levar ao espaço de mistura. Então, faremos isso e depois abriremos. Agora, como você pode ver, temos essa visualização gráfica aqui em baixo, e é aqui que definimos nossas animações para as diferentes velocidades. Então aqui você pode ver que a velocidade é 0, e aqui em cima a velocidade é 500 por 0. Se passarmos o mouse sobre esse ponto, você pode ver que a animação atual é a animação do local de entrada. Então, mais adiante , com o valor 230, temos uma animação diferente e essa é a nossa animação de avanço. E, finalmente, no final, velocidade 500, tocamos ou executamos animação. Se eu segurar Control e mover mouse ao longo da linha do tempo aqui, você pode ver conforme o valor aumenta, nossa animação muda. Então, à medida que nos aproximamos da nossa animação de corrida aqui, você pode ver que ela se aproxima dessa animação. Então isso é o que nos permite fazer uma transição suave entre, digamos, uma animação de caminhada e eu executo transição suave entre, digamos, uma animação de caminhada e eu executo animação e ela usa esse valor de velocidade, que nosso projeto de animação aqui está fornecendo, e isso é nosso valor de velocidade no solo. Agora, eu vou correr. O espaço de mesclagem é um espaço de mesclagem 1D, o que significa que só tem uma variável que controla qual animação está sendo reproduzida. Esse é o nosso valor de velocidade aqui. Mas também podemos ter espaços de mesclagem que usam duas variáveis. Podemos ter uma direção e a velocidade que controlam qual animação será reproduzida. Para esta lição, vamos configurar um espaço de mesclagem 2D. Então, para fazer isso, vamos para o Navegador de conteúdo. Eu só vou para a pasta Animações. Dentro da pasta manequins, vamos clicar com o botão direito do mouse, ir para a animação. E então você quer encontrar a opção de espaço de mesclagem. Você pode ver que há a opção 1D aqui, ou o espaço de mesclagem aqui, que é o 2D. Então, vamos selecionar esse. Então vamos escolher um esqueleto. Vou usar o esqueleto que vem com o modelo de terceira pessoa. Então esse é o topo aqui, você pode ver que o caminho é de quatro caracteres, manequins e malhas. Então, vamos selecionar isso e isso não terá nome para o espaço de mistura de caminhada direcionada. E vamos abrir isso. Agora aqui você pode ver que temos um gráfico de aparência semelhante ao nosso 1D. Mas em vez de ter apenas o valor horizontal, também temos um valor vertical que nos permite definir animações em qualquer lugar neste gráfico. E então poderemos controlá-los com uma direção e uma variável de velocidade. Então, para começar, precisamos renomear e configurar esses eixos. Então, vamos começar com o eixo horizontal aqui. Você pode clicar no menu suspenso se não estiver aberto para você, vamos nomear o nosso como direção, porque esse eixo controlará a direção que as animações que queremos reproduzir usam. Então, queremos que o valor mínimo do eixo seja um ou menos um AT e o valor máximo seja 180. E isso significa que podemos definir uma animação para cada direção possível que nosso personagem siga. Então precisamos definir o eixo vertical que você possa abri-lo aqui embaixo. E vamos definir isso para acelerar. Agora, o valor máximo que vou definir para dizer 600, e deixaremos o valor mínimo como 0. Portanto, qualquer animação que colocarmos aqui na parte inferior do gráfico será usada quando nosso personagem estiver ocioso ou não se movendo. E então, à medida que avançamos, as animações serão usadas para velocidades de movimento mais rápidas aqui. Agora, algo que eu gosto de fazer é assumir a opção de encaixar na grade no eixo horizontal e depois no eixo vertical. E o que isso fará é quando arrastarmos nossas animações, elas realmente se encaixarão nesses pontos da grade. Agora, essa é uma preferência pessoal, mas eu recomendo ativá-las. Isso torna a configuração de suas animações muito mais fácil. Agora estamos prontos para definir algumas animações em nosso espaço de mesclagem. Vamos começar com a animação usada quando estamos na velocidade 0. Então, para isso, vou pesquisar por idle em nosso navegador de ativos aqui. E eu vou usar o rifle ADS ocioso. Agora, se você não tiver essas animações, você pode assistir ao início da aula de montagem e eu mostrarei como adicionar essas animações ao seu projeto. Mas se você fizer isso, podemos simplesmente arrastar isso para dentro e queremos que fique no centro inferior, então eu vou soltar isso aqui. Também vamos adicioná-lo ao canto inferior esquerdo e inferior direito assim. Agora, a razão pela qual fazemos isso é porque é quando nossa velocidade é 0, então nosso personagem não está se movendo, então nosso valor de direção não importa. Tudo o que precisamos fazer é reproduzir nossa animação ociosa. Em seguida, precisamos de uma animação de avanço, e essa será a animação que será reproduzida quando nossa direção for 0. Então, ele estará no topo aqui. Então, para isso, vou procurar FWD e o navegador de ativos, e vamos usar a animação de avanço do rifle. Então, arraste isso para dentro e solte no topo aqui. Agora, se mantivermos o controle, podemos arrastar e realmente ver nossa animação de caminhada agora funcionando enquanto arrastamos nosso valor até a animação caminhar para frente. Em seguida, precisamos de nossa animação ao contrário. Então, para isso, vamos pesquisar será WD. E vamos usar o rifle para trás. E vamos colocar isso no ponto mais à esquerda aqui. E também para o ponto mais à direita aqui. Agora, a razão pela qual fazemos isso é porque, onde quer que nossos personagens direção 180 ou menos um AT na direção 180 ou menos um AT, ambos estarão retrocedendo. Então, qualquer um deles queremos reproduzir essa animação ao contrário. Em seguida, queremos nossa animação à esquerda. Então, em nosso navegador de ativos, vamos procurar a esquerda e queremos que o rifle ande para a esquerda. Então, eu vou arrastar isso para este ponto quadril. E então queremos a animação certa. Então, vamos procurar o certo. E queremos andar com o rifle, certo? E isso vai subir aqui assim. Agora, quando mantemos o controle, podemos controlar qual animação será reproduzida, dependendo da nossa direção e também da nossa velocidade. Agora vamos usar esse novo espaço de mesclagem dentro do nosso projeto de animação. Então, para fazer isso, vamos para o nosso projeto de dinheiro. Agora vamos adicionar um novo estado que será usado quando, onde visar e enquanto estivermos nos movendo. Então, para fazer isso, vamos clicar com o mouse e adicionar um novo estado. Vou chamar isso de movimento direcionado assim. Agora vamos precisar de uma regra que vá do nosso movimento direcionado ao nosso movimento direcionado. E dentro desta linha, vamos verificar se o objetivo é verdadeiro. E também vamos verificar se estamos nos mudando? Então, vamos fazer um booleano AND e queremos obter o should move. Então, se ambos forem verdadeiros, retornaremos o resultado. E isso nos permitirá passar do movimento direcionado para o nosso movimento direcionado. Agora queremos fazer a transição de volta para o objetivo de nosso movimento direcionado. Paramos de nos mover. Então, vamos abrir que a regra será direcionada. E queremos verificar se deve ser falso. Então, ele vai ficar deve se mover. Queremos usar nós booleanos NOT. Portanto, NÃO é booleano. E então, de volta à locomoção, precisamos adicionar uma linha saindo do nosso objetivo para verificar se dois são movimentos direcionados , porque se já estivermos nos movendo e começarmos a mirar, queremos fazer a transição para o movimento direcionado estado. Então, vamos arrastar da verificação direcionada para o movimento direcionado. E abriremos nosso Rohit. E mais uma vez, vamos conseguir o seu objetivo. E também queremos verificar se deve ser verdade também. Então, vamos começar a nos mover assim. Em seguida, voltaremos para a locomoção. Então, até agora, temos uma configuração para que, quando as verificações direcionadas estiverem em execução, elas verificarão tudo o que almejamos. E se estivermos, entraremos em nosso estado de mira. E se formos apontados e em movimento, vamos para o nosso movimento direcionado. Agora, se estivermos na mira e começarmos a nos mover, ela passará da mira para a mira para o movimento. E se estivermos em movimento direcionado e pararmos de nos mover, faremos a transição para o estado desejado. Agora, há algumas outras mudanças que precisamos fazer. Precisamos selecionar nossas verificações de movimento, permanecer como alias. Precisamos assumir o quadril de movimento direcionado e estamos fazendo isso. Então, verificamos se estamos mirando e se não estamos, então queremos fazer a transição de volta para nossas animações normais de ociosidade ou corrida normal de nossos estados de mira. Agora, precisamos mudar uma de nossas regras relacionadas à nossa verificação de movimento aqui, e essa aqui. Então, se abrirmos isso atualmente, isso é apenas verificar se estamos nos movendo. Queremos mudar isso porque agora temos um estado de movimento. Não queremos fazer a transição para o walk slash run se estivermos apenas nos movendo. Portanto, precisamos adicionar uma verificação para garantir que o alvo seja falso. Então, queremos um conhecimento booleano para isso. Vamos nos arrastar novamente e retornaremos esse valor aqui. Então, agora, se voltarmos para a locomoção, se estivermos em movimento Ames e pararmos de mirar, isso fará a transição de volta para nossa corrida de barra de caminhada porque temos essa verificação aqui que as verificações são direcionadas como falsas e deve se mover de verdade. E se for, então ele nos fará a transição do movimento direcionado ou do objetivo de caminhar. Em seguida, precisamos realmente configurar nosso espaço de mistura e direcionar o movimento. Então, vamos abrir isso. Vamos nos arrastar para fora do resultado e eu vou procurar por Blend Space Player. E usaremos o espaço de mistura. Toque uma nota. Em seguida, vamos selecioná-lo e rolar para baixo até a opção de espaço de mesclagem na parte inferior aqui. Precisamos definir isso para o nosso novo espaço de mistura. Então esse é o espaço de mistura de caminhada pretendido aqui. Você vê que, na verdade, atualizou nossas entradas para nossa direção e nossas variáveis de velocidade. Então, para a velocidade, basta se arrastar e obter velocidade no solo assim. Agora, para orientação, precisamos de uma nova variável. Para fazer isso, vamos para o Gráfico de Eventos. E aqui vamos criar uma nova variável. Então, faremos isso agora e chamaremos essa direção. E queremos que isso seja um carro alegórico. Então, vamos definir isso como um flutuador e compilar. Agora precisamos disso para atualizar cada quadro, então vamos adicioná-lo ao código aqui embaixo. Então, adicionaremos uma nova caneta à sequência, criaremos um nó definido. E vamos conectar isso à nossa sequência. Só vou clicar duas vezes na linha para criar um redirecionamento. Agora, só para manter as coisas arrumadas. Então, para obter nossa direção, precisamos de nossas velocidades. Então, vamos clicar com o botão direito do mouse e pesquisar por velocidade. E se rolarmos para baixo, devemos encontrar a opção de velocidade. Então precisamos da nossa rotação atual. Então, vamos fazer isso. Vamos clicar com o botão direito do mouse e fazer o caractere de lacuna e usar a variável de caractere de espaço. Arraste para fora disso e obtenha rotação. E usaremos a rotação ativa gets. Em seguida, vamos clicar com o botão direito do mouse e pesquisar a direção de cálculo. E essa é uma função que está embutida em todo o Animation Blueprint, o que é muito útil. Isso só nos permite conectar nossa velocidade. Rotação e isso nos dá a direção de que podemos simplesmente conectar diretamente à nossa nota fixa aqui. Agora podemos voltar ao nosso gráfico Anim, depois à locomoção. E então dois são direcionados ao movimento. E podemos pegar essa variável de direção, conectá-la ao nosso nó aqui. Então, agora podemos compilar e experimentar isso. Então, vamos apertar Play. Se eu deixei o mouse, você pode ver que estamos mirando corretamente e se eu começar a me mover, estamos realmente jogando em novas animações de caminhada direcionada. Se eu clicar com o botão esquerdo enquanto me movo, voltamos às nossas animações normais de corrida. Agora, se o seu não estiver funcionando, você pode voltar para a máquina de estado de locomoção e apenas certificar-se de que todas as regras que você configurou estão corretas. Então, eles se parecem com os meus agora. O que está aqui em baixo. E certifique-se de que, nas verificações de movimento, você tenha marcado o movimento direcionado. Atualmente, nosso personagem não está realmente usando nossas animações para a esquerda, direita ou para trás. E isso se deve a uma configuração que ativamos no Modelo do Personagem. Então vamos para a pasta da terceira pessoa, blueprints, ThirdPersonCharacter, e herdar. Vamos selecionar o componente Movimento do personagem. Em seguida, vamos rolar para baixo até as configurações de rotação e desmarcar a rotação orientada para o movimento. E isso impede que nosso personagem fique frente para a direção em que estamos nos movendo. Agora podemos testar nossas animações, compilar e clicar em Play. E agora, quando mudei para a direita, você pode ver que aramos animações para a direita, animações esquerda ou para a esquerda e, em seguida, animações para trás ou para trás são reproduzidas. Agora você pode notar que se você clicar com o botão esquerdo e começarmos a nos mover para o lado, nosso personagem não se move mais para o lado. Ele está apenas seguindo em frente. Agora, a razão pela qual isso está acontecendo está em nosso projeto de animação. O estado de execução da barra de navegação está usando apenas um espaço de mesclagem 1D, portanto, não tem uma entrada de direção. Tudo o que tem é uma entrada de velocidade. E é por isso que o personagem em terceira pessoa tem, por padrão, a rotação do Oriente para o movimento. Agora, há mais algumas configurações no espaço de mesclagem de animação que eu queria mostrar a vocês. Então, temos as divisões da grade agora, isso controla quantos espaços temos em nossa grade. Então, se eu aumentar isso para dizer, oito a oito aqui também em nosso eixo vertical, você verá que agora temos mais blocos em nossa grade. Isso é útil se você estiver usando a grade de encaixe ativada. E isso só lhe dá mais pontos na grade para encaixar para dizer se você quiser uma animação em um local específico, você pode aumentar esses valores para obter um ponto de snap lá. Então temos o tempo de suavização. Agora, esse é o tempo que leva para uma animação fazer a transição para outra animação. Se formos definir isso muito alto, digamos cinco segundos, por exemplo. Agora, quando clicamos em play e eu mudei para a direita, você verá que leva cinco segundos para eu realmente fazer a transição para nossa animação mover para a direita. Então, normalmente você gostaria de usar valores menores para isso. Digamos, por exemplo, 0,250,25 aqui também, apenas para dar um pouco de tempo de transição entre o movimento entre as animações. Mas, por padrão, eles são definidos como 0, então a animação é apenas uma transição instantânea entre si. Então, podemos apenas defini-los como 0 por enquanto. Também há algumas configurações dentro do nosso Animation Blueprint. Então, se tivéssemos isso, então vamos para a locomoção, movimento direcionado. E se selecionarmos esse nó e rolarmos até a parte inferior, você pode ver que há algumas configurações adicionais aqui. Temos a brincadeira de estupro. Então é assim que as animações em nosso espaço de mesclagem serão reproduzidas. Um é a velocidade normal, dois seriam o dobro da velocidade normal. O próximo é o loop. Normalmente, você quer que isso fique ativado para espaços de mesclagem, mas se quiser desativar isso, você pode desativá-lo aqui. Também temos a posição inicial. Então, se você quiser que as animações comecem em um horário diferente de 0, você pode mudar isso aqui. Por fim, temos nossa configuração de espaço de mesclagem. É assim que alteramos o espaço do botão que estamos realmente usando nesse nó. Então é isso para esta lição, mas usaremos espaços de mesclagem em nossas aulas futuras. 51. Blueprints de animação (offsets): Olá pessoal. Nesta lição, vamos dar uma olhada nas compensações de mira. Agora, o objetivo dos conjuntos nos permite realmente fazer com que nosso personagem olhe em uma direção específica. Isso pode ser útil se você tiver uma arma e realmente quiser que o personagem olhe na direção que sua câmera está apontando. Agora, o objetivo dos conjuntos realmente funciona forma muito semelhante aos espaços de mesclagem. Temos um gráfico no qual podemos colocar animações e, em seguida, usamos duas variáveis para controlar quais animações queremos reproduzir. Agora vamos fazer isso. Vamos precisar de alguma animação, então vou tirar X de jogar o NetTutor aqui, vou usar algumas animações que estão incluídas na pasta Animações da lição. Se você não tem isso em seus projetos, mostro como adicioná-los no início da aula de montagem. Então, se você der uma olhada nisso, isso explicará como você pode colocar essas animações em seu projeto. Agora, se descermos até o final, encontraremos as animações do EO. Agora, isso significa compensação de AIM, e você pode ver que temos alguns deles. E essas são animações para cada direção que o personagem pode estar voltado. Se abrirmos essa animação voltada para baixo aqui, por exemplo, você pode ver que é uma animação de quadro único, o que significa que na verdade não anima o personagem, é apenas um quadro único do nosso personagem olhando para baixo. Então, se fecharmos isso e formos para outro, diga nossa animação aqui. Esta é uma animação que é apenas um quadro, mas nosso personagem está olhando para a esquerda. Agora, usando nosso desvio de mira, vamos recombinar todas essas animações e depois controlar qual delas queremos jogar dependendo das duas entradas variáveis. E essas entradas serão a rotação da nossa câmera. E isso nos permitirá controlar a direção que nossos personagens enfrentam usando nossa câmera. Para começar, vamos fechar isso e vamos criar um novo deslocamento AME. Vou fazer isso dentro dos manequins, depois animações. Então, clicaremos no botão Adicionar aqui, depois iremos para a animação e você deseja encontrar um deslocamento mais agora, semelhante aos espaços de mesclagem, que é uma opção 1D que permite controlar o objetivo de conjuntos com apenas uma variável, mas vamos usar apenas o deslocamento normal da mira, então ele criará um deles. E agora precisamos selecionar nosso esqueleto. Vou selecionar o esqueleto que vem com o modelo de terceira pessoa. Então esse é esse aqui em malhas de manequins de caminho CSS. Então, sabemos que é o certo. Isso vai criar um novo A-Master. Então, eu vou chamar isso de A0 apontado. Então, sabemos que esse é o objetivo do deslocamento da animação. E então vamos abrir isso. Eu só vou arrastar o meu até a barra superior aqui. Então, agora estamos dentro do nosso desvio de mira. Você pode ver que é muito semelhante a um espaço de mesclagem. Temos nosso gráfico aqui embaixo. Temos as mesmas configurações de eixo horizontal e vertical aqui, e temos nossa visualização no topo aqui. Então, para começar, precisamos configurar nosso gráfico nomeando nossas variáveis aqui. Então, nosso top para horizontal, queremos York. Vamos definir o mínimo de cinco, U2 menos 90 e o valor máximo como positivo 90. Isso dará ao nosso personagem a capacidade de reproduzir uma animação quando estivermos olhando para a direita e para a esquerda. Em seguida, fazemos o mesmo para o pitch. Então, vamos nomear nosso passo do eixo vertical. E o valor mínimo será menos 90 e o valor máximo será positivo 90. E isso significa que seremos capazes de definir uma animação para todo o caminho para cima e para baixo. No próximo slide, nosso espaço de mesclagem é, eu gostaria de assumir a opção de ajustar à grade aqui e também aqui embaixo, apenas para quando arrastarmos nossas animações e sabermos que elas estão se ajustando aos valores exatos. Agora, antes de começarmos a adicionar animações ao nosso deslocamento de mira, eu só queria explicar um pouco sobre o que ele realmente faz. Agora, o objetivo dos conjuntos usa animações aditivas, o que significa que as animações que reproduzimos usando nosso deslocamento de mira não substituem a animação atual está sendo reproduzida no personagem. Eles realmente contribuem para essas animações. Isso significa que podemos ter nosso objetivo compensado jogando com nosso personagem, olhando em uma direção enquanto ainda tocamos, digamos, uma animação ociosa para a respiração do personagem. Mas para fazermos isso, precisamos mudar a animação. Então, vamos usar um deslocamento em animações aditivas. Agora, temos que fazer isso qualquer maneira, porque não seremos capazes de colocar essas animações aqui até que elas sejam configuradas como aditivas. E posso mostrar a vocês que, se rolarmos até o final, devemos encontrar nossas animações A0 aqui embaixo. Se eu tentar arrastar um para dentro, você verá que ele não vai realmente me deixar, e ele diz tipo de animação aditivo inválido. Isso porque atualmente todas as nossas animações A0 aqui ainda não são aditivas. Precisamos entrar neles e alterá-los para usar configurações aditivas. Então, há algumas maneiras de fazer isso. Vou mostrar como alterar essas configurações em uma animação. E então vamos usar o editor de matrizes para alterar todos eles para as mesmas configurações. Começará com o primeiro aqui. Esta é a A0, C, C. Então esta é a nossa animação central. Só vou clicar duas vezes nisso para abri-lo. Agora, em nossos detalhes de ativos, vamos rolar para baixo até encontrarmos as configurações aditivas aqui. E atualmente você pode ver que está definido como sem aditivo, o que significa que esta é apenas uma animação normal, ainda não configurada como uma animação aditiva. Agora, para os deslocamentos do AIM, precisamos alterar isso para o espaço da malha, que significa que essa animação calculará as alterações. Portanto, isso deve ser feito para o caractere e o espaço da malha em vez do espaço local para deslocamentos do AIM, você sempre quer usar o espaço MSS porque esse é o único que ele suporta. Em seguida, vamos alterar o tipo de pose base para a animação selecionada dimensionada aqui assim. Agora, isso nos permite definir uma animação que consideramos ser o ponto de partida padrão para essa animação aditiva. Então, para esta animação, estamos no centro, e essa é a que queremos usar como referência. Então, na verdade, vamos definir isso para a animação em que estamos dentro agora. Procuraremos por CC e usaremos o quadril ocioso do rifle MM, FAI, AOC. Veja, esta é apenas a nossa animação central de quadro único. Agora, essa é a animação que vamos usar para todas as nossas animações de mira fora do set aqui, porque esse é o ponto central e é aí que queremos que nossas animações aditivas sejam adicionadas. Então, agora configuramos essa animação como aditiva e poderemos adicioná-la ao nosso deslocamento de mira agora, mas ainda temos que fazer isso para todas essas animações aqui embaixo. Agora podemos analisar cada um vez e definir essas configurações da mesma forma, mas há uma maneira mais rápida de fazer isso. Então, o que faremos é salvar e ir para a pasta de animação da lição. Vamos rolar para baixo até perto da parte inferior, e vamos selecionar todas as nossas animações de deslocamento de mira além da central porque já acabamos de configurar isso para manter o controle e selecione todos esses aqui e continue descendo até que tenhamos todos eles. Em seguida, clicaremos com o botão direito do mouse e queremos ir para ações de ativos e, em seguida, editar em massa via matriz de propriedades. E isso abrirá essa janela aqui. Agora, se você nunca usou essa ferramenta antes, ela basicamente permite selecionar vários ativos no Navegador de conteúdo e alterar todas as configurações ao mesmo tempo. Então, para fazer isso, vou clicar nos ativos e fazer o Controle a, e isso selecionará todos os nossos ativos aqui. Então, no editor de propriedades, você pode ver que temos as mesmas configurações que tínhamos quando estávamos dentro da animação. Vamos apenas rolar para baixo até o final aqui. Queremos encontrar as configurações aditivas. Então, vamos mudar isso de nenhum aditivo para o espaço da malha, como fizemos antes. Em seguida, alteraremos isso para a animação selecionada em escala. Em seguida, queremos selecionar a animação e o fim de semana. Queremos definir isso para a animação CC para nosso deslocamento de mira, então vamos selecionar isso. E agora podemos fechar isso e todas as nossas animações agora usarão essas configurações. Então, se escolhermos um aleatoriamente como a nossa esquerda aqui embaixo, você pode ver se eu rolar para baixo, encontramos as configurações aditivas. Você pode ver que agora estão configurados para nós. Então, agora todas as nossas animações de compensação de mira são configuradas como aditivas. Podemos voltar ao nosso desvio de mira. Então, eu vou fechar essas duas animações por enquanto. E vamos para os manequins do que para a pasta Animações e abriremos nosso objetivo. Eu só vou arrastar isso até o topo novamente. Portanto, a última coisa que precisamos fazer antes de começarmos a adicionar animações ao nosso deslocamento de mira é definir uma animação de visualização. E isso apenas nos dá uma animação que será visualizada em cima do nosso deslocamento de mira para que possamos ver como ela se parece. Então, ele vai rolar até o final aqui. Agora, para a pose base de visualização, não queremos usar uma animação aditiva, caso contrário, simplesmente não veremos uma prévia. Então, vamos procurar por ocioso. E vamos encontrar o, vou usar o FAI de quadril ocioso de rifle aqui porque nossos desvios de mira são na verdade para o quadril rápido, então vamos selecionar isso. Então. Eu só vou salvar e depois fechar e reabrir nosso desvio de mira assim. Agora estamos prontos para começar a adicionar animações ao nosso gráfico aqui embaixo. Na barra de pesquisa, vou procurar a animação central porque essa é a animação que queremos usar. Quando seu tom é 0, porque esse será o ponto central. Vou procurar por CC e vamos arrastá-lo para o centro assim. Agora você pode ter esse problema em que a visualização desaparece. Parece haver um bug se você rolar para baixo e nós apenas redefinirmos o valor da nossa visualização e em seguida, selecionarmos, digamos, uma animação diferente. Vamos apenas procurar por ocioso novamente. Vou selecionar MFA ocioso e, em seguida, procurarei por ocioso novamente. Vamos selecionar nosso rifle, quadril ocioso, FAI, como fizemos antes e você pode ver agora que está funcionando. Não sei por que isso acontece. Eu acho que é um bug do motor, então espero que seja consertado em breve. Em seguida, precisamos adicionar outras animações. Então, aqui na barra de pesquisa, vou procurar por CU, e isso significa Centralizar. Então, vamos adicionar essa animação aqui porque queremos que para nossos personagens centrados na sua bunda, seja 90 no campo. Então, vou adicionar isso aqui. Você pode ver nossas prévias quebradas novamente, tudo bem. Vamos corrigi-lo assim que terminarmos de adicionar ou animações. E então faremos outra busca e procuraremos por c, d. E isso significa Centro para baixo. Então, vamos adicionar isso ao centro na parte inferior aqui. E novamente, isso é para quando R é 0 e nossos arremessos menos 90. Em seguida, vamos fazer o lado esquerdo. Então vou procurar por L, C, que significa centro esquerdo. Então, vamos adicionar isso aqui. Isso será para o nosso arremesso, ou desculpe, você está sendo menos 90 e nosso arremesso sendo 0. Então queremos deixar para cima, então LU, e vamos adicionar isso ao topo aqui, depois Aldi e adicioná-lo ao fundo. Então vamos fazer o lado direito. Então, vamos fazer LC, RC, Isso é o centro certo do que queremos. Direto para cima. E esse é aquele acerto para baixo somado ao canto superior direito. E então queremos nosso D, que está logo abaixo, e vamos adicioná-lo ao canto inferior direito assim. E agora podemos salvar isso. Em seguida, podemos corrigir nossa visualização, então faremos o que fizemos antes, que redefiniu o valor. Em seguida, procuraremos por ocioso. Vou definir isso para nossa animação ociosa, e então procuraremos por ocioso novamente. E usaremos o fogo de quadril ideal assim. Agora, esse bug não afetará a forma como nosso desvio de mira funciona no jogo. É apenas um problema de pré-visualização, então não se preocupe muito com isso. Mas agora podemos realmente testar isso. Portanto, mantemos o controle e movemos o mouse e você pode ver nossos personagens agora usando os desvios de mira que acabamos de configurar. Você também pode ver que nossa animação ociosa ainda está sendo reproduzida, mesmo que estejamos adicionando em cima dessa animação nosso deslocamento de mira. E é assim que as animações aditivas funcionam. Eles adicionam as informações adicionais à animação que está sendo reproduzida no momento. Agora estamos prontos para realmente configurar isso dentro do Art Animation Blueprint. Então, o que faremos é salvar isso e sair daquilo. Então, ele abrirá com o dinheiro Animation Blueprint e queremos ir para o Gráfico de Eventos. Então, se você não estiver lá, basta clicar duas vezes nele e entrar no gráfico de eventos. E vamos precisar de duas novas variáveis. Então, vamos precisar de uma variável para nosso tom e guinada. Então, vamos adicionar uma nova variável, vou chamar isso de argumento de venda. E queremos que isso seja um carro alegórico. Então, vamos mudar isso para o tipo flutuante. E faremos o mesmo para o seu problema super legal. E já está definido para flutuar para nós. Então, podemos simplesmente compilar. Em seguida, precisamos de algum código para realmente definir essas variáveis. Então, vai descer aqui e vamos começar com o personagem. Então pegue o personagem. E queremos que eles obtenham variáveis de caracteres. E precisamos obter a rotação do controle. Portanto, obtenha rotação controlada. E essa é a rotação da nossa câmera. E então queremos a rotação de nossos personagens, então faça uma rotação de atores assim. Então, a partir da nossa rotação de controle arraste para fora e vamos procurar por Delta. Queremos que o Delta gire uma nota, e queremos conectar b em nossa rotação de eixo assim. Agora, o nó delta basicamente obtém a diferença entre nossa rotação de controle e a rotação do eixo. E essa é a direção que queremos que nosso personagem realmente enfrente. Agora, a partir do valor de retorno, vamos procurar nossa interceptação. E queremos nosso interp2. E queremos que esse seja o alvo porque essa é a direção do alvo que queremos que nosso personagem olhe. E então, para o atual, vamos usar nosso argumento de venda em seus valores. Agora, podemos clicar com o botão direito do mouse e fazer uma caneta dividida assim. Podemos conectar os valores indiretamente. Ou se você recombiná-los, podemos arrastar e fazer e usar um nó rotador make como esse. Podemos conectá-los aqui também. Então eu vou pegar o seu, conectar isso na sua entrada e depois lançar, conectar isso no campo e colocar assim. Então, para o tempo delta, queremos usar o tempo deltas do mundo. Então, vamos apenas nos arrastar e procurar pelo mundo. E queremos obter as configurações do Delta mundial. E então, para a velocidade da Internet, essa é a rapidez valor retornado passará do atual para o alvo. Então, quanto mais alto isso for, mais rápido a ou B, vou definir o meu para 20. Podemos voltar e ajustar isso se quisermos. Em seguida, precisamos fixar os ângulos de inclinação e guinada. Então, para fazer isso, vamos nos arrastar e fazer uma pausa. rotador do nosso campo se arrastará e procurará o grampo. Queremos um ângulo de fixação. Agora, a razão pela qual estamos fazendo isso é se você se lembrar em nosso deslocamento de mira, temos um valor mínimo de menos 90 e um valor positivo de 90. Não queremos nosso argumento de venda ou você está indo acima ou abaixo desses valores. Então, para eles, vamos definir menos 90 para o máximo que queremos 90. E então vamos copiar e colar isso e conectar os graus do ângulo no Z ou na saída aqui assim. Agora vamos usá-los para definir nossas variáveis. Então, para o primeiro, para o pitch, queremos definir o pitch. E quando usamos nosso nó set pitch e, em seguida, para o inferior, queremos que o set your use o set your node assim. Conecte-os juntos. E então vamos conectá-los às nossas sequências. Então, adicione uma nova caneta, arraste para fora dela e conecte-a ao nosso tom. Basta clicar duas vezes nele para adicionar um nó raiz. E vamos apenas arrastar isso aqui só para manter as coisas arrumadas assim. Então, agora estamos realmente prontos para adicionar nosso deslocamento de mira ao nosso gráfico Anim. Então, vamos para lá agora. Queremos apenas que nosso deslocamento de mira afete a metade superior do nosso corpo, não a metade inferior por causa dos efeitos da metade inferior, isso vai atrapalhar nossas animações de movimento. Agora, se você se lembra da nossa lição de mesclagem de nós, configuramos uma nota de mistura por osso aqui que separará nossa parte inferior e superior do corpo e nos permitirá que as animações sejam reproduzidas apenas na metade superior. E é isso que estamos fazendo aqui com nosso slot de montagem. Então, vamos adicionar nosso objetivo, o deslocamento a este código aqui, porque esse será o código que será jogado para a metade superior. Então, vamos arrastar isso só para criar um pouco mais de espaço. Agora vou ter meu deslocamento de mira jogado antes do meu slot Montage. A razão pela qual fazemos isso é se tocarmos uma montagem, eu não quero, ou não quero que nosso deslocamento de mira afete a montagem. Então, se fizermos isso antes, quando tocarmos uma montagem, ela substituirá nosso deslocamento de objetivo do nosso caixa principal. Vamos arrastar e pesquisar o deslocamento do AIM. E queremos o plano de compensação da mira. Então, vamos criar isso assim. Agora precisamos definir qual mira fora do conjunto que realmente queremos usar. E isso é o mesmo que definir espaços de mesclagem. Então, aqui no painel Detalhes com as notas selecionadas, vamos rolar para baixo. Você pode ver que na verdade diz espaço de mesclagem, mas significa dizer deslocamento. Mas podemos clicar aqui e você pode ver se o A0 está lá. Então, vamos selecionar isso. Apenas como uma nota lateral, pode ser uma compensação para você se a Epic consertar isso. Então, para mim, diz espaço de mistura para você. Pode dizer um deslocamento, mas você pode definir seu deslocamento de mira aqui de qualquer maneira. Então você pode ver nosso aviso atualizado. Nós temos nossas próprias entradas de pitch, então vamos pegar essas variáveis e conectá-las ao nosso nó de compensação de mira. Então, vamos pegar seu argumento de venda e conectá-lo ao tom assim. E agora podemos compilar e testar isso. Então, vamos para o nosso nível de imprensa Play. Você pode ver que agora, quando estou e olho em torno de nosso personagem na verdade, olha na direção em que minha câmera está voltada. Se começarmos a nos mover, você pode ver que nosso espaço de mesclagem ainda está funcionando com as animações de movimento de nossos personagens, enquanto também nossos deslocamentos de mira funcionam. E se você olhar de perto ou animação ociosa ainda estiver sendo reproduzida, mesmo que estejamos mirando em uma direção diferente com nosso objetivo de SAP. Mas agora, se eu sair da minha visão de mira apenas clicando com o botão esquerdo, você pode ver que minha animação normal por não segurar uma arma é meio estranha. E isso é porque estamos jogando esse desvio direcionado. Mesmo quando não estamos mirando, podemos mudar isso em nosso projeto de animação com bastante facilidade, então vamos até lá. Agora, aqui você pode ver que nosso deslocamento de mira tem um valor Alpha. Agora, um significa que o deslocamento da mira está ativado e 0 significa que está desligado. Então, se for 0,5, seria preciso metade da influência do nosso desvio de mira. Agora podemos realmente mudar isso para um booleano para apenas ativá-lo ou desativá-lo. Então, vamos selecionar nossa nota, vá para o valor Alpha no valor C Alpha, desculpe, o tipo de entrada alfa está atualmente definido como valor flutuante. Mas se eu alterar isso para valor booleano e ver que agora temos essa caixa de seleção total ativada. E agora podemos pegar a barra é oito. Conecte isso ao habilitado aqui. E agora, quando compilamos e clicamos em Play, você pode ver que agora eu não estou mirando. Você verá que a animação ociosa está se comportando corretamente. Mas quando eu começo a mirar, você pode ver que nosso deslocamento de mira começa a funcionar novamente. Agora, há outra maneira de ativarmos e desativarmos nosso desvio de mira. Então, se sairmos daqui e voltarmos ao nosso Animation Blueprint, em vez de apenas ativar ou desativar esse nó especificamente, poderíamos ter uma seção inteira de código executada somente quando for direcionado como verdadeiro . Então, para fazer isso, podemos procurar a ferramenta Blend, e podemos usar a Bíblia de poses de mistura. E usamos isso em nossa lição de nós de combinação. Então, se você se lembra, podemos pegar isso, conecte-o ao nosso slot padrão aqui, e então vamos desconectar o coração é direcionado. Conecte isso ao valor ativo. Então, se for apontado como verdadeiro, o código verdadeiro aqui será executado. E se for falso, o código pessoal será executado. Então, quando não estamos, queremos nossos códigos direcionados. Então, vamos conectar isso à verdade. Vou clicar em Habilitar testes. Por isso, está sempre ativado. Se não formos direcionados, podemos simplesmente copiar e colar o dinheiro dos nossos principais estados. Conecte isso aqui. Isso funcionará exatamente da mesma forma que antes. Assim, podemos compilar o hit Play. Você verá que quando eu apontar nossos personagens fazendo nossa mira ou nome de arquivo separado, você pode ver que nossa animação está funcionando corretamente. Então, como você pode ver, as duas formas funcionam. Qual deles você usa, depende totalmente de você. Dessa forma, pode ser um pouco mais fácil se você tiver, digamos, outros nós que deseja sejam executados quando for direcionado como verdadeiro, porque você poderia simplesmente conectá-los até aqui e executá-los. Quando isso é verdade? Então é isso para esta lição. Espero que agora você entenda como configurar um deslocamento de nome e como usá-los em seus projetos. 52. Blueprints de animação (curvas e metadados): Olá pessoal. Nesta lição, vamos dar uma olhada nas curvas e nos metadados da animação. Agora, essencialmente, curvas e metadados nos permitem adicionar informações adicionais às nossas animações que podemos ler dentro de nosso projeto de animação quando elas são reproduzidas. Então, para começar, mostrarei como realmente criamos uma nova curva. Então, vamos para uma animação. Vou escolher a animação de avanço. Então, para nós, isso estará na pasta Quinn e depois na r14. E a razão pela qual está na pasta Quinn e não no dinheiro é, se você se lembrar, nosso projeto de personagem está realmente usando o Quinn Animation Blueprint. E nisso temos o conjunto de animação Run 4D. Vamos abrir isso. E aqui você pode ver que temos uma linha do tempo de curvas. Agora, para adicionar uma nova curva, basta clicar no menu suspenso aqui e podemos ir para a curva AD. Agora, como você pode ver, o modelo de terceira pessoa vem com um monte de curvas embutidas. Na verdade, eles não fazem nada por padrão até que os usemos e os configuremos. Mas, por enquanto, vamos criar nossas próprias curvas. Então, vamos subir para Criar curva, e vamos dar um nome a ela. Vou chamar o meu exemplo de curva assim. E você vê que isso agora adicionou nossa curva de exemplo à nossa animação. Agora, essa curva permite que nossa animação produza um valor dependendo do tempo na animação em que estamos. Então, atualmente você pode ver que está definido como 0. Então, quando tocamos essa animação, tudo o que nossa curva fará é gerar um valor 0. Mas podemos editar essa curva para gerar um valor diferente, dependendo do ponto da animação que está sendo reproduzida no momento. Para fazer isso, vamos até o menu suspenso da curva para a curva de exemplo e, em seguida, queremos selecionar Editar curva. E se você se lembra da nossa lição de cronogramas, isso realmente funciona muito parecido com isso. Então, atualmente, esse valor será 0 o tempo todo em que as animações forem reproduzidas, mas podemos adicionar novos pontos. Então, se eu clicar com o botão do meio do mouse, isso adiciona um novo ponto para nós. E então, aqui no topo, temos o tempo em que esse ponto está atualmente e seu valor. Então, se eu definir isso como 0 ou 0 está atualmente no tempo 0 e tem valor 0. Agora, se eu adicionar outro ponto, digamos em um segundo. Então, por aqui, vamos clicar no meio do mouse. Agora, com isso selecionado, você pode ver que o tempo é um e podemos definir o valor para outra coisa como dez, por exemplo, você pode ver que meu ponto saiu do gráfico, mas se clicarmos neste pequeno caixa aqui, ele realmente trará todos os nossos pontos de volta à vista. Agora, quando essa animação for reproduzida a 0 vezes, o valor será 0. Mas com o passar do tempo, o valor aumentará ao longo dessa linha até chegarmos a 1 segundo e serão dez. Então, à medida que o tempo aumentar novamente, o valor permanecerá dez porque não temos nenhum ponto adicional. Então, agora podemos ler esse valor dentro do nosso projeto de animação acessando o mapa em terceira pessoa aqui. Então, queremos ir para o nosso Animation Blueprint. Então, as animações vão para o dinheiro Animation Blueprint. E no gráfico de eventos, vamos adicionar um novo nó. Vamos clicar com o botão direito do mouse e pesquisar por curva. Vamos usar get curved valley. Você pode ver que podemos colocar um nome de curva. Então esse precisa ser o nome exato que estamos usando para nossas curvas. Portanto, este é um exemplo de curva escrito exatamente da mesma forma com as letras maiúsculas também. Agora, se uma animação for reproduzida curva que configuramos, a saída será o valor atual. Então, vamos adicionar uma nova caneta e apenas adicionar uma string de impressão, por exemplo. E vamos inserir o valor de retorno em nossa string de impressão. E vamos compilar. E podemos testar isso. Então, vamos apertar play. E você pode ver que atualmente nenhuma animação que usa essa curva está sendo executada. Portanto, nosso valor é apenas 0. Mas se eu começar a correr para frente, você pode ver nosso valor aumentar para dez. Agora ele está redefinindo para 0 toda vez que a animação é reiniciada. Porque se você se lembra no início da nossa animação, é 0, então vai para dez. E então, quando chegar ao final da nossa animação, vai fazer um loop. Ele começará novamente em 0 e o valor de r será 0. Agora, novamente, semelhante à nossa linha do tempo, podemos destacar esses pontos aqui. Podemos mudar a forma como eles fazem a transição um do outro. Então, aqui em cima, podemos escolher quais tipos de queda serão para o ponto. Por exemplo, podemos selecionar o automático e você vê agora que obtemos um efeito mais curvo para nosso aumento de valor. E podemos usar essas pequenas alças para realmente ajustar como nossa linha muda. Também podemos mover nossos pontos apenas selecionando-os e arrastando-os. Agora, eu selecionei os dois, então está movendo os dois. Mas se eu destacar apenas aquele aqui, você pode ver que posso mudar esse ponto para mudar qual será o nosso valor naquele momento específico. Se você quiser ver esse valor, passe o mouse sobre ou pode encontrá-lo aqui. E então o valor do tempo está aqui. Agora, atualmente, estamos no editor de curvas, como você pode ver aqui. Mas se você quiser voltar à visualização normal, basta clicar nessa guia e isso nos leva volta à guia que normalmente vemos. Agora, se você quiser voltar ao Curve Editor, digamos que o fechou por acidente, você pode clicar na curva e apenas editar a curva. Isso nos trará de volta aqui. Se você quiser remover uma curva, basta clicar nela e clicar em Remover curva e isso realmente eliminará nossa curva para nós. Agora você pode ter várias curvas e uma animação. Você pode simplesmente acertar a curva e outra curva, você pode criar ou reutilizar uma das curvas que estão aqui. Agora podemos adicionar essa mesma curva a outra animação. Então, se sairmos e vamos até o dinheiro e abrimos, digamos, a animação do salto. Poderíamos ter a mesma curva até aqui também. Podemos ir para a curva AD. E em vez de criar uma nova curva, podemos simplesmente pesquisar pelo nome. Então, vamos pesquisar por exemplo. E você pode ver que nossa curva de exemplo já está lá porque nós a criamos já existe. Para que possamos reutilizá-lo, criaremos isso. E você pode ver que começa com os valores padrão de 0. Agora, talvez nesta animação queiramos que uma curva escura tenha valores totalmente diferentes. Por exemplo, podemos clicar com o botão do meio do mouse, definir isso como 0. Poderíamos definir o valor inicial para algo como menos 100. E clicaremos na caixinha só para trazê-la de volta à nossa vista. Então podemos clicar com o botão do meio do mouse em, digamos, 2,5 e fazer com que esse valor vá para 500. E vamos coletar a caixa novamente apenas para mostrar os dois à nossa vista. E agora, quando essa animação é reproduzida ou produz valores totalmente diferentes da nossa curva. Então, para testar isso, aperte play e veja se eu corro para frente que ainda está tocando nossa curva a partir dessa animação. Mas se eu pular, você verá que ele sobe dois valores completamente diferentes. Em seguida, temos metadados, que são basicamente uma curva que acaba de receber um valor. Então, mostra o que quero dizer, podemos adicionar ao salto aqui e voltaremos para a guia aqui em cima. Agora podemos remover essa curva de exemplo por enquanto. Então, vamos apenas remover curva, subir para curvas e você pode ver que temos metadados. Agora aqui você pode ver, novamente, há muitos modelos padrão que vêm com o modelo de terceira pessoa. Mas se pesquisarmos, por exemplo, curvar novamente, você verá que isso também está lá. Mesmo sendo uma curva, também são apenas metadados. Assim, podemos pesquisar por curva e adicionar nossa curva de exemplo assim. Agora, como você pode ver, seu valor padrão é um. E se formos para o menu suspenso da curva, não há opção para editar isso. Isso ocorre porque os metadados agem como adicionar um booleano à sua animação. Se for adicionado à animação o Boolean equivale a ser verdadeiro. E se não estiver na animação, então é falso. Em nosso blueprint de animação, esse valor de retorno será um ou 0, dependendo se a animação tiver esses metadados com esse nome. Agora, quando clicarmos em Play, você verá quando eu pular aumenta para um e depois diminui de volta para 0. Agora, as curvas de animação são usadas para todos os tipos de coisas, como controlar animações faciais ou propriedades dentro de materiais. Não vamos abordar isso nesta lição apenas porque ela é um pouco mais avançada. Mas o que também podemos fazer com curvas de animação é lê-las dentro do nosso Animation Blueprint, como temos feito com nossas curvas em metadados. Um exemplo do que você poderia fazer com curvas no futuro é talvez você tenha um projeto que tenha filmagem, mas certas animações você não quer que o jogador seja capaz de atirar. Bem, você poderia criar uma curva de tiro em bloco. Essas são as animações nas quais você deseja bloquear a filmagem. Então, dentro do seu projeto de animação, você poderia ler essa curva. E se o valor estiver acima de 0, você sabe que deve bloquear o disparo no seu código. Agora, uma coisa a ter em mente é se voltarmos para nossa animação de salto, porque temos nossa curva de exemplo aqui adicionada como metadados. Não podemos adicionar uma curva de exemplo como uma curva também. Se tivéssemos que adicionar curva, pesquisamos, por exemplo, em C, Ela não vai aparecer até excluirmos essa curva de exemplo. Então, vamos remover isso e, em seguida, ir para Adicionar pesquisa de curva, por exemplo. Agora, você pode ver que está aparecendo e podemos adicioná-lo como uma curva. Agora, se você quiser descobrir onde todas essas curvas estão realmente definidas e você pode gerenciá-las, renomeá-las ou excluí-las. Vamos para o Navegador de conteúdo. Então vamos para a pasta do manequim, depois malhas e vamos abrir o SK mannequin. Agora, este é o esqueleto do nosso personagem. E aqui você pode encontrar as curvas do anime. Se o seu não estiver aberto, você pode ir até a janela e selecionar as curvas de anime aqui. Agora, nas curvas do anime também, podemos excluir curvas para que você possa clicar com o botão direito do mouse na coluna, clicar em Excluir. Você pode renomeá-los ou adicionar novas curvas apenas selecionando Adicionar nova curva e inserir um nome. Agora, por fim, se tentarmos adicionar nossa curva de exemplo às animações da lição aqui e à pasta de animação da lição. Na verdade, não conseguiremos encontrar nossas curvas de exemplo. Então, se abrirmos, digamos, o rifle, caminharmos para frente, eu vou para curvas e vou para a curva AD e procuro, por exemplo, ver que ele não aparece de fato. Agora, se você se lembra dessas animações em nossa pasta Animações da lição ou usando um esqueleto diferente, elas do nosso personagem. Então, na verdade, temos que adicionar manualmente nossa curva a esse esqueleto para que essas animações o encontrem. Então, para fazer isso, vamos apenas para o manequim do que duas malhas e depois para o manequim SK. E aqui vamos para curvas de anime, que vai clicar com o botão direito do mouse em adicionar uma curva. Vou chamar esse exemplo de curva exatamente igual ao nome que demos à nossa curva antes. Vamos pressionar Enter e agora adicionamos essa curva ao nosso esqueleto. Então agora podemos fechar isso e voltar para o nosso rifle, caminhar para frente, depois duas curvas. E podemos adicionar uma curva ou metadados, e podemos pesquisar, por exemplo, e podemos encontrar nossa curva agora. Então, vou apenas adicionar nossa curva de exemplo. Vou editá-lo para adicionar alguns valores. Clique com o botão do meio do mouse na palavra e um valor de dizer 0 para dez. E então vamos centralizar novamente o gráfico. Eu não tenho um valor, digamos um por 500, assim. Vamos centralizá-lo novamente apenas para garantir que tudo esteja correto. Agora podemos testar isso. Vou apertar o play e mirar e seguir em frente. E você vê que nosso valor está aumentando assim. Agora, se o seu não funcionar e continuar lendo 0 quando você avança, tente salvar tudo da reinicialização do motor. Isso é um bug no momento com esqueletos compatíveis. Se você se lembra, é por isso que nosso personagem pode reproduzir as animações de nossas aulas. Vimos esqueleto compatível com pagamento na aula de montagens, mas é um pouco confuso, pois é um novo recurso. Então, às vezes você só precisa salvar e reabrir o projeto e ele deve funcionar corretamente, então é isso para esta lição. Espero que agora você entenda como adicionar metadados e curvas às animações e, em seguida, ler esses valores dentro do Animation Blueprint. 53. Sistemas de jogabilidade (interação): Olá pessoal. Nesta seção do curso, usaremos tudo o que aprendemos em nossas lições anteriores para criar algumas mecânicas de jogo comuns. Agora, nesta lição, vamos criar um sistema básico de interação. Isso nos permitirá executar código dentro de outros objetos quando nosso jogador interagir com eles. Agora, para aqueles de vocês que acompanharam as lições anteriores, criei um novo modelo de terceira pessoa apenas para que tenhamos um novo começo para esta seção do curso. Então, para começar, vamos para o ThirdPersonCharacter Blueprint e isso está dentro da pasta da terceira pessoa, depois nos projetos. Então, isso abrirá isso. E inspire, vamos criar uma nova função e vamos chamar isso de olhar para o ator irá compilar. Agora, essa é uma função que realmente detectará qual ator estamos vendo atualmente. E para fazer isso, vamos usar um traçado de linha, então ele se arrastará e procuraremos por traçado de linha. E queremos traçado de linha por canal. Se você se lembra da nossa lição de traçados de linha, um rastreamento de linha nos permite detectar objetos entre os locais inicial e final. Então isso o torna ideal para coisas como um sistema de interação, porque podemos detectar o jogador está olhando para um objeto. Então, para fazer isso, precisaremos de um pouco de matemática para determinar onde nossa bandeja de linhas deve começar e terminar. Então, vamos clicar com o botão direito do mouse e obter rotação de controle. E isso nos dá a rotação atual da câmera de nossos jogadores. A partir disso, queremos avançar na direção. Então, queremos pesquisar por get rotation x vector. Então queremos nos arrastar para fora disso e fazer um nó vezes ou multiplicar. E vamos mudar a entrada aqui para um flutuador. Então, vamos clicar com o botão direito do mouse para converter caneta e, em seguida selecionar o fluxo e queremos precisão dupla. Então, vamos fazer isso. Isso vai recuar um pouco. Agora, o valor que definimos aqui é o quão longe do local de início nosso personagem pode interagir. Então, digamos que eu queria que a interação e a distância fosse de quatro metros. Vou colocar 400 aqui e poderemos mudar isso mais tarde, mas por enquanto, vamos deixar isso em 400. Agora precisamos de um local inicial para nosso rastreamento de linha. Agora poderíamos usar apenas a localização do ator dos personagens, mas se formos para Viewport, os atos ou a localização dos personagens estarão no centro. E eu preferiria que meu traçado de linha viesse da cabeça. Então vamos voltar para olhar para o ator e vamos ver a localização dos ossos da cabeça. Então, para fazer isso, podemos pegar o componente de malha do painel Componentes, arrastar para fora e pesquisar obterá a localização do soquete. Podemos usar esse nó com nomes de soquete e nomes de osso e ele nos dará a localização desse soquete ou osso. Eu vou colocar o nome do osso da cabeça que apenas cabeça assim. E vou recuar um pouco. Em seguida, conectaremos o valor de retorno às ações porque é onde eu moro. O Trace vai começar a partir de. Então vamos precisar de um nó estranho. Então, vamos arrastar para fora do valor de retorno, eu adiciono nó? E vamos adicionar o valor de saída de r vezes anotá-lo ao Add Node do app node two e inserir em nosso rastreamento de linha. Então, só para explicar, nosso rastreamento de linha começará no local do osso da cabeça e , em seguida, o final do nosso rastreamento de linha será novamente no local do fone de ouvido, mas estamos adicionando quatro metros na direção que nossa câmera está voltada. Então, agora podemos testar isso. Definiremos o Draw Debug Type two para um quadro, que o traçado de linha fique visível para um quadro. E então precisamos executar essa função. Então, vamos apenas para o Gráfico de Eventos, clique com o botão direito do mouse e pesquise por tecnologia. E adicionaremos uma tecnologia de evento, que fará isso temporariamente para testar se tudo está funcionando. Em seguida, pegaremos o vigia e conectaremos isso aqui e compilaremos. Agora podemos testar isso para que possamos jogar. E é meio difícil ver o traçado da linha porque nossas cabeças estão no caminho. Se pressionarmos F8 para rejeitar o mouse e nos movermos, você pode ver que o traçado da linha está começando nossa cabeça e ele está indo quatro metros para frente na direção que nossa câmera está apontando. Então, a seguir, queremos armazenar o que o traçado de linha está realmente atingindo. Então, vamos sair dos planetas para aqui, voltar para nosso ThirdPersonCharacter, e depois voltar para nossa função de ator de pesquisa. E vamos passar por aqui até o fim. Agora queremos adicionar uma nova variável que armazena o resultado da ocorrência do nosso rastreamento de linha. Então, vamos apenas sair daqui e promover para variável. E vamos nomear isso, veja o resultado do hit assim. Agora, podemos usar essa variável mais tarde para detectar o que nosso personagem está vendo atualmente. Agora também vou criar uma variável para esse valor 400 aqui. Então, vamos arrastar e fazer de novo promove variável. E isso só vai criar um carro alegórico para nós. E vou chamar isso de distância de interação. Agora, faremos isso apenas para que possamos alterar facilmente nossa distância do Interact para nosso traçado de linha. Então você pode ver que, na verdade, ele está definido como 400. E se quiséssemos mais tarde, poderíamos ajustar isso nas configurações da aula aqui. Então, em vez de ter que entrar em função para mudar a distância, podemos simplesmente entrar aqui e mudar isso facilmente. E para manter as coisas organizadas, poderíamos dar a ela uma categoria também, então vou selecioná-la e vamos mudar o nome da categoria para interação como essa. Você vê agora que tem uma pequena categoria de interação que podemos manter todas essas variáveis. E se formos para os padrões da classe, devemos ter uma categoria de interação, se pudermos bombear, compilaremos primeiro, depois iremos para os padrões da classe e você verá que agora temos uma categoria de interação e nossas variáveis de distância de interação lá. Em seguida, vamos mudar nosso ator de vigia para funcionar com um cronômetro em vez de fazê-lo com tecnologia. E se você se lembra, a tecnologia executará todos os quadros. Então, se você estiver recebendo, digamos, 200 quadros por segundo, isso será executado 200 vezes. O que é um pouco excessivo para o nosso ator de armário. Então, em vez disso, vamos usar um cronômetro. Então, eu só vou começar o planeta Begin. A partir disso, vamos arrastar e fazer a função func por timer. Queremos definir o temporizador pelo nome da função. Agora podemos excluir nosso ator local aqui. E isso nos permite executar uma função em um determinado momento. Então, vamos definir o nome dessa função para examinar o AXA. Agora, o nome precisa ser escrito exatamente da mesma forma com maiúsculas, caso contrário, isso não funcionará. Então vamos começar a fazer looping. Em seguida, vamos definir o tempo para 0,03. Agora, isso significa que nossa função de vigia será executada 30 vezes por segundo. Agora isso pode parecer muito, mas para um único traço, não é grande coisa. E isso significa que, quando estamos olhando em volta com nossa câmera, obtemos as informações mais atualizadas. Agora, outra coisa que podemos fazer é armazenar esse valor de retorno e esse é o nosso controle de timer, apenas no caso de querermos parar esse cronômetro, talvez nosso personagem morra. Não queremos mais que o ato de vigia rastreie a execução, então podemos usar o manipulador de timer para pará-lo. Então, vamos nos arrastar para promover a variável, e vamos chamar esse temporizador de ator visual assim. Então, agora, se quisermos pará-lo, podemos usar essa variável para fazer isso. Então, agora nós demos uma olhada na configuração funcional ativa. Agora precisamos adicionar uma nova interface à qual possamos adicionar dois outros blueprints para realmente executar eventos e códigos quando eles interagirem. Então, o que faremos é compilar e salvar isso e ir para o Navegador de conteúdo. E clicaremos com o botão direito do mouse e adicionaremos uma nova Interface do Blueprint. Então, vamos para os blueprints e, em seguida, queremos a Interface Blueprint aqui, e vamos nomear isso, eu vou chamar a minha interação BP underscore , interface como essa. E vamos abri-la. E eu vou apenas adicionar o meu à barra superior aqui. Agora, se você se lembra do nosso vídeo de interface, não fazemos nenhuma codificação aqui. Tudo o que fazemos é adicionar novas funções e fornecer entradas e saídas. Já temos uma nova função que começa com a interface. Então, vamos apenas clicar com o botão direito e renomear isso. Vou chamar o meu de interagir assim. E vamos compilar e podemos adicionar novas entradas agora. E essa é a informação que vamos enviar do projeto do nosso personagem de jogador para qualquer projeto com o qual estamos interagindo. Então, o que eu gosto de fazer é adicionar uma referência de caractere apenas para que possamos acessar informações do personagem que interagiu com o blueprint que estamos executando esse código. Então, vamos procurar por personagem, usaremos a referência de objeto de tipo de caractere. Só vou dar um nome a esse personagem. Agora, é claro, no futuro, se você quiser enviar informações do personagem para a planta com a qual ele está interagindo. Você pode adicionar novas entradas aqui. Portanto, agora temos nossa função que será executada sempre que nosso jogador interagir com um blueprint, mas também podemos adicionar algumas funções adicionais. Então, vou adicionar um. E vamos chamar isso de permitir interação. E, na verdade, vamos adicionar uma saída para este. Então, adicionaremos uma nova saída. E definiremos isso para ser um booleano e nomearemos esse valor de retorno assim. Então, agora isso nos dá uma nova função que podemos verificar antes de executarmos a função Interact apenas para garantir que o blueprint com o qual estamos interagindo tenha sua interação ativada. Agora vamos adicionar mais uma função. Então, vamos adicionar função e, em seguida, chamaremos esse nome de interação. Em seguida, adicionaremos uma nova saída. E isso vai ser chamado de nome. E vamos definir o tipo variável de dois textos assim, e depois compilaremos. Agora, isso nos permite definir um nome personalizado em qualquer blueprint que adicionamos ao nosso tubo de interface de interação. E então vamos adicionar alguns textos à nossa tela para que, quando nosso jogador olhar para um objeto, ele exiba o nome que fornecemos usando essa função. Então, agora tudo isso foi adicionado. Podemos compilar e salvá-lo. Agora, voltando ao personagem de terceira pessoa, precisamos de alguns eventos de entrada para realmente executar nosso código interativo. Agora podemos clicar com o botão direito do mouse e pesquisar os eventos de entrada temporários que usamos antes. Mas, em vez disso , iremos para as configurações do nosso projeto e adicionaremos corretamente uma entrada. Então, vamos para Editar configurações do projeto. E aqui queremos ir para a categoria Input. E agora queremos adicionar um mapeamento de ações. Então, vamos para Mapeamentos de ação. Clicaremos no botão Adicionar mapeamento de ação. E vamos chamar isso de interagir assim. Em seguida, clicaremos no teclado e você poderá escolher qualquer que seja a sua tecla, vou pressionar E, então isso define para E. Agora que está configurado, voltaremos ao nosso personagem com o botão direito do mouse e procuraremos interagir. E queremos que a interação abaixo dos eventos de ação aqui adicione nossa opinião. Então, agora vamos adicionar o código que realmente diz ao objeto que estamos olhando para executar sua interface de interação. Então, para fazer isso, subimos a vigia, clicamos em resolvido, e vamos nos arrastar para fora e quebrá-lo. E clicaremos na pequena seta para baixo aqui para obter todas as variáveis ou arrastar para fora do Ator de sucesso. E vamos pesquisar pelo Interact. E queremos a mensagem do Interact aqui. Agora vou clicar nessa seta novamente apenas para diminuir. E podemos amarrar isso um pouco. Agora, antes de executarmos isso, primeiro queremos verificar se o ato de violeta. Então, o que faremos é válido. Vamos conectar isso ao pressionado. E também queremos verificar se permite interação verdadeira. Então, vamos arrastar novamente e procurar por Permitir. E podemos usar o par permitir interação. Conectar isso é válido. E, em seguida, queremos executar um nó de ramificação. Então, vamos arrastar para fora do valor de retorno e fazer IF. E a partir disso, se nosso valor de retorno for verdadeiro e permitir que a interação seja verdadeira, queremos executar nosso Interact que possamos conectá-lo assim. Então, para nossa entrada de personagem, porque estamos dentro de nosso ThirdPersonCharacter, podemos simplesmente arrastar para fora e fazer self. E isso passará uma referência a esse personagem por meio da função Interact. Agora vamos manter as coisas arrumadas. Na verdade, podemos destacar tudo isso. Observe, não o evento de entrada, apenas o código que destacamos mouse e podemos fazer a função recolhida. E eu vou chamar isso de interagir assim. Podemos simplesmente mover isso aqui. Agora, todo esse código está dentro da nossa nova função de interação. Então, se clicarmos duas vezes nisso, você pode ver isso aqui. Podemos apenas mover isso aqui para cima, então está um pouco arrumado. Agora precisamos criar um ator com quem nosso personagem possa interagir. Então, ele será compilado e irá para o Navegador de conteúdo, apenas criando uma nova classe de blueprint. Vamos definir para um ator. Vou chamar isso de exemplo de interação de sublinhado da BP . Assim. Abriremos e adicionaremos um novo componente. Vou apenas adicionar um componente de cubo. Assim. Só nos dá algo que o traçado de linha pode atingir. Mas você poderia usar uma malha esquelética ou um componente de malha estática e ter uma medida personalizada, se quisesse. Agora, uma coisa a ter em mente é que, se você usar uma malha estática ou malha esquelética, ela deve ter colisão, porque se não se alinhar, o rastreamento não a atingirá. Então, para verificar se sua malha estática tem colisão, você pode simplesmente ir para a malha de pilha no Navegador de conteúdo. Então, por exemplo, o que são Coupa? Basta clicar no navegador Procurar e no navegador de conteúdo para ir até lá. Podemos abrir isso. Agora aqui, você pode ir ao show e depois descer até onde diz colisão simples. E então, se você assumir isso, você tem esse contorno verde claro aqui, isso significa que você está bem. Tem colisão. Se você não tiver isso, você pode ir até o menu suspenso de colisão aqui, e você pode tentar essas diferentes opções para adicionar alguma colisão ao seu objeto. Então, estamos usando este cubo para sabermos que ele tem uma colisão simples, então estamos todos bem. Podemos adicionar de volta ao nosso modelo de exemplo de interação. Agora, aqui, precisamos adicionar nossa interface de interação. Então, vamos para Configurações de classe para implementar interfaces e adicionaremos uma nova. Vamos procurar por interação. E queremos a interface de interação da BP. E então vamos compilar. Agora, se formos para o painel Meu Blueprint, clique no menu suspenso para interfaces, você pode ver que temos todas as nossas novas funções de interface que adicionamos dentro de nossa interface de interação. Agora você pode notar que este é amarelo, mas esses são ótimos. Isso porque, se você se lembra, nosso Interact não tem um valor de retorno. Se eu clicar aqui, ele apenas criará um evento em nosso Gráfico de Eventos. Mas se eu clicar ou permitir interação, por exemplo, se você se lembrar que tinha um valor de retorno. Então, isso abre isso em um editor de funções. Então essa é a principal diferença ou a interação não tem realmente um valor de retorno. Se você se lembra dentro da interface, se selecionarmos nosso Interact, você verá que ele não tem saídas, mas os outros dois têm saídas. E é por isso que eles são de cores diferentes. E se clicarmos em interagir, isso cria um evento. E se clicarmos em Permitir interação, surge uma função. Então, para começar, queremos apenas habilitar, permitir a interação. Então, vamos apenas assumir isso. Mas em seus projetos futuros ou funções como essa é útil porque você pode ter um objeto que deseja que seja interativo algumas vezes e algumas vezes deseja desativá-lo. Assim, você pode simplesmente retornar um valor diferente quando quiser desativar sua interação. Em seguida, temos o nome da interação, então vamos clicar duas vezes nele para abri-la. Agora podemos simplesmente inserir manualmente um nome aqui, se quisermos, mas vou arrastá-lo e promovê-lo para uma variável. Então, promoveremos uma variável. Vou chamar meu nome e deixar como mensagens de texto. Então, vamos compilar e vou adicionar um valor padrão, como default. Nome. Não conseguirei mudar isso mais tarde. Então, vamos apenas componente. Então, agora podemos realmente adicionar algum código ao nosso evento interagir. Então, voltaremos ao nosso gráfico de eventos. E agora, como clicamos duas vezes em interagir, ele acabou de adicionar isso ao nosso gráfico de eventos. Mas se não tivéssemos isso, também poderíamos clicar com o botão direito do mouse na pesquisa para interagir com o evento. E nós poderíamos criar isso dessa forma também. Agora, este é o evento que ocorrerá quando nosso personagem olhar para esse objeto e pressionar a-z soap. Por enquanto, vamos apenas arrastar para fora e fazer uma string de impressão. Podemos imprimir string com o valor name, por exemplo, e apenas conectá-lo assim. Agora, o bom desse evento é que temos acesso ao nosso projeto de personagem. Então, talvez você tivesse um componente no projeto do seu personagem que fosse um inventário ou um sistema de saúde. Você pode simplesmente arrastar para fora do personagem aqui. Poderíamos usar get component by class. E poderíamos usar isso para verificar se nosso personagem tem um componente específico? Se isso acontecer, podemos usar o valor de retorno para acessar qualquer uma das variáveis desse componente. Ou podemos apenas custar ao nosso personagem. Então, poderíamos fazer o custo para ThirdPersonCharacter. E então, usando isso, poderíamos obter variáveis ou funções do nosso personagem. Assim, poderíamos obter, digamos, a distância de interação se quiséssemos por algum motivo ou se você adicionar variáveis de saúde, somos. Seja o que for, você pode usar isso para acessá-los. Mas, por enquanto, vamos apenas passar nossa string impressa. Então, vou excluí-los e conectar esse backup à string de impressão assim. Agora, uma das coisas que queremos fazer é com nossa variável name. Nós só queremos ter uma instância editável. E se você for um membro, isso significa apenas que quando arrastarmos nosso cubo para o nosso nível, poderemos alterar esse nome para cada cubo que arrastarmos. Então, agora nosso sistema de interação está praticamente configurado. Mas eu queria adicionar um HUD que diremos nome da interação dos atores sempre que nosso jogador olhar para esse ator. Então, para fazer isso, vamos voltar para a pasta de terceira pessoa aqui, depois para os blueprints e vamos criar um novo widget de HUD. Então, clique com o botão direito do mouse, vá para Interface do usuário. Faremos um diagrama de widget. Vou selecionar usar um widget. E vamos chamar isso de HUD de sublinhado da BP, assim. E vamos abri-la. Agora, porque esse é o nosso HUD principal. Vamos adicionar painéis de tela. Então, basta pesquisar pelo Canvas e adicionaremos isso à nossa hierarquia aqui. Então eu vou querer que algum texto realmente exiba o nome da interação. Então, procuraremos por texto aqui também. E adicionaremos isso ao nosso painel de tela. E nós vamos tê-lo para que fique no centro. Então, vou mudar a âncora do texto para centralizar assim. E você pode ver que nossa posição está confusa. Então, o que faremos é selecionar isso para 000 assim. Então agora você pode ver onde está centrado. Na verdade, quero que o centro do texto esteja no centro do texto. Então, o que vamos fazer é fazer o alinhamento, fazer 0,50.5 assim. Então você pode ver que o texto agora está centralizado. Agora eu quero que meu texto fique um pouco mais alto, então vou segurar Shift e arrastar para cima. E isso realmente me permitirá mover nossos textos e uma direção e travá-lo nessa direção para que você possa ver que eu posso movê-lo para cima. Diga aqui. Agora vou mudar a fonte só para torná-la um pouco menor. Então vamos fazer com que diga 20. E vamos compilar. Agora, você pode gastar o tempo que quiser configurando isso para que o texto fique bonito. Só estou fazendo isso rapidamente para que possamos colocá-lo em funcionamento. Então, primeiro precisamos esconder nossos textos quando não estamos realmente olhando para um objeto. Então, o que vamos fazer é usar a visibilidade aqui. Vamos criar um novo binds. Então, vamos fazer ou clicar em vincular e criar vinculação. Com isso aberto, precisamos determinar quando devemos definir esse texto visível e depois oculto. Então, para fazer isso, precisaremos de algumas variáveis do nosso ThirdPersonCharacter. Então, vamos precisar de uma referência a isso. Então, começaremos acessando o Gráfico de Eventos. Vamos excluir esse nó e esse nó aqui. Vamos pegar o personagem do jogador. E a partir disso, queremos verificar se é válido? Então, fazer é válido. E vamos conectar isso para construir. Então vamos nos arrastar novamente e fazer Cast to ThirdPersonCharacter. Então, podemos usar a saída disso para armazenar como uma variável. Então, faremos promoções variáveis. Eu só vou chamar meu personagem assim. Então, na verdade, vou destacar esses nós. E nós vamos clicar com o botão direito do mouse e apenas fazer recolhido para funcionar. E chamaremos isso de referências configuradas assim e, na verdade, manteremos as coisas bem organizadas. E podemos reutilizar isso mais tarde também. Então, agora estamos prontos para voltar à nossa função de obter visibilidade. E queremos ter nosso personagem. E só queremos ter certeza de que isso é válido antes de executarmos qualquer código. Ele conectará isso até aqui. E se não for válido, podemos executar nossas referências de configuração assim. E usaremos esse nó de retorno, conecte-o aqui. Vamos definir isso como oculto. Portanto, se nosso personagem não for válido quando isso for executado, ele tentará definir a variável de caractere novamente. Agora, se a variável de caractere for válida, queremos obtê-la novamente. Então, a partir disso, queremos arrastar e ver o resultado do hit. Nós nos arrastávamos para fora e fazíamos uma pausa. Vamos estender esse nó e queremos o Hit Actor. que fazemos é válido. E se for válido, isso diminuirá novamente. Então, temos um pouco mais de espaço, o que arruma isso assim. Então, se isso for válido, queremos verificar se é interativo? Então, vamos nos arrastar e permitir uma interação assim. E se isso for verdade, queremos definir nossa visibilidade como visível. Então, vamos copiar e colar aqui. Então, isso é muito visível. Vamos conectá-lo assim. Então, uma vez que você terminar, deve ser um pouco parecido com isso. Agora, na verdade, precisamos de um ou mais nós. Então, o que faremos é copiar nosso valor de retorno, colá-lo aqui e defini-lo como oculto. Agora, se permitir interação é falsa, queremos esconder nossos textos, então faremos isso. E também se o ator de sucesso não for válido, também queremos esconder nossos textos, então vamos conectá-lo assim. Isso abrange a definição da visibilidade de nossos textos, mas também queremos mudar o que ele diz para o nome da interação. Então, o que faremos é copiar esse código porque haverá o mesmo. Assim, podemos copiar tudo isso e isso também. E isso garante que você tenha todos os nós destacados aqui do Control C. Então vamos até o designer, selecione nosso texto aqui. E queremos ir para o texto e vincular, depois criar vinculação. E aqui vamos colar essas notas. E eu vou fazer com que o nó inicial conecte até r é válido assim. Agora precisamos devolver um pouco de sexo. Então, este só se conectaria aqui. E não queremos retornar nenhum texto para isso, então vamos deixar isso vazio. Vamos copiar isso e colar aqui. Então, agora, uma vez que sabemos que permitir interação é verdade, queremos realmente obter o nome da interação. Então, vamos arrastar para fora do nome da interação do reator. E vamos conectar isso com a verdade. Agora, se a interação for falsa, queremos apenas retornar um valor vazio. Vamos fazer isso. Em seguida, copiaremos e colaremos isso novamente, colaremos aqui e conectaremos o nome ao valor de retorno assim. Então, podemos compilar. E uma vez feito isso, deve parecer um pouco com isso. Agora, a última coisa que você precisa fazer é adicionar nossa tela difícil de reproduzir. Então, para fazer isso, vamos para o ThirdPersonCharacter Blueprint, esse gráfico de eventos. Vamos adicionar isso ao nosso Begin Play. Vamos clicar com o botão direito do mouse e criar widget. Conecte isso às nossas notas. E possuindo o Player, vamos apenas fazer o Controle, obter o controle do jogador. Assim. Precisamos definir a classe para o hub que acabamos de criar. Então BP HUD. Agora, é sempre uma boa ideia armazenar esse valor de retorno ao criar seu HUD principal. Então, vamos arrastar e provavelmente vamos isso para uma variável, vamos chamar isso de HUD. E isso é só isso se quisermos usá-lo mais tarde. E então, a partir da saída desse nó definido, ou apenas pesquise por Add to Viewport assim. E isso realmente adicionará nosso widget à tela de nossos jogadores. Então, agora estamos prontos para testar isso. Vamos compilar e seguir para o nosso mapa. Queremos adicionar alguns dos nossos exemplos de interação ao nível. Então vou adicionar um aqui e outro aqui. E se você se lembra, porque definimos nosso nome como instância editável dentro do nosso exemplo interativo, temos esse valor aqui. Então, para este, vou definir isso para dizer espada. Para este. Defina-o para ser algo parecido com um cachimbo assim. Então, agora podemos apertar o play. E se corrermos até este cubo aqui, você pode ver que está imprimindo a espada. E se eu pressionar C, você pode ver que está imprimindo o nome do nosso exemplo de interação com a espada, e fará o mesmo com o exemplo var pi aqui. Agora poderíamos passar um pouco mais de tempo arrumando nossos textos HOD x, é um pouco difícil de ver. Então, se sairmos e abrirmos nosso capô, podemos selecionar nossos textos na hierarquia aqui. E primeiro pudemos centralizá-lo para que nosso texto agradável e centralizado e pudéssemos adicionar um plano de fundo também. Então, o que eu vou fazer é clicar com o botão direito do mouse para fazer rap com, e nós faremos rap com uma borda. E então, para nossa borda, vamos selecionar isso e vamos definir o tamanho para o conteúdo, que ele seja redimensionado para o tamanho do nosso texto. Podemos mudar a cor, então eu vou mudar a cor do pincel para dizer cinza. Então é um pouco mais fácil ver assim. E também podemos adicionar um pouco de preenchimento. Então, selecionaremos nosso texto e definiremos o preenchimento, parecendo dizer oito. Isso nos dá um pouco de preenchimento nas bordas. E agora adicionamos um novo widget. Na verdade, precisamos definir sua visibilidade também. E podemos reutilizar nossa função de visibilidade que usamos para nossos textos. Então, vamos rolar para baixo, vá para a opção de visibilidade aqui. Basta clicar em vincular e você pode ver que nossa função de visibilidade anterior é que podemos defini-la. E agora nossa borda de texto aqui mudará sua visibilidade sempre que estivermos olhando para um objeto com o qual possamos interagir. Para que possamos testar isso. Vamos compilar e voltar e clicar em play. E agora podemos ver nosso texto está centralizado e é um pouco mais fácil de ver porque temos nossa caixa cinza quando não estamos olhando para algo, você pode ver que nossas caixas estão escondidas junto com nosso texto. Agora, o que estamos fazendo quando presi e selecionamos um de nossos exemplos de interação é imprimir um nome. Mas é claro que isso é apenas um exemplo. Você pode mudar isso para o que quiser. Então, podemos ir para a nossa interação no exemplo aqui e fazer com que o ator diga destruir quando interagirmos com ele. Então, poderíamos adicionar Destroy Actor. Agora, quando compilamos e clicamos em Play, se eu interagir com os cubos agora, você pode ver que ambos são destruídos. Então é isso para esta lição. Esperamos que agora você entenda como podemos usar interfaces de blueprint para executar código em outros blueprints, como, por exemplo, quando precisamos de um sistema de interação. E em nossas próximas lições, vamos adicionar mais recursos de jogabilidade a este projeto. 54. Sistemas de jogabilidade (danos): Olá pessoal. Nesta lição, vamos configurar um sistema de saúde e também usaremos o sistema de danos embutido no Unreal Engine. Então, para começar, poderíamos simplesmente adicionar nossas variáveis e funções de saúde diretamente ao nosso personagem de terceira pessoa. Mas, em vez disso, vamos criar um componente de saúde. E a razão pela qual vamos fazer isso é porque podemos reutilizá-lo e outros projetos, se quisermos mais tarde . Então, vamos começar. Clicaremos no botão Adicionar em nosso navegador de conteúdo, acessaremos a classe Blueprint e selecionaremos um componente de ator. Estamos escolhendo o componente ato em vez de ver o componente porque nosso componente de saúde não precisa existir no mundo. Ele só precisa de código, então usaremos o componente ativo. Vou nomear o meu componente de saúde de sublinhado da BP assim. Agora vamos abrir isso e eu vou arrastar o meu até a barra superior assim. Então, começaremos criando algumas variáveis de saúde. Então, vou adicionar uma nova variável. Vou chamar isso de saúde atual assim. E eu vou definir o meu como um número inteiro. Você poderia usar um flutuador se quisesse. Pessoalmente, prefiro usar números inteiros para saúde porque é um número inteiro. Então, vamos começar com a saúde atual e isso será um número inteiro. Então vamos criar outro. Isso vai ser chamado de saúde inicial. E queremos outro, e isso será chamado de saúde máxima. Então, por fim, queremos outra variável chamada e receber dano. E vamos mudar isso para um brilhante porque isso é verdadeiro ou falso. Então, para essas três variáveis, vamos usar uma instância editável. Então, vamos fazer isso agora. Isso significa apenas que, quando adicionarmos nosso componente de saúde a outro blueprint, quando selecionarmos o componente de integridade em seu painel de componentes, poderemos editar esses valores. Então, agora vamos compilar e definir algum valor inicial. Então, para começar a saúde, vou definir isso para 100. Para o máximo de saúde, defina isso para 100 também e pode sofrer danos também, e depois compilar. Em seguida, vamos criar algumas funções que realmente mudarão nossa variável de saúde. Então, adicionaremos uma nova função e chamaremos isso de aumentar a saúde. Assim. Adicionaremos uma nova entrada e chamaremos esse valor de aumento. E vamos definir isso como um número inteiro como esse. E então vamos compilar. A primeira coisa que queremos fazer é garantir que nossa saúde atual não seja maior que a saúde máxima. Então, obtemos nossa saúde atual e verificamos se isso é menor do que r max self? Então, obteremos mapas, saúde. E só queremos executar esse código se for verdade. Então, ele moverá isso aqui e adicionará isso ao nosso nó de entrada assim. Em seguida, queremos verificar se adicionaremos a quantidade, o aumento da nossa saúde atual fará com que ela supere a saúde máxima. Então, para fazer isso, obteremos a saúde atual e adicionaremos nossa montanha aumentada, agora podemos simplesmente arrastar para fora daqui e conectar isso assim. Ou podemos sair daqui e obter um aumento na quantidade. E você pode ver que podemos realmente obter esse valor do nosso nó de entrada sem precisar criar uma variável. Só nos permite usar isso aqui. E se isso não aparecer, apenas certifique-se de que você pode dividir a entrada e você deve ser capaz de encontrá-la. Em seguida, queremos verificar se esse valor é menor ou igual ao limite máximo. Então, ele terá o máximo de saúde. E se for, então podemos definir esse valor para nossa saúde atual. Então, faremos isso e então podemos copiar e colar esses pastéis de nós aqui. Vamos definir a saúde atual. Isso. Então, se falso, o que significa que o aumento e os valores atuais de saúde serão maiores que r max. Quantas vezes queremos apenas copiar e colar isso e dizer, vou ajudar a maximizar assim. Poderíamos adicionar uma nota de redirecionamento aqui, apenas manter as coisas arrumadas. Então, quando você terminar, deve ficar assim. Então, a seguir, queremos uma diminuição da função de saúde. Então eu vou procurá-lo, ou vou criar uma nova função e chamar isso de graxa, assim. E, novamente, vamos adicionar uma entrada a isso, então vou aumentar minha janela aqui. Por que a nova entrada, e chamaremos esse valor de diminuição. E definiremos isso como um número inteiro também. E então vamos compilar. Agora, queremos verificar se nossa saúde atual é maior que 0? Portanto, a saúde atual é maior que 0. E se for, então permitirá ou diminuirá a saúde para funcionar assim. Em seguida, queremos verificar se nossa saúde atual menos r quantidade de diminuição maior que 0. Então, obteremos a saúde atual e queremos fazer menos ou subtrair. Queremos subtrair nossa diminuição deles. Agora, novamente, poderíamos conectar isso assim ou podemos prolongar a quantidade de diminuição sexual e podemos adicionar isso aqui. E então queremos verificar se isso é maior que 0? Se for, podemos permitir que esse valor seja diminuído de nossa saúde atual. Então, vamos fazer isso. Vamos copiar isso, colar isso aqui. Vamos definir a saúde atual. E se o valor for menor que 0, só queremos definir nossa saúde atual 0 porque não queremos que nossa saúde fique abaixo de 0. Então, basta adicionar uma nota aqui, apenas arrumar isso, e quando terminar, deve ficar assim. Agora, uma coisa que esqueci de acrescentar é que queremos verificar se podemos sofrer danos antes de aumentarmos a saúde. Então, vamos arrastar isso ainda mais, o que vai pegar nosso dano. E se isso for verdade, permitiremos essa função Trump. Então, ele apenas conectará isso aqui e verdadeiro aqui. Agora também vamos adicionar alguns despachantes de eventos e isso pode ser útil, pois se adicionarmos nosso componente de saúde a diferentes plantas, podemos querer que algo diferente aconteça em um. blueprint do que outro quando nossa saúde aumenta ou diminui quando a saúde atinge 0. Então, começaremos criando um despachante de eventos. E eu vou chamar isso de aumento de saúde. Assim. Vamos criar outro chamado sobre a diminuição da saúde. Então queremos saúde 0. Assim. Poderíamos adicionar alguns insumos ao nosso próprio aumento e diminuição de saúde. Então, vamos ao painel Detalhes aqui e adicionamos uma nova entrada. Vou chamar esse valor de aumento. E vamos defini-lo como um número inteiro. E faremos a mesma coisa para diminuir a saúde. Então, adicionaremos uma nova entrada e chamaremos isso de vinco. Soletre corretamente, diminua a quantidade. Lá vamos nós. E definiremos isso como um número inteiro também. Então, por dentro ou diminua a função que podemos executar nossa própria diminuição de saúde aqui. Então, vamos fazer algo legal. Conecte isso aqui e, em seguida, queremos obter uma quantidade reduzida. Então, eu vou apenas copiar e colar isso e conectar isso aqui. Então, para saúde 0, queremos o não saúde 0. Então vamos chamar isso, conecte isso aqui. E não adicionamos uma entrada para isso, então não precisamos conectar mais nada. E então vamos para o nosso aumento de saúde. E aqui, queremos um aumento insalubre. Vamos conectar isso aqui. E obteremos o valor do aumento assim. Vamos conectar isso aqui também porque, quando definirmos nossa saúde máxima, também a aumentaremos. E isso criará mais uma função. E eu vou chamar isso de aplicar saúde inicial. Então, aqui o que vamos fazer é ir para nossa saúde atual e definir isso como nossa saúde inicial. Em seguida, executaremos essa função em nosso Gráfico de Eventos em Iniciar o Jogo. Então, vamos pegar o que se aplica à saúde inicial e conectá-lo aqui assim. E então vamos compilar e salvar isso. Agora podemos ir em frente e adicionar nosso componente de saúde ao nosso personagem. Então, vamos para o ThirdPersonCharacter Blueprint. Então eu vou fazer essa janela um pouco maior assim. E vamos adicionar um novo componente ou procurar por saúde. Adicionaremos o componente BP health e depois compilaremos. E com nossos componentes de saúde selecionados no painel Detalhes, você pode ver que podemos definir nossa saúde inicial ou máxima e se o componente de saúde pode ou não sofrer danos. Agora, como você pode ver, nossa saúde atual está definida como 0, mas não se preocupe, isso será definido como 100 ou onde quer que você esteja começando. O valor da saúde é quando o jogo começa. E podemos acessar facilmente essas variáveis, bem como nossas funções, apenas arrastando ou arrastando o componente para fora, podemos obter informações atuais, por exemplo, que nos dá acesso a isso variável que podemos chamar nossa função para aumentar a saúde que executará nossas funções. E também podemos, se quisermos vincular eventos a esses despachantes de eventos. Então criamos, para que pudéssemos fazer um sinal, poderíamos atribuir um aumento na saúde, por exemplo. E isso nos dá um evento e o evento de compra para isso. E isso será executado sempre que nossa saúde aumentar. E também nos dá o aumento aqui se realizarmos nosso evento Bind no topo. Mas, por enquanto, vamos excluí-los. Próximo. Precisamos configurar nosso evento de dano em nosso personagem em terceira pessoa. Então, para fazer isso, clicaremos com o botão direito do mouse e procuraremos por qualquer dano. Usará o evento e o dano. E vamos pegar nosso componente de saúde e queremos diminuir nossa saúde pela quantidade de dano sempre que esse evento ocorrer. Então, vamos nos arrastar e procurar diminuir a saúde. E vamos conectar isso a qualquer dano. Então queremos danos e conectamos para diminuir a quantidade. E você verá que isso nos dá esse nó que converte o float em um número inteiro. Isso arredondará o valor para baixo. Então, por exemplo, se o dano fosse 1,5, isso arredondaria para um. Mas poderíamos arrastar e dar voltas e usar um nó redondo. E isso realmente o arredondará para o número inteiro mais próximo. Então, se for 1,5, acredito que vai arredondar para dois. Se fosse 1,2, seria arredondado para um. Então, usaremos around node para isso só porque é um pouco mais intuitivo. E agora, sempre que outro projeto chama o evento aplicar dano para nosso personagem, esse evento será executado e diminuirá nossa saúde e nosso componente de saúde. Agora vamos configurar uma zona danificada em nosso nível que, quando nosso personagem entrar nela, nosso personagem realmente perderá saúde. Então, ele compilará isso. Mas primeiro, na verdade, vamos apenas adicionar uma string impressa aqui porque atualmente não temos uma barra de saúde. Então, nós apenas adicionamos uma string de impressão. E toda vez que sofremos danos, queremos apenas obter nossa saúde atual. Então, obtemos a saúde atual, imprimiremos o valor atual da saúde para que, quando sofremos danos, saibamos exatamente quanta saúde temos. Vou fazer com que o texto fique por aí um pouco mais. Então, vou definir a duração para cinco assim. E então vamos compilar. Agora vamos para o Navegador de conteúdo. Vamos adicionar um novo projeto, o ator da classe blueprint. E eu vou rolar para baixo e vamos chamar isso de zona de dano de sublinhado BP. Assim. Vamos arrastar isso para o nível e abri-lo. Para isso, vamos apenas adicionar uma colisão de caixa para sabermos quando algo se sobrepõe a ela. Então, adicionaremos uma colisão de caixa. Vou arrastá-lo um pouco para que fique nivelado com o chão. Em seguida, entraremos no Gráfico de Eventos e excluiremos a jogada inicial e a tecnologia. E vamos usar o evento que o ator começou a se sobrepor. E vamos nos arrastar de outro ator, que vai chamar o dano de Aplicar. Este é o evento que realmente chamará o dano dentro do nosso personagem em terceira pessoa, podemos definir a quantidade de dano. Então eu vou dizer a ele assim. Agora podemos fornecer um instigador de eventos, e este é um controlador de jogador. Não usaremos isso para zonas danificadas simplesmente porque não há nenhum jogador que esteja causando esse dano. É apenas um efeito ambiental. Então temos danos mais grosseiros. E para isso, vamos nos arrastar e fazer sozinhos. E isso basicamente nos permite saber qual ator realmente aplica o dano ao nosso personagem ou não qualquer dano que você possa ver causar dano. Também temos isso instigado pela caneta também. Em seguida, temos a classe de danos. Agora, isso é um pouco mais avançado. Não vou abordar isso nesta lição, mas basicamente você pode criar novos tipos de dano e adicionar variáveis a eles. Por exemplo, você pode ter uma classe de dano de fogo na classe de dano de gelo, e então você pode definir essa classe aqui, depois na extremidade receptora. Assim, em qualquer dano de evento, você pode se arrastar do tipo de dano e você pode realmente obter essas variáveis, digamos que é dano de gelo ou dano de fogo, por exemplo. Mas, por enquanto, vamos deixar isso como aula de paramédicos. Mas, por enquanto, uma última coisa que faremos antes que ele diga, é selecionar os componentes da caixa, procurar por ocultos. E queremos desmarcar o Endgame oculto apenas para que ele possa ver ou danificar a zona. Então, agora estamos prontos para testar isso. Vamos compilar a cabeça para o nosso mapa em terceira pessoa. E eu vou fazer a zona de dano um pouco maior e movê-la para cá. E agora, quando clicamos em play, podemos correr para a caixa de dano e você pode ver que eu, saúde está diminuindo em dez cada vez que realmente entramos nessa caixa. Então é basicamente assim que podemos configurar um sistema de saúde e podemos usar essa lista de casas em outros projetos também. Agora eu queria dar um exemplo rápido de como podemos configurar esses eventos de ligação em nosso personagem. Digamos, por exemplo, toda vez que seu personagem sofreu danos, você queria tocar um som crescido. Você poderia fazer isso de forma agradável e fácil com os eventos bind. Então, vamos para o ThirdPersonCharacter, encontrar o começo, jogá-los. No final daqui, podemos adicionar um novo código. Então, para que nossos eventos bind sejam executados, nós realmente precisamos vinculá-los. Então, vamos fazer isso no Begin Play. E vamos pegar nosso componente de saúde se arrastar e procurar por vínculo na diminuição da saúde. E nós queremos esse hit. Assim, conectará isso à nossa janela de visualização. E agora precisamos de um evento que realmente esfrie quando minha saúde diminuir. Então, vamos nos arrastar e fazer o costume. E queremos adicionar clientes. Então vamos chamar isso de vinco, assim. Agora, este evento ocorrerá toda vez que minha saúde diminuir e podemos apenas adicionar um som para que possamos tocar a localização do som. Eu vou fazer isso na localização dos meus personagens, então ele voltará ao local. E podemos definir isso para um som que eu não tenho, como sons crescidos ou desconhecidos, então vamos apenas escolher compilado com falha, por exemplo. Vamos apenas compilar. Agora, quando clicamos em play, nos deparamos com a caixa danificada. Na verdade, temos aquela reprodução de som. E ele será reproduzido toda vez que sofrermos danos. Agora, tocar um som é apenas um exemplo. Você pode ter efeitos de partículas acontecendo. Você pode executar um código totalmente diferente completamente para você. É assim que você executaria o código em seu personagem ou em qualquer outro blueprint que esteja usando no componente de saúde. Quando a saúde diminui, podemos fazer exatamente a mesma coisa com aumento da saúde e com a saúde 0 também. Então, agora o que vamos fazer é adicionar um componente de saúde ao nosso cubo ou exemplo de interação que criamos em nossa última lição. Então, vamos para esse projeto, abrí-lo. Vou adicionar o componente de saúde aqui. E assim como fizemos antes em nosso projeto de personagem, vamos adicionar a aplicação ou desculpe, seria qualquer dano, o evento qualquer nó de dano. Vamos pegar nosso componente de saúde. De lá. Queremos diminuir a saúde. Vamos sair do DynaMesh e procurar por aí. E usaremos o nó redondo. Conecte isso para diminuir a quantidade e conecte-o aqui. Exatamente assim. Agora, nosso cubo pode sofrer danos, assim como nosso personagem. E o que faremos é recuperar nossa saúde atual novamente como fizemos no personagem. E adicionaremos uma string impressa. Eu só vou adicionar um anexo aqui. Então, vamos acrescentar e colocar um cubo. A saúde é assim. E então vamos conectar nossa saúde aqui só para sabermos a diferença entre a saúde do nosso personagem e a saúde do cubo quando ela for impressa na tela. Assim, r cubed agora tem saúde. Podemos usar esses eventos de ligação se quisermos como acabamos de fazer em nosso personagem. Assim, podemos ligar, diminuir a saúde e podemos ter algo totalmente diferente acontecendo em nosso cubo quando a saúde diminui. Então, esse é o poder dos componentes. Você pode adicioná-los a outros projetos. E supondo que você os tenha configurado de forma modular, basta adicioná-los e fazê-los funcionar muito rapidamente. Em vez de ter que criar novas variáveis de saúde em cada blueprint que você deseja ter saúde e , em seguida, novas funções para afetar essas variáveis. Podemos simplesmente adicionar um componente e podemos fazer tudo isso imediatamente. Então, em seguida, vamos montar um projétil que nosso personagem vai disparar na direção que olhamos quando esse projeto eu acertar algo que tem esse nó de dano. Vamos aplicar algum dano a esse objeto. Então, para fazer isso, vamos para o navegador de conteúdo. Clicaremos em Adicionar e criaremos uma nova classe de blueprint. Vou selecionar Ator. E vamos rolar para baixo e chamaremos esse projétil de sublinhado BP assim. E vamos abri-la. Agora, a primeira coisa que adicionaremos é uma colisão de esfera, e isso será o que realmente detecta a configuração do nosso projétil. Então, ele adicionará, procurará a esfera e usaremos essas colisões justas. Na verdade, vou selecioná-lo e arrastá-lo para cima do D para a rota vista padrão. E isso nos fará temer a raiz do nosso projeto. Agora, a seguir, queremos adicionar um novo componente. Vou adicionar uma esfera e falar corretamente. Lá vamos nós, esfera. E isso é exatamente o que os jogadores verão durante o jogo. Esta é a nossa representação visual do nosso projétil. Você pode usar um componente de malha estática. Se você quisesse, digamos que tinha uma bala ou um foguete, você poderia usar isso em seu lugar. Eu só vou usar a esfera aqui, então vamos fazer isso. E eu vou fazer o meu um pouco menor. Então, eu só vou reduzir um pouco assim. Eu também vou fazer minha esfera um pouco menor. Então, vou selecionar o componente esfera e vamos mudar o raio da esfera, basta arrastá-lo para baixo um pouco assim. E agora, como nossa esfera aqui vai lidar com a esfera de colisão, Malha Estática não precisa realmente ter nenhuma colisão e nós não queremos que isso aconteça. Então, selecionaremos a medida da pilha de esferas, rolaremos para baixo e encontraremos as predefinições de colisão. Vamos definir isso para nenhuma colisão e vamos desligar o personagem Can para saber e vamos decolar para gerar eventos de sobreposição. Então, agora nossa malha estática esférica não tem nenhuma colisão. E toda a colisão será tratada pela colisão da esfera que adicionamos no início. Só para tornar as coisas um pouco menos confusas, vou selecionar esses medos Static Mesh, e vou renomear isso para malha assim. E então vamos renomear nosso componente de colisão de esfera para colisão assim. Então, sabemos a diferença entre os dois componentes agora. Agora também precisamos definir algumas configurações de colisão para o nosso projétil. Então, o que faremos é ir para a colisão, selecioná-la, ir para Predefinições de colisão. Então, para nossa colisão de projéteis, vamos transformar isso em personalizado. Em seguida, vamos garantir que Collision Enabled esteja definido apenas para consulta. Então, para o tipo de objeto, na verdade não temos um tipo de objeto de projétil, então vamos adicionar um nas configurações do nosso projeto. Então, vamos fazer isso. Vamos até Editar configurações do projeto e queremos ir para a categoria de colisão aqui. Em seguida, nos canais de objeto, vamos adicionar um novo canal de objeto. Vou chamar esse título de projeto. Assim. Queremos que a resposta padrão seja bloqueada porque a maioria dos objetos no mundo bloqueará nosso projétil. Então, queremos começar a bloquear e depois clicar em Aceitar. Agora, a razão pela qual estamos fazendo isso é porque queremos que certas coisas ignorem nosso projétil. Então, em nosso personagem, por exemplo, se formos para a janela de visualização, não queremos que nossa cápsula aqui bloqueie projéteis porque na verdade é maior do que nosso personagem é. Queremos que nossa malha de personagens bloqueie a do projétil. Então, estamos adicionando um novo canal de objeto de projétil porque então podemos dizer ao nosso Componente Cápsula aqui para ignorar isso. E então queremos que nossa malha bloqueie isso. Então, voltando ao nosso projeto, nosso projeto, selecionaremos nosso componente de colisão. Por aqui. Queremos selecionar o tipo de objeto e queremos alterar isso para proteger. Você pode ver que o meu não está aparecendo. Podemos tentar compilar e ver se ele aparece lá. Isso faz. Se você ainda não estiver, você pode tentar salvar tudo e reiniciar o motor. Às vezes, eles demoram um pouco para aparecer. Então você pode tentar isso se o seu não for isso, mas o meu é. Então, vamos selecionar isso e depois compilar novamente. E então queremos definir isso para bloquear tudo. Então, vamos escolher a opção Bloquear na parte superior. E então queremos que isso realmente ignore ****. Então, vamos ignorar o ponto. E a razão pela qual estamos fazendo isso está em nosso personagem, essa cápsula aqui é considerada o tipo de objeto ****. Queremos que nosso projétil ignore completamente a cápsula e atinja apenas a malha. É por isso que aceitamos ignorar para ****. Agora, a última colisão dizendo que queremos ignorar a câmera dele, estamos apenas fazendo isso porque não queremos que nosso projétil afete nosso boom de câmera. Porque se um projétil passasse pelo boom da câmera, ele poderia fazer com que suas câmeras aumentassem o zoom muito rapidamente e, em seguida, diminuíssem o zoom e não ficaria muito bom. Então, certifique-se de definir isso para ignorar para a câmera. Também queremos colocar o personagem Can em, saber que vamos parar nosso personagem de tentar ficar sobre esse objeto se ele ficar muito perto de nosso personagem. Agora estamos prontos para escrever algum código para o nosso projétil. Então, vamos para o Gráfico de Eventos. Se você não tiver essa guia, basta abri-la aqui. Agora inerente, vamos clicar com o botão direito do mouse e pesquisar o hit do evento. Agora, esse evento ocorrerá sempre que nossos objetos forem nosso projétil aqui ou atingirem outro objeto. E isso nos dá alguma saída. Então, quando atingimos algo, isso nos dá uma referência ao componente dentro do nosso blueprint que realmente atingiu os outros objetos. Então, para nós, esse será o componente de colisão porque é o único que tem colisão. Então temos outros, e isso dá a você uma referência ao outro ator que atingimos e usaremos isso para aplicar dano. Então temos outro componente. Isso nos dá uma referência ao componente no outro ator que atingimos. E temos a localização do hit. Isso só nos dá a localização de onde atingimos. Nós atingimos Normal, que é a direção em que a superfície que atingimos, não usaremos isso. É um pouco mais avançado. E então, na verdade, temos aqui os resultados da moda. Portanto, se arrastarmos e quebrarmos o resultado do hit em C, esse é realmente o mesmo resultado de dica que obtemos para os rastreadores. Assim, podemos acessar todas essas informações sobre o objeto que atingimos com nosso projétil. Agora, novamente, isso é um pouco mais avançado. Vamos apenas usar a outra caneta aqui para aplicar dano ao ato de que vamos arrastar para fora do evento aqui, vamos procurá-la, aplicar, dano usará esse nó. Queremos que o ator danificado seja o outro pino aqui. Então, estamos dizendo que queremos aplicar uma dimensão ao ator que ouvimos. Podemos definir os valores dos danos. Então, vou definir dez causas de danos. Como eu disse antes, esse será o ator que realmente está causando o estrago. Então, estamos no projétil, este é o nosso eu, então vamos nos arrastar e fazer a nós mesmos. E então instigador de eventos. Na verdade, vamos conectar isso porque um personagem estará ostentando nosso projétil. Então, o que podemos fazer é ser instigador. Não vamos conseguir o controlador instigador. E podemos conectar isso ao instigador de eventos assim. E a maneira como isso está funcionando é quando realmente geramos nosso projétil teremos a opção de fornecer um instigador, e faremos isso e esse será o personagem. E agora, quando aplicamos dano a outro objeto, estamos obtendo o valor instigador que definimos quando geramos nosso projétil. Estamos fornecendo isso para o outro projeto que estava danificando apenas no caso de eles quererem acessar quem realmente os danificou. Agora, vamos adicionar a string impressa aqui é só para termos um pouco mais de informações sobre quem atingimos. Então, adicionaremos a string de impressão e arrastaremos para fora desse acréscimo. E vamos apenas colocar no topo do projétil atingido. E então, na segunda linha, conectaremos nossa prática. Então, vamos superar o ator e conectar isso aqui. Eu só vou adicionar um espaço ao final de um hit. Então, são duas palavras separadas como essa. Agora, a próxima coisa que precisamos fazer é não queremos que nosso projétil atinja o personagem que gerou o projétil. Então, para fazer isso, vamos criar uma nota inicial como essa. Vamos pegar nosso componente de colisão, arrastar e ignorar o ator enquanto nos movemos. Agora, isso basicamente nos diz apenas o componente de colisão, um ator que queremos ignorar quando o componente está se movendo. Então, vamos conectar isso. Queremos fornecer um ator. Vamos usar get owner. E vamos conectar isso aqui. E nós vamos assumir deve ignorar. Agora, get owner é outra variável que definimos quando realmente geramos projétil. E então estamos acessando isso e estamos dizendo a colisão, Ei, queremos que você ignore bater no dono. Em seguida, vamos adicionar um novo componente. Então, vamos para Adicionar e vamos procurar por projetor. E vamos adicionar o componente de movimento do projétil. Este é um componente embutido no motor e fará todos os cálculos para nós que permitirão que nosso projétil bp realmente se mova como um projétil. Então, para começar, vamos definir a velocidade inicial para 3 mil. Essa é a velocidade inicial de um objeto. Em seguida, definiremos a velocidade máxima para o mesmo valor também. Obviamente, se você quiser que o objeto se mova mais devagar ou mais rápido, você pode aumentar ou diminuir esses valores. Você provavelmente vai querer mantê-los iguais. E então, aqui embaixo, também temos velocidade. Vou definir o primeiro valor aqui para liberar mil também. Então, se você fosse mudar as velocidades aqui em cima, você gostaria de ter certeza de fazer o mesmo por ela também. Agora, se fôssemos gerar nosso projeto, como ele não se destruiria quando atingisse algo. Então, vamos adicionar uma destruição ao final do nosso código aqui. Então, eu só vou destruir o ator. E isso significaria apenas que quando nosso projétil atingir algo, ele se tornará onde será destruído. Então agora podemos compilar e salvar isso, e configuramos nosso projétil, e agora precisamos realmente gerar. Então, para fazer isso, vamos para o ThirdPersonCharacter, depois de volta ao Gráfico de Eventos, adicionaremos um novo evento de entrada. Então, para fazer isso, vou para Editar configurações do projeto. Em seguida, vamos para a categoria de entradas e adicionaremos um novo mapeamento de ações. Então, vamos apenas adicionar uma nova opção. E eu vou chamar o meu fogo. E então voltaremos para o ThirdPersonCharacter faria o evento disparar. E descobriremos isso sob a ação, eventos como esse. Agora precisamos gerar atores. Então, vou mover isso aqui para que tenhamos mais espaço. Vamos nos arrastar do Pressed. Faremos spawn actor. Queremos os atos de desova da aula. Vamos definir a classe para o projétil do nosso projétil no protetor CPP. Agora, a transformação de spawn que vamos arrastar e fazer, fazer transformar. Agora, o local, vou usar a localização dos meus atores. Mas mais tarde, se você estiver fazendo uma arma, provavelmente gostaria de usar como o encaixe do cano, por exemplo. Mas, por enquanto, vamos usar a localização do ator dos personagens. Então ele fica, ele é mapeado para o local. E vamos conectar isso ao local. E então, para rotação, vamos usar a rotação atual da câmera. Então, obtenha rotação de controle. Portanto, nossa proteção é a distância na direção que estamos procurando atualmente para lidar com colisões. Queremos definir isso para sempre gerar ignorar colisões. E então, se você se lembra, estamos usando o proprietário e instigador dentro do nosso projetor para. Este nó aqui e também para este nó aqui. Então, precisamos defini-los. E vamos usar apenas uma referência ao nosso próprio personagem. Então, vamos apenas usar a si mesmo. E queremos conectar isso em ambos aqui e aqui assim. Agora estamos realmente prontos para testar isso. E há uma coisa que eu esqueci de fazer dentro das configurações do nosso projeto. Então, se voltarmos lá, criei um novo mapeamento de ação, mas na verdade não defini uma chave. Então, precisamos ter certeza de fazer isso. Vou apenas clicar no botão do teclado aqui e, em seguida, clicar com o botão esquerdo do mouse, e isso atribuirá isso a isso. Agora podemos testar isso, então apertamos play e deixamos o botão esquerdo do mouse. Você pode ver que nosso projétil está surgindo e fluindo para fora e a direção que olhamos. E se atirarmos em nosso cubo, você pode ver que a saúde do nosso cubo está caindo. Agora, verifique se você está batendo no cubo e não no chão, por exemplo. Portanto, devo dizer que o projétil atingiu exemplo de interação da BP como o meu. O mesmo com o R1. Aqui você pode ver que tem um valor de saúde diferente deste e está diminuindo também quando o atingimos. Agora, existem alguns outros eventos de danos incorporados ao motor. Então, se formos para o ThirdPersonCharacter, vou apenas explicar isso. Se clicarmos com o botão direito do mouse e pudermos procurar por pontos de dano, você poderá encontrar o dano do ponto de evento. Agora, isso funciona de forma semelhante ao nosso qualquer dano. Se o movermos para cá, você pode ver que temos algumas entradas adicionais. Agora, a razão para isso é que, se chamarmos o dano de pontos de aplicação, você pode ver que isso funciona muito como o nó de dano aplicado, mas nos dá algumas entradas extras. Então, temos uma entrada para a direção e também para informações modernas. Então, isso executará este evento e nos fornecerá informações de sucesso. Ele nos fornecerá um nome de osso e isso está embutido nas informações do hit e coisas como a direção do hit. Portanto, esse nó é um pouco mais avançado do que o dano aplicado e o dano MD, apenas porque nos fornece um pouco mais de informações que podemos receber sobre o ator que chega aqui. Em seguida, fornecemos essas informações usando o nó de dano do ponto de aplicação e podemos inserir esses valores aqui. Agora, existem alguns outros nós de dano, então ele os excluirá se clicarmos com o botão direito do mouse e procurarmos por danos radiais em encontrar o evento dano radial. Agora, isso será executado sempre que nosso personagem receber um tipo de dano radial. E se clicarmos com o botão direito do mouse e procurarmos por Aplicar rádio, você verá que há duas opções aqui. Começaremos com o primeiro. Então, temos que aplicar danos radiais. Agora, este é um nó muito legal porque faz todo o trabalho para nós, para coisas como explosões. Então, o que fazemos é fornecer uma origem e isso é como o centro de explosões. Podemos definir um dano base e definir o tamanho da zona de dano. Assim, todos os objetos dentro de, digamos, 300 centímetros da origem realmente sofrerão o dano base. E podemos fornecer aos atores para ignorar como um traçado de linha, por exemplo. Então, se apenas fizermos re, podemos conectar atores que queremos ignorar tendo sofrido qualquer dano radial. Também podemos enfrentar danos totais. Isso significa apenas que não importa onde os objetos que estão em nossos intervalos danificados terão o valor total do dano base. Então temos os canais de prevenção de danos. Então você pode ter uma explosão explodir e há uma parede entre você e a origem das explosões, você provavelmente gostaria que o dano fosse bloqueado. Então aqui é onde definimos qual canal de colisão realmente bloqueia o dano que nosso dano radial causa. Mas, por exemplo, talvez você tenha uma janela entre você e a explosão. Você não gostaria que o vidro bloqueasse todos os danos. Você teria sua palavra a dizer, ignorar o canal Visibilidade e o dano da explosão passaria e atingiria seu personagem. E então temos outro tipo de dano de rádio para que possamos clicar com o botão direito do mouse na busca por danos radiais. Novamente. Usaremos aplicar danos radiais com queda. Agora, isso funciona praticamente da mesma forma. Isso só nos permite ter um raio interno e externo. Agora, objetos dentro do valor do raio interno da origem, sofreremos o dano base total e em seguida, objetos dentro do raio externo, mas fora do raio interno sofrerão uma redução quantidade de dano. Essa quantidade de dano dependerá da queda do dano. Portanto, quanto maior for esse valor, menos dano você sofrerá, mais longe você estará da origem. Se você ainda estiver dentro do valor do raio externo, poderá definir um dano mínimo. Então, digamos que isso fosse 600 e nosso jogador estivesse, digamos, 590 centímetros da origem, você provavelmente teria um dano mínimo, digamos cinco. E não importa o quão longe você esteja da origem, se você estiver dentro do raio externo, você sempre sofrerá pelo menos cinco de dano. E então acabamos de receber as mesmas entradas do nosso nó anterior aqui embaixo. Agora, nossos dois nós de dano radial ou aplicamos nós de dano radial, chamaremos isso de evento de dano radial. Assim, você pode usar esse único evento e que será chamado por ambos os nós que acabei de mostrar a você. Esses são todos os eventos de danos adicionais que você pode usar no motor e também estão embutidos no motor , então você sempre pode acessá-los. Agora, uma coisa a ter em mente é esse evento e o dano ocorrerá independentemente do tipo de nó de dano aplicado que você usar. Mesmo se usarmos, digamos, aplicar dano radial, ele chamará esse evento para ser executado, e isso será executado, mas também será executado. Portanto, se você tiver esses dois eventos em seu projeto, ambos serão executados sempre que você aplicar um dano radial. E isso é o mesmo para o dano pontual. Portanto, se você usar o nó de aplicação de dano pontual, ele chamará o evento de dano do ponto de evento. Se descobrirmos que o evento de dano do ponto de evento, isso será executado, este evento, qualquer dano também será executado. Então, os dois fugirão. Isso é apenas algo para se ter em mente. Se você tiver, digamos, ambos, todos esses eventos em seu projeto, isso será executado sempre que você sofrer qualquer tipo de dano. Portanto, tenha cuidado com isso. Se você tiver sua saúde diminuída aqui, e depois novamente nesses dois eventos, você pode acabar com sua saúde diminuindo duas vezes. Portanto, podemos excluir esses nós, pois não os estamos usando. E estamos praticamente prontos para esta lição. Então, espero que agora você entenda um pouco mais sobre os eventos de danos incorporados que vêm com o motor. E também como você pode criar 55. Sistemas de jogabilidade (barra de saúde): Olá pessoal. Nesta lição, adicionaremos um widget de barra de saúde que usará os valores que configuramos em nosso componente de saúde. E então vamos adicionar nossa barra de saúde ao HUD BP que criamos na aula de interação. Então, para começar, vamos criar um novo widget. Então, vamos para Add then to user interface e vamos selecionar Widget Blueprint. Em seguida, selecione o widget usual. E vamos rolar para baixo e eu vou chamar o meu BP underscore health, assim. Vamos abri-la. Eu só vou arrastar o meu até a melhor escolha. Para o nosso Health Bar. Vou criar alguns textos que dizem apenas saúde. Então, abaixo , teremos uma barra de progresso que mostrará quanta ajuda temos. Também vamos adicionar algum texto a isso, que dirá nossa saúde atual e também no próprio Mac. Agora, para começar, não vamos usar um painel de tela porque lembre-se de que vamos adicionar nossa barra de saúde ao nosso HUD. Então, usaremos isso para escolher onde nossa barra de saúde está posicionada na tela. Então, aqui, só precisamos adicionar nossos widgets da Barra de Saúde. Então, vamos começar com uma caixa vertical. Então vou para o painel e depois pegamos a caixa vertical e adicionamos isso à hierarquia. Vamos pegar alguns textos, então eu só procuro por texto. Vamos colocar isso na caixa vertical. Então eu vou pegar uma sobreposição. Então, procuraremos por sobreposição e adicionaremos isso à caixa vertical também. E a razão pela qual estou usando uma sobreposição é porque eu quero ter uma barra de progresso e , em seguida, quero sobrepor algum texto em cima dessa barra de progresso. Então, vamos usar a sobreposição para isso. Agora vamos pegar nossa barra de progresso, então vou pesquisar o progresso e adicioná-lo à nossa sobreposição. E então eu também vou pegar um pouco mais de texto e adicioná-lo à sobreposição também. Então, começaremos selecionando nosso texto principal aqui. E eu vou mudar isso para dizer saúde assim. Podemos alterar as configurações. Então, se você quiser, eu vou fazer o meu um pouco menor, como talvez 20. Em seguida, quero definir o tamanho da minha barra de progresso, mas não temos uma caixa de tamanho. Então, para fazer isso, vamos selecionar nossa sobreposição com o botão direito do mouse em Wrap with. E então queremos encontrar a caixa de tamanho aqui. Isso acabou de ser adicionado em uma caixa de tamanho para nós. Agora podemos escolher o tamanho da nossa barra de progresso. Então, vou ativar a largura de sobreposição e a altura de sobreposição. E eu vou definir a altura para economizar 30. E então vamos definir a largura para dizer três quintos. Por enquanto. Agora vamos selecionar nossa barra de progresso e apenas dizer a ela para usar todo o espaço disponível para que possamos preencher horizontalmente e também verticalmente. No momento, estamos visualizando uma tela de tamanho 1280 por 720. Então, vamos mudar isso para a tela do Phil para apenas adicionar o tamanho desejado na tela assim. Só para que possamos ter uma ideia melhor de quão grande ou qual é atualmente. Em seguida, vamos selecionar nosso livro didático aqui que está sobre nossa barra de progresso. E eu vou mudar isso apenas para dizer 50 slash 100s para que possamos ver como será. Vou mudar o tamanho para ser bem menor. Então, vamos começar com, digamos, 14 a 16. E vamos alinhar isso no lado direito. E também queremos alinhar no centro assim. Então, agora vamos editar esse texto usando código. Então, para fazer isso, precisaremos que seja uma variável. Então, eu vou assumir é variável e vou mudar o nome para texto de saúde. Assim. Também vamos mudar nossa barra de progresso. Então, vou renomear isso. Você pode ver que ele já está marcado como é variável. Então, eu vou chamar essa barra de saúde assim. Agora também vou adicionar um pouco de preenchimento no lado direito porque não quero que o texto fique bem na borda dessa barra de progresso, abrirei o preenchimento e definirei o direito de dizer cinco pixels. Oh, desculpe, precisamos selecionar nossos textos lá, então certifique-se de ter o texto selecionado. E então definiremos o lado direito para cerca de cinco pixels, ou talvez quatro. E isso nos dá um pouco de espaço entre a borda da nossa barra de progresso e nosso texto. Agora podemos compilar e salvar isso. E estamos prontos para escrever o código que controlará nossa barra de saúde. Então, vamos para a visualização gráfica. Agora, para atualizar nossa barra de saúde e nossos textos de saúde, precisaremos obter uma referência ao componente de saúde que adicionamos ao nosso personagem. Então, para fazer isso, vamos adicionar algum código ao nosso Event Construct que começa apenas excluindo essas duas notas porque não vamos usá-las. E então nós vamos conseguir nosso próprio lugar ou você ganha Jogador Proprietário? E isso nos dá o controlador que possui esse widget. Então, a partir disso, podemos fazer é controlado****. E isso nos dá uma referência ao nosso personagem, mas como uma referência de objeto pontual. E então, a partir disso, podemos obter componentes por classe. E então podemos verificar se nosso **** tem o componente de saúde? Se isso acontecer, então queremos definir isso. Vamos nos arrastar do valor de retorno. Você promove uma variável? E chamamos esse componente de saúde assim. Agora, antes de definirmos isso, queremos fazer algumas verificações. Então, primeiro queremos verificar se estamos controlando algo. Então, o que faremos é válido aqui assim. E se for válido, permitiremos definir o componente de saúde dessa forma. Então, agora estamos prontos para criar nossa função bind. Então, vamos compilar e voltar para a visão do designer. E começaremos selecionando nossa barra de saúde aqui. E iremos até o painel Detalhes e encontraremos o valor presente. Em seguida, queremos usar a opção bind e criar criar vinculação. Então, para começar, queremos verificar se nosso componente de saúde é válido? Então, vamos pegar o componente de saúde e fazer é válido assim. Isso apenas nos impediria de receber erros. Então, precisamos obter nossa saúde atual e também nossa oferta máxima. Então, ele vai se arrastar e obter a saúde atual e obter o máximo de saúde, como bater palmas. E então precisamos dividir nossa saúde atual por r max saúde. E isso nos dará um valor de 0 a um. Que podemos usar em nossa barra de progresso. Mas primeiro precisamos convertê-los em carros alegóricos. Então, vamos fazer para flutuar. Isso nos dará essa nota. Ele apenas copiará e colará isso aqui. Plugger whole fin ou imax health aqui. Então, usaremos nossa saúde atual e dividiremos. Divida e dividimos nossa saúde atual por r max out. E isso nos dará um valor de 0 a um. E isso dirá à nossa barra de progresso até onde chegar. E então podemos simplesmente conectar isso aqui assim. Então, se nosso componente de saúde não for válido, podemos simplesmente copiar e colar esse valor de retorno e conectá-lo a não válido e retornaremos apenas 0. Em seguida, precisamos de um fichário para nossos textos. Então, voltaremos ao designer e selecionaremos o texto dentro da nossa barra de progresso aqui. Então, para o valor do texto selecione bind e faça Create Binding. E faremos a mesma coisa com nossos componentes de saúde. Então, vamos conseguir isso e verificar se é válido. E conecte isso ao nosso nó inicial assim. Então, queremos ter nossa saúde atual. Então, obtenha a saúde atual e obtenha a saúde máxima assim, que é linha, estes são um pouco melhores. Agora, precisamos realmente retornar alguns textos. Então, vamos arrastar para fora do nosso valor de retorno e usar o nó de texto de formato assim. Então precisamos de uma entrada para nossa saúde atual. Então, usaremos colchetes abertos, chamaremos isso de saúde atual. E então feche o colchete. E clicaremos em Enter e você verá que isso agrega um novo valor para nós. Então, vou conectar nossa saúde atual lá. E então em nosso formato de texto valor aqui, faremos uma barra e, em seguida, faremos colchete aberto, saúde máxima e, em seguida, fecharemos colchete e depois entraremos agora. E isso nos cria um novo Max de forma saudável. E vamos conectar isso aqui assim. Então, se não for válido, estamos apenas copiando, colando ou retornando o nó e vamos conectá-lo e deixar esse valor vazio. Então, agora todo o nosso código está configurado. Se voltarmos para o designer, você pode passar o tempo que quiser editando isso e fazendo com que pareça como quiser. Vou fazer uma coisa e isso mudou a cor da nossa barra de saúde. Então, vou selecioná-lo e vou descer para Preenchimento, Cor e Opacidade. E eu vou selecionar isso e vou mudar para uma bela cor verde apenas para representar a saúde. E então eu vou clicar em OK, compilar e salvar isso. Agora podemos adicionar isso à nossa cabana, então voltaremos ao navegador de conteúdo e abriremos o HUD da BP. Na paleta, procuraremos por saúde e arrastaremos nossa Barra de Saúde BP assim. E eu só vou colocar o meu no canto inferior lá. Eu também vou trocar a âncora. Então, como esse é o ponto de ancoragem mais próximo, é aí que vou usar. Então, vamos configurá-lo para o lado inferior esquerdo assim. Agora, você pode redimensionar o switch. Então, se eu arrastar para fora, você pode ver nossa barra de saúde fica maior e menor. Ou você pode assumir o tamanho do conteúdo. E isso só garantirá que o widget tenha sempre o mesmo tamanho que estava dentro deste editor de widgets aqui. Agora podemos compilar e testar isso. Então, vamos apertar play. E você pode ver que nosso valor está aparecendo em dizer 100 de 100 se eu encontrar esta caixa aqui, você pode ver que nossa saúde diminui cada vez que eu entro na caixa. Se expirarmos o editor do plano e formos para a planta do nosso personagem e alterarmos nossas configurações de saúde aqui. Então, se selecionarmos o componente de saúde, digamos que eu defini a saúde máxima para 500 e definimos a metade inicial para 250. Você verá que, quando compilarmos e clicarmos em play, espero que apenas atualize automaticamente, diga 250 500 e nossa barra de progresso também esteja na metade. Então agora eu vou apenas X out e eu vou apenas definir esses valores de volta para o padrão. Então, um 100100. Agora, se você quiser fazer mais personalizações, basta acessar sua barra de saúde aqui e fazer as alterações que desejar. Se você quiser alterar o tamanho da barra de progresso, você pode selecionar a caixa de tamanho e podemos alterar esses valores aqui. Se você quiser alterar o tamanho do texto, basta selecioná-los e alterar os tamanhos das fontes aqui. E também aqui. Terminamos para esta aula. Espero que agora você entenda um pouco mais sobre como podemos obter valores de outros blueprints e depois exibi-los em um widget. 56. Sistemas de jogabilidade (Respawning): Olá pessoal, Nesta lição, vamos configurar um sistema de resposta. E isso incluirá um HUD que será exibido quando morrermos, poderemos clicar no botão de resposta, e isso nos criará um novo personagem que assumirá o controle. Então, para começar, criaremos nossos respondentes. Então, vamos para o Navegador de conteúdo, adicionar e queremos adicionar uma interface de usuário e um widget. O Blueprint será um uso de widget. E vamos rolar para baixo até o final. E eu vou chamar meu BP underscore, responder HUD assim. E vamos abrir isso. Eu só vou arrastar o meu para a barra superior assim. Isso substituirá nosso HUD normal. Então, vamos usar um painel de tela para isso. Então, ele procurará por Canvas e adicionará isso à hierarquia assim. Agora, vou apenas adicionar um botão simples para que possamos coletar uma resposta. Então vamos pegar um botão. Eu só vou arrastar isso para dentro. Vou mudar o ponto de ancoragem para o centro porque quero meu botão perto do centro. Também vou alterar o alinhamento para 0,50.5, só para que nossa localização fique no centro do nosso widget hip. E eu vou definir isso para 0 e o x. E eu só vou segurar shift e arrastá-lo para baixo um pouco para que fique por aqui. E agora eu posso adicionar alguns textos, meus botões, para que ele procure por texto. Eu só vou me arrastar em cima do meu botão. E teremos essa palavra a dizer, esporte assim. Agora vou parar meu botão novamente e apenas dimensionar o conteúdo para que fique maior para caber no texto aqui. Vou mudar a cor do texto para preto só para que fique um pouco mais fácil de ver. Botão Iniciar novamente. Agora você pode passar o tempo que quiser aqui fazendo esse visual como quiser. Estou feliz por um pouco de texto, vou ter novamente âncora no centro mudará seu alinhamento novamente para 0,50.5. E vamos definir o x como 0. E eu vou segurar Shift novamente e apenas movê-lo para baixo. E eu vou ter esses textos dizendo que você tem assim. E teremos isso alinhado no centro e no tamanho ao conteúdo. Agora estamos prontos para adicionar algum código ao nosso personagem em terceira pessoa. Então, vamos para o navegador de conteúdo e abrimos isso. Agora aqui conectado até eu começo a jogar, temos um código que liga um som de reprodução sempre que sofremos danos, eu só vou deletar isso porque é um pouco chato. Então, vamos deletar isso por enquanto. E vamos criar um novo vínculo para quando eu clicar em 0. Então, pegaremos nosso componente de saúde, nos arrastaremos disso e nos ligaremos à saúde. E queremos Bind Event para a saúde 0 aqui, assim. Então, a partir do evento, vamos nos arrastar e fazer customização. E queremos adicionar um cliente. Então chamaremos esse personagem de morto. Assim. Em seguida, vamos adicionar notas de vencimento uma vez, então vamos arrastar e fazer, fazer uma vez. E isso significa que esse código só é executado uma vez. Então, queremos verificar se nosso HUD é válido no momento? Deveria ser, mas queremos verificar de qualquer maneira. Então, o que faremos é válido. E vamos conectar isso até aqui. E vamos remover nosso hub agora. Então, vamos nos arrastar e remover dos pais. E isso funciona como uma forma de destruir um widget. Então, vamos adicionar isso como válido. E então queremos realmente gerar nossa resposta. Então, vamos sair daqui, criar widget e definir a classe para responder. Queremos que seja o HUD de resposta, jogador vencedor obterá o controle do jogador assim. Então, queremos realmente definir nossa resposta para uma variável. Então, vamos arrastar para fora do valor de retorno, promover a variável. Vou chamar isso de responder. Então precisamos adicionar isso à tela do player. Então, vamos arrastar e fazer Add to Viewport assim. Então, queremos ter certeza de que o PIN não é válido está conectado ao nosso nó Create Widget. E agora, para manter as coisas organizadas, vamos destacar tudo isso e transformá-lo em uma função. Então, vamos clicar com o botão direito do mouse e fazer a função recolhida, e chamaremos isso de criar respawn, HUD assim. Então, todo esse código agora está contido dentro dessa função aqui. E podemos mover isso para ser um pouco menor. Podemos adicionar alguns nós de redirecionamento. Dois não são válidos. Ligue aqui assim. Só para arrumar as coisas. Em seguida, vamos compilar e salvar isso. Em seguida, voltaremos ao Gráfico de Eventos. Agora, depois de criarmos nossa resposta aqui, queremos desativar qualquer entrada de movimento para nosso personagem. Então, clicaremos com o botão direito e procuraremos por deficientes. Queremos desativar a entrada. E então vamos pegar o controlador do jogador e conectar isso ao controlador do jogador e colocá-la. Agora, se quiséssemos, poderíamos ter uma animação surda aqui. Agora eu não tenho nenhum, mas o que vamos fazer em vez disso é montar uma boneca de pano. Então, quando morremos, nosso personagem jogaria como um efeito rabdo. Então, para fazer isso, obteremos nossos componentes de malha. Então, queremos o componente de malha do painel Componentes que vamos arrastar para fora e vamos fazer simulação de conjunto. Queremos que o conjunto simule a física. E vamos conectar isso para desativar a entrada. Queremos assumir isso. Então vamos sair de Michigan e o que queremos fazer é definir todos os corpos. Soletre corretamente, Corpos simulam física aqui. Queremos assumir isso também. Então, queremos mudar seu perfil de colisão. Então, para isso, vamos nos arrastar e fazer a colisão de conjuntos. E queremos Definir nome do perfil de colisão. Conecte isso aqui. Queremos definir isso no nome do perfil de colisão para boneca de pano. Então R maiúsculo e depois boneca de pano escrito exatamente assim. Esse código é, na verdade, o que tornará nosso personagem boneca de pano quando morrermos. Então, vamos reduzir isso para uma função também. Então, vamos clicar com o botão direito e fazer a função de colapso E vamos chamar isso de começo Greg, assim. E, novamente, vamos apenas manter as coisas bem organizadas e todo esse código está contido nessa função. Agora, assim, também podemos adicionar uma nota aqui para o nosso Componente de Movimento de Personagem. Para que pudéssemos pegar isso e parar o movimento. E podemos parar o movimento imediatamente. Isso significa apenas que nosso personagem não continuará recebendo nenhuma entrada de movimento. Então, uma vez que você terminar, deve ficar assim. Agora, de volta ao nosso Gráfico de Eventos, podemos querer que o cadáver do nosso personagem desapareça após algum tempo. Então, para fazer isso, podemos nos arrastar e fazer a vida útil. Queremos definir a vida útil. E isso é quantos segundos após esse nó ser executado, o ator existirá antes de destruí-lo. Então, se eu definir isso para dizer dez segundos, depois de dez segundos, o corpo do nosso personagem desaparecerá. Agora você pode querer uma variável morta que seja apenas um booleano que seja verdade quando o personagem está morto. Não o usaremos neste exemplo. Mas se você fez isso, poderíamos criar uma nova variável, chamar isso de morto. Poderíamos definir isso aqui também, só para termos uma variável que nos diz que estamos mortos. E você poderia usar isso em outro código, se quisesse. Em seguida, vamos configurar um controlador personalizado. E a razão pela qual estamos fazendo isso é o corpo do nosso personagem pode desaparecer após dez segundos e então talvez comecemos ociosos na tela de resposta. Agora, se nosso código de resposta estivesse no personagem e tivesse sido destruído, se clicássemos no botão responder, nada aconteceria porque nosso personagem teria sido destruído, mas o o controlador de local sempre existirá. Então, queremos colocar nosso código de resposta nisso. Então, para fazer isso, vamos criar um novo controlador personalizado, vamos para o Navegador de conteúdo, depois adicionamos a classe Blueprint e, em seguida, queremos o controlador do player. E isso nos criará um novo plano. Chamaremos esse exemplo de controlador de sublinhado BP. Como agora. Vamos abrir isso e eu vou arrastar o meu para o bar aqui. Em seguida, vamos para o gráfico de eventos. E então aqui vamos criar uma nova função para realmente encontrar o local onde vamos responder ao nosso personagem. Então, criaremos uma nova função. Vou chamar esse ponto de resposta aleatória. Assim. Vamos adicionar uma saída. Este será um local. Então, queremos que isso seja um vetor e chamaremos esse local assim. Então, vamos fazer ou trabalhar para desconectar essa nota de devolução por enquanto. Vamos nos arrastar disso e conseguir ou atores da classe. E com isso, vamos usar o player start. Agora, este é um ativo que está embutido no motor. Portanto, não criamos isso na verdade, vem apenas com o motor. Então, a partir disso, queremos nos arrastar e fazer o comprimento. que faremos é maior que 0. Então, estamos apenas verificando se há pelo menos uma estrela em nosso nível. Então vamos fazer f. E se verdadeiro será executado em nossa verificação aleatória. E se for falso, só teremos que chegar a um local. Então, para isso, podemos fazer algo como 300 e o Z apenas para garantir que não caiamos no chão. Mas isso só será usado se não tivermos nenhum jogador inicial e o nível, o ideal é que você sempre queira ter pelo menos um em seu nível. Então, a partir disso, podemos criar uma variável local para armazenar isso apenas para manter as coisas organizadas. Então, vamos sair daqui, promover uma variável local. Vamos chamar esse jogador de Scott. Eu gostaria de colocar um L no final das variáveis locais apenas para que seja fácil dizer que elas são locais. Então, vou fazer os jogadores começarem com L maiúsculo assim. Conecte isso até aqui. E eu vou pegar a saída e conectá-la aqui. Basta manter as coisas arrumadas. E depois pegamos o gesso. Queremos escolher aleatoriamente uma das entradas nesta matriz para o nosso jogador, gerar. Para isso, vamos nos arrastar e vamos conseguir comprimento novamente. E então queremos um número inteiro aleatório. Queremos um número inteiro aleatório de um número inteiro aleatório no intervalo. E então, para o mínimo, queremos que seja 0 e, em seguida, no máximo, queremos que seja o comprimento menos um. Então subtraia um. Este será o nosso máximo assim. Então, isso nos dará um número aleatório entre 0 e qualquer que seja o número máximo atual de entradas que estão em nosso jogador começa. E então, a partir disso, podemos copiar e colar essa variável, fazer gap e obter uma cópia. E então vamos inserir isso no número inteiro. Isso nos diz quais jogadores queremos começar. Em seguida, basta obter sua localização. Então, voltamos ao local, retornaremos isso. Então, vou apenas copiar e colar. Eu retorno o nó, conecto a localização ao local e conecto isso aqui em verdadeiro assim. Podemos fazer isso um pouco mais direto, amarrar isso, e então vamos compilar e salvar isso. Agora, esta função fará com que um jogador comece aleatoriamente para que nosso personagem responda que iremos para o Gráfico de Eventos agora. E vamos excluir os dois porque não vamos usá-los. Em seguida, vamos criar um novo evento personalizado ou clicar com o botão direito do mouse e personalizar. E queremos adicionar um cliente. Então eu vou chamar esse personagem de respawn assim. E vamos começar com nosso ponto de resposta aleatório. Então, vamos conseguir isso assim. Então, queremos responder ao nosso caráter. Então, vamos sair daqui e gerar ator da aula. Agora, para a classe, queremos que seja o nosso **** padrão em nosso modo de jogo. Então, o que faremos é pesquisar o modo de jogo. A partir disso, podemos obter o poema padrão. E esta será a Classe de Peão Padrão que definimos em nosso modo de jogo. Então, vamos colocar isso na aula. Então, para a transformação de spawn, vamos arrastar e fazer uma transformação de make. Só vou recuar um pouco para termos um pouco mais de espaço. Em seguida, pegaremos o local do nosso ponto de resposta aleatório e o conectaremos em um local assim. E definiremos o tratamento de colisão padrão para tentar ajustar a localização, mas sempre surgiremos porque sempre queremos que nosso personagem seja gerado. Em seguida, clicaremos na seta para baixo aqui e definiremos o proprietário para ser nosso controlador. Então, vamos apenas usar a si mesmo e conectá-lo ao proprietário também. Agora, como estamos no controle, só queremos possuir esse novo personagem que respondemos. Então eu vou me arrastar do valor de retorno, você possui? E podemos possuir esse personagem e podemos deixar o alvo em si porque estamos dentro de um controlador. Então, agora vamos compilar e salvar isso. E vamos voltar à nossa resposta com força, porque aqui precisamos adicionar algum código que será executado quando pressionarmos o botão R responder, ele selecionará o botão aqui e desceremos para o não clicado no painel Detalhes. Clique nisso. E aqui precisamos disso para executar nosso evento de resposta dentro do nosso controlador de exemplo. Então, para fazer isso, clicaremos com o botão direito do mouse e procuraremos por Obter Jogador Proprietário. E isso nos dá uma referência ao nosso controlador. Então, tudo o que precisamos fazer é o custo para o controlador de exemplo. Conecte isso até aqui. E isso nos permitirá chamar nosso evento de caráter de resposta. Agora, quando adicionamos todos respondem com dificuldade para tocar um grito, queremos que ele solte o mouse para que possamos coletar nosso botão de resposta. Então, para fazer isso, vamos adicionar algum código ao Event Construct, apenas excluiremos o tick do evento e o evento pré-construído. Então vamos conseguir o controle do jogador novamente. Então, vamos conseguir o Jogador Proprietário. E a partir disso, podemos usar o show mouse. Queremos definir show mouse cursor como true. Em seguida, queremos definir o modo de entrada para game e gy. Então vamos conectar isso aqui. E queremos que o cabelo do widget seja próprio, então vamos pesquisar você mesmo. E isso está apenas nos dizendo que o cursor do mouse agora está visível e estamos usando esse widget como nosso foco. Vou desmarcar ocultar mouse durante a captura, porque tudo o que faz é quando você mantém o botão esquerdo do mouse pressionado e arrasta enquanto os widgets estão visíveis, ele oculta o mouse. Então, pessoalmente, eu não gosto disso, então vou desmarcar isso. Agora, depois de clicarmos, eu responderei no botão. Queremos que nosso mouse fique escondido novamente. Então, vamos copiar esse código aqui, e ele vai colar isso aqui. E vamos definir o cursor do mouse para não ficar visível. E então queremos definir o modo de entrada para o jogo. Então, vamos definir o modo de entrada apenas para o jogo, conectaremos aqui. E, por último, queremos esconder nossa resposta com força depois de coletarmos a resposta. Então, vamos nos arrastar e destruir ou desculpar, não destruir, remover pais movidos dos pais. E isso funciona como um nó de destruição. Então, quando clicamos em responder, berm dirá ao código de nossos caracteres no controlador para responder ou ocultar nosso mouse. E entraremos apenas no modo de jogo e, em seguida, removeremos nossa resposta ouvida da tela. Agora, ainda não estamos usando nosso controlador de exemplo, então precisamos ir para o nosso modo de jogo. Então, vamos ao navegador de conteúdo e encontramos o modo de jogo em terceira pessoa. Abra isso, você pode encontrar o controlador de jogador ou a classe de controle de jogador padrão aqui. E podemos mudar isso para ser o exemplo de controlador da BP. Em seguida, vamos compilar e salvar isso. Agora, outra coisa que precisamos acrescentar é a colisão de nossos personagens para quando eles morrerem. Agora, não queremos que nosso personagem continue bloqueando as coisas depois que elas estiverem mortas. Então, vamos adicionar um novo perfil de colisão. Então, vamos até Editar configurações do projeto. E então aqui nós queremos descer para a colisão. E depois predefinições. Vamos adicionar uma nova predefinição. Vou chamar isso de morto de ****. Vamos Definir Colisão Habilitada somente para consulta. Vamos definir o tipo de objeto como**** eles para todo o resto, o que será necessário ignorar. E então vamos bloquear tanto a estática quanto a dinâmica. Vamos usar esse perfil de colisão para nossa cápsula. Então, quando o jogador morrer, boneca de pano de calcanhar, mas sua cápsula ainda estará onde morremos. Agora não queremos, se respondermos que corramos para o nosso corpo e batamos na cápsula. Então, o que isso fará é fazer com que nossa cápsula não interfira na colisão do nosso jogador. Mas isso impedirá que nossa cápsula caia no chão porque não temos estática e dinâmica selvagem bloqueada. Nossa cápsula pode simplesmente cair direto no chão. E agora precisamos configurar nossa cápsula para usar isso. Então, clicamos em Aceitar e depois vamos para a terceira pessoa. E poderíamos adicionar isso ao nosso código aqui, mas na verdade vou adicionar o meu ao boneco de pano inicial. Então vamos abrir isso e vamos pegar nossos componentes da cápsula. Então é isso do nosso painel de componentes. Arraste para fora e faça Definir colisão. E queremos o nome do perfil de circulação. E vamos apenas adicionar isso à anterior. Isso vai estar morto ****, escrito exatamente assim. Agora, outra coisa que vamos mudar em nosso personagem no Gráfico de Eventos é que esse código aqui está sendo executado pelo nosso evento começar a jogar. Mas agora temos um sistema de resposta. Queremos mudar isso para ser executado apenas quando possuímos o personagem. Assim, podemos clicar com o botão direito do mouse e pesquisar por evento possuir. E podemos usar o Event possessed e conectar isso aqui. E então podemos excluir a jogada inicial. E agora, sempre que esse personagem for possuído por um controlador, ele executará esse código. Agora, outra coisa que podemos acrescentar é, se você se lembrar, nosso ator Tracy vai correr 30 vezes por segundo, mas queremos parar isso quando mergulharmos, porque não vamos mais ser interagindo com as coisas. Então, se você se lembra, criamos nosso olhar para Agir um cronômetro e podemos usar isso para pará-lo. Então, aqui, podemos simplesmente adicionar isso no final. Vamos dar uma olhada no cronômetro, sair disso e deixar claro e invalidar o tempo que eu compro. E isso realmente interromperá nosso rastro assim. E vamos compilar isso. Agora, uma última coisa que precisamos mudar em nosso ônibus de saúde, então vamos até lá e nosso navegador de conteúdo o encontrará no topo aqui. Abra isso. Em seguida, vamos para o Gráfico de Eventos. E se você se lembra, é aqui que obtemos nosso componente de saúde de peões. O problema com isso agora é que agora temos um sistema de resposta ou controle ou podemos não ter assumido o controle do**** quando esse código é executado. Então, tudo o que precisamos fazer é adicionar um atraso de um quadro. Então, procuraremos por atraso e usaremos o atraso até a próxima tecnologia. E tudo isso faz é adicionar um único atraso de quadro para quando esse código será executado. E até lá, nosso controlador terá assumido o controle de nosso ****. Agora estamos prontos para testar isso. Vamos compilar e voltar para o Navegador de conteúdo. Vou mudar os danos que a zona danificada faz, então vou abrir isso. Vou aumentar isso para dizer que 40 serão compilados. E agora podemos apertar o play e testar isso. Então, se eu correr para a zona de dano, você pode ver que estamos sofrendo 40 de dano. E agora, quando eu correr pela última vez, você verá nosso personagem morrer. Bonecas de pano no chão. Podemos clicar em responder para gerar um novo personagem. Você pode ver que nossa interação ainda está funcionando. Se eu pressionar E, isso está funcionando corretamente. Se corrermos para a zona novamente, podemos matar esse personagem também. Agora temos um sistema de resposta totalmente funcional. Agora você pode querer adicionar novos pontos de spawn para seu personagem. Então, para fazer isso, podemos sair e vamos para o menu suspenso aqui, depois dois básicos e podemos adicionar um novo começo de jogador apenas arrastando isso para dentro. Podemos adicionar um segundo, então ele irá para o Básico novamente, depois para o Início do Jogador e adicionaremos um aqui. Agora, quando clicamos em jogar para jogar nessa etapa, podemos gerar ou até mesmo um desses novos pontos. Então, vamos apertar Play. Você pode ver que realmente geramos no original, mas se corrermos para a zona de dano para nos matar, podemos responder. E você pode ver que me responde no original novamente. Mas se fizermos isso de novo, responderemos em um ponto de desova diferente. Então é isso para esta lição. Espero que você tenha achado as informações úteis e agora saiba como configurar um sistema de resposta para seus projetos futuros. 57. Sistemas de jogabilidade (crouching): Olá pessoal. Nesta lição, mostrarei como configurar um sistema de agachamento para seus personagens. Agora, você pode usar qualquer animação agachada que quiser. Vou usar as animações de aula que usamos anteriormente no curso. E para baixá-los, basta acessar o link na descrição do curso. Você pode baixar esse arquivo, extraí-lo e acabar com uma pasta parecida com esta. Agora vamos adicioná-los ao nosso projeto. Então, tudo o que fazemos é clicar com o botão direito e copiar. Em seguida, volte para o motor. Em seguida, clicaremos com o botão direito na pasta de conteúdo aqui E queremos mostrar no Explorer. E isso trará nossos arquivos de projeto aqui. E nós vamos apenas colar isso nisso. Agora você pode ver que é mostrado no motor aqui. Agora, o seu pode ou não ter firewalls dentro. Então, se abrirmos, você pode ver que o meu está funcionando, mas se o seu não tiver nenhuma animação dentro, basta fechar o motor e reabri-lo e ele deve aparecer. Agora, a primeira coisa que você precisa fazer é criar um novo espaço de mesclagem, porque as animações da lição não incluem um espaço de mistura pré-fabricado para nosso agachamento, mas inclui todos os as animações que precisamos para criar uma. Então, ele criará um novo espaço de mistura. Agora, vou clicar em Adicionar depois ir para animação. E queremos encontrar a opção de espaço de mesclagem aqui. E precisamos selecionar o esqueleto do nosso personagem. Então esse é esse aqui. Você pode ver que diz jogo de caminho, personagens, manequins e, em seguida, malhas. Então, vamos selecionar esse. E vamos nomear esse espaço de mistura, agachar-se assim. E vamos abrir isso. Eu só vou arrastar o meu para a barra superior assim. Então, para começar, precisamos configurar nosso eixo para começarmos com a horizontal. Isso vai ser em todas as direções. Então, procure por direção. Vamos definir o valor mínimo para menos 180 e, em seguida, o valor positivo para 180 positivo. E se você se lembra do nosso espaço de mistura é menor que, Isso é porque precisamos ser capazes de definir uma animação para todas as diferentes direções que nosso personagem pode estar indo. Em seguida, precisamos do eixo vertical, então vamos abrir isso e definir isso para ser a velocidade. E deixaremos o valor mínimo do eixo em 0. E então nosso valor máximo do eixo estará onde quer que sua velocidade de caminhada esteja quando você estiver agachado. Então, se estamos planejando 300, então vamos definir isso para 300. Agora, isso é importante porque se eu definir isso para dizer 600 e definirmos animações para nossa caminhada agachada nesse valor de 600. Se nosso personagem estava andando por aí quando agachado aos 300, as animações que serão reproduzidas estarão na parte central aqui. Então, se tivéssemos animações na parte inferior e superior, obteríamos metade das animações de cima e metade de baixo. E então nossas animações não ficariam muito boas. Portanto, queremos que nosso valor máximo de acesso no topo seja qualquer que seja nossa velocidade máxima de caminhada agachada. Para mim, vou configurar para 300, então vou definir isso para 300 também. Também vou assumir o Snap to Grid para o eixo vertical e horizontal. Agora, se você se lembra de nossas aulas de animação, não podemos usar nosso bate-papo de animação agachado porque precisamos configurar nossos esqueletos para serem compatíveis. Então, para fazer isso, vamos para personagens, depois para manequins, malhas. Vamos abrir o manequim SK. E então, aqui queremos ir para o Windows e , em seguida, queremos encontrar detalhes do ativo e marcar isso. Para esqueletos compatíveis, queremos adicionar uma nova opção. E queremos que esse seja o esqueleto que veio com as animações da aula. Então esse vai ser esse aqui, você pode ver que diz menos caminho do que animações. Então, vamos clicar nesse. E então salvaremos nosso esqueleto. E podemos fechar os detalhes desse ativo e voltar ao nosso espaço de mistura. Agora, para que nossas animações apareçam no navegador de ativos, talvez precisemos reiniciar nosso espaço de mesclagem, então vamos salvá-lo e fechá-lo, e então eu o reabrirei. Então isso está nas minhas animações de aula. E vamos abrir o espaço de mistura agachado. E agora devemos ser capazes de encontrar todas as nossas animações aqui no navegador de ativos. Então, ele começará apenas procurando por agachamento. E isso deve mostrar todas as nossas animações de agachamento aqui. Então, vamos começar com a animação ociosa. Então, vou colocá-los na parte inferior para a velocidade 0. Então ele vai pegar o rifle, agachar-se, ficar ocioso e conectá-lo aqui, aqui e aqui assim. Em seguida, precisamos da animação de caminhar para frente, e isso vai estar no centro porque é para a direção 0. Então, vamos pegar a opção vau aqui e arrastá-la para o meio superior, assim. Então queremos o contrário, então vamos pegar aquele e isso vai ser tanto na direção menos um AT quanto na direção positiva 180. Então queremos a esquerda. Então, vamos pegar a animação à esquerda e conectá-la aqui. E então bem aqui. Agora, quando mantemos o controle, podemos visualizar nossa animação e garantir que todas elas estejam sendo reproduzidas corretamente, o que parece que estão. Agora podemos salvar e fechar isso. Também estamos perto do nosso esqueleto. E vamos para o Projeto de Personagem de Terceira Pessoa. Então isso vai estar na pasta da terceira pessoa, plantas, e então encontraremos o personagem em terceira pessoa. Agora, nosso projeto de personagem na verdade tem um sistema agachado embutido que podemos usar. Então, tudo o que precisamos fazer é adicionar uma entrada. Então, vou procurar por entrada e depois soletrá-la e colocar o evento de entrada que controlamos. Vou usar o controle esquerdo. Em seguida, vamos clicar com o botão direito do mouse e procurar por agachamento. E queremos a função de agachamento. E vou conectar isso ao pressionado e botão direito do mouse e procurar agachado. E queremos o agachado conectado ao lançamento assim. Agora, atualmente, este realmente funcionou porque nosso personagem não tem o can crouch ativado. Então, ele irá para o Movimento do Personagem aqui e procurará por can crouch. E queremos assumir a capacidade de agachar-se sob capacidades de movimento como essa. Então, agora podemos testar isso. Vamos compilá-lo e clicar em Play. E agora, se eu pressionar Control, você pode ver minha câmera se mover para baixo. E quando eu me movo, estou andando mais devagar porque estamos usando nossa velocidade de caminhada agachada, mas nossas animações estão realmente mudando porque ainda não as conectamos. Então, vamos para o Animation Blueprint. Então, ele vai realmente sair do editor de planos, ir para personagens do que manequins, do que animações e abrir o dinheiro Animation Blueprint. E eu só vou arrastar o meu até o par superior. Agora, como fizemos na seção de animação deste curso, temos nossa lição de estados. Vamos adicionar um novo estado para nossas animações Crunch. Então, vamos para o gráfico Anim e depois para a locomoção. Agora, existem algumas maneiras diferentes de configurar isso. Se você olhar aqui, nós temos um estado para tudo que você faz animação e então eu vou andar slash run. Agora, nosso espaço de mistura realmente tem as animações ociosas incorporadas. Então, podemos usar apenas um estado para agachar. E isso atualizará se estamos nos movendo ou ociosos para nós. Mas se você estiver usando um espaço de mistura que não tenha aquelas animações ociosas. E então você precisaria de um estado ocioso agachado e um estado de movimento agachado, como fazemos para o nosso ocioso normal. E então eu vou andar slash run. Para nós. Vamos clicar com o botão direito do mouse e usar o estado. E vamos chamar isso de agachamento assim. Vamos abri-lo e ligar nosso espaço de mistura para que ele se arraste e assim misture o espaço. E queremos a linspace Claire aqui. E então, no painel Detalhes, queremos definir o espaço de mesclagem para nosso espaço de mesclagem agachado. Você pode ver que ele está atualizado para direção e velocidade. Vamos apenas compilar e obteremos nossa velocidade. Então, vamos nos arrastar e conseguir velocidade. E usaremos a velocidade de obtenção do solo. Agora, precisamos configurar uma variável de direção. Então, faremos isso agora, vá em frente para o gráfico de eventos e criaremos uma nova variável. Vamos chamar essa direção. Precisamos definir isso para um flutuador como esse. Agora também vamos adicionar outra variável para se o personagem estiver agachado. Então, criaremos um novo e chamaremos isso de agachamento. E vamos definir isso também. Precisamos que isso seja um booleano assim. Então, agora, para obter nossa direção, precisamos de nossa velocidade. Então, vamos clicar com o botão direito do mouse e obter velocidade. E isso deve estar na parte inferior aqui. Então, a partir disso, arrastaremos para fora e procuraremos a direção do cálculo. Isso levará nossa velocidade e rotação de nossos personagens , retorno e direção para nós. Então, vamos precisar da variável character. Então, vamos conseguir caráter. E então, a partir disso, queremos fazer rotação. Queremos o ato de rotação do get e conectá-lo à rotação da base. E então, a partir da nossa direção Calcular, podemos definir nossa direção. Então, vamos definir a direção. Podemos conectar isso às nossas sequências. Então, vou adicionar um novo pino, conectar isso aqui, e vou adicionar para redirecionar o know apenas para manter as coisas arrumadas assim. Agora precisamos definir R é variáveis agachadas, então vamos arrastar isso para dentro e criar um nó definido. Então vamos conseguir movimento. E queremos o componente de movimento de lacunas. A partir disso, vamos nos agachar. Soletre corretamente agachado. E queremos o nó está agachado aqui. E vamos apenas conectar isso ao nosso agachamento e, em seguida, adicionaremos uma nova caneta para sequenciar e conectá-la aqui em cima. vez, vou adicionar um redirecionamento agora apenas para manter as coisas parecendo um pouco ideias demais. Agora podemos voltar ao nosso estado agachado. E aqui precisamos conectar a direção r assim. E então podemos compilar. E agora precisamos definir as regras que realmente interessam à multidão. Então, vamos para a locomoção. Em seguida, arrastaremos de ocioso para agachado, e também arrastaremos de Walk, slash run para agachamento também. E abriremos a regra de ocioso para agachar. Então, aqui só queremos agachar o is e conectá-lo ao quadril variável. E então faremos a mesma coisa em nosso walk slash rum. E vamos conectar isso aqui. Então precisamos de regras para voltar de nosso agachamento para nossa corrida ociosa ou walk slash. Então, vamos arrastar de Crouch para ocioso e então abriremos essa regra. E então aqui nós só queremos ficar agachados, não é verdade. Então, vamos arrastar e não usar berílio e conectar isso aqui. E depois queremos fazer a mesma coisa. Nós arrastamos de Crouch para andar slash run. Abra essa regra. E aqui nós queremos fazer a mesma coisa é agachado, não é verdade, então vamos experimentar e não booleano. Mas também queremos verificar se estamos nos mudando? Então, vamos sair daqui e fazer e conectar isso aqui. E então queremos que se mova, então devemos nos mover, conecte isso aqui. Então, deve ficar assim. Agora vamos compilar e podemos realmente testar isso. Então, vamos selecionar a variável is crouching, assumir isso. Você pode ver que está subindo e descendo como deveria. Então, vamos compilar e testar isso no jogo. Então, ele irá para o nosso mapa, clique em Play. E agora, quando eu pressiono Control, você pode ver que nós realmente agachamos, estamos agachados, animação ociosa está sendo reproduzida. Se eu andar para frente e de um lado para o outro, as animações de movimento também serão reproduzidas. Agora, atualmente, nosso personagem apenas está voltado para a direção em que estamos nos movendo. E a razão pela qual isso acontece é se você se lembrar, eu andei slash run blend space é um 1D, então ele só tem para frente e para trás. Ele não tem animações laterais como nosso agachamento. Então, se quiséssemos que nossas animações laterais fossem reproduzidas enquanto estamos agachados, precisaríamos alterar as configurações de movimento do nosso personagem. Então, fazer isso exalará planetas para, e se voltarmos para o nosso ThirdPersonCharacter, podemos selecionar o movimento do personagem. E aqui vamos procurar a rotação orientada para o movimento. Você pode ver que atualmente está ligado, que significa que sempre que nosso personagem se move em uma direção, o ator enfrentará essa direção. Desligue isso e compile clique em Play. Você verá que, se eu me mover de um lado para o outro, nosso personagem não estará mais voltado para a direção em que estamos nos movendo. E a razão pela qual a animação está fazendo isso é porque só temos animações para frente e para trás. Mas se nos agacharmos e nos movermos de um lado para o outro, você pode ver que nosso personagem realmente coloca as animações corretas. E isso porque agachamos um espaço de mistura 2D com animações para cada direção. Agora, se eu olhar a câmera em uma direção diferente, não importa para onde eu olho. Nosso personagem sempre vai encarar da mesma maneira. Então, o que podemos fazer para mudar isso é ir para o ThirdPersonCharacter aqui e, em seguida, selecionar o componente superior aqui para obter nossos padrões de custo. E então aqui podemos procurar por York e podemos usar a rotação do controlador. Agora você está quando clicamos em Compilar e pressionamos Play, você pode ver que eu posso me mover de um lado para o outro e andar slash run não funciona muito bem, mas nosso agachamento funciona. E se eu olhar em uma direção diferente, você pode ver que nosso personagem realmente olha nessa direção. Assim, podemos mudar a direção que estamos olhando agora. Agora, é claro, todas essas configurações podem ser alteradas durante o tempo de execução quando certas coisas acontecem. Então, por exemplo, talvez você só quisesse ativar ou desativar a rotação orientada para o movimento quando você se agacha, Você poderia fazer isso apenas obtendo o movimento do personagem aqui, arrastando para fora e pesquisando orientar, role para baixo até a parte inferior. E você pode definir a rotação orientada para o movimento. Podemos definir isso como verdadeiro quando nos agachamos e falso quando nos agachamos. Ou podemos mudar isso. Você está definindo que ativamos dentro de nossos padrões de classe aqui. Nós poderíamos mudar isso. Para que pudéssemos definir, usar o controle de rotação. Você está, e podemos ligar ou desligar isso sempre que quisermos. Todas essas configurações são de preferência pessoal. Depende totalmente de como você quer que seu personagem se mova e como você quer que o jogador seja capaz de controlá-lo. Agora, se você quiser mudar a velocidade de movimento agachada de seus personagens, podemos fazer isso no movimento do personagem aqui, que se livra dessa busca. Podemos apenas procurar por agachamento e você encontrará a velocidade máxima de caminhada agachada aqui. Você também pode alterar sua meia altura agachada. Então, esse é o tamanho do componente da cápsula dentro do personagem enquanto você está agachado. E você também pode mudar se o personagem pode ou não sair de uma saliência, agachado selvagem. Novamente, essas coisas podem ser alteradas no código. Você pode simplesmente pegar o componente de movimento do personagem , arrastar para fora, definir o agachamento máximo e você pode alterar a velocidade máxima de caminhada agachada no código, se quiser. Agora, por fim, talvez você queira configurar o agachamento para alternar em vez de segurar. Nós podemos fazer isso. Portanto, excluiremos esse código aqui e os desconectaremos por enquanto e os moveremos de volta. Vamos usar pressionado e fazer um nó de ramificação. E aqui queremos verificar se o personagem está atualmente agachado. Então, para fazer isso, obteremos o movimento do personagem, agacharemos ou agacharemos isso aqui. E se estamos agachados no momento, queremos nos agachar, e se não estamos agachados no momento, queremos nos agachar. Então, ele vai reordená-los assim. Agora, quando eu clicar em Play, você verá se eu pressiono crouch. Eu fico agachado. E se eu me agachar sem preço, saímos do Crouch e não precisamos mais segurá-lo. Então esse é o final desta lição. Espero que agora você entenda como configurar um sistema simples de agachamento para seus futuros personagens.