Transcrições
1. Vídeo promocional: Bem-vindo ao meu curso sobre
inventário e lojas em Gado. Este curso é uma continuação de diálogos e eventos em Gado, mas pode ser seguido e aplicado a qualquer projeto que envolva
pegar itens, adicioná-los a um
inventário, soltar, usar ou equipar itens de um menu
de inventário
e trocar itens com um e trocar itens Você está convidado a se juntar ao
nosso servidor de discórdia para trabalhar neste curso
ao lado de seus colegas Neste curso, abordaremos diferentes métodos de
pegar itens, gerenciar os dados de
inventário dos jogadores, exibir seu inventário
na interface de usuário em um menu, permitir que o jogador interaja com seu inventário de
maneiras diferentes e trocar itens com NPCs Quando terminar,
você terá um sistema de
inventário simples para seu jogo que é facilmente personalizável em sua apresentação
e função Você também aprenderá habilidades úteis para trabalhar com o motor de
jogo Gada, organizando e projetando seus projetos para
serem mais escaláveis Você
aprenderá a codificar com script
GD com tudo
explicado em detalhes Aplicaremos princípios de design
orientado a objetos em nossos scripts,
herança, encapsulamento,
abstração e polimorfismo,
para mantê-los organizados,
personalizáveis e reutilizáveis para personalizáveis Todos os arquivos do projeto
também estão disponíveis no GitHub, se você precisar revisar
o projeto como estava depois de concluir
cada lição Esses vídeos foram gravados
usando o Gdoersion 4.2 0.2. O projeto começa com
ativos de K Kits, pacotes remasterizados de
personagens e Dungeon feitos por K Lauberg Pacote Basic Guy
feito pela Penzilla
e ícones feitos por Shakahi e ícones feitos Todos estão disponíveis para
download gratuito nele. Os efeitos sonoros feitos por
Valensbyer também estão
incluídos e estão disponíveis
2. Moedas: Olá, amigos. Antes de
começarmos, você deve ter
visto um jogo em seu projeto, que contém um personagem
que o jogador pode controlar e um nível pelo qual ele
pode andar. Você deve ter pelo menos
um outro personagem para atuar como lojista, bem
como ativos para moedas e itens para o jogador
pegar, usar e Ao longo deste curso,
forneceremos ao jogador um inventário para controlar
seu dinheiro e itens, exibi-los na
interface do usuário, usar consumíveis, equipar itens para o personagem e comprá-los ou vendê-los Você pode usar seu próprio projeto
para acompanhar este curso ou baixar um projeto
inicial do meu GitHub,
intitulado Godo Inventory
course, intitulado Godo Inventory
course, Seu projeto pode ser dois D ou três D e quase qualquer gênero de
jogo que envolva o personagem ter
dinheiro e/ou itens em um inventário e a
habilidade de negociar com NPCs Vamos começar adicionando
uma variável para
acompanhar a moeda do jogador em seu arquivo salvo, que neste projeto é
o recurso de progresso. Exportando as variáveis, para
que elas sejam serializadas e Vamos chamá-lo de moedas. Será um número inteiro com um valor
padrão de zero Em seguida, vamos exibir essas
informações no Canvas, usando um nó de rótulo. Depois de definir a
fonte e o tamanho da fonte, é uma boa ideia
decidir o limite do
tamanho do número que você deseja
permitir que seja exibido, experimentando um número de
espaço reservado Limite total de 10 milhões. Seria bom
ter um ícone ao lado desse número para dizer ao
jogador o que ele significa. Usando um nó destruído de textura, preenchido com um ícone de moeda, podemos colocar os dois como filhos de
um contêiner de caixa horizontal
para organizá-los para Vamos renomear a carteira do nó
principal. E mova-o para ficar
atrás do fade. Acho que o contador de moedas
ficará melhor no canto
superior esquerdo, qual já está ancorado, mas com 32 pixels de preenchimento na
borda da janela O ícone é muito grande, então vou alterar o modo de alongamento aspecto
para manter
a proporção e fazer com que ele seja redimensionado
automaticamente para caber largura proporcional
à altura Redefinindo a altura
do contêiner principal. Agora, ele será definido pelo tamanho da fonte dos nós do
rótulo, que aparentemente é de 42 pixels. A altura do ícone também
será de 42 pixels
e, portanto, com uma proporção de um
para um, o ícone também terá
sua largura definida como 42. Também
centralizarei o texto verticalmente e adicionarei um contorno preto de 16 pontos ao número para combinar com
o contorno ao redor do
ícone Pensando no futuro,
gostaria que
o ícone pulsasse levemente
quando o número mudar. Definindo seu valor de
tamanho mínimo personalizado em y como 42. Clique e arraste-o para a direita, e podemos ver os efeitos de aumentar e depois diminuir
esse valor ao longo do tempo Fazendo isso rapidamente, podemos ver o efeito da
aplicação de um efeito de pulso rápido, mas sutil, que também
moverá levemente o rótulo, chamando a atenção do jogador Eu também gostaria de
manter o Canvas livre de informações
irrelevantes enquanto o jogador estiver jogando Então, teremos o contador de dinheiro escondido quando não for necessário. Selecionando o nó da carteira. Podemos clicar e
arrastar o valor da posição y para ver como ele pode se mover para fora da tela para se esconder e voltar para baixo
novamente para se mostrar. Vamos iniciar a carteira
em sua posição fechada, onde o valor da posição
y será
igual ao valor do tamanho y, mas negativo. Depois de exibir a carteira, podemos iniciar um cronômetro para ocultá-la
automaticamente após um período de tempo
usando um nó de cronômetro Vamos chamá-la de ocultação automática e definir sua
propriedade one shot como verdadeira, para que ela
faça a
contagem regressiva apenas uma vez quando solicitada para manter a
demonstração curta. Vou esconder automaticamente a carteira
depois de apenas 3 segundos. Adicionando um script a esse nó, vamos chamá-lo de contador e salvá-lo na pasta de
scripts de interface do usuário. Ele pode herdar do
controle, pois não precisa de nenhum comportamento do contêiner
horizontal da caixa Precisaremos de referências a todas
as anotações infantis definidas
durante a fase de preparação. E uma variável de interpolação privada. Funções públicas
estarão disponíveis para fazer com que esta nota
abra ou feche, retornando o sinal
interpolado finalizado quando terminar e outra para definir o
valor do contador A abertura do contador
será feita
interpolando sua posição y
para 32 positivos, e fechá-lo fará o mesmo o ponto negativo de
seu tamanho y. Seria uma boa ideia exportá-las como
variáveis
para tornar o script
mais reutilizável para mais reutilizável Adicionando variáveis de
posição na tela e fora da tela,
ambas como vetor dois, o Open agora pode interpolar a posição dos
nós para estar na tela e fechar as
interpolações para fora da tela Alterando o argumento float
em um vetor dois. Interpolando a posição dos nós, aceitando uma nova posição
como parâmetro vetorial dois e retornando o sinal finalizado de
interpolação Primeiro, verificaremos se uma interpolação
existe e está em execução. Se sim, mate-o e
crie um novo. Podemos então intercalar a posição
dos nós para alcançar a nova posição
por um período de tempo Vamos exportar isso
como outra variável e atribuir a ela um
valor padrão de 1 segundo. Lembre-se de definir os valores das posições
na tela e
fora da tela desse nó
de controle
no inspetor Para definir o valor, precisamos de um novo valor para defini-lo,
que deve ser um número inteiro Definiremos a
propriedade de texto do nó do rótulo para corresponder a esse número inteiro depois
de converter seu tipo em uma string, mas fixando que
esteja entre zero
e o valor máximo
permitido ao comprador exibir Mas primeiro, devemos verificar se o contador está
sendo exibido no momento
e, caso contrário, aguardar
a função de abertura Para isso, precisaremos de
uma variável booleana informando se o
contador está aberto ou não, que será definida como verdadeira
durante a função aberta, mas somente após a
interpolação Em seguida, aguarde também a animação
do pulso do ícone antes de atualizar
o número real Ou você pode omitir o
peso a aqui para que o pulso e o número sejam
atualizados simultaneamente Adicionando uma função de pulso, retornando o
sinal finalizado de interpolação após fazer as verificações
usuais de interpolação, simplesmente
interpolarei os ícones personalizados no mínimo por propriedade
para serem Digamos que 46 pixels. Durante uma duração de um
décimo de segundo, depois volte ao tamanho
original durante
a mesma Também podemos exportar variáveis para a duração e o tamanho
do pulso, se quisermos. Observe que, devido às configurações de
nó que estou usando, reduzir o ícone para ser menor que 42
pixels será ignorado Você sempre pode alterar o tipo da caixa horizontal para um
nó de controle normal e
posicionar manualmente seus filhos se
quiser mais flexibilidade. Selecionando o nó do temporizador de
ocultação automática, podemos conectar seu sinal de
tempo limite à função de fechamento do contador Ao selecioná-la na lista, a seta verde
mostra que a função está conectada a um sinal. Às vezes, podemos querer
desativar o recurso de ocultação automática. Vamos adicionar essa
funcionalidade com um parâmetro booleano opcional chamado stay open, cujo
padrão é true Armazenando isso em uma
variável local com o mesmo nome, podemos usar isso como uma condição antes de solicitar que o cronômetro de ocultação
automática inicie, desabilitando o comportamento de ocultação
automática e mantendo Ao definir o
valor do contador, se o contador ainda
não estiver aberto, é lógico que o contador não tenha
sido instruído a permanecer aberto. Portanto, devemos aguardar
sua abertura e passar false como argumento para
acionar a ocultação automática, e definir is open back
para false ao fechar Agora vamos mudar para
a cena do nível e criar uma pilha de moedas que
o jogador possa pegar Começando com
um nó Aa de três D, vamos chamá-lo de pilha de moedas pequena Em seguida, arraste o ativo
do modelo até o nó D da área três
para adicioná-lo como filho. Clicando com
o botão direito do mouse na pilha de moedas, selecione tornar Local para separar esse nó
do ativo importado, tornando-o apenas uma cópia local, em vez de uma referência
ao ativo Agora podemos extrair
apenas o nó D da
instância da malha que está desenhando a pilha de moedas e
remover todo o resto. Certifique-se de que as moedas estejam bem
apoiadas no chão,
ajustando sua
perspectiva, ajustando sua
perspectiva Em seguida, adicionaremos uma forma de
colisão para o nó D da área três Vou usar uma esfera,
dar a ela um raio que a envolva o suficiente e movê-la acima do solo Vamos anexar um novo script a essa pilha de moedas
chamada pilha de moedas Vou colocá-lo na pasta de scripts do
evento. T. E faça com que
ele herde de um evento de proximidade para reagir
automaticamente às
colisões com o jogador Para obter mais informações sobre eventos, consulte o
curso de diálogos e eventos da série. Vamos exportar uma variável para a quantidade de moedas
que estão na pilha, um número inteiro com um valor
padrão de dez Também podemos restringir esse
valor a ser contido em um intervalo usando
a tag de intervalo de exportação, especificando um valor mínimo
e máximo permitido para essa variável Uma pilha de moedas não
deve estar vazia, então o
valor mínimo seria um, e vou colocar o
máximo em 10 milhões Ao fornecer uma definição para que o gerenciador de eventos chame a função run event do script, aceitando o
gerenciador de eventos como parâmetro, não
precisaremos usá-lo, portanto, ele pode ser prosseguido
com um sublinhado Precisamos definir a variável de
progresso sendo mais o valor
dessa pilha de moedas e, em
seguida, destruí-la usando Q free Também precisaremos substituir
a função on body entered para
dizer ao gerente do jogo que não
desative o nó do jogador
durante esse evento Vamos transformar essa pilha
de moedas em sua própria cena, salvando-a na
pasta de cenas e criando uma nova
subpasta para itens Em seguida, afaste a pilha da posição
inicial do jogador A última coisa que precisamos fazer é atualizar a interface quando as
moedas são coletadas. Provavelmente
haverá muitas moedas no
jogo e não
queremos gerenciar seus sinais manualmente. Isso
seria uma perda de tempo. Uma maneira fácil de fazer isso é usar sinais carregados automaticamente. Criando um novo script de carregamento automático, vamos chamá-lo de global e emitir
um sinal chamado moedas datadas com um parâmetro inteiro
para a nova quantidade de moedas Esse script também é útil
para fornecer valores para variáveis
comumente usadas em diferentes scripts em
todo o projeto, especialmente
aquelas que não devem ser ajustadas pelo jogador
nas configurações do jogo. Em seguida, podemos adicionar o script
global à lista de nós carregados automaticamente nas configurações
do projeto. O script de contador anexado
à nossa carteira agora pode usar a função ready para conectar esse sinal à função de valor
definido. Definir o rótulo na
interface do usuário para corresponder ao argumento passado pelo sinal emitido pelo carregamento automático global E também inicialize o
valor do que estiver armazenado no arquivo salvo do jogador quando o jogo for carregado pela primeira vez Mas isso não é mais
um script reutilizável. Então, vamos dar a ele um contador
de nomes de classes. Em seguida, crie um novo script herdado do contador
chamado Wallet Que terá
essa função pronta ligando-a diretamente às moedas
do jogador Substituindo o script preso
à parede
arrastando-o até o nó O script do contador agora
pode ser usado para contar qualquer coisa
exibida no UY, como chaves ou
poções de saúde, por No script de progresso, adicionando uma função setter
à variável coins, podemos fazer com que esse sinal seja emitido
automaticamente sempre que o Usando uma declaração if,
podemos
garantir que o número não esteja
sendo definido como já era. Vamos experimentá-lo. Caminhando até as
moedas, elas desaparecem. A carteira aparece com
o saldo zero, que pulsa e
atualiza para dez Depois de um tempo de espera de três
segundos, a carteira se esconde. Agora temos moedas que
o jogador pode pegar e acompanhar no Canvas
do jogo. Na próxima lição, adicionaremos efeitos
visuais e de áudio para melhorar a aparência
dessas mecânicas de jogo Te vejo na próxima aula.
3. Língua polonesa: Olá, amigos.
Na lição anterior, adicionamos
moedas colecionáveis ao nosso jogo Nesta lição, usaremos todos os
tipos de efeitos especiais para
aprimorar o processo de
coleta de moedas torná-lo mais satisfatório A partir do script de contador, podemos adicionar uma variedade de
efeitos ao comportamento de nossos interpolados usando
transições e atenuações, que alteram a forma como a propriedade muda ao longo do
tempo Vamos exportar uma variável do tipo de
transição de interpolação. E configure-o ao
criar a interpolação. Observando o inspetor,
o comportamento padrão é uma transição linear, alterando
uniformemente a
propriedade ao longo do Mas podemos alterá-lo para
várias opções diferentes. Dando uma olhada nesses gráficos, acho que ficaria bom se o contador usasse o tipo de transição
elástica E cada um deles também pode ser combinado com um tipo de atenuação, aplicando-os na metade interna da interpolação,
na metade externa ou Em vez de exportar
o tipo de atenuação, eu gostaria de
aplicar atenuações
diferentes às funções abertas e
fechadas Como
faria sentido que
o efeito elástico fosse
reproduzido na tela
, colocarei a função aberta
e a função fechada ativadas. Passando o tipo de atenuação
das funções abertas e fechadas para
a função de posição de interpolação em cada caso Na cena da pilha de moedas, podemos esperar que a
pilha diminua antes de destruí-la, em vez
de Pegando uma referência à
bagunça durante a fase de preparação, podemos fazer com que a malha
encolha usando uma interpolação Como não há como
essa interpolação ser
usada mais de uma vez, não
precisamos nos preocupar com
isso. Basta criar a interpolação Usarei o mesmo
tipo de transição
elástica e interpolarei a propriedade de
escala das malhas para zero um curto período
e retornarei o sinal Mas precisamos garantir
que o jogador não
colida com essa área novamente enquanto a interpolação estiver Então, vamos desativá-lo
adicionando uma função
no script de eventos de proximidade que define sua máscara de colisão como zero Também podemos adicionar um polimento extra
adicionando um
reprodutor de stream de áudio com três nós D. Preenchido com um efeito sonoro de
tilintar de moeda. Estou usando o pacote de
sons de moedas criado por val inspired or. Precisamos obter uma referência
a esse nó usando o complemento. E peça para ele jogar
durante o evento. Em seguida, espere o
som terminar antes de colocar o nó na
fila para ser
liberado para que ele possa Como
reprodutor de fluxo de áudio de três nós D, o som emitido
ajustará seu volume com base na proximidade do
ouvinte padrão, a câmera Se quisermos adicionar
efeitos sonoros à interface do usuário, devemos usar o nó básico do reprodutor de fluxo de
áudio, que sempre
reproduzirá seu efeito sonoro no volume definido. Obtendo uma referência ao nó do reprodutor
de fluxo de áudio. Podemos tocar um som de tilintar de moeda sempre que o
valor do contador for definido Agora temos
efeitos sonoros reproduzidos diferentes nós e cenas
diferentes. Um nó carregado automaticamente também
está tocando música de
fundo enquanto
outros estão reproduzindo efeitos sonoros, e com
certeza teremos muito mais à medida que o jogo ficar maior, e outros
também poderão reproduzir diálogos. Devemos ajustar o volume para coincidir com as configurações do jogo. Mas gerenciá-los individualmente
seria difícil. Se clicarmos na guia de áudio
na parte inferior do editor, o Gada tem um barramento de
áudio integrado que podemos usar para categorizar nossas
diferentes fontes de áudio Isso nos permite
ajustar os volumes ou outras configurações de cada um
coletivamente por meio do barramento, em vez de cada nó individual Adicionando um novo barramento para música e
outro para efeitos
sonoros, ambos passarão pelo master antes de serem
enviados para os alto-falantes. Ajustar o volume principal afetará tudo
no jogo Ajustar o
volume da música afeta apenas a música e também
os efeitos sonoros Selecionando os nós
de fluxo de áudio do efeito sonoro, podemos alterar seu barramento para SFX Como não podemos acessar
o nó de música fora do script carregado automaticamente, podemos usar a função ready
para configurar seu barramento para música. Verifique se a ortografia
é exatamente a mesma. Caso contrário, o barramento
voltará ao padrão de master. Salve o layout do barramento de áudio
como um recurso do projeto. Em seguida, abra as
configurações do projeto Em barramentos de áudio, selecione o
layout do barramento de áudio como padrão. O nó de música não
precisará mais se referir
à configuração de volume, pois o
barramento de áudio musical definirá o limite seu volume e poderá simplesmente diminuir
para um volume linear de um No
recurso de configurações, podemos adicionar variáveis para armazenar cada configuração
individual de volume, masterização, música e efeitos
sonoros, fornecendo também valores padrão
para cada um. No menu de configurações, podemos adicionar controles deslizantes de
volume para alterar
cada um desses valores Vou mudar o volume
para o volume principal. Em seguida, duplique-o duas vezes e edite as duplicatas para serem volume
e efeitos sonoros da música Capturando referências a cada controle deslizante durante a fase de preparação Inicializando-os para corresponder às configurações
do jogo
quando carregados pela primeira vez Não precisamos mais
definir manualmente volume
da música, pois ela
será gerenciada pelo ônibus E quando o player
alterar seus valores, altere as variáveis
no recurso de configurações e também ajuste os volumes
no barramento de áudio para corresponder. servidor de áudio define o volume do barramento
Decibéis
índice do barramento do servidor de áudio As configurações de pontos do arquivo mestre fazem o volume principal, convertido de
linear para Dando a cada controle deslizante sua
própria função de alteração de valor, depois de podermos editar as conexões
de sinal dos controles deslizantes para
conectar-se às funções apropriadas de alteração de
valor Também precisamos inicializar os volumes
do barramento
quando carregados pela primeira vez Agora, não precisamos nos preocupar ajustar
manualmente
os volumes de
nenhum nó de áudio, desde que sejam classificados na
categoria apropriada Abrindo a pilha de moedas pequena cena Reinicie a
origem local da transformação, se não estiver Vamos também adicionar um efeito de partícula
simples às moedas quando
elas desaparecerem Pudo tem dois tipos
diferentes de nós para gerar partículas, um que roda na CPU
e outro na GPU Partículas de CPU que são compatíveis com
computadores mais lentos ou que não têm um processador
gráfico dedicado como dispositivos móveis, mas não conseguem produzir tantas partículas e têm
menos recursos Um sistema de partículas de CPU
é capaz o suficiente para produzir uma pequena explosão de partículas, como o que estamos
tentando alcançar Mas um emissor de partículas de GPU
seria mais apropriado para emitir milhares ou milhões de partículas em Vou usar um emissor de partículas da CPU. No momento, nada está sendo emitido porque não há nenhuma
partícula para extrair Expanda a
seção de desenho e adicione um recurso de malha para representar
uma única partícula Eu gostaria de usar a malha de
moedas como partícula. Vou arrastar um único ativo monetário do pacote de ativos
para a cena. Torne-o local e selecione o nó D da instância de
malha. Depois de tornar essa malha única
, ela não está mais vinculada
ao ativo importado. Eu posso salvar essa malha
como um recurso do projeto. Vou chamá-la de malha de moedas. Excluindo todos esses nós e selecionando novamente o emissor de
partículas, agora
posso usar essa As partículas agora estão emitindo oito vezes por segundo
e caindo. Eu gostaria de uma explosão única de partículas em vez de uma emissão
contínua Expandindo a seção de tempo, vou definir uma chance como verdadeira
e explosividade Ao clicar no botão de emissão, todas
as oito partículas aparecem ao mesmo tempo e
desaparecem após 1 segundo, que é Eu quero que as partículas explodam
para cima, então vou expandir a seção de
direção e mudar a direção para cima
com uma extensão de 15 graus Em seguida, definirei a
velocidade inicial como um número aleatório de 2 a 3 metros/segundo e definirei a gravidade mais baixa em apenas 4 metros/segundo ao quadrado . Vou fazer com que as partículas
alinhem seus vetores ascendentes locais na direção em que estão se movendo Vamos ver como está até agora. Eu preferiria que as moedas não aparecessem ou desaparecessem
repentinamente, então vou expandir a seção de
escala e em uma curva de escala. Expandindo o
recurso de curva para editá-lo, temos o tempo ao longo do eixo x
e a escala ao longo do eixo y. Note que o tempo de
um não é 1 segundo, nem a escala de um, 1 metro. Essas são porcentagens da vida útil
das partículas
e das propriedades de escala No momento zero, quero que a
moeda fique invisível, definindo sua escala como zero, e a mesma no tempo um. Na metade da vida útil
das partículas, quero que sua escala
seja de uma ou de tamanho total Isso cria uma onda
para que a partícula cresça e encolha
gradualmente
ao longo de sua vida útil Podemos modificar as
âncoras de qualquer ponto dessa curva para ajustar como isso
afeta a escala das partículas Agora parece que
as moedas explodiram e
choveram
depois de serem coletadas Há muitas
configurações diferentes para ajustar a forma como as
partículas são geradas e como partículas são geradas e como elas se comportam ao longo de sua Experimente diferentes configurações de efeitos de
partículas para obter o tipo de efeito
que você deseja para o seu jogo No script da pilha de moedas, podemos pegar uma referência
ao nó emissor de partículas e definir sua propriedade
de emissão verdadeira quando as Em seguida, aguarde o sinal finalizado antes de colocar esse
nó na fila para ser liberado Vou fazer com que o encolhimento, o efeito
sonoro e o efeito de partícula aconteçam Duplicando a cena pequena da
pilha de moedas, podemos fazer uma pilha média
e uma grande Substituindo os
três nós D da instância de malha por diferentes pilhas de moedas Também definirei o valor
dessas pilhas para ter um valor padrão mais alto,
alterando-o no inspetor
em suas cenas Altere seu efeito sonoro e o número de partículas emitidas por seus efeitos de
partículas Em seguida, adicione pilhas diferentes
ao redor do nível para serem
coletadas pelo jogador Também podemos usar
efeitos de partículas em dois D. Vamos fazer um efeito semelhante no ícone
da carteira quando a
moeda encontrar atualizações. Adicionando um
emissor de duas partículas D ao nó do ícone. Vou posicioná-lo para
ficar no centro. R Usando quase todas as mesmas propriedades
desse emissor de partículas, vou apenas transformar a partícula
em uma cópia do ícone da moeda Use uma extensão de 180 graus, para que as partículas
voem em todas as direções e removam a gravidade. A velocidade é medida
em pixels por segundo, então vou fazer com que varie de 16 a 32 Mas aplique a mesma curva para que as partículas
cresçam e encolham E defina a escala mínima e máxima para apenas 5% do tamanho normal. Então, no script do contador, pegando uma referência
ao emissor de partículas, podemos dizer que ele emita ao
atualizar Agora, ao pegar as moedas, o comportamento das moedas e da interface
do usuário parecem muito
mais interessantes Experimente diferentes tipos de transição e atenuação, efeitos
sonoros e efeitos de
partículas para
obter a aparência
que você deseja para Agora temos uma
experiência mais satisfatória para o jogador coletando moedas em nosso jogo graças a uma variedade de efeitos Na próxima lição,
permitiremos que o jogador pegue um item pressionando um botão e adicionando-o
ao inventário. Te vejo na próxima aula.
4. Pick Up: Olá, amigos.
Na lição anterior, aprimoramos a mecânica de coleta de
moedas Nesta lição,
adicionaremos itens que o jogador pode pegar
pressionando um botão. Vamos começar
criando alguns itens que o jogador
deve ser capaz de pegar. Começando na cena do personagem, podemos usar um dos
itens em suas mãos. Vou usar o machado dos bárbaros. Fazendo desse machado sua própria cena, salvando-o na pasta de cenas dos
itens, observe como a origem do machado está na alça em que
o personagem o segura Podemos adicionar um corpo rígido de
três nós D a essa cena, o que a tornará
um objeto físico, indicado pelo ícone da bola de
praia Dê a ele uma forma de colisão. Vou usar apenas um Box Collide. Em seguida, ajuste os limites
e a posição
da caixa para encapsular
o modelo x. Usar pontos de vista ortográficos
torna isso muito mais fácil. Clicando com o botão direito do mouse no nó
D do corpo rígido, farei dele o nó
raiz da cena e o renomearei para X. Vamos colocar isso em uma
nova Vou usar a camada seis para itens. Este objeto pode
mascarar o terreno, outros itens, o player e o MPC Abrindo as configurações do projeto, nomes das
camadas, três físicas D, reservando a camada
seis para a coleta de itens Anexando um script
ao nó raiz, vou chamá-lo de item Por enquanto, vou simplificar as coisas e apenas exportar um nome de exibição para
o item como uma string. Expandiremos os
itens em si. Voltando à cena do
personagem, podemos excluir o nó do item, já que ainda não temos
os sistemas
adequados para
equipá-lo Na cena do Dungeon,
arrastando
uma garrafa A rotulada como marrom para a
cena e tornando-a local, o ativo foi importado para já ter um
corpo rígido preso Podemos clicar com o botão direito do mouse nesse
nó e criar sua própria cena e chamá-la de poção de saúde Crie novamente, renomeie a poção de saúde e
exclua o Node 3 D. Ao abrir a cena,
a simulação mundial
é desativada Vou ligá-lo novamente. Vamos renomear o nó raiz
para poção de saúde também. E anexe o script do item, dando à
poção de saúde um nome de exibição Usando as mesmas
configurações de colisão do machado. A origem da poção está em sua base, onde ela
ficará no chão, assim como em seu centro de massa, levando a um comportamento
incomum Para tornar os itens mais fáceis de serem
segurados pelos personagens, é útil que sua origem esteja onde o personagem os
segurará. Então, selecionando a malha
e a forma de colisão, vamos movê-las para baixo cerca de
dois terços da garrafa,
posicionando a origem ao redor do
gargalo da E selecionando o nó do corpo
rígido, expandindo a seção de
distribuição de massa Também podemos alterar o centro de massa trocando-o
de automático para personalizado, deslocando-o para ficar mais próximo
da parte mais larga da garrafa ao longo
do eixo
y, cerca de um terço Isso evitará que a garrafa se comporte como um poste rolante. Agora temos dois itens diferentes que o jogador
deve conseguir pegar. Vamos colocar um machado
e duas poções na mesa para o
jogador coletar Mas isso parece um pouco chato
e, como esses são
objetos físicos que podem se mover, vamos colocar uma das poções no chão inclinada para
o lado chão inclinada para
o De volta ao cenário de saúde potente, podemos tentar anexar um evento de
interação a ele, usando um nó D de área três
e uma forma de colisão Vou usar a mesma cápsula
dos nossos NPCs como exemplo. Embora esse sistema tenha
funcionado muito bem para interagir com NPCs e portas, que geralmente são
maiores e não giram, agora
podemos ver as
limitações de
nossas
interações de eventos existentes ao lidar com
objetos menores e/ou objetos físicos que Para esta demonstração, vou ativar as formas de
colisão visíveis Anexar um evento de interação à
poção de saúde a tornará
ininterativa se ela tombar e rolar no chão Já que a
área de colisão também
girará em torno da
origem local da poção de saúde Isso se torna muito mais difícil atingir com
segurança com um raio lançado Poderíamos fazer com que a colisão
moldasse uma esfera grande o suficiente para que sempre fosse
detectada pelo raio lançado Mas vamos usar uma solução
diferente. Muitos jogos também permitem que o
jogador pegue itens atrás deles que ainda estão
próximos ao personagem
por conveniência. Um elenco que só olha para frente não vai
conseguir isso. Outra forma de interagir com o ambiente pode ser obtida usando um nó D de área três anexado ao personagem do
jogador, usando uma forma de colisão esférica ou
cilíndrica, definindo o raio para um limite de alcance
apropriado Vou usar o mesmo alcance do raio de interação
de 2 metros. Defina a altura na altura do
colisor de caracteres de 2,6 metros e
centralize-a
no personagem na metade desses 1,3 metros Mas se o personagem estiver em uma ladeira descendente
e o jogador quiser pegar itens um pouco abaixo dele, ele
deve ser capaz Então, adicionarei meio metro
de altura e abaixarei o centro em
um quarto de metro. Essa forma de colisão
monitorará os itens
que o jogador pode pegar ao
pressionar o
botão de interação , mascarando a camada seis Anexando um script
a esse nó de área. Vamos nomeá-lo como raio de captação. Vou criar uma nova pasta para scripts de
jogadores e
colocá-la lá. Em seguida, mova também os scripts
do player e do spring arm para
essa pasta. Em seguida, conecte o
sinal inserido pelo corpo a esse script para reagir a qualquer corpo na camada seis que entre
no raio de captação Assim como o
sinal de saída do corpo quando eles saem
do raio de captação Esse script
precisará manter uma lista de todos os itens
ao alcance do jogador que podem ser coletados usando
uma matriz de nós três Ds, que será padronizada como
uma matriz vazia. Quando um corpo entra nessa área, ele é anexado
à matriz E quando sair dessa área, será apagado
da matriz Mas a desvantagem de
usar colisões de área
dessa forma é que não
há como
detectar obstáculos Na verdade, isso
permitirá que o jogador pegue itens do
outro lado da parede. Precisaremos usar outro
lançamento de raios para determinar se o que o jogador quer pegar está obstruído pelo terreno
ou por Adicionando um nó D lançado de três
ao raio de coleta do item, eu o moverei para cima ao longo do eixo y
até a metade do personagem,
1,3 metros, e farei com que ele colida apenas com o terreno ou
os Quando o jogador
pressiona o botão de interação, eu peço que ele pegue
o item mais próximo Vamos escrever um
algoritmo que levará o item mais próximo ao
jogador nessa área, retornando um nó três D.
Ao escrever um algoritmo, é melhor primeiro
descobrir quais são
todos os casos possíveis
que precisam ser considerados O que acontece quando
a matriz está vazia, o que significa que não há itens dentro do alcance para o
jogador pegar. Devemos retornar null, não
significando nada. Se houver apenas um
item na matriz, primeiro
teremos que verificar
se há um caminho desobstruído entre esse nó e o nó do item
usando o Definir a posição
alvo da projeção de raios como
sendo a diferença entre os itens
e as posições globais
dos nós de projeção de raios . O raio aponta de
sua própria origem diretamente para a origem do item. Depois de alterar para onde o
raycast está apontando, as
informações de colisão não serão atualizadas até o
próximo processo físico, mas podemos forçá-las a serem atualizadas imediatamente com
uma chamada de função Se o raycast atingir o
item, poderemos devolvê-lo. Caso contrário,
ainda retornaremos null, já que o único item
na matriz está
obstruído pelo terreno Vamos tornar esse código reutilizável transformando-o em
uma função privada Vou chamá-lo de obstruído, aceitando o item
como parâmetro e
retornando um booleano se projeção
do raio estiver
obstruída Como esses casos abrangem a grande maioria das vezes em que o jogador pressiona
o botão de interação, eles devem ser verificados primeiro e tratados da
forma mais eficiente possível Na rara
circunstância de haver dois ou mais
itens na matriz
, precisaremos comparar
a distância de cada um até o jogador para decidir qual é
o mais próximo, aumentando
consideravelmente a
complexidade do algoritmo Precisaremos de algumas variáveis
extras agora, o índice da matriz
do item mais próximo, a distância até
o item mais próximo e a distância até o
próximo item na Depois que todos os nossos
cálculos estiverem
concluídos, podemos devolver o item no
índice do item mais próximo. Ao comparar
distâncias como essa, é matematicamente mais
eficiente usar a distância
ao quadrado
em vez da Como a distância entre dois
pontos no espaço de três D é a raiz quadrada de x ao quadrado
mais y ao quadrado,
então d ao quadrado é igual a x
ao quadrado mais y ao quadrado mais ao quadrado Eliminando a necessidade de calcular a raiz quadrada desse número, e se d um for
menor que d dois, então d um ao quadrado também é
menor que d dois ao quadrado Podemos começar
definindo o índice zero e
a distância até
o item mais próximo como algo
maior do que o raio de
coleta ao quadrado, então qualquer item dentro do raio de coleta será
considerado o considerado Como meu raio é dois,
vou usar apenas cinco. Para cada item na matriz, precisamos determinar a
distância quadrada até ele Usando a
posição global desse nó, distância quadrada até
a posição global do item no índice Em seguida, compare essa distância
com a distância mais próxima. Se for menor,
verifique também se o item
está desobstruído Se isso for verdade, então essa é a distância mais próxima
que encontramos até agora, e I é o índice
do item mais próximo até agora Observe que as operações booleanas
são executadas da esquerda para a direita. A comparação das distâncias
será concluída primeiro, o que é um cálculo
matemático bastante eficiente. Se a distância até
o próximo item
não for menor que a distância
mais próxima, não importa se
o item não está obstruído A operação booleana e
começará com false
e, portanto, não importa o que o outro lado
acabe sendo, pois falso e tudo ainda
é falso, ignorando totalmente a projeção do raio, que é um
cálculo mais caro Escolher cuidadosamente a ordem das operações a partir de verificações comuns
e simples e adiar os casos mais
complexos ou mais raros final, onde eles
possam ser ignorados, pode ajudar seus algoritmos a
funcionarem Vamos repetir isso até
chegarmos ao final da matriz. Em seguida, teremos
o índice de matriz
do item
mais próximo do jogador e poderemos devolver o item
para ser retirado. Isso não deve ser igual a. O jogador precisa de um inventário
para armazenar seus itens, que farão parte de suas informações de
progresso. Vamos declarar uma
variável privada chamada inventário como um dicionário e
inicializá-la para ficar vazia usando colchetes em vez
de colchetes Um dicionário é uma coleção de pares de
valores-chave,
semelhante a uma matriz. Se você considerar que o
índice da matriz é a chave, mas um dicionário pode usar
qualquer coisa como chave. Desde que cada chave seja única. Usando o
nome de exibição dos itens como chave, podemos facilmente empilhar itens
usando a quantidade como valor Essa é uma estrutura de
inventário muito simplista, mas suficiente para
essa demonstração Por enquanto, criaremos uma função
chamada adicionar ao inventário, aceitando que um item seja adicionado ao inventário
do jogador e uma quantidade opcional com
o valor padrão de um Primeiro, verifique se o item já existe no inventário do
jogador. Podemos aumentar o valor
dessa chave pela quantidade. Se o item ainda não existir no inventário do jogador
, podemos definir o valor como
a quantidade, o que também cria essa
entrada no dicionário. No final, vamos apenas imprimir o inventário para que possamos vê-lo. No
script dos jogadores, podemos dar
ao botão de interação vários usos sensíveis ao
contexto. Pegando uma referência
ao raio de coleta do item, também
declararemos uma variável para conter o
item mais próximo do jogador Ao pressionar o botão de
interação, primeiro
atribuiremos o valor
do item mais próximo ao item mais próximo retornado
pelo raio de coleta
usando nosso algoritmo Se o
script de raio de coleta retornar um item, qualquer coisa que não seja nulo
, devemos
pegar esse item, adicioná-lo ao inventário do
jogador
e colocar o item na fila para ser liberado, removendo-o da árvore da cena Mas se não houver nenhum item
no intervalo para selecionar, o script retornará nulo, então podemos prosseguir com o comando de
interação de caracteres E se o jogador
estiver enfrentando um NPC com quem deseja conversar e houver um item que eles
possam pegar aos pés Ao criar comandos
sensíveis ao contexto, considere quais
contatos têm
prioridade e como isso
afetará a experiência do jogador. Nesse caso, pressionar
o botão de interação pegará o item primeiro. Em seguida, o jogador
terá que pressionar o botão novamente para
falar com o MPC Às vezes, pode
ser melhor usar um botão diferente,
se for mais conveniente
para o jogador. Ok. Se rodarmos o jogo, ficarmos atrás da parede e
pressionarmos o botão de interação, o item ficará obstruído e não
conseguiremos
pegá-lo Entrando na sala, pressionando o botão de interação
sem qualquer obstrução As duas poções de saúde e o machado são adicionados ao inventário do
jogador, cada um pressionando um
botão separadamente e exibidos no registro de saída As poções de saúde também
são
agrupadas em uma única entrada do
dicionário Agora temos o jogador
pegando itens pressionando um botão e
os adicionando ao inventário Na próxima lição,
exibiremos o inventário do jogador
no Canvas. Te vejo na próxima aula.
5. Inventário: Olá, amigos.
Na lição anterior, adicionamos itens ao inventário do jogador
pressionando um botão. Nesta lição, exibiremos o conteúdo do
inventário do jogador em um menu. Um bom lugar para começar
com os menus é montar uma maquete das informações que você deseja exibir
para o player Isso pode ajudar a ter uma ideia da melhor
forma de usar o
espaço disponível e talvez fazer com que você considere coisas que você não
pensaria em incluir de outra forma. Vamos começar com um nó de painel
básico e renomeá-lo para inventário Provavelmente,
desejaremos alguns nós de rótulo, um título para esse painel para dizer
claramente ao jogador para que serve, bem
como um nome do item e descrição do item
atualmente selecionado. O título
dirá apenas inventário, e eu usarei um texto fictício para o nome e a descrição do item Vou usar os dois envoltórios para
que não fiquem fora do painel E também um contêiner, geralmente um contêiner de
caixa vertical ou um contêiner de grade para
organizar todos os itens. Seja qual for o recipiente que
você vai usar, ele provavelmente estará
cheio de botões, cada um representando um
item ou uma pilha ele provavelmente estará
cheio de botões,
cada um representando um
item ou uma pilha de itens.
Vamos adicionar um agora. Em seguida, vamos criar um
tema para esse menu. Vou chamá-lo de inventário. Crie uma nova pasta de recursos para temas e coloque-a junto com
o tema existente. Expandindo
o tema no painel do inspetor, alterarei a fonte padrão
para a fonte mais legível
que estou usando meu jogo e definirei o tamanho
padrão da fonte como 96, que na verdade não
será tão grande
depois que eu reduzir o Na guia do tema,
começarei adicionando o painel. Em seguida, dê ao painel uma
nova textura de caixa de estilo. Clicar na textura da caixa de
estilo para abri-la na guia Inspetor Vou usar a imagem
quadrada da caixa cinza com margens de
textura de 128
pixels em todos os lados A imagem é muito grande, então vou
reduzi-la para um quarto do tamanho. Em seguida, defina o
tamanho dos painéis para dobrar a resolução
da tela de 12 80 por 720 Ele ocupa metade da tela
em largura e altura. Definir o pivô
para ser o centro usando metade
da propriedade de tamanho e, em
seguida, ancorando o painel no centro
da Com o painel em posição, agora
posso ancorar
cada um dos elementos diferentes
posições dentro dele Vou ancorar o título
para ser centralizado
no painel horizontalmente e
10% abaixo Crescendo em ambas as direções
horizontal e verticalmente, modo que fique centralizado em torno Vou fazer com que use
a fonte mais sofisticada e um tamanho de fonte maior de 128 O nome do
item e a descrição do item, vou colocar dentro de uma caixa
vertical. Em seguida, use âncoras personalizadas para posicioná-lo no
lado direito do painel, cobrindo tudo de
60 a 95% na horizontal e 20 redefinição dos
deslocamentos da âncora quebrará os limites
do controle para coincidir com os pontos de Vou usar uma
substituição de tema para espaçar o modo e mais 64
pixels um do outro O nó do rótulo deseja que um tamanho
mínimo personalizado seja definido, então vou defini-los para 64 pixels de altura para
eliminar os avisos Isso deixa a metade esquerda
do painel disponível para
a lista ou grade de itens. Novamente, usando âncoras personalizadas, farei com que a grade
cubra 5% a 58% na horizontal e 20 Eu darei ao meu botão de amostra
um tamanho mínimo personalizado de 256 por 256 pixels. Em seguida, altere também
a fonte do nome do item para que ele se
destaque mais na descrição. Adicionando botões
ao tema do inventário, também
podemos alterar a
aparência dos botões do item. Vou usar a mesma caixa cinza
para os botões do painel. Vou usar a mesma caixa de estilo para quando o botão for pressionado. Deste-o quando estiver desativado. Mude o botão para
branco quando estiver focado ou amarelo quando estiver com o mouse sobre
ele. Vou adicionar uma textura
destruída e uma etiqueta
ao botão para exibir um
ícone para representar o item e um contador de quantos itens
o jogador tem
atualmente Quero que o ícone mantenha sua proporção e permaneça ancorado no
centro do botão Quanto ao nó do rótulo. Vou configurá-lo para 99, para que eu
possa ver como fica. Vou fixar o contador
no canto inferior direito do botão e dar
a ele um contorno grosso para se
destacar contra o ícone Mas quando for um número de um
único dígito, quero que seja
centralizado horizontalmente A partir dos meus ícones, usarei uma folha de sprites feita por
Shashi no itch Usando uma textura de atlas, podemos definir essa textura
como um único s de uma folha Definindo a propriedade da textura
como a textura do Atlas, podemos clicar no botão da região de edição e, em
seguida, dividir
a folha de sprites em sprites individuais Ao selecionar uma para atuar
como espaço reservado, vou usar uma poção de saúde e aumentá-la para
preencher o botão Esses ativos são arte em pixels, que não devem ficar
embaçados dessa forma Precisarei alterar
o filtro de textura para vizinho
mais próximo para obter a aparência
apropriada desse ícone. Vou definir seu tamanho
para 32 por 32 pixels, e ele gira para
ficar no centro, que
fique bem
dentro do botão Agora que temos um item de amostra, vamos duplicá-lo várias
vezes para
simular a aparência de um
inventário completo O contêiner da grade
precisará ter mais de uma coluna. Cinco colunas se
encaixam perfeitamente no espaço. Mas ainda podemos
armazenar apenas 20 itens dentro do contêiner da grade antes os itens transbordem para
fora do painel Lembrando os valores de âncora
que usamos para esse contêiner. Se adicionarmos um contêiner de rolagem
, copiaremos as mesmas âncoras para o contêiner de rolagem
que tínhamos para o contêiner de grade Em seguida, aninhe-se ao contêiner
da grade dentro do contêiner de rolagem. rolagem será ativada
automaticamente para permitir que qualquer número
de itens seja mantido Vou redefinir os deslocamentos da âncora
do contêiner de visualização em rolagem para forçá-lo a permanecer
dentro das âncoras Agora podemos excluir todos os botões
de espaço reservado, exceto um. O último botão que devemos
salvar como sua própria cena. Um que podemos
usar como modelo para gerar o inventário do
jogador Vou salvá-lo em uma nova
pasta de cenas para cenas de interface do usuário. Em seguida, mova o
menu de configurações para essa pasta também. Em seguida, podemos excluir
o último botão e remover todo o texto do
espaço reservado, deixando-nos com uma tela de inventário
vazia Nosso painel de inventário também deve incluir um botão fechado
se estivermos planejando lançar este jogo
para PC. Vamos adicionar um botão. Re. E fixe-o no canto superior
direito do painel Nosso tema já tem
uma configuração para botões, mas podemos alterar a aparência
desse botão sem afetar outros botões
usando uma variação de tipo. Mas adicione um novo tipo ao
nosso tema de inventário
e, desta vez, basta digitar um nome personalizado para
nosso botão fechado. Na última guia do nosso novo tipo, podemos especificar um
tipo base para esse tipo, que será botão. Em seguida, mudando para
a guia da caixa de estilo, podemos sobrescrever
seus valores para usar caixas de estilo
diferentes,
especificamente para botões fechados Usando o botão X vermelho pré-fabricado do UiPac para o estado
normal do botão, podemos então selecionar o nó do botão
fechado e definir sua variação de tipo
para Ele usará essa configuração de
tema no lugar das configurações normais do
botão. Vou definir seu tamanho para 128 pixels e
reancorá-lo no canto superior direito Vou usar a mesma caixa de estilo para cada estado de botão
para o botão fechado. É anexar um script ao
nosso painel de inventário, nomeá-lo como inventário e
salvá-lo na pasta de scripts de interface do usuário. Ele pode ser herdado de uma aula que
escrevemos no menu essencial do
curso Herdando da classe de menu, já
lidaremos com a abertura
e o fechamento do menu, daremos foco a um
item de foco padrão quando o menu for aberto e forneceremos
trilhas de navegação se tornarmos esse menu acessível
a partir de outro menu No entanto, gostaria de ignorar
esses comportamentos poder desativar o nó do jogador enquanto o inventário estiver aberto Copiar as definições de abrir e fechar no script de
inventário e chamar as
superdefinições. Nossa árvore de cenas está ficando
bastante grande e complexa agora, então o caminho do nó entre o inventário e o nó do jogador exigirá a
subida de vários níveis. Ao acessar um nó exclusivo
por meio de um caminho de nó complexo, é melhor marcar
o nó como exclusivo. Clicando com
o botão direito do mouse no nó do jogador, selecione acesso como nome exclusivo. O nó é marcado com
um sinal de porcentagem. Agora, quando obtemos uma referência
a ela usando add on re, o caminho do nó é
substituído pelo sinal de porcentagem e agora é uma referência direta a esse nó exclusivo específico. Ao abrir o, podemos definir a propriedade ativada do nó
do jogador como quedas, para que o jogador não possa
se mover ou pular. E quando estiverem fechados, se não houver migalhas de pão
, podemos reativar
o nó do jogador para que o jogador possa continuar
jogando Também precisaremos
adicionar um botão ao mapa de entrada
das configurações do
projeto para abrir o inventário. Vou usar a tecla backspace ou o botão de seleção
no meu controle No script do jogador, se o botão de
inventário for pressionado, podemos dizer
ao gerente do jogo que ative a invenção Mas o jogador deve
ser capaz de fechar o inventário enquanto o nó do
jogador está desativado, para que essa verificação precise ser separada da funcionalidade de
pausa No script do gerenciador de jogos, pegando uma referência
ao menu de inventário Podemos abri-lo se estiver fechado
ou fechá-lo se estiver aberto. O script de inventário
então precisa ser capaz dizer
ao gerente do jogo
se ele está aberto ou não. Portanto, ao declarar uma variável booleana, ela naturalmente assumirá o
padrão false, e podemos configurá-la quando o
inventário abrir ou fechar Quando o
menu de inventário for aberto pela primeira vez, o inventário do jogador
provavelmente estará vazio, então não haverá
nada que possa chamar a atenção. Podemos adicionar uma instrução if ao script
do menu
para primeiro verificar se o item de foco padrão foi definido antes de pedir que
ele pegue o foco. Agora, o inventário
que não tem um item de foco padrão não se
preocupará em tentar
se concentrar quando estiver vazio Vamos conectar o
sinal pressionado dos botões
fechados à função de fechamento do
menu de inventário. E defina a propriedade visível
do inventário padrão, para que ele seja fechado por padrão. Vamos experimentá-lo.
Ao abrir o menu, o inventário do jogador está vazio e o movimento e o
salto do jogador foram desativados Mas ainda podemos
fechar o inventário com o mesmo botão
usado para abri-lo, que reativa os controles do
jogador. Agora temos um
menu de inventário em nosso jogo que podemos usar para exibir o conteúdo
do inventário do jogador. E na próxima lição,
preencheremos esse menu com os itens
do jogador
e permitiremos que o jogador os selecione
para obter mais
informações sobre eles. Te vejo na próxima aula.
6. Itens: Olá, amigos.
Na lição anterior, adicionamos um
menu de inventário ao nosso jogo. Nesta lição, adicionaremos botões de
itens ao menu de
inventário. Nossos itens
precisarão muito
mais informações do que apenas um nome de exibição, e não queremos que essas
informações sejam vinculadas à cena tridimensional
e ao modelo do item. Já que quando o item estiver
no inventário do jogador, ele não será sorteado em três D, mas sim em dois D dentro do menu do inventário. Podemos agrupar todas
as informações sobre nossos itens em um script de recurso
personalizado Vou colocá-lo na
pasta de recursos
personalizados e criar uma
nova pasta para itens. Vou chamá-lo de item
herdado do recurso. Em seguida, na parte superior do script, atribuiremos a esse script
um item de nome de classe. Aqui podemos exportar todas as variáveis necessárias para descrever o item, como nome e descrição, bem
como uma textura dois D para seu ícone seja desenhado no inventário
do jogador. E também podemos incluir uma cena em
três D do item, mas ainda não precisamos disso
e, se for feito incorretamente,
interromperemos seu projeto Por enquanto,
vamos adicionar um comentário dizendo para incluir isso mais tarde. Salve o script
para que o mecanismo
reconheça o item como
uma classe de recurso. Clicando com o botão direito do mouse na pasta de
novos itens, agora
podemos criar um novo
recurso do tipo item e nomeá-lo com o nome do item.
Vou começar com o At. Exigirei
que cada item do meu jogo tenha um nome
exclusivo e que o arquivo
de recursos desse item também use a grafia exata
desse nome para simplificar O recurso deve
abrir automaticamente no painel do inspetor
ao ser criado Mas se não, ele pode ser aberto
clicando duas vezes nele. Em seguida, podemos visualizar e
editar suas propriedades. um nome
e uma descrição, podemos preencher o ícone
com uma textura de atlas, selecionando o
sprite apropriado na planilha de sprites Vou mudar o corte do
sprite para uma grade de 32 por 32 pixels e selecionar o criarei o recurso do item
de poção
de saúde com um nome, descrição e um ícone Mas eu quero que a
poção de saúde seja empilhável. Podemos usar a herança para dar propriedades
adicionais aos nossos itens Vamos criar outro recurso
personalizado
herdado de um item
chamado empilhável Esse script adicionará
um novo nome de classe, item de extensão
empilhável, e exportará apenas
uma variável adicional, o limite de pilha do item,
cujo padrão será 99 Clicando duas vezes no recurso
Health potent, na
seção Rf count, podemos alterar o
script do qual esse recurso
herda para o
script empilhável Agora podemos definir o limite do tamanho da
pilha. Algumas outras variáveis podem ter seus valores redefinidos
ao fazer isso, e precisaremos
repovoá-las. Em seguida, devemos
abrir as cenas dos itens e editar os scripts de itens antigos
anexados a elas. Esses scripts não
precisam mais de um nome de exibição, mas de uma referência
ao recurso do item. Que podemos então atribuir
no inspetor para cada item. Em seguida, agora que temos um script de inventário
adequado, vamos ao script de progresso, tornar pública a
variável de inventário e mover a função de adição ao inventário para o script de inventário ao
qual ela pertence. Vou renomeá-lo para adicionar item, aceitando um item como
parâmetro em vez de um nó três d e deixando o
parâmetro de quantidade como está De volta ao script de
recursos do Progress, eu gostaria de permitir que
várias cópias
do mesmo item apareçam no inventário
do jogador, que seria um pouco mais
difícil com um dicionário. Então, vou mudar o tipo
da variável de inventário para uma matriz. Mas cada elemento na matriz de
inventário ainda precisa de um identificador,
o nome do item
e, se o item for empilhável, também uma quantidade Portanto, o inventário
será uma série de dicionários com
cada dicionário contendo o nome do item e possivelmente outros detalhes, como quantidade nesse espaço de inventário Qualquer detalhe específico sobre qualquer item que possa ser alterado e precise ser salvo também
precisaria ser incluído como uma entrada no
dicionário. Se o jogador pegar 98 poções de
saúde e dois eixos, o inventário ficará mais ou menos
assim No script de inventário, precisaremos ser capazes de adicionar botões de
itens
ao menu de inventário que representem cada item ou pilha de itens no inventário do
jogador Para isso, precisaremos de um botão de item
pré-fabricado. O que criamos
na lição anterior e salvamos na pasta de cenas da
interface do usuário. Arrastar um
arquivo de cena para um script enquanto mantém pressionada a tecla de
controle ou comando declarará uma constante para
mantê-lo e pré-carregará a cena
com uma chamada de função,
retornando um tipo de cena compactada As constantes são convencionalmente
nomeadas em maiúsculas
e contêm valores que, por
definição, nunca mudam Vamos chamar isso de pré-fabricado. Como ele contém uma planta
para um botão pré-fabricado,
produziremos produziremos Escrevendo uma função
que adicionará um novo botão de item
ao menu de inventário, ela aceitará um item e
uma quantidade como parâmetros. Declarando uma nova variável de
botão de item, instanciaremos uma cópia
do botão pré-fabricado Em seguida, altere a propriedade de textura
dos nós do ícone para o ícone pertencente
a este item. Se a quantidade
for diferente de um, definirei a
propriedade de texto do nó do
rótulo do botão como a quantidade
convertida em um tipo de string. E se for uma, defina sua propriedade visible como false
para ocultá-la. Também precisaremos de uma referência ao nó
do contêiner que
contém os botões. Não precisamos
especificar o tipo de contêiner ou itens, seja uma caixa
vertical ou uma grade, então ele ainda funcionará se
quisermos alterá-lo posteriormente. Depois
que o botão for criado, basta
adicioná-lo ao contêiner para que ele seja desenhado no menu. Quando a cena do jogo for carregada pela primeira vez, precisaremos inicializar o
inventário do jogador para que já esteja preenchido com o conteúdo
dos itens do inventário do jogador Iterando cada item
no inventário do jogador, adicionaremos um novo botão de item ao contêiner para cada entrada Como o valor armazenado
no inventário do jogador é
um nome de string do item, precisaremos
carregar o recurso contendo as informações reais do
item. Arrastar qualquer recurso de item da guia do sistema de arquivos para o script
nos dará um caminho até ele Podemos então substituir
o nome do item
nessa string pelo nome do item
no inventário do
jogador, já que todos são nomeados
exatamente como o nome do item. Se você quiser que vários
itens tenham o mesmo nome, mas propriedades
diferentes
, o valor armazenado
no inventário
precisaria ser um nome de arquivo exclusivo, não o nome de exibição. Também precisaremos da quantidade do item se o item
tiver um valor de quantidade. Caso contrário, podemos simplesmente
assumir a quantidade de um. Isso gerará os
botões para exibir as 98 poções e dois eixos com os quais o jogo
foi instruído a começar Ao adicionar um item ao inventário
do jogador, podemos primeiro determinar se o
item é empilhável ou não, pois o processo
será muito diferente Em seguida, chame
funções privadas separadas para adicionar um item empilhável
ou um único item Adicionando um único item,
basta colocar um novo dicionário na parte de trás
da matriz de
inventário do jogador. Um dicionário contendo
um nome, o nome do item. Em seguida, podemos adicionar um novo
botão de item para esse item. Vamos tornar a quantidade opcional dando a ela o valor
padrão de um. Se o item for empilhável, o processo é muito
mais complicado Primeiro, precisamos
pesquisar o
inventário do jogador para encontrar as
pilhas existentes do mesmo item Verifique se essas pilhas têm espaço para os itens que estão sendo adicionados, verifique se o
limite da pilha foi excedido e repita até que todos
os itens tenham sido adicionados às ou que todas
as pilhas existentes estejam cheias Se
ainda houver itens a serem adicionados, precisaremos criar
novas pilhas para guardá-los. Precisaremos percorrer cada pilha no inventário do
jogador Verificando se o nome
dos itens armazenados no slot I é
igual ao nome desse item. Em seguida, precisamos verificar se
há mais espaço na comparando
a quantidade da pilha com o limite de tamanho
da pilha Então, podemos adicionar a
quantidade à pilha. Em seguida, podemos definir
a quantidade como sendo
a quantidade da pilha menos
o limite do tamanho da pilha, que agora é o
número de itens que estão acima do limite do tamanho da
pilha Portanto, se a quantidade agora
for maior que zero, o limite de tamanho da pilha
foi excedido e podemos definir o
tamanho da pilha Se a quantidade na pilha
não ultrapassar o limite, terminamos e podemos
sair do ciclo quantidade agora contém os itens que
ainda não foram adicionados a uma pilha, e o loop continuará
adicionando itens às pilhas até que a quantidade seja usada
ou todas as pilhas Depois que esse ciclo for concluído, se houver alguma
quantidade restante, precisaremos gerar novas pilhas de
itens para mantê-los. Verificar se a quantidade é
menor ou igual ao limite
da pilha Podemos gerar uma pilha
de tamanhos e quantidades. Em seguida, defina a quantidade para zero. Caso contrário, podemos criar
uma nova pilha completa e reduzir a quantidade pela quantidade
limite da pilha e repetir Adicionando novos botões ao menu de
inventário para
as novas pilhas Sempre que a quantidade de
itens em uma pilha for alterada, precisaremos atualizar a etiqueta
no botão para
corresponder ao novo Então, vamos criar uma nova função
privada que aceita o botão e
a nova quantidade como parâmetros, com
o botão tendo
o mesmo índice de matriz dentro dos contêineres filhos que
o índice de inventário. A quantidade
também precisará ser atualizada antes de
sair do ciclo. Definindo essa função,
aceitando os mesmos parâmetros. Já
escrevemos esse código ao criar nossos
novos botões de item. Vamos mover esse código para nossa nova função e
chamá-lo aqui também. No script do jogador, podemos usar o mesmo método de nome exclusivo para obter uma referência ao inventário do
jogador. Em seguida, ao pressionar
o botão de interação, adicione o recurso anexado
ao item mais próximo do inventário do
jogador. Voltando ao script de
inventário, para exibir as informações dos
itens, também
precisaremos
obter referências aos nós
do nome do item e da
descrição do item. Vamos escrever outra
função que exibe as informações de
um item no lado
direito do painel, aceitando um item
como parâmetro. Dando a ele um
valor padrão de null, também
podemos usar isso para
não mostrar nenhuma informação Definir a propriedade de
texto do nome do item como o nome do item se o
item não for nulo,
caso contrário, uma string vazia e o mesmo para a descrição Sempre que um novo botão de item
é adicionado ao menu, podemos conectar o
sinal de foco inserido a essa função Mas a função requer
um item como argumento e o sinal não
tem argumentos. Podemos vincular argumentos a um
chamável com uma chamada de função, passando o próprio item Por fim, ao abrir
o menu de inventário, se o contêiner
tiver filhos, devemos dizer à
criança superior que se concentre E se não tiver filhos, exiba as informações do item,
passar null é o argumento Vamos experimentar. Começamos com 98 poções de saúde e
dois eixos em nosso inventário, e as informações das poções de saúde se concentraram,
exibindo as
informações exibindo as Depois de pegar os
itens na mesa, uma poção de saúde foi adicionada à pilha de 98,
enchendo-a, enquanto a outra iniciou uma nova pilha junto
com Como os botões têm foco, eles também podem ser navegados com as teclas de seta
do teclado ou com o teclado
direcional do controle Agora temos o
inventário dos jogadores exibido no menu. Na próxima lição, o jogador
poderá soltar ou consumir
itens no inventário. Te vejo na próxima aula.
7. Consumíveis: Olá, amigos.
Na lição anterior, adicionamos itens ao inventário do
jogador e exibimos as informações do item. Nesta lição,
permitiremos que o jogador
derrube ou consuma itens
em seu inventário. No menu de inventário, precisaremos
apresentar ao jogador
as opções de suas opções
para o item selecionado. Para simplificar as coisas, vou ter apenas dois botões abaixo da descrição do item organizados em um contêiner horizontal e renomeá-los como
auxiliar e Removendo as caixas de estilo
substituindo o tema do botão, farei com que o botão
esquerdo diga usar e o direito diga soltar Nem todos os itens do
jogo poderão ser usados, então não faz
sentido que o botão
diga usar quando o machado for selecionado Faria mais sentido
dizer equipar. Esse botão será
sensível ao contexto com base no tipo
de item selecionado. Quero que esses botões
sejam
espaçados uniformemente na
parte inferior do painel Vou definir seu alinhamento
horizontal para alinhar com expandir e preencher Em seguida, redefina também os deslocamentos da
âncora da caixa vertical para mantê-la
contida dentro das âncoras E também diga à
descrição para alinhar com expandir e preencher a
caixa vertical o máximo possível, pressionando os botões na parte inferior
do painel T. Nas configurações do projeto, adicionarei mapeamentos de entrada
para o item Use e o item drop Em seguida, defina o botão x
no controle para uso e o botão Y no
meu controle para soltar. adicionarei esses indicadores de
botão às propriedades de texto
dos botões. Assim, o jogador sabe qual botão do
controle faz o quê. Os jogadores de PC podem simplesmente
clicar nos botões. Eu removeria o texto X ou
Y e provavelmente adicionaria mais caixas de estilo
para esses botões para a exportação do jogo para PC. No script de recursos do item, podemos adicionar uma
variável booleana que especifica se um item é
utilizável
ou não e outra para especificar se o item é
consumido quando Enquanto estivermos aqui,
também precisaremos acessar as três cenas D
contendo o item real, para que, quando o
jogador soltar o item, possamos gerá-lo na cena
ou, se ele usar o item, possamos realmente fazê-lo aparecer
na mão do personagem Não podemos dar à cena em três
D uma referência
ao arquivo de recursos e também dar
ao arquivo de recursos uma referência
à cena em três D. Essa é uma
referência cíclica e criaremos um loop infinito que interrompe
qualquer cena que contenha o item T. Em vez disso, vamos apenas dizer ao recurso do item onde encontrar a cena em três D, dando a ela o caminho até ela como uma string para que possamos
carregá-la quando for necessário. Em seguida, no arquivo de recursos
da poção de saúde, podemos copiar o caminho da cena
da poção de saúde e colá-lo no campo da cena Podemos configurá-lo para ser utilizável
e consumido durante o uso. Não tenho planos
em mente para implementar um item que não seja
consumido quando usado,
mas é uma boa ideia
tornar o código flexível. E repita isso para
o outro item. No script de inventário. Precisaremos obter
uma referência aos botões de ação
usando o complemento pronto. Quando um botão de item está focado e as informações
do item são exibidas, podemos definir a propriedade
de texto do botão auxiliar para dizer se o item está habilitado e definir sua
propriedade desativada como falsa Caso contrário, vou simplesmente
desativar o botão por enquanto. Vamos conectar os
sinais pressionados dos
botões ao script de inventário. Também adicionarei uma
função de entrada que fará com que o sinal
pressionado do botão auxiliar seja emitido quando o
botão de uso do item for Mas somente se o menu de
inventário estiver aberto e o botão estiver ativado. E faça o mesmo se o botão de soltar item for pressionado
no controle. Normalmente, eu não
colocaria uma função de entrada diretamente em um
script como esse, mas para atalhos simples
para pressionar botões, acho que não há problema em pular
a etapa de
usar um script de manipulação de entrada separado Se o botão x
for pressionado usando o controle ou o botão de uso no menu for
clicado com um mouse, essa função será
chamada em ambos os casos Mas precisamos saber
qual item foi selecionado. E também pode ser importante saber qual item específico no
inventário do jogador se ele tiver vários do mesmo item. Sempre que um item captura foco e suas informações
são exibidas, também
aceitaremos
o botão que representa esse item
no menu de inventário Dando a ele um
valor padrão de null, para que seja opcional, também
podemos vincular
esse argumento ao
chamável passando o botão do novo item como Da mesma forma, quando esses
botões perdem o foco, seria uma boa
ideia
não exibir nenhuma informação e
desativar os botões. Vamos também conectar seus sinais de
saída
à mesma função, vinculando null aos argumentos Se nenhum item for selecionado, não poderemos verificar
se ele é utilizável e devemos desativar
os dois botões Declarando novas
variáveis privadas para manter o item selecionado e seu botão
correspondente, podemos armazenar o item selecionado e seu botão quando
ele for selecionado Quando esses
botões de ação capturam o foco, eu gostaria de dizer ao
botão do item que recupere o foco imediatamente para que o jogador sempre saiba qual
item está selecionado. Conectando seus sinais
inseridos focados, que podem chamar
a mesma função. Vamos chamá-lo de acordo com o foco do
botão de ação inserido. Mas quando esses
botões de ação entram em foco, o botão selecionado sai
do foco no mesmo momento O botão selecionado agora é nulo. Vamos declarar outra variável chamada botão
selecionado anteriormente que será definida como o botão
selecionado
toda vez que o valor do
botão selecionado for alterado Então, eu foco as mudanças de um botão de item para
um botão de ação, o botão selecionado
será definido como nulo Mas o botão selecionado anteriormente manterá sua referência, então podemos dizer ao botão
selecionado anteriormente para capturar o foco. Dessa forma, o jogador
ainda poderá ver qual item está selecionado
se clicar nos botões de
ação. Agora, quando qualquer
ação é realizada, podemos acessar facilmente o
botão selecionado, bem
como o item que esse botão representa no inventário do
jogador. Para descartar um item, se
um item for selecionado, podemos primeiro declarar uma
variável para conter uma instância desse item e definir
seu valor para carregar, passando o caminho para
a cena conforme armazenado no arquivo de recursos
do item
e instanciá-lo Em seguida, adicione esse item
à árvore da cena. Você provavelmente desejará que seja filho do nó de nível a ser removido automaticamente junto com o nível quando
for descarregado Para simplificar, vou adicioná-lo ao gerenciador de jogos. Declarando uma variável
para representar uma direção aleatória
ao longo do plano xd, ela será um número aleatório
entre zero e T. To representa
a
circunferência completa de um círculo Em seguida, definiremos a
posição global do item para ficar próxima
à posição
global do personagem do jogador um pouco acima do solo, aplicando seno e
cosseno na direção para obter os valores x e Z da nova Primeiro, vamos
nos certificar de que temos uma referência
ao personagem do jogador
usando um nome exclusivo. E remova o item descartado
do inventário do jogador, passando o item que está sendo removido, quantidade de um e o botão selecionado que
representa o item específico. Se o jogador pressionar o botão de ação
auxiliar, se houver um item selecionado
e esse item puder ser usado, podemos chamar uma função
privada separada para usar o À medida que outros usos do
botão auxiliar se tornam relevantes
, mais funções
podem ser adicionadas aqui Para usar um item. Se o personagem do
jogador estiver no chão e não estiver
ocupado fazendo mais nada, usarei a variável can move, mesmo que esteja
marcada como privada, então podemos dizer ao
personagem que use o item. Se o item for consumido durante o uso, podemos removê-lo
do inventário do jogador, passando o item selecionado, quantidade de um e
seu botão como argumentos. Como vou adicionar
uma animação de item eletrônico ao personagem e
quero que o jogador a veja, fecharei o
inventário do jogador ao solicitar uso de um item
para que possamos
ver a animação se desenrolar Remover um item
do inventário do jogador é quase o mesmo que adicionar um, com o comportamento
sendo diferente para itens empilháveis e itens
individuais Portanto, ao remover um único item,
se o botão não for nulo, podemos prosseguir e remover a entrada de inventário cujo índice corresponde ao índice filho desse
botão na matriz dos filhos dos
contêineres E também remova o botão do item do
menu de inventário e devolva. Farei isso em outra
função privada para também manter o controle
adequado das referências dos
botões selecionados e selecionados
anteriormente. Se o botão não foi fornecido
, precisaremos pesquisar
o inventário
do jogador
para encontrar esse item. Depois de encontrá-lo,
podemos retirá-lo do inventário e
dos
contêineres infantis e devolvê-lo. Antes de remover qualquer botão de item, precisaremos verificar
se esse botão foi selecionado ou selecionado anteriormente. E se sim, defina essas
referências como nulas, para que não tentemos acidentalmente
referenciar botões
que não existem mais Usaremos free aqui
em vez de Q free para tornar o efeito imediato, em vez de esperar pelo final
do quadro atual. Dessa forma, no
caso de precisar
remover várias entradas do inventário do jogador,
os contêineres
infantis ainda
corresponderão aos índices do
inventário Mas removendo esse botão
que atualmente tem foco, precisaremos dizer a um botão
adjacente para capturar o foco. Então, vou chamar uma
função privada para mudar foco para o próximo item
da lista aqui. forma como isso é tratado
dependerá do número de filhos que o
contêiner tem atualmente Se houver
menos de dois filhos, nada
precisará
chamar a atenção e poderemos voltar. Se nenhum botão foi fornecido
como ponto de referência, podemos simplesmente dizer à
criança superior que se concentre. Se um botão foi fornecido, precisaremos saber seu
índice secundário dentro do contêiner. Se o próximo índice for válido, o que significa que é menor que a contagem de
filhos do contêiner, o próximo filho
poderá capturar o foco. Caso contrário, esse é
o último filho
e, em vez disso, queremos que o filho
anterior se concentre. Vamos combinar isso em
uma reafirmação de turno. Podemos então prosseguir
com
a remoção do botão do item agora que
ele não está mais em foco. Remover um item empilhável
será um pouco mais complicado. Se um botão específico
foi fornecido
, podemos obter seu
índice filho dentro do contêiner. Em seguida, remova a quantidade
da pilha no compartimento de inventário
correspondente Se o resultado da subtração for menor ou igual a zero, a pilha
estará vazia Definindo o novo valor da
quantidade o negativo do tamanho
atual da pilha, esse valor agora
conterá a quantidade que a pilha estava aquém
da quantidade que estávamos
tentando remover Assim, podemos remover
a pilha de inventário e o botão que
a representa do menu Se o resultado da subtração
for um número positivo, a pilha não está vazia e precisamos apenas atualizar
seu novo Então volte quando terminarmos. Agora que terminamos de verificar
o botão sugerido, se ainda houver alguma quantidade
para remover, precisaremos pesquisar no inventário do jogador para encontrar
mais pilhas desse item Em seguida, podemos repetir a
mesma lógica acima, usando o alias de índice I em vez do
índice do botão E removendo o botão correspondente cujo índice secundário corresponde ao índice
do inventário. Se chegarmos a uma quantidade
de zero, terminamos. Em uma cena de personagem, selecionando o nó da árvore de animação dentro da máquina de estados diversos Podemos adicionar a animação do
item de uso. Já que, como outras
animações aqui, ela também começa e
termina com o propósito Usando as mesmas
configurações de transição das
outras animações,
definindo o modo avançado
da transição para
a animação como definindo o modo avançado
da transição para
a animação ativado e o
modo de alternância da transição
da animação para final Pressionar o ícone play nos
permitirá
visualizar a animação. No script, vamos adicionar uma nova
função pública para usar um item, aceitando um item
como parâmetro. Para isso,
precisaremos de uma referência à mão principal do personagem, que saibamos onde posicionar
o item que está sendo usado. Essa também será a posição
principal da mão usada para equipar armas. Então, criando uma nova
categoria exportada para equipamentos, vou exportar uma nova variável para o espaço principal
do personagem com um tipo de acessório
ósseo três D. Selecionando o nó raiz do meu
personagem Esse slot principal do
equipamento manual será o mesmo nó de fixação óssea que anteriormente continha
o x de uma mão. Ao usar um item,
declararemos uma nova variável para conter uma instância do item e atribuiremos seu valor como carga Passando o caminho para as
três cenas em D armazenadas
no recurso do item como
argumento e instancie-o. Isso criará o item, que adicionaremos como filho do slot principal do equipamento manual. Mas esse item tem
física e colisões. Ele colidirá
com o personagem e será afetado pela gravidade Precisaremos definir sua propriedade de
congelamento como verdadeira,
para o motor ignore
tudo isso e trate como se estivesse colada
na mão do personagem Em seguida, aguardaremos a conclusão da animação do item de uso Finalmente, colocando a instância
do item na fila para ser liberada da árvore de cena, vamos assumir que a mão
do personagem está vazia
antes que tudo É aqui que os efeitos do
uso do item
seriam ativados, mas vamos apenas
imprimir uma declaração para atuar
como um espaço reservado, para que
saibamos que funciona Pequenas correções no script
de inventário. Só podemos remover o botão do item
sugerido uma vez. Se remover vários itens
únicos
, usaremos null todas as
vezes após o primeiro E ao dizer ao próximo
botão para capturar o foco, não
devemos
defini-lo como nulo imediatamente depois. Vamos experimentá-lo. Abrindo o inventário,
temos 98 poções. Podemos usar um que
fecha o inventário e podemos ver o personagem
segurando uma poção na mão, bebendo e ela desaparecer reabrir o inventário, agora
temos 97 poções e podemos soltar alguns itens, removendo-os
do inventário, que agora estão espalhados pelo
chão ao redor do personagem após
o
fechamento do Podemos até mesmo pegar
os itens novamente e adicioná-los de volta
ao inventário do jogador. Agora temos itens que
podem ser retirados ou usados no menu de inventário do
jogo. Na próxima lição, permitiremos que o jogador equipe
armaduras e Te vejo na próxima aula.
8. Equipamento: Olá, amigos.
Na lição anterior, permitimos que o jogador
usasse ou soltasse itens de seu inventário
por meio do menu. Nesta lição, permitiremos que os jogadores equiparem itens
para seus personagens Cada um de nossos personagens tem vários itens diferentes em
suas mãos, uma capa e um chapéu. Exceto pelo
ladino, cujo capô
infelizmente não está separado do resto do modelo, então não podemos usá-lo como equipamento Tudo isso pode ser transformado em itens seguindo os
métodos usados nas lições
anteriores
que podemos
pegar e adicionar ao inventário do
jogador. Observe que o ladino não
tem um acessório de osso de chapéu e o mago não tem
um acessório de osso fora da mão Podemos corrigir isso adicionando nossos próprios nós de fixação óssea
ao personagem e
anexando-os aos ossos corretos
dentro do esqueleto Na cena do personagem Mags, podemos adicionar um nó filho ao
esqueleto do tipo bone attachment three D e renomeá-lo para
algo Em seguida, no inspetor,
conecte-o ao slot da mão um, seja, à esquerda, e
agora esse nó seguirá automaticamente a mão esquerda do
personagem em todas as animações Arrastando o livro para
esse novo acessório ósseo, podemos ver como ele continua seguindo
a mão esquerda Quaisquer outros itens
destinados a serem mantidos nas mãos
do personagem podem ser
transferidos para os slots do equipamento principal ou externo
antes de serem transformados em suas próprias cenas para manter suas posições
e rotações relativas Em seguida, podemos repetir
esse processo para adicionar um acessório de osso de chapéu para a personagem da fileira
após o osso da cabeça. Também vou reorganizar e renomear os nós para que correspondam exatamente
aos do mago O slot para chapéus Mags
também é diferente
dos outros personagens Ele é posicionado mais alto
e girado ligeiramente. Para facilitar nossa vida, vamos adicionar um novo nódulo de
fixação óssea que segue a cabeça de Majes e, em
vez disso, usá-lo como seu lote de chapéus Arrastar o ativo do chapéu de seu acessório ósseo existente para o novo também nos dará a posição exata e a
diferença de rotação desse chapéu Quando criamos a cena do item do chapéu
Majes, podemos tornar essa posição e rotação uma parte natural dela Usando esses métodos, todos os nossos personagens devem ter os
mesmos quatro slots de equipamento, e qualquer item pode ser
equipado com qualquer personagem. Os slots do equipamento podem ser
renomeados para fins de consistência,
se você preferir, e os três nós N de
fixação óssea não utilizados podem ser excluídos das cenas
dos personagens Mas o cabelo de alguns
dos personagens vai passar por
alguns dos chapéus Em alguns jogos, você notará
que o cabelo
do personagem é removido quando um capacete ou chapéu é equipado para
corrigir esse problema Nesses ativos, o cabelo
faz parte do modelo da cabeça, então precisaremos restringir quem pode usar qual chapéu, escalar ou reposicionar o chapéu dependendo de quem o está usando, ou simplesmente ignorar o problema Especialmente ao usar ativos de
espaço reservado, é melhor observar
as limitações
e garantir que
os
ativos de as limitações
e garantir que produção finais resolvam os problemas em vez
de replicá-los Antes de criarmos qualquer
novo recurso de item, vamos definir um novo
tipo de recurso de item. Vamos chamá-lo de equipamento,
herdado do item. Isso nos permitirá
adicionar uma nova variável aos itens que se enquadram nessa
categoria, o tipo de equipamento
que é, que determinará
como ele pode ser equipado. Nas enumerações de nossos projetos, podemos adicionar uma lista enumerada dos diferentes
slots
de equipamento para nosso jogo, mão
principal, mão livre, cabeça
e costas, bem como quaisquer A
enumeração do tipo de equipamento agora pode ser usada como um tipo para a variável do tipo de
equipamento, que possamos
configurá-la facilmente no Trocando o script
do eixo do item para o equipamento. Ele pode ser configurado para ser um equipamento para o espaço da mão
principal do personagem. No
script do personagem, podemos adicionar mais variáveis para
cada slot de equipamento ou
transformar a variável em uma matriz de acessórios
ósseos chamados soquetes. Ao usar um item, a
mão principal agora é o soquete zero. Em seguida, atribua cada soquete de
fixação óssea na mesma ordem na
matriz para cada caractere Em seguida, podemos adicionar novas funções
públicas para mandar o personagem fazer ou
fazer peças de equipamento. colocação de um equipamento exigirá uma
referência ao item,
e a retirada
exigirá apenas a Para D, um equipamento
é quase o mesmo instanciar a poção e colocá-la na mão do
personagem Substituindo o soquete
manual principal por qualquer soquete para o qual
o item se destina doping exige apenas que
verifiquemos se o
soquete tem um filho
e, em caso afirmativo, nos livremos dele Usando um item, não podemos mais presumir que
suas mãos estão vazias. Vamos declarar uma nova
variável para conter o que
o personagem estava segurando antes de ser instruído a usar o item Se a
tomada principal tiver um filho, então é isso que
eles estavam segurando, e devemos definir
sua propriedade de visibilidade quedas
para ocultá-la
quando eles usarem o item Se eles estavam segurando algo
antes de usar o item
, podemos definir sua propriedade
visible novamente como verdadeira após a conclusão do uso do
item. No recurso de progresso, precisamos acompanhar tudo o que o
jogador tem equipado. Uma maneira simples de
referenciar itens dentro do inventário seria
usar seu índice de matriz Portanto, o equipamento do nosso jogador é
uma matriz de números inteiros com cada elemento na
matriz contendo o índice da matriz do equipamento
no inventário do jogador padrão o conteúdo
da matriz para menos
um para cada entrada, podemos usar menos um como um significante de que o
slot Agora, conecte tudo isso
ao menu de inventário. Quando o botão de um item está focado, estamos exibindo
suas informações, mas precisaremos criar casos
separados para quando esse
for um equipamento. Em seguida, divida ainda mais com base em se este item está atualmente
equipado ou não. Em ambos os casos, o botão
auxiliar está ativado, mas o botão suspenso deve ser desativado se o
item estiver equipado Alterar o botão auxiliar para equipar ou equipar Como sabemos se o item
selecionado está equipado? Precisamos saber seu índice
nos filhos dos contêineres, pois esse é o
número salvo
na matriz de equipamentos
do recurso de progresso. Então, podemos verificar se a matriz de
equipamentos no índice
do slot
designado dos itens selecionados corresponde a esse valor e
retornar verdadeiro ou falso? Tudo isso pode ser feito em
uma única linha de código. desativação ou não do
botão
suspenso também precisará ser tratada
para os
itens consumíveis e os itens consumíveis e Quando o
botão auxiliar é pressionado, se o
item selecionado for um equipamento, podemos usar a
mesma condição para desequipar ou
equipar Para equipar um item,
definiremos a matriz de equipamentos no recurso de
progresso no índice do slot
do item o índice da matriz
do item no inventário do
jogador Em seguida, diga
ao personagem que faça o equipamento. Vou reutilizar o
rótulo do item mas definindo seu texto
padrão como E maiúsculo para equipamento
e definindo sua propriedade visível como
ao equipá-lo e definindo sua propriedade visível como
ao equipá-lo Também atualizarei o texto dos botões
auxiliares e desativarei o botão suspenso Para desequipar um item, definiremos a matriz de
equipamentos no índice
do
slot do item para menos um, já que agora está vazia, dizendo ao personagem
que faça o que tiver no Oculte o E para equipado
no botão, coloque a data no texto dos botões auxiliares e ative o botão de soltar Mas antes de equipar um item, precisaremos verificar se um item já
está equipado
nesse slot, o que
significa que o valor da
matriz de equipamentos no índice
do slot do item é qualquer coisa
diferente de negativo Nesse caso, devemos dizer ao personagem que faça o
que ele tem naquele soquete Em seguida, encontre também o
botão no contêiner cujo índice corresponde ao valor
da matriz do equipamento, para que possamos ocultar o
E de equipado. Podemos então prosseguir com o
equipamento do item selecionado. Para
que isso funcione, os valores na matriz de equipamentos devem sempre corresponder aos índices da matriz dos itens no inventário do
jogador Mas os índices da matriz mudam toda vez que um
botão de item é removido Vamos exigir o
índice da matriz como parâmetro ao remover os botões do item do menu
de inventário,
já que, de qualquer forma, já descobrimos
isso todas as vezes. Em seguida, podemos pesquisar
na matriz de equipamentos quaisquer valores
maiores que o índice do
item que está sendo removido. Se houver, eles
podem ser reduzidos em um, para que ainda correspondam ao
índice do item equipado. Em meu recurso de progresso, começarei o jogador
com vários itens novos em seu inventário e
também terei alguns deles. Depois de inicializar
o inventário do jogador pela primeira vez, também
podemos percorrer
a matriz de equipamentos Se o slot do equipamento for
diferente de um negativo, podemos encontrar o botão cujo índice corresponde
ao valor armazenado aqui. Para simplificar as coisas, usarei
apenas as funções existentes, com que o botão capture foco e equipando
o item selecionado Agora, quando o inventário
é inicializado, o jogador também está equipado
com os itens armazenados em seu arquivo. Vamos experimentá-lo. O personagem
começa equipado com alguns itens e, abrindo o inventário, temos
vários para escolher. Podemos desequipar itens,
equipar novos. Se tentarmos equipar um
item em um espaço ocupado, o item equipado
não estará equipado antes Se bebermos uma poção, o item principal da mão do
personagem fica escondido durante a animação e volta
depois que ele termina Agora temos itens
sendo equipados para o personagem do jogador
por meio do menu de inventário. Na próxima lição, permitiremos que o jogador troque
itens com um NPC Te vejo na próxima aula.
9. Loja: Olá, amigos.
Na lição anterior, permitimos que o jogador
equipasse itens do menu Nesta lição, faremos com que eles comprem e vendam itens de um NPC Para economizar tempo, vou reutilizar
o mesmo menu de inventário
para criar a loja Vou renomear o contêiner vertical da
caixa para info e duplicá-lo para criar outro controle com as
mesmas âncoras e tamanho,
e renomeá-lo Em vez do
nome e da descrição do item, a loja conterá
um contêiner de rolagem, contendo um
contêiner de grade com o
estoque da loja , assim como aquele que
contém os itens do jogador. O contêiner de rolagem
pode preencher o espaço, pressionando os botões
até a parte inferior No lugar do botão
auxiliar, terei um ícone de moeda, o preço do item
atualmente selecionado e um botão de
transação sensível ao contexto para comprar ou vender o item
selecionado O ícone da moeda pode manter
sua proporção, mas cabe proporcionalmente
no espaço fornecido Vou descobrir a
quantidade máxima de espaço que o preço
poderia ocupar e
usá-la como tamanho mínimo personalizado. Em seguida, o botão pode usar o
restante do espaço. Também adicionarei 32 pixels de separação entre esses
três controles no contêiner
da caixa horizontal e alterarei a propriedade
de texto da transação para dizer. Vamos encher o estoque da loja com um monte de itens fictícios
para ver como fica As colunas da grade devem
caber perfeitamente no espaço. Para alternar entre a
visualização do inventário e a visualização da loja, tudo o que precisamos fazer é alternar a visibilidade entre
as informações e os nós da loja, e também podemos alterar
o título Quando estiver satisfeito com
o layout da loja menos, você pode excluir os
itens fictícios do estoque da loja No script,
precisarei atualizar o caminho do nó para o
nó de informações para refletir seu novo nome. Precisaremos de referências
ao título, informações e aos nós
da loja, para que possamos trocá-los
,
além do contêiner que
conterá o estoque da loja, etiqueta de preço e
o botão de transação Nosso script de inventário está
ficando um pouco grande. Uma forma útil de
manter scripts mais longos organizados é criar
regiões de código usando comentários. Com um comentário sobre a região acima,
um bloco de código nomeando a região e um comentário sobre a região
final na parte inferior da região A região pode ser reduzida e expandida para melhor
organizar o roteiro Vamos adicionar uma nova função
pública que abre o
menu de inventário como uma loja. Alteraremos o título para dizer
loja em vez de inventário, definiremos a propriedade visível
da visualização de informações como falsa e a visibilidade
da visualização da loja como verdadeira. Podemos então chamar nossa função aberta
existente para também fazer o resto
dessas outras coisas. Também precisaremos
criar uma função para abrir o menu no modo inventário, redefinindo o título
para o inventário e revertendo a visibilidade das informações e
dos nós da loja O gerente do jogo
abrirá o menu como inventário quando o
botão de inventário for pressionado. Usando o sistema
de gerenciamento de eventos que construímos no curso anterior, podemos anexar um nó D da
área três a qualquer personagem em nossa
cena de nível e renomeá-lo para loja Adicionando uma forma de colisão
três D quando criança, podemos atribuir a ela um tamanho
e uma forma fáceis para o jogador mirar
com a reformulação do Interact A área três D não
precisará
monitorar nada,
mas ser monitorável existente na
camada de colisão especificamente para interações e não
terá máscara de colisão Para obter mais informações
sobre eventos de interação, consulte o curso anterior sobre diálogos
e eventos. Vamos criar um novo
script para esse nó, salvo na pasta de
scripts de eventos. Herdando do evento de
interação. Nesse script, podemos
exportar uma matriz de itens para representar o estoque de itens que estão disponíveis para compra. Como qualquer script de evento, escreveremos uma função run
event, aceitando o
gerenciador de eventos como um parâmetro, que contém todas
as referências de objetos nossos eventos podem precisar
para realizar seu trabalho. Nesse caso, o gerente do evento
precisará de uma referência
ao inventário do jogador e à loja se você estiver usando
um menu separado para isso. Isso também permitirá que o
gerente do evento adicione ou remova itens do inventário do
jogador durante eventos ou
diálogos, se necessário. O script da loja pode então pedir
ao gerente do evento que
abra o menu da loja. Passar uma referência para
si mesmo é um argumento, então o inventário
terá acesso
ao estoque e a quaisquer outras
variáveis públicas que você queira. Vamos dar a isso um nome de
classe de loja, para que o script de inventário
possa aceitar uma loja como parâmetro ao abrir
o menu como uma loja. Para usar o comando await
durante o evento, nossa função open as shop também precisa retornar
um sinal de espera Aceitando a loja
como parâmetro, podemos armazenar uma referência a ela
ao abrir o menu de
inventário como uma loja. O sinal retornado será quando o menu de inventário for fechado. Podemos emitir esse sinal
sempre que a janela estiver fechada, mesmo que ninguém esteja
ouvindo,
quando o menu é aberto como inventário
do jogador Para tornar nossas lojas mais exclusivas, vamos também exportar uma linha de
diálogo para o fornecedor como introdução e outra
como encerramento Em seguida, adicione-os à função de
execução do evento como diálogo
extra antes e
depois do acesso à loja. E diga ao gerente do jogo
que encerre o evento. Podemos até mesmo exportar um multiplicador de
valor chamado markup para oferecer a diferentes fornecedores preços
diferentes preços
diferentes Vou definir a marcação padrão
para ser dez vezes o valor. Vamos preencher a
loja noturna para
incluir a poção de saúde e o A, bem como uma linha de diálogo de
introdução e encerramento. Em nosso recurso personalizado de itens, podemos atribuir a cada item
um valor inteiro com o
valor padrão de uma moeda Cada item no jogo pode então receber um valor
diferente,
que, nesse caso, será por
quanto o jogador pode
vender um item. Mas compraremos por
dez vezes esse preço. De volta ao script de inventário, também
seria útil
exibir as moedas do jogador. Vamos fazer disso um
nó único e pegá-lo também. Podemos abrir o balcão da carteira quando o inventário é aberto e pedir que ele permaneça aberto
passando por true como argumento. Em seguida, peça para fechar quando
o inventário estiver fechado. Ao contrário do
inventário do jogador, onde inicializamos os
muitos botões ao carregar
, adicionamos ou removemos botões à medida itens são adicionados ou
removidos do O estoque da loja precisará ser gerado toda vez que o jogador
interagir com o fornecedor e totalmente eliminado
quando terminar Limpar o estoque é
bastante simples, basta percorrer
cada um dos filhos do contêiner de estoque e colocá-los
na
fila para serem liberados da contêiner de estoque e colocá-los
na árvore de Também podemos definir a loja como nula aqui ou na função
fechada Podemos liberar o estoque sempre que o menu de inventário for fechado Se o menu de inventário foi aberto como inventor e
não como loja, o conteúdo do estoque da loja
ficará vazio de qualquer maneira Gerar o estoque é
praticamente o mesmo processo gerar o inventário
inicial do jogador, percorrer cada item
na matriz de estoque da loja e, em
seguida, chamar o botão de adicionar item Mas precisaremos de um novo argumento para especificar em qual contêiner o
botão está sendo adicionado. Em seguida, adicione o parâmetro à
função para corresponder, dando a ele um valor padrão
do contêiner de itens do jogador. Essas informações de em qual
contêiner esse botão está também
serão relevantes ao exibir as informações dos
itens, bem
como quando o botão de
transação for pressionado. Podemos armazenar essas informações
dentro dos metadados dos nós. Vamos adicionar uma nova entrada aos metadados
do nosso botão
recém-criado, com o nome no inventário, com o valor de se
o contêiner ao qual está sendo adicionado é igual ao contêiner de itens do
jogador Agora, cada botão sabe que lado do menu da
loja está. Ao exibir as informações de um
item, se houver um botão selecionado, podemos obter seus metadados usando o mesmo identificador que
está no inventário Se o item estiver no inventário do
jogador
, podemos definir a
etiqueta de preço com o valor
do item e definir a propriedade de texto do botão de
transação como x vender. Para simplificar as coisas, não
permitirei que o jogador
venda nenhum item que tenha equipado e, nesse caso, desabilitarei o botão de
transação. Se o item estiver no estoque
da loja, texto do preço será valor
do item multiplicado
pela margem de lucro da loja E o
texto dos botões de transação foi alterado para x by. A desativação ou não do botão
dependerá de as moedas
atuais do jogador serem menores que o preço. Ao verificar se o item
selecionado está equipado, vamos verificar se
há um item selecionado e se ele também é um
equipamento. Na função de entrada, se a variável shop não
for nula, podemos retornar para evitar que as
funções de usar item ou descartar item sejam verificadas Se o
botão de uso do item for pressionado, o que estamos reutilizando aqui para acionar a ação de compra
ou venda, desde que o
botão de transação não esteja desativado, podemos emitir Conectando o sinal
pressionado do botão de
transação ao script, vou movê-lo para
a região da loja. Se nenhum item for selecionado ou nenhuma loja estiver
sendo interagida no momento
, podemos simplesmente devolver Se o botão selecionado estiver
no inventário do jogador
, o botão de transação
venderá o item atualmente
selecionado. Aumentar as moedas do jogador
pelo valor do item e removê-las
do inventário do jogador. Caso contrário, o botão selecionado deve estar no estoque da loja, o que significa que o
botão de transação vai comprá-lo, reduzindo as
moedas do jogador pelo valor
do item multiplicado
pela margem de lucro da loja, adicionando o item ao inventário do
jogador e verificando novamente se
o botão de compra
deve ou não ser Uma pequena correção ao
atualizar a quantidade em um botão precisará definir sua propriedade
visible como verdadeira. No script de progresso. Vou começar o jogador
com algum dinheiro. Também vou ignorar o aviso de conversão de
asa estreita gerado ao converter esse
flutuador em um número inteiro Lembre-se de que o
menu de inventário deve começar a ser fechado. Vamos experimentá-lo. Falando com a noite,
somos recebidos com uma linha de diálogo
antes da abertura da loja, que também exibe nossas moedas. O botão de transação exibe vender ao selecionar nossos itens. Mas ele é desativado quando o item
selecionado está equipado. Podemos vender itens
do nosso estoque, o que nos dá mais ouro. O
botão de transação exibe comprar ao selecionar os itens de estoque da
loja, mas é desativado quando
não temos dinheiro suficiente
para comprar o item. Podemos comprar itens
do fornecedor gastando nosso ouro. E quando fechamos a loja
agora, a noite nos agradece. Agora temos uma loja em
nosso jogo para que o jogador possa comprar e vender
itens de um NPC
10. O que vem a seguir?: Olá, amigos. Antes de
começarmos, você deve ter um projeto com um personagem de jogador que possa se mover em um ambiente e alguns inimigos
para ele lutar. Você também pode querer
ter um menu de inventário capaz de equipar itens, incluindo pelo menos
uma arma mala, uma arma arranjada e
um escudo Ao longo deste curso,
adicionaremos controles, mecânicas e animações ao nosso projeto
para fixar um alvo,
atacar, esquivar, bloquear e disparar projéteis atacar, esquivar, bloquear