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.