Inventário e lojas em Godot! | Thomas Yanuziello | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


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

Inventário e lojas em Godot!

teacher avatar Thomas Yanuziello, Indie Game Developer

Assista a este curso e milhares de outros

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

Assista a este curso e milhares de outros

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

Aulas neste curso

    • 1.

      Vídeo promocional

      1:38

    • 2.

      Moedas

      14:38

    • 3.

      Língua polonesa

      16:41

    • 4.

      Pick Up

      17:39

    • 5.

      Inventário

      15:34

    • 6.

      Itens

      15:21

    • 7.

      Consumíveis

      17:32

    • 8.

      Equipamento

      12:11

    • 9.

      Loja

      13:43

    • 10.

      O que vem a seguir?

      0:32

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

Gerado pela comunidade

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

22

Estudantes

--

Projeto

Sobre este curso

Este curso é uma continuação dos fundamentos do desenvolvimento de jogos em Godot.

Clique no link do meu site no meu perfil para participar do nosso servidor de discord!

Neste curso, vamos abordar diferentes métodos de coleta de itens, gerenciamento de dados de inventário do jogador, exibição de seu inventário na interface do usuário em um menu, permitindo que o jogador interaja com seu inventário de diferentes maneiras e negociação de itens com NPCs.

Você também vai aprender habilidades úteis para trabalhar com o motor de jogo Godot, organizar e projetar seus projetos para serem mais escaláveis.  Você vai aprender como codificar com GDscript, com tudo explicado em detalhes.  Nossos scripts serão escritos para serem altamente personalizáveis e reutilizáveis.  Todos os arquivos do projeto também estarão disponíveis no GitHub se você precisar revisar o projeto como estava depois de concluir cada aula.  Esses vídeos foram gravados usando a versão Godot 4.2.2.

Este curso vai fazer parte de uma série projetada para ensinar pedaços de desenvolvimento de jogos do tamanho de uma mordida que podem ser usados ​​de forma intercambiável uns com os outros.  Então, deixe-me saber quais tipos de jogos você é interessante em aprender como fazer e vou tentar incluí-los em futuros cursos desta série.

Conheça seu professor

Teacher Profile Image

Thomas Yanuziello

Indie Game Developer

Professor
Level: All Levels

Nota do curso

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

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

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

Transcrições

1. 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