Crie e crie um jogo de tiro emocionante em trilho em Unity | Romi Fauzi | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


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

Crie e crie um jogo de tiro emocionante em trilho em Unity

teacher avatar Romi Fauzi, Game Developer, 3D Artist & VFX Artist

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.

      Introdução ao curso

      1:05

    • 2.

      01 configuração do projeto

      6:06

    • 3.

      02 modelagem do ambiente

      7:34

    • 4.

      03 Movimento do caminho da câmera

      13:44

    • 5.

      04 Como criar o ponto de saída

      13:54

    • 6.

      05 Mecanismo básico de disparo

      10:43

    • 7.

      06 Configuração inicial do inimigo

      20:46

    • 8.

      07 preparações de animações inimigas

      12:00

    • 9.

      08 scripts de animações inimigas

      15:33

    • 10.

      09 Correção e animação de acerto do movimento inimigo

      11:39

    • 11.

      10 efeitos de sucesso básicos

      11:02

    • 12.

      11 efeitos de acertos inimigos

      4:18

    • 13.

      12 adereços explosivos

      17:30

    • 14.

      13 Arma personalizada

      19:30

    • 15.

      14 recolhimento de arma

      4:44

    • 16.

      15 FX de arma

      9:33

    • 17.

      16 extensões de ação de atraso

      5:48

    • 18.

      17 estados do gerente de jogo

      7:59

    • 19.

      18 pontuação e vidas do gerente de jogo

      6:10

    • 20.

      19 Visual de captação de arma

      6:50

    • 21.

      20 sistema de ataque inimigo

      12:07

    • 22.

      21 Visual de ataque inimigo

      13:26

    • 23.

      FX de dano de 22 jogadores

      11:22

    • 24.

      23 configuração de refém

      16:50

    • 25.

      24 configuração do temporizador de área

      16:51

    • 26.

      25 estatística de jogo

      4:24

    • 27.

      26 Barra de saúde da interface do usuário

      8:41

    • 28.

      27 HUD de arma de interface

      14:06

    • 29.

      28 Temporizador de interface

      6:50

    • 30.

      29 refém da interface do usuário morto

      19:35

    • 31.

      30 tela de introdução e final da interface

      21:01

    • 32.

      31 correções de erros parte 1

      10:06

    • 33.

      32 urso personalizado

      3:57

    • 34.

      Desenvolvimento de 33 olhares

      14:48

    • 35.

      34 Correção da parte superior do corpo do inimigo

      4:58

    • 36.

      35 Configuração de biblioteca de áudio

      8:40

    • 37.

      36 Configuração de jogador de áudio

      18:26

    • 38.

      37 Editor personalizado de audio Getter

      12:56

    • 39.

      38 Como otimizar o fluxo de trabalho de áudio

      6:04

    • 40.

      39 Como aplicar FX de som

      14:10

    • 41.

      Correção de bug de 40 tiros

      6:05

    • 42.

      41 Avaliação de posição

      12:41

    • 43.

      42 Configuração de volume e parada

      17:32

    • 44.

      43 configuração inoperante do jogador

      6:18

    • 45.

      44 Cena de menu de titulo

      17:51

    • 46.

      45 Menu de Title continuado

      10:52

    • 47.

      46 Crie o jogo!

      13:28

    • 48.

      47 Resolução de bug com área limpa

      7:18

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

21

Estudantes

--

Projeto

Sobre este curso

Pronto para aprender como criar um emocionante jogo de tiro em trilho que vai manter os jogadores engajados por horas? Junte-se a nós neste curso emocionante, onde vamos ensinar você a criar um jogo semelhante a Virtua Cop e Casa dos Mortos desde o início usando Unity.

Ao longo do curso, você vai aprender sobre programação orientada a objetos e obter uma melhor compreensão da API C# da Unity. Vamos mostrar como baixar todos os ativos que você precisa para o projeto gratuitamente na loja de ativos Unity e forneceremos links para esses ativos nas palestras.

Mas isso é apenas o começo. Vamos nos aprofundar em conceitos avançados como Herança e InterfaceEventos para acoplamento solto, trajetória do caminho para movimento da câmera e pós-processamento para aprimorar o apelo visual do seu jogo.

Este curso é destinado a estudantes de nível intermediário com um conhecimento básico da API C# da Unity, mas qualquer pessoa que queira aprender como fazer jogos é bem-vinda para participar. Quer você seja um desenvolvedor de jogos indie, um profissional experiente ou apenas um entusiasta de jogos que quer aprender mais sobre desenvolvimento de jogos, este curso é para você.

Então, por que esperar? Inscreva-se agora e aprenda como criar um jogo de tiro em trilho que vai ter os jogadores voltando para mais!

O que eles dizem sobre este curso:

Andrew Newman - "Na metade do caminho, e estou muito feliz em trabalhar junto com este tutorial e tenho visto a consistência 1:1 entre o que está sendo ensinado e o que sou capaz de criar. Estou ansioso para terminar em breve!"

Brian Cole - "Excelente curso. Muitas novas ideias e dicas que você não vê em um curso para iniciantes, por exemplo, extensões. Gosto especialmente da maneira muito flexível que ele implementa o sistema de áudio."

Michael - "Excelente. Segundo curso que fiz com o excelente instrutor."

O que você vai aprender

  • Crie um jogo de tiro completo semelhante ao Virtua Cop e à Casa dos mortos usando o Unity
  • Programação orientada a objetos (herança e interface)
  • Como usar eventos para comunicação entre scripts
  • Objeto scriptable para criar dados de arma personalizados
  • Definir um caminho para o movimento da câmera
  • Uso de pós-processamento para aprimorar a aparência do jogo
  • Configurações do gerenciador de áudio e do mixer

A quem se destina este curso:

  • Desenvolvedor de unidade intermediário

Requisitos

  • Unity 3D instalado em seu PC (versão 2019 preferível)
  • Uma forte vontade de aprender o desenvolvimento de jogos
  • Compreensão básica da API Unity C#

Conheça seu professor

Teacher Profile Image

Romi Fauzi

Game Developer, 3D Artist & VFX Artist

Professor

Hi there, I'm Romi, a self taught 3d artist and game developer with more than 10 years of experiences in the industry.

Visualizar o perfil completo

Level: Intermediate

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. Introdução ao curso: Oi Bem-vindo a este curso da Unity. Sou Rome Faze e sou desenvolvedora de jogos e artista de tratados há muitos anos Eu ensinei para mais de 9.000 estudantes como desenvolver jogos em Unity Neste curso, desenvolveremos um jogo de tiro ferroviário semelhante à série Fear Talk Op ou House of the Death Com mais de 7 horas de conteúdo, este será um curso completo com um jogo totalmente finalizado e polido no final do curso Vou abordar as melhores práticas de desenvolvimento de jogos em Unity, incluindo programação orientada a objetos, como herança e interface, eventos para comunicação de scripts e dois pós-processamento para aprimorar a aparência do Para esses projetos, vou usar o Unity 2019 0.2, mas qualquer versão de 2018 deve estar bem. Então, se você é um desenvolvedor Unity e está aprimorando suas habilidades, você se divertirá muito neste curso Então, inscreva-se hoje e vamos aprender juntos. 2. 01 configuração do projeto: Ok, então vamos criar um novo projeto. Eu lancei o Unity Hub e, em seguida, sob o novo botão , pressionarei o botão suspenso aqui e escolherei a versão mais recente que instalei no meu PC, que é 2019 0.2. Você pode usar este ou os anteriores, deve estar bem. E então, quando houver, crie um novo projeto. Janela, vou selecionar os três projetos D e navegar pela localização. E vou chamar esse projeto virtual de estilo Cp. OK. Então, vou pressionar criar e isso iniciará a unidade. E aqui vamos importar alguns ativos básicos que precisaremos usar para criar esse projeto. Agora, então o projeto já está aberto. Vou até a guia de iluminação e, se você não tiver isso, basta ir até a janela e, basta ir até a janela e em renderização, abrir as configurações de iluminação Aqui, vou desabilitar a caixa de seleção de geração automática, para que ela não gere o GI o tempo todo E queremos gerar mais tarde uma vez que já tenhamos configurado a cena. A próxima coisa que precisamos importar é o construtor profissional, e podemos importá-lo do gerenciador de pacotes. É gratuito no Unity. Portanto, esse tipo de construtor profissional e, se verificarmos o pacote show preview, ele começará a carregar o pacote. Depois de carregado, podemos instalá-lo. Aí está. Aqui temos o Pro Builder e, em seguida, basta instalá-lo. Agora temos o Pbiler instalado. Você pode ver que a mudança instantânea para um botão de remoção. Isso significa que já instalamos isso. A próxima coisa que precisamos instalar é o pacote pro grid. Vamos apenas digitar O, são os pacotes de carregamento. Vou digitar a grade. Pronto, instale isso e isso facilitará o encaixe no Unity usando as grades profissionais Agora, temos o progresso instalado e a próxima coisa que precisamos instalar é o pós-processamento. Basta digitar post e você verá que temos pós-processamento, instale isso. Temos o pós-processamento instalado e agora queremos fechá-lo Vamos até a loja de ativos e importaremos algumas coisas da loja de ativos. Eu abri a aba da loja de ativos aqui. Está um pouco atrasado atualmente. Agora vamos abrir a guia da loja de ativos e, se você não tiver isso, basta ir até a janela e pressionar a loja de ativos. Depois de carregado, queremos importar o robô espacial. Digite novamente, robô espacial. Aqui, queremos baixar este. Vamos usar isso para o inimigo. Em seguida, o pacote de partículas da unidade. Basta digitar pacote de partículas e você verá que, acho que este é o mais recente Vamos selecionar esse aqui. Depois, há uma atualização, então eu preciso atualizar esse versículo. Vou pausar o vídeo e continuar quando terminarmos de baixá-lo Agora o download foi concluído e eu vou importar isso. Pressione importar porque ainda não definimos nenhuma configuração de projeto. Este é um projeto novo, então deve ficar bem. Vamos apenas instalar e atualizar as dependências do gerenciador de pacotes Agora basta importar isso e ficaremos bem. Agora vamos finalizar o download. Ele importa algumas coisas também, como o Tex Mash pro, e também podemos usar isso, então é bom Agora, os outros ativos que precisamos baixar são o criador do caminho. Isso foi criado por Sebastian leg. Desculpe se eu pronunciei o nome incorretamente, mas isso é muito poderoso e é gratuito para criar um caminho Podemos usar esse caminho como o movimento para o jogador se mover e a câmera se mover Vamos fazer o download e depois importar. Concluímos a importação do caminho crea e agora vamos criar uma nova pasta e chamar esse jogo Desculpe, vou renomear isso, então está no topo com sublinhado Vou colocar todos os recursos do jogo, como os efeitos da partícula, Robert Kyle, criador de Pat, e essas três pastas dentro da pasta do Está arrumado, não está disperso, e também podemos direcionar as cenas para esta pasta do jogo aqui Agora que já importamos os ativos de que precisamos. Vou criar uma nova pasta e vamos chamar isso de textura. Ok, a seguir, vamos importar o mapa que eu criei aqui e também a textura da grade para o projeto aqui. Basta cortar isso aqui e depois direcionar para o preenchedor de textura Aí está. Isso conclui nosso vídeo de configuração do projeto 3. 02 modelagem do ambiente: Então, agora que as cenas de amostra estão abertas, vamos criar primeiro o guia para nossa cena. Para criar o guia, queremos criar um novo objeto plano. E isso deve ter dez grades de largura, eu acho, mas aparentemente é maior Vamos apenas, são dez. É dez por dez, mas queremos aumentar o tamanho dz para 1,3, então é então e eu vou definir o encaixe para a metade, depois voltar para um e definir a posição y também para zero Agora que temos esse plano aqui, podemos criar um novo material. Vamos apenas criar uma nova pasta de materiais. Nas pastas de materiais, vamos criar um novo material. Esse será o nosso cara e, para o guia, queremos definir a textura do albedo como a textura do mapa que importamos e, em seguida, direcionar esse material Agora temos uma representação correta do nosso C aqui. A vareta é de 13 unidades por dez unidades. Agora vamos criar uma nova forma a partir do construtor profissional. Se você não tiver essa janela aqui, basta acessar as ferramentas do construtor profissional e pressionar a janela provável Por padrão, ele estará flutuando assim, e podemos arrastar o nome da guia e colocá-la ao lado do painel do projeto. Agora que temos isso e também quando instalamos o progrit, ele mostrará as configurações do progrid aqui, e podemos desativar ou ativar o Também podemos alterar o valor do incremento de encaixe usando o sinal negativo e positivo no teclado Vou definir esse 21 primeiro, mas se precisarmos disso, também podemos diminuí-lo. A próxima coisa que queremos fazer é criar uma nova forma. Pressione mais ao lado do botão de nova forma aqui, e teremos isso, e agora queremos criar essa caixa primeiro aqui. É quatro por dois, e vamos definir isso como quatro. Não, desculpe, eu deveria ter dois no x e quatro no z. Vamos definir isso para três no y. Então é alto, é uma parede, e então pressione construir. Agora podemos posicionar isso e depois mover isso para cima. Aí está. A próxima coisa que queremos criar é outro cubo aqui Podemos definir isso no z, mas aqui temos um, dois, três, quatro, cinco, seis, deve ser seis no z xs Vamos posicionar isso aqui e depois mover isso para cima. Aí está. Agora precisamos criar outra forma, deve ser três no eixo x e também seis no eixo z, e pressionando build, podemos inserir esse objeto aqui e reposicionar adequadamente Como você pode ver, eu contei mal as grades aqui, está tudo bem Como provedor, podemos modificar o objeto aqui selecionando o subobjeto na Então aqui está o vértice, e este é a borda, e esta é a fase No vértice, você pode selecionar os vértices e, em seguida, movê-los. Você pode modificá-lo. O mapeamento UV se adaptará, não se estenderá, se expandirá Então, isso é bom para criar o nível. Vou usar essa seleção de fase e selecionar essa fase aqui e, em seguida, movê-la uma grade para o lado. Está em conformidade com nosso guia de mapas. Agora, quando já estivermos satisfeitos com o tamanho, podemos voltar à seleção de objetos no modo objeto e agora vamos criar outra forma E isso estará no x, quantos são esses? Precisamos contar isso. Um, dois, três, quatro, cinco , seis, sete, deve ser sete no x xs e depois no z xs. Sim. Agora vou reposicionar isso e depois mover isso para cima. Precisamos criar mais três paredes aqui. Vamos apenas criar novas formas. Este sapato deve estar no x e um no z. E então mova-o para cima e pressione construir Vamos criar outro. Mas isso está errado em termos de tamanho então vou deletar esse, e então vou criar esse aqui, pequeno, um por um. Mas vou definir o valor y como dois, então vou pressionar ou está aqui. Agora mova-o para cima e pressione construído. Aí está. Vamos adicionar que isso é três por um. Deve ser um contra três sob o eixo z, e podemos dois, está tudo bem, e então mova isso aqui, e então mova-o Aí está, temos a cena criada. Agora, o último objeto que queremos criar é o chão. Vamos apenas criar o solo, que deve ser dez por 13 no z, e eu vou mudar o y20 0.1 Vamos mover isso aqui, e eu vou definir o valor y 20. E eu vou alinhar isso aqui. Aí está. Agora temos a cena aqui. Podemos simplesmente esconder o guia, pois não precisaremos dele por enquanto A próxima coisa que eu quero fazer é criar um novo material para esse objeto probilar Aqui eu vou criar um novo material, e vou chamar esse ambiente de grade. Vou habilitar o material de emissão. Aqui, vamos usar a textura de grade que criamos, textura de grade em preto e branco. Você verá que teremos uma emissiva de branco porque definimos que a cor da emissão é branca e podemos definir a cor base como provavelmente azul escuro Algo assim, sim, e mude a grade para algo laranja. Com essas configurações, você verá que, quando usarmos o efeito de pós-processamento posteriormente, a linha ficará brilhante Agora temos isso aqui. Vamos aplicar isso ao objeto. Vou selecionar o editor de material e, em seguida, vou atribuir o material do ambiente aqui e, em seguida, vou aplicar isso. Aí está. Agora temos uma grade muito bonita para o meio ambiente. 4. 03 Movimento do caminho da câmera: Agora, continuando com nosso último vídeo, já criamos o ambiente. Agora vamos começar a criar o movimento do caminho para nossa câmera. Aqui, vou reativar nosso guia de avião aqui e depois movê-lo um pouco para cima para que possamos vê-lo Ainda estamos usando o Snap. Vou reduzir o incremento aqui pressionando o sinal negativo e, em seguida, movê-lo para cima Aí está, e então coloque isso de volta em um. Ok, então, primeiro, precisamos mudar a visão para a vista superior aqui, e depois vou mover nossa câmera para nossa posição inicial aqui. Vamos mover isso aqui e depois girar 180 graus sobre o excesso, para que possamos ver nosso nível Vou reposicionar isso a cerca 11,5 metros do chão Vamos empurrar isso 1,5 metros. Agora, essa é a altura média de um adulto, ou podemos aumentá-la para 1,7 se quisermos. E aqui você pode ver isso, a primeira visão aqui. E agora precisamos criar o caminho. Para criar o caminho, primeiro precisamos criar um objeto vazio. Vamos reorganizar a cena aqui. Vou reinicializar esse aqui e vou chamar esse ambiente. E vou colocar todo o cubo que criamos pelo construtor profissional, o ambiente para ser filho desse objeto de jogo aqui Então, podemos reduzir isso e renomear o avião para o guia do mapa Vamos chamar esse mapa de objetos de guia, para que fique muito mais claro. E agora vamos criar outro objeto anti-jogo, e esse será o caminho da nossa câmera. Podemos ajustar a posição, a posição inicial aqui. E provavelmente aqui. Agora precisamos adicionar um componente criador de caminhos. Depois de criarmos isso, você verá que temos um novo caminho. Agora vamos até o topo da vista aqui e, em seguida, selecionar o nó do caminho e podemos mover esse caminho aqui, como você pode ver. Vou mover a câmera desta posição aqui, depois vou ajustar as alças e, para adicionar isso, podemos segurar a tecla Shift e, em seguida, adicionar pontos entre nossos dois pontos iniciais aqui. No caminho, podemos segurar a tecla shift e, em seguida, pressionar o botão esquerdo para criar um novo ponto. Vou ajustar essa posição aqui. Vou mover isso para nossa última posição, e então vou inserir um ponto no meio e colocá-lo adequadamente, assim, e então adicionar um novo ponto aqui, e então vou colocá-lo aqui. Assim, podemos ajustar o controle Bezier. E vamos definir isso aqui. Para o último ponto, podemos simplesmente ampliar e arrastar a base. Está voltado para aquele lado, e este está voltado para esse lado e esse deveria estar voltado para esse lado. Podemos ajustar a curva mais tarde, quando começarmos a mover nossa câmera ao longo dessa linha aqui. Agora, se eu for para a vista frontal do eixo z na vista aqui, vou definir isso como uma vista isométrica e, em seguida, vou alinhar nosso ponto Vamos mover isso um pouco para cima e também este, vou movê-lo um pouco acima de sua posição anterior, e então vou realinhar o Bezier e mover este também E esta última, essa posição aqui. Isso deve funcionar por enquanto, mas sempre podemos ajustar o caminho posteriormente. Vamos salvar isso. Agora que criamos o caminho até aqui. Vamos até a pasta do jogo e criaremos uma nova pasta chamada scripts. E vamos começar a criar os roteiros para o movimento da câmera. Abra a pasta de scripts e eu vou criar um novo script CHR, e vou chamar esse movimento de câmera ou provavelmente o player Move seria mais adequado, pois a câmera é nosso player, o site do nosso jogador ou a divisão do nosso jogador Depois de criar o script do Player Mo, vou abri-lo no Visual Studio e começar a criar o script para ele. OK. Deixe-me aumentar o tamanho primeiro. OK. Agora, para ter acesso ao componente de caminho que criamos aqui, o objeto criador do caminho, vou renomear esse objeto vou renomear de jogo de movimento do caminho da câmera antes Para ter acesso a esse componente aqui, precisamos usar o namespace do criador do caminho Vamos apenas criar caminhos. Então, aqui, podemos criar uma variável de campo serial e o tipo será o criador do caminho, e esse será o nosso caminho. Também vou criar uma nova instrução de fim de caminho, deve ser o campo de fim de caminho. E podemos ajustar isso para parar ou repetir ou jogar pingue-pongue se quisermos criar um tipo diferente de fim de instruções passadas Também vou criar um novo campo celular e esse será um tipo de flutuação, e esse será o movimento rápido da nossa câmera Por enquanto, vou definir isso como três como o valor padrão. Outro campo que precisamos criar é um carro alegórico privado, e vamos chamar isso de viagem à distância Usar o criador de caminhos, na verdade, é muito fácil. Primeiro, podemos definir o nível de distância do movimento do nosso caminho e podemos modificá-lo com nosso valor de velocidade e multiplicá-lo pelo tempo Delta O aumento do valor será consistente, independentemente do quadro por segundo. Atualmente, nosso jogo está rodando em uma máquina específica. Se o FVS for baixo, ele terá a mesma velocidade de um PC poderoso com maior FVS E agora vamos usar esse valor aqui para um método que pertence ao criador do caminho. Vou acessar a posição de transformação do nosso objeto de jogo, que é o movimento do jogador aqui. Podemos simplesmente acessar o caminho. Tem um caminho tecnológico, propriedades ou campo. E aqui podemos ver que vamos usar o ponto de obtenção à distância. E aqui vamos passar a distância percorrida. Para as instruções do final do caminho, usaremos a variável final do caminho que preparamos aqui. Além disso, queremos atribuir a rotação de acordo com o caminho, e podemos obter sua rotação à distância e também além do nível da distância. Segurança. Agora você vê que, assim que colocarmos o script na câmera, ele modificará a posição com base na distância revelada E a distância percorrida mudará o tempo com base na nossa velocidade aqui. Vamos atravessar o caminho. Guarde isso e voltemos à união. E para a câmera principal, vou adicionar esse script de movimentação do jogador aqui, e vou configurá-lo para parar, o fim do caminho, e vamos fazer o objeto de jogo do criador do caminho aqui até o slot do caminho em que o jogador se move Vamos salvar as cenas e eu vou apertar play para ver se isso funciona ou não. Aí está. Está funcionando, mas as rotações estão erradas, então podemos ajustar a rotação Agora, se observarmos o movimento da câmera de caminho aqui, podemos expandir o normal e você verá que o fator está voltado para esse lado. Vou mudar o ângulo global em 90 graus, o fator ascendente está voltado para cima e, dessa forma, teremos a rotação correta. Vamos mudar a velocidade para cerca de 1,5. É muito rápido atualmente. Vamos tentar novamente. Aí está. Como você pode ver, mas há uma coisa. Atualmente, ele começa a partir dessa posição. Começa a partir deste ponto aqui e volta ao primeiro. Precisamos inverter isso Eu acabo reorganizando os nós do caminho aqui e troco o primeiro aqui para esta posição aqui e reorganizo a posição com base em suas guias Agora, se eu pressionar play, você verá que vamos parar desta posição aqui. Aí está. Começa a partir daqui e agora ainda está se movendo, mas depois vamos adicionar um mecanismo onde podemos parar em uma determinada posição e depois nos mover novamente. OK. Agora, se abrirmos novamente nosso script aqui, precisamos criar alguns campos aqui. Vamos criar um novo campo s, e esse seria um tipo de bleion, e vou chamar isso de está se movendo e será definido como quedas por padrão E aqui dentro da atualização, vou criar uma verificação nula do nosso caminho Se nosso caminho não for nulo e o movimento for verdadeiro. Queremos definir esses dois como verdadeiros por padrão. Se a variável está se movendo for verdadeira, então queremos executar esse código aqui. Vamos copiar tudo isso aqui e colocar aqui. Há um truque interessante que podemos ajustar aqui. Podemos criar alguma variável de depuração, então vou criar um novo cabeçalho de atributo e vou chamar isso de opções de depuração E eu vou criar um novo campo Sus e isso será um flutuante, e vamos chamar essa distância de visualização e definir esse padrão de 20 Podemos usar a função ou método embutido da unidade chamada data válida. Vamos apenas digitar fid valid date. Basicamente, o que esse método está fazendo é que sempre que alteramos um campo ou uma variável em nosso inspetor, esse método é executado Vamos adicionar outro campo sus chamado Bullion e chamá-lo de enable debug E queremos verificar se a ativação do bug é verdadeira, então queremos definir sua posição e rotação para o caminho. Mas, em vez de usar o nível de distância, queremos usar o valor da distância de visualização aqui. Dessa forma, será mais fácil verificar a que distância queremos marcar o primeiro encontro com o inimigo e o segundo e o terceiro. Agora, se salvarmos isso, isso funcionará. Então, vamos voltar ao Unity, e se formos para a visualização do jogo aqui, você pode ver que se eu selecionar a câmera aqui e ativar o bug, aí está. Depois que eu habilito o D bug, ele é executado e nossa posição é definida para a distância de visualização em zero Se eu limpar isso, você verá que podemos movê-lo Esse é um truque muito legal ajustar e agora podemos ver que, se quisermos essa posição , podemos usar esse valor aqui, 9,54 Vou colocar isso de volta em zero e desativar o bug. Agora que temos essa variável móvel do bulion, se eu pressionar play, você verá que, se eu desmarcar isso, ela parará, e se marcarmos isso, ela avançará Se desmarcarmos isso novamente, ele parará e se moverá Vamos usar isso sempre que encontrarmos um inimigo. 5. 04 Como criar o ponto de saída: Ok, agora neste vídeo, vamos criar um ponto de disparo onde podemos definir uma área para um inimigo emboscar e também comparar a distância nesse ponto para que nossa câmera possa parar nesse ponto da área de filmagem Então, primeiro, vamos criar um novo script de captura na pasta de scripts e, em seguida, vou chamar esse ponto de captura. E vamos criar duas novas propriedades, não uma variável, mas uma propriedade. E deixe-me aumentar o tamanho do texto aqui. E agora vamos primeiro criar um novo bulion privado para limpar a área E isso seria uma lacuna, mas com um set privado. Portanto, as propriedades só podem ser configuradas com essa classe aqui, mas podemos obter o valor de outra classe que precisa desse valor aqui. Portanto, há um erro. Sim, preciso ter certeza de que isso é público, não privado. Portanto, deve ser público, para que possamos obter esse valor, mas para definir esse valor, devemos ser privados aqui. E também queremos criar propriedades para referenciar o movimento do jogador Então, vamos criar uma nova jogada pública de jogador e definir isso para ser configurada. Desculpe. Precisamos definir um nome, então vou chamar esse jogador de jogada. OK. E agora queremos criar um novo método público para inicializar essa classe para que ela possa ter uma referência ao objeto de movimentação do jogador Vamos apenas criar uma nova inicialização pública vazia. E queremos aprovar a jogada de um jogador. Podemos simplesmente chamar esse valor aqui. Nesta classe, podemos simplesmente definir o movimento do jogador para esse valor aqui. Vamos fazer esse jogador passar para uma variável. Talvez seja melhor fazer isso como uma variável como uma variável privada local. E precisamos mudar o P para minúsculo, porque mudamos o nome aqui. E vamos excluir o método de início. Agora vamos criar uma instrução if para testar isso. Vamos criar um novo evento de pressionamento de tecla, pressionar a tecla e usar a barra de espaço para interromper o movimento do jogador Mas, para fazer isso, precisamos criar primeiro um método público para acessá-lo. Vamos criar um novo método chamado set player movement. E isso vai ser um Bulion, e vamos chamar isso de habilitar para a discussão E vamos passar isso para o valor do movimento as b aqui. Vamos apenas definir o acesso como em movimento e seguida, atribuir o valor de habilitação aqui. Agora podemos usar esse método para fazer uma pausa. Vamos definir o movimento de duas quedas aqui. Então, para nos movermos novamente, podemos simplesmente criar um novo evento e, desta vez, podemos usar a tecla return ou a tecla enter para configurar a câmera para se mover novamente. Agora vamos voltar à jogada do jogador aqui e vamos criar um novo campo de usuário E isso é para o ponto de filmagem. Primeiro, precisamos criar uma nova classe pública aqui abaixo. Essa será apenas uma classe personalizada que usaremos para adivinhar uma variável personalizada. Vamos apenas usar o atributo serializável do sistema e, em seguida, criar a nova classe Vou chamar esse tiroteio de três. E terá dois campos. O primeiro deve ser o ponto de tiroteio. Vamos chamar isso de ponto de tiroteio. A segunda seria a distância e esse será o tipo de flutuação Essa será a distância que precisaremos comparar sempre que o jogador se mover ou a câmera estiver chegando a essa distância no caminho. Então, queremos começar o tiroteio. Vamos apenas criar uma nova matriz de entrada de fotos. E eu vou chamar isso de entradas de filmagem. Com esse campo aqui, podemos colocar o ponto de disparo dentro dessa matriz aqui. Vamos voltar para Unity, e aqui, vou voltar para a visão em perspectiva, e então vamos criar um novo objeto de jogo T, que seria o gerente de tiroteio ou não, mas podemos simplesmente chamar esse grupo. Então, vamos criar um novo Monte. Podemos posicionar esse vazio em qualquer lugar. Isso realmente não importa. Vamos apenas adicionar um ponto de disparo. Aqui agora não temos nenhum valor, mas vamos modificar isso mais tarde. No objeto do jogo de câmera, agora temos esses novos campos aqui. Vou adicionar um novo tamanho e depois colocar o ponto de disparo. Aqui. E ainda não definimos a distância, mas está tudo bem. E vamos apenas renomear o objeto do jogo que tem esse script aqui. Atire 0.1. E agora salve isso. E agora, atualmente, ainda não funcionará porque precisamos adicionar um novo código de inicialização dentro do movimento do jogador Assim, podemos atribuir a instância do movimento do nosso jogador a essa variável aqui. Então, podemos definir o movimento do jogador com esse código fictício aqui Então, vamos acessar a coleção de entradas de filmagem. Desculpe, a coleção de entradas de filmagem aqui está. E então eu vou chamar a entrada de membros individuais, e vamos apenas acessar a entrada, disparar o ponto, inicializar e, em seguida, passar essa classe aqui como o valor aqui Então, basta digitar isso. Então , o que esse código está fazendo é basicamente observar as entradas de filmagem e, para cada entrada dentro dessas entradas de tiroteio, inicializaremos ponto de disparo passando essa classe aqui para o método aqui OK. Então, agora, se voltarmos para o Unity, vamos tentar jogar isso e agora, se eu pressionar espaço, você o verá parar e, se eu pressionar Enter, ele começará a se mover novamente. A próxima coisa que precisamos fazer é definir o movimento do jogador para o movimento do jogador para parar em cada ponto de tiroteio com base na distância Basicamente, o que queremos fazer é criar um loop de quatro aqui e percorrer o comprimento das entradas do tiroteio E agora vamos comparar a distância com certas entradas de filmagem, e podemos simplesmente acessar o caminho do objeto e, em seguida, obter o ponto à distância, e então queremos passar a distância aqui, a distância de entrada da filmagem. Vamos apenas acessar o índice de entradas de filmagem de I e, em seguida, a distância. E queremos subtrair isso porque isso retornará um vetor te, queremos subtrair isso com nossa posição de transformação de carbono da câmera Vamos fechar isso com um conjunto de parênteses para que possamos obter a distância ou a magnitude desses Para magnitude, podemos usar magnitude ou magnitude quadrada. Para um melhor desempenho, eu recomendaria usar a magnitude quadrada porque não teremos nenhuma operação de raiz quadrada com a magnitude quadrada. E como não precisamos de uma distância precisa, podemos usar a magnitude quadrada e verificar essa distância entre a câmera e a distância, dois valores muito pequenos. Isso significa que chegamos a esse ponto aqui e, se chegarmos, queremos parar a câmera. Então, agora queremos verificar se as entradas de disparo, desculpe, as entradas de disparo, a área do ponto de filmagem está limpa e, se estiver limpa, queremos retornar. E vamos mudar o valor total ou o valor do bilhão aqui quando terminarmos derrotar todos os inimigos no ponto de tiroteio E agora queremos verificar se ele está se movendo atualmente, então queremos parar. Vamos acessar as entradas de filmagem novamente, o ponto de filmagem e, em seguida, criaremos um novo método para essa aqui. Vamos criar um novo método, e esse é um método público. Comece a atirar. E agora vamos colocar as duas quedas aqui. Vamos chamar o método start shoot out. Para testar, podemos simplesmente adicionar uma área clara e verdadeira aqui dentro da chave. Retorne e pegue a chave. Vamos configurar isso para testar isso. Se voltarmos para a unidade agora, aqui embaixo da câmera principal. Você vê que temos uma distância e podemos mudar isso. Para testar isso, podemos simplesmente habilitar o valor de depuração aqui e, em seguida, definir a distância de visualização para um determinado valor que queremos interromper A primeira posição que queremos que a câmera pare é ao redor dessa área verde aqui. É 3,15. Vamos definir a distância para 3,15 e criar um novo ponto de disparo duplicando este aqui Vamos chamar essa filmagem de 0,2. E selecionando a câmera principal, queremos adicionar esse ponto de filmagem, o segundo ponto de filmagem ao segundo membro da matriz de entradas de filmagem. Vamos apenas direcionar isso. Para este, vamos executar isso e queremos parar neste ponto aqui. Podemos simplesmente copiar esse valor aqui e depois colar no segundo ponto aqui. Agora vamos colocar isso de volta em zero e desativar a ativação do total de dólares e salvar a cena novamente. Agora, se pressionarmos play, você verá que ele vai parar, ele vai parar neste ponto aqui, e então se pressionarmos enter, ele começará a se mover novamente, e então ele vai parar no próximo ponto aqui. Desculpe. Encontrei o problema. Não é a distância aqui, mas eu configurei isso para 0,0 0,01 de qualquer maneira E é porque esse método de atualização, sempre que pressionamos return, limpou a área dos dois pontos de tiroteio Precisamos ter certeza de que temos um bulion para verificar se esse é o ponto de disparo ativo ou não Vamos apenas criar um novo ponto ativo de ouro privado, vamos chamar esse ponto ativo e isso será falso por padrão Se começarmos um tiroteio, então queremos que isso seja verdade. Então, sempre que pressionamos Enter, queremos que isso volte a ser falso. E queremos ter certeza de que só podemos pressionar return sempre que o ponto ativo for verdadeiro. Vamos apenas adicionar uma condição N e , em seguida, adicionar o ponto ativo de Bulan Dessa forma, sempre que pressionamos return e é o ponto ativo, queremos definir esse movimento e, em seguida, definir o ponto ativo de volta para falso. Agora vamos voltar para o Unity e testar isso. Agora ele pára aqui, e se pressionarmos Enter, ele se move novamente, e então ele vai parar no segundo ponto. Aí está, e se você pressionar enter, ele se moverá novamente. Basicamente, a lógica que queremos fazer é definir um contador e o número de inimigos para cada ponto de tiroteio e, sempre que matamos, derrotamos todos os inimigos e, em seguida, queremos limpar a área Nós vamos fazer isso no próximo vídeo. 6. 05 Mecanismo básico de disparo: Neste vídeo, antes de continuarmos a fotografar o ponto, precisamos ter certeza de que criamos um mecanismo de disparo para o jogador. Para fazer isso, vamos criar um novo script e chamá-lo de script do player. Em seguida, vamos criar uma interface e um script de interface para criar um método básico para um objeto habilitado Vamos criar uma nova pasta e essa interface. E eu vou criar um novo script em C sharp, e vou chamar isso de I hittable Basicamente, para a prática padrão na interface C sharp, nomeamos a classe com um I na frente do nome da classe aqui. Cabo de interface. E vamos remover toda a diversão aqui e não será um comportamento de humor, e também não será uma classe, mas será uma interface E também queremos excluir esse método aqui. E, basicamente, a interface é um contrato básico para outro script implementar um método. Então, por exemplo, podemos declarar um nome de método e todas as outras argilas que implementam essa interface precisam implementar esse Por exemplo, vamos criar um novo método chamado isso. E, basicamente, se criarmos um novo script, por exemplo, se voltarmos para UT aqui e criarmos, vamos criar um novo script SSH, e vamos chamar isso de objetos dinâmicos dinâmicos Vamos abrir esse script aqui. E podemos fazer com que esse objeto implemente o hit able adicionando uma vírgula após o comportamento mono e, em seguida, digitando a interface que queremos implementar Agora, isso nos deu um erro porque nossa classe aqui não implementa o hit do membro da interface . Precisamos fazer isso. Mas antes de implementar o método hit, vou modificá-lo e, para o hit, ele solicitará um objeto para o argumento. Vamos chamar isso de sucesso. E segurança. Agora, se você estiver usando o Psal Studio, basta destacar a interface na classe de objetos dinâmicos e pressionar mostrar correção potencial e, em seguida, implementar a interface Você verá que ele implementará automaticamente os métodos declarados pela interface. Vamos deletar isso aqui, e agora podemos fazer qualquer coisa com isso. Por exemplo, se eu simplesmente excluir o método embutido, vamos criar um novo corpo rígido privado RB e podemos simplesmente inicializar o corpo rígido no Vamos verificar se corpo rígido do componente é não, então vamos criar um novo Ou talvez seja melhor se tentarmos agarrar. Vamos colocar o corpo rígido do componente get dentro dessa variável aqui Vamos apenas duplicar isso e colar aqui. Agora podemos verificar se o RB é, então queremos criar um novo corpo rígido para Vamos apenas digitar RB igual ao objeto de jogo. Acho que está no corpo rígido do componente. Aí está. Dessa forma, ele garantirá que todos os objetos que estejam usando essa classe tenham um corpo rígido Agora, sempre que somos atingidos, podemos sempre aplicar uma força ao corpo rígido Por exemplo, podemos simplesmente digitar um corpo rígido em força e obter o vetor das informações do ca it, e as informações do caso hit têm muitas informações Por exemplo, podemos pegar a normal e depois inverter a normal e depois multiplicar por algum valor 50 aqui ou 100 Isso será básico e, claro, vamos modificá-lo. Vamos voltar ao Unity e, em seguida, abrir nosso arquivo de scripts do player aqui. Neste script, queremos criar um mecanismo no qual possamos fotografar um objeto em nossa cena. Como o script do player será anexado à câmera, podemos criar uma nova variável de câmera privada e pegar o componente da câmera. Vamos criar uma nova variável de câmera chamada CM. No início, sempre podemos usar a câmera componente GT. E salve-o. A próxima coisa que precisamos fazer é garantir que, sempre que o mouse estiver clicando no botão esquerdo, pressione o botão do mouse e o botão esquerdo seja zero. Um é para o botão direito e dois é para o botão do meio. Sempre que clicamos com o botão esquerdo do mouse, queremos criar um novo elenco y. Vamos digitar ray, e isso é objeto ray object, e vamos chamar isso de ray. E isso será uma câmera para câmera. Eu tenho um método, que é a tela de 0,2 raios, e isso é basicamente fotografar raios de um ponto de tela. Para o ponto da tela, vamos colocar a do mouse para inserir a posição do mouse. Aí está. Agora podemos sempre tentar testar o raio usando a projeção de raios físicos. Tem muitas substituições, como você pode ver aqui. Nós vamos usar esse, eu acho, esse. Sim, esse, podemos usar esse. Então, basicamente, queremos passar o raio e divulgar as informações de sucesso do RCA Então, precisamos criar um novo cs aqui. Vamos apenas criar um hit do Cas. Vamos chamar isso de sucesso. E podemos passar o valor para hit. Portanto, qualquer que seja a ocorrência de ras resultante estará segura para essa variável de ocorrência, e podemos passá-la para a outra classe. Isso precisa dessa informação. E acho que o próximo passo será a distância máxima. Vamos colocar em 50 unidades. E se atingir alguma coisa , o código dentro da instrução if será executado. Vamos apenas criar um novo objeto passível. Desculpe. Precisamos ter certeza de que o colisor não é conhecido primeiro Vamos criar uma nova instrução I e aqui queremos verificar se a variável de ocorrência ou o objeto atingido tem um colisor anexado a ela Então, se bater em alguma coisa, deve ter um colisor. Não é nulo, então queremos pegar o objeto atingível, se estiver disponível Vamos criar um novo hit i hit, vamos chamá-lo de hitable Então eu vou pegar o hit, pegar o colisor de impactos, pegar o componente, e aqui podemos pegar o i hable Aí está. Vamos verificar isso novamente se itable não for nulo, então queremos executar o método hit aqui e, em seguida, passar as informações de lançamento hit Também podemos imprimir seu nome executando o comando debug log e passando o nome do ponto do objeto do jogo collider Ok, salve isso, e agora podemos anexá-lo à nossa câmera. Vamos voltar para o Unity e, se selecionarmos a câmera aqui, podemos adicionar o componente de script do player e, para testá-lo, vamos criar um novo cubo aqui Vou criar um novo cubo normal. Provavelmente vou colocá-lo aqui ou aqui no meio. E coloque-o no topo aqui, e vamos adicionar o script de objeto dinâmico. Vamos salvar isso e tentar. E vamos abrir nosso console aqui. Se eu clicar aqui, você verá que estamos atingindo esse cubo E se eu, como o nome do objeto é o mesmo, o bloqueio de depuração será interrompido. Então, vamos chamar essa caixa, essa aqui, e salvar isso. E agora você verá que se eu atirar nesta caixa aqui, ela se move porque temos isso. Onde está? Porque temos isso no primeiro comentário sobre nosso método de acerto. Basicamente, esse script verificará se o objeto que é atingido por nossos Cs tem um componente de acerto ou alguma classe que implemente uma interface adequada E se não for nulo, se estiver disponível ou se o objeto tiver uma interface habilitada anexada , queremos executar o método hit E podemos implementar isso da maneira que quisermos. Para o inimigo, podemos colocar a saúde. Podemos diminuir a saúde dentro do golpe. A interface do método é bastante poderosa. E é assim que fazemos o mecanismo básico de disparo. E, claro, vamos expandir esse mecanismo. 7. 06 Configuração inicial do inimigo: Olá, neste vídeo, continuaremos nosso projeto e criaremos o mecanismo básico simples do inimigo e, claro, expandiremos esse mecanismo. Primeiro, vamos excluir a caixa aqui. Não precisamos mais disso. E precisamos definir a área da malha NAF. Para fazer isso, podemos ir até a janela abaixo da IA, clicar no menu de navegação e ela abrirá esse painel de navegação. E aqui embaixo, primeiro para o meio ambiente, queremos definir esses dois como estáticos. Vamos apenas habilitar a estática e depois mudar os filhos. Agora, quando mudarmos isso para estático, se formos para a navegação, podemos pressionar o botão grande e, em seguida, ele assará nossa área aqui. Aí está. Como podemos ver, temos uma área aqui, mas nesta posição, há um problema aqui porque precisaremos que o inimigo se esconda dessa área aqui, e não temos matemática de navegação. Precisamos diminuir o raio aqui para talvez 0,3. Temos um tamanho de agente menor e ele criará mais área para a área da malha N e N. Vamos criar uma bolsa novamente e ver se. Como você pode ver aqui, agora temos uma malha NAF dentro dela e ela está conectada aqui. É melhor. Podemos criar a partir dessa posição e, em seguida, ele poderá se mover para uma determinada posição fora desse corredor ou beco Uma vez que já criamos a malha NF, se voltarmos ao inspetor, essa malha de navegação azul fica A próxima coisa que queremos fazer é criar uma nova cápsula. Para o inimigo, vou criar um novo objeto cápsula, que será o inimigo. E estar ciente da direção da cápsula. Vou adicionar outro objeto de três cubos d, e vou torná-lo menor, assim, e depois movê-lo para a frente aqui Portanto, sabemos para quais áreas a cápsula está voltada atualmente. Sim, vamos até a iluminação aqui e eu quero desativar a geração automática. Portanto, ele não gera a iluminação toda vez e salva a cena. Esse vai ser o inimigo. Vamos chamar isso de inimigo. Primeiro, precisamos adicionar um agente de malha de navegação e também um corpo rígido Como esse objeto vai se mover, precisamos também atribuir um corpo rígido Mas se não precisarmos das interações físicas ou do cálculo dinâmico desse objeto, podemos simplesmente desativar o uso da gravidade e, em seguida, ativar a cinemática Ok. Agora vamos alterar o raio da bagunça de navegação para 0,3, então é o mesmo com nossas configurações de malha de navegação Para a cápsula, também vou mudar o raio do colisor de cápsulas para cerca de 0,3 Agora temos o inimigo. A próxima coisa que precisamos fazer é criar um novo script para o inimigo. Vamos criar um novo script de loja e, em seguida, chamá-lo de script inimigo. Vamos abrir isso. Agora, há algumas variáveis que precisamos definir para esse script inimigo. Primeiro, precisamos de um campo serializado, e isso deve ser inteiro, e vamos chamar isso de Mx Isso serve para definir a saúde máxima. Em seguida, adicionaremos também um número inteiro privado e essa será a saúde real ou a saúde atual que usamos para calcular a saúde do inimigo Então, também precisamos de um tipo de transformação de campo serializado, e essa será a posição de destino E a posição alvo é onde o inimigo se reposicionará ou se moverá depois de sair do esconderijo ou da posição de emboscada A outra coisa à qual precisamos ter acesso é a transformação do jogador. Vamos criar uma nova variável de transformação privada e chamar esse jogador, e também precisamos de uma variável bleion, para alternar se o inimigo já está morto ou não, e a última será um componente do agente de malha NF Mas se você pode ver aqui, ele não aparece na saída completa porque você precisa usar a IA do motor unitário. Se destacarmos a classe aqui e depois mostrarmos uma possível solução. Teremos a opção de adicionar isso. Vou apenas clicar aqui e ele também será adicionado automaticamente ao script, e vou chamar esse Agente. Vamos criar um novo método de inicialização, que será um método público Vamos colocar isso nele. Outra coisa que precisamos criar, esqueci, precisamos ter uma referência ao ponto de filmagem Vamos apenas criar um ponto de disparo da variável U. Agora, no início, vamos ultrapassar o ponto de tiroteio e apenas chamar esse ponto Vamos apenas atribuir aqui o ponto de valor que passamos como parâmetro para o ponto de tiroteio. Ok. Agora vamos pegar o player, também o agente de malha NF Vamos apenas digitar agent equal get component NF mesh agent. Para o jogador, podemos simplesmente pegar a classe da câmera e depois pegar a câmera principal e obter a transformação. Aí está. Temos a transformação do jogador. Dentro da atualização, também queremos garantir que o inimigo que enfrentamos sempre seja o jogador. Vamos apenas verificar isso. Dentro da atualização, queremos verificar se o jogador não é nulo e se o inimigo também não está morto atualmente, então queremos enfrentar o jogador Para enfrentar o jogador, vamos criar um novo fator três, e vamos chamar essa direção, e para direção, será o jogador nessa posição, subtraído com a posição do inimigo, a posição atual Então eu vou zerar o valor y. A rotação será estritamente nos planos x e z, e podemos definir a rotação da transformação, rotação em um quatérnio, olhando a rotação na Agora, dentro do método init, também vamos adicionar o destino do agente Vamos verificar isso se o agente não estiver. Em seguida, queremos definir o destino para nossa posição alvo. Posição alvo. Queremos pegar a posição alvo como destino para o agente. Outra coisa que precisamos ter certeza de que precisamos desativar a rotação do agente é que o componente do agente me não conduz a rotação. Já que nós mesmos já lidamos com a rotação dentro do método Pate Vamos apenas adicionar o código aqui, rotação do agente e definir isso para falle Basicamente, ignoraremos a rotação e também criaremos um método de hit e precisaremos implementar a interface hittable Agora, depois de implementar essa interface, você verá que temos um erro, então vou clicar em mostrar possíveis correções e, em seguida, implementar a interface, e ela implementará automaticamente a interface aqui. No momento, podemos simplesmente subtrair a saúde atual, mas precisamos inicializá-la Dentro do init, vamos definir a saúde atual para a integridade máxima I. E então podemos subtrair a integridade atual no método hat e também imprimir uma mensagem de log no console, estou fechado e se a integridade atual for menor ou igual a zero, então queremos habilitar o s se esse bulto for verdadeiro, e também queremos desativar o componente do agente definido como Outra coisa que precisamos fazer é ter certeza de que, se isso for verdade, queremos retornar esse método, para que ele não execute nenhum código aqui abaixo. A outra coisa que precisamos configurar é que acho que isso seria tudo. Vamos tentar e precisamos fazer algumas modificações no ponto de tiroteio Vamos até o ponto de tiroteio. Agora precisamos criar uma entrada inimiga. Vou criar uma classe personalizada aqui fora e vou adicionar um atributo serializável do sistema a ela e chamar essa classe pública de entrada inimiga E essa é uma classe personalizada, então não precisa derivar do comportamento mono Vou criar um novo script de inimigo público, o inimigo. Então, para o outro valor, seria um atraso flutuante, e esse é o atraso em segundos. Quanto tempo precisaremos para que esse inimigo apareça. Agora vamos adicionar um novo campo serializado, será a matriz de entrada de inimigos, e vamos chamar essa lista de inimigos E vamos criar uma nova corrotina para gerar esse inimigo Vamos apenas criar um novo método i enumerator que retorna o tipo enumerator que retorna Vamos chamar isso de enviar inimigos. E dentro do cotin aqui, queremos dar uma olhada na coleção da lista de inimigos aqui Vamos apenas digitar a variável, ela será o inimigo e estará dentro da coleção da lista de inimigos. Aqui, vamos adicionar um novo peso de retorno de rendimento por segundos e vamos ultrapassar o atraso do inimigo aqui. Esse é o atraso que declaramos na entrada do inimigo aqui E depois de atrasarmos a execução do código aqui, queremos acessar o inimigo que o inimigo inicializou Então, quando for inicializado, ele fará com que o inimigo se mova para cá, como você pode ver aqui, uma vez inicializado, ele definirá o destino do agente NMS inimigo Então, o inimigo começará a se mover. Mas precisamos ultrapassar o ponto de tiroteio. Vamos passar esse ponto de tiroteio aqui com a palavra-chave dis Se quisermos, também podemos depurar o nome do objeto inimigo Vamos apenas digitar inimigo, inimigo, jogo ou nome spawn Dentro do script do ponto de tiroteio. Também precisamos adicionar uma variável privada, que é um número inteiro, e vamos chamar esse inimigo de morto Isso serve para contar quantos inimigos já matamos e depois de matarmos todos, podemos passar para a próxima área. Vamos criar um novo método público e chamar esse inimigo de matar. Para esse método público, vamos aumentar esse número inteiro k inimigo Vamos digitar o inimigo kel plus plus. Isso significa que estamos aumentando um ou incrementando em valor de um, e queremos verificar se o valor do kel inimigo é igual ao tamanho da nossa lista de inimigos Então, queremos continuar o movimento aqui, o movimento do jogador. Vamos usar esse valor aqui. Copie isso e cole aqui. Ok. Então, agora que criamos o método público para o kilt inimigo, precisamos chamá-lo a partir do script inimigo Sempre que cada instância do script inimigo é eliminada , queremos executar esse método aqui. Eu aumento o valor do inimigo morto aqui. Vamos voltar ao script do inimigo e, dentro da saúde atual aqui, podemos simplesmente acessar o ponto de tiroteio e executar o método de matar inimigos E guarde isso. Obviamente, essa ainda é a implementação básica e vamos modificá-la mais tarde. Vamos voltar ao Unity e testar isso. Esse será o inimigo aqui. Vou definir isso ou salvar como pref Dentro da pasta do jogo, vou criar uma nova pasta E dentro dessa pasta de prefabs. Vou direcionar esse objeto de jogo inimigo como pré-fabricado Agora, como já mudamos isso para um prefácio, podemos simplesmente adicionar um script, que é o script inimigo, e então podemos aplicar isso aos prefabs Agora precisamos reposicionar o inimigo. Vamos ativar a navegação e eu vou mover esse inimigo para essa posição aqui. Provavelmente estou aqui. Vou duplicar esse inimigo Mas primeiro, vamos definir o valor da saúde porque atualmente ele ainda é zero. Vamos definir esse 23 e aplicar isso. Esse será o valor padrão. Podemos duplicar o inimigo aqui, e podemos colocá-lo aqui Se formos até a navegação, podemos ver, podemos colocá-la aqui. Então, no ponto de tiroteio, podemos criar um novo objeto do jogo t. E essa será a posição. Isso é para esse inimigo aqui. Podemos movê-lo para esta posição aqui, e podemos duplicar esse objeto anti-jogo e colocá-lo aqui atrás O segundo aparecerá nesta posição aqui. Podemos mover isso um pouco para o site aqui. Vamos apenas renomear isso. Esta é a posição alvo um, e esta será a posição alvo dois. Ok. Agora, se selecionarmos o inimigo aqui, vou colocar esse inimigo aqui, a posição alvo na segunda posição alvo. E para o primeiro inimigo aqui, vou definir isso como a primeira posição alvo. Ok, vamos salvar a cena aqui e abaixo do ponto de tiroteio, queremos configurar menos o inimigo, vamos definir esse 22, e para cada uma dessas entradas, vamos definir o primeiro inimigo dois aqui, e o segundo inimigo estará na segunda entrada aqui e provavelmente precisamos definir um atraso, então vamos definir esse 23 por enquanto O próximo inimigo, podemos definir esses dois. Basicamente, isso será acionado depois que for mostrado que é B. Se voltarmos ao código aqui, você verá isso no ponto de tiroteio O loop four e será liderado pelo primeiro atraso do inimigo. E então ele inicializará esse inimigo. E então, no próximo loop, ele atrasará o código com base nos atrasos do segundo inimigo Por exemplo, este inimigo aqui ou desculpe, o segundo, será mostrado após 5 segundos após 5 segundos aproximadamente. Então, vamos tentar aqui. Vou verificar mais uma vez pelo código aqui. Quando começamos a filmar, há outra coisa que precisamos fazer é iniciar essa corrotina aqui quando executamos o método start shoot out aqui Vamos apenas executar a rotina inicial de SN Enemies. Guarde isso e vamos voltar à união. Agora, depois de compilado. Vamos tentar. Vou habilitar a janela do console para que possamos ver a mensagem aqui, a mensagem de bloqueio de depuração Vamos apertar play. Desculpe, vou gerar a iluminação uma vez. Agora temos a bolsa de luz, salve a cena novamente e pressione play. Agora vamos dar uma olhada quando paramos aqui, o inimigo depois de 3 segundos mostra, aí está. Nós podemos atirar nele. E se formos até o inimigo aqui, sob o comando do inspetor, o primeiro inimigo Podemos verificar sua integridade, e agora nossa saúde atual ainda está, para que possamos clicar mais uma vez. Aí está. É zero. Mas precisamos destruir ou, posteriormente, se usarmos o personagem, precisamos reproduzir a animação da morte. Vamos apenas usar destroy. Primeiro, agora aqui. No roteiro do inimigo. Depois de matarmos, queremos destruir o objeto do jogo. Salve isso, vamos tentar. Se eu for até o prefeito aqui, vamos consertar algumas coisas aqui Vamos apenas remover o colisor do objeto do jogo de caixa aqui Vamos apenas remover o colisor. Sim. E salve isso novamente. Vamos executar isso mais uma vez e tentar. Agora os inimigos aparecem, podemos deletar aqui e depois atirar três vezes. Depois de matarmos todos os inimigos, você vê que o jogador começa a se mover novamente, e podemos definir outro ponto de tiroteio aqui Sim, essa é a base da configuração inicial do inimigo, e depois vamos mudar o modelo com o personagem real do robô e também com animações 8. 07 preparações de animações inimigas: OK. Agora, neste vídeo, continuaremos desenvolvendo nosso mecanismo inimigo e agora vamos começar a preparar o modelo. Se formos para a pasta do jogo e dentro da pasta do jogo, eu tenho um modelo Robot Kyle, e dentro do modelo da pasta, temos o arquivo FBX, que consiste nos três modelos D do Primeiro, precisamos alterar a configuração do RIG para um humanóide e pressionar aplicar, e podemos deixar as outras configurações Agora que tivermos o tipo de animação, altere, queremos abri-la no Explorer, que possamos ver o modelo FBX, e agora precisamos preparar algumas animações Para fazer isso, usei Mixamo para criar animações personalizadas Você pode ir até o endereço, que é mixamo.com. Basta se cadastrar. É gratuito e, depois disso, você pode fazer o login e também podemos fazer o upload de nosso próprio personagem. Pressione o caractere de upload e eu copiarei o caminho do modelo aqui. Vou selecionar um arquivo de caractere , colar o caminho e, em seguida, fazer o upload do arquivo FBX Depois de fazer o upload dos arquivos FBS, escolheremos uma das bibliotecas de animação, e essa biblioteca será redirecionada para o objeto Robot kyle Assim, podemos usar a animação corretamente e se adequar muito bem ao personagem do robô Pressione Avançar uma vez, basta pressionar NX, e agora podemos selecionar muitas das animações disponíveis. Também podemos pesquisar. Vou procurar uma caminhada com uma arma. Ou podemos pesquisar apenas uma arma e deve haver muitas armas relacionadas. Vamos apenas procurar a caminhada com uma arma. Ou podemos simplesmente procurar um rifle. Sim, podemos usar isso. Precisamos de um movimento para frente. Provavelmente, aqueles que não estão atirando seriam os melhores. Podemos usar esse rifle para caminhar. Não tenho certeza se são lentos, vamos apenas para aqueles que provavelmente são mais rápidos. Isso deveria ser melhor. Queremos as informações de tradução porque vamos usá-las para criar um movimento muito bom que seja sincronizado com a animação Pressione download e defina o formato de duas unidades FBX de quatro unidades e podemos escolher sem capa e, em seguida, basta fazer o download Depois de pressionar o download, ele preparará os ativos e poderemos salvar o arquivo FBX Vou colar nosso caminho aqui. E então vá para a pasta do jogo e eu vou criar novas animações. Então eu vou guardar isso. Mas provavelmente vou mudar isso para um rifle Run Forward Depois de salvar isso, vamos procurar aqueles que são sts. Este, podemos usar este para evitar, mas acho que é muito lento, então vamos procurar um que seja mais rápido Temos isso em cima? Vamos apenas pesquisar nas outras páginas. Esse deveria servir. Nós podemos usar isso. Vou pressionar o download novamente e temos as configurações anteriores, basta pressionar o download e depois salvar na mesma pasta Provavelmente precisamos de uma animação. Este é muito bom, na verdade. Ou esse, provavelmente. Sim, podemos usar isso, pressione o download. Não posso incluir esses ativos no tutorial devido aos termos e à licença para usar o Mixamo, então você pode simplesmente se inscrever e baixar a animação de que precisa Vou baixar este e vamos ligar para s para ver a animação. Ou fuzil isso. Sim. Acho que podemos usar esse. Agora podemos pressionar o download e entrar nas animações. Agora que temos tudo isso, animações preparadas. Vamos voltar ao Unity, e ele terá as animações importadas automaticamente Mas queremos primeiro configurar o tipo de animação. Vamos selecionar todos os arquivos FBX aqui dentro da pasta de animações e Então, para a definição de Avatar, já que este é apenas um arquivo de animação , não há nenhum avatar dentro dele , então precisamos copiar do outro Avatar, e podemos escolher o avatar do Robot Kyle aqui Esse aqui. É do modelo Robot Kyle dentro da pasta do modelo e é do Robot Kyle Vamos apenas selecionar este e pressionar aplicar. OK. Então, agora, se selecionarmos um deles, e se formos para a animação, há algum problema aqui. Vamos verificar. O problema estava nas configurações do modelo. Portanto, precisamos alterar o fator de escala para 0,01. Precisamos ter certeza de que as configurações aqui são mesmas do nosso modelo Robot Kyle aqui Como você pode ver, ele é definido para o fator de escala 0,01 e todas as configurações estão desmarcadas, exceto formas de mesclagem e hierarquia de classificação E isso é o mais importante. Essas unidades de conversão não estão marcadas. Portanto, precisamos garantir que as animações tenham as mesmas configurações Depois de desmarcar as unidades de conversão e o restante das opções, pressione aplicar Agora, se formos até a plataforma, você verá que não temos mais o erro. E se selecionarmos uma das animações e formos para a janela de animação, você verá que temos animações muito boas para o robô aqui OK. Agora precisamos configurar algumas coisas aqui. Primeiro, queremos definir a rotação, não para a orientação do corpo, mas para a original e, em seguida, pressionar aplicar. Aqui, queremos mudar os dois pés. Queremos colocar esses dois grandes em pose aqui, e esta também é uma grande pose. Agora temos um movimento de movimento muito bom. Se eu fechar isso e tentar selecionar novamente, você verá que o robô se moverá linearmente nesta linha aqui Então, ele se move muito bem. Mas certifique-se de que, para a posição de transformação raiz, não queiramos verificar as grandes opções de interposição Para a outra capa esquerda aqui, vamos definir a mesma coisa. Defina essa pose original de duas polegadas grandes, e isso é dois pés para a transomposição da raiz y. Pose de polegada grande, e vamos deixar a transomposição da raiz E agora, se pressionarmos play, você verá que ele se move bem para o eixo x aqui A outra coisa que precisamos definir é para as reações de calor, e isso garante que o tráfego raiz y seja alimentado e saia das outras configurações Para a animação des, verifique se temos as mesmas configurações. E o que essa configuração é basicamente fazer. Estamos preservando a rotação original. Portanto, está voltado corretamente para o eixo z, da maneira que deveria. E para a posição y da transformação raiz, queremos incorporar a pose para que ela não altere a tradução na animação, e ela comece com base nos pés no primeiro quadro da animação. Há uma animação que esquecemos de pegar. Então, basicamente, queremos pegar o ídolo do rifle. Então, vamos pegar esse. Ou podemos, o ídolo de mira do rifle deveria ser melhor. Em seguida, faça o download e salve-o na pasta de animações Se voltarmos, você verá que temos essa nova animação. Acho que é esperar um minuto. Essa. Vamos configurar primeiro os toques do modelo, definir o fator de escala como 0,01 e verificar todas essas opções, exceto as formas de mesclagem e a hierarquia curta Para o equipamento, mude isso para humanóide e copie de outro Avatar, e eu vou escolher o avatar do robô Kyle e pressionar Aplicar robô Kyle Uma vez que já tenhamos definido isso, teremos esse objetivo. Para a mira, podemos definir essas opções de loop para ativar o tempo do loop Defina isso como original, Big em pose, coloque esses pés, sim. Para a execução, também precisamos ativar o tempo de loop que eu esqueci antes Pressione aplicar, marque isso e, em seguida, pressione aplicar. Também para a capa esquerda, queremos também definir o tempo de loop a ser ativado. 9. 08 scripts de animações inimigas: Ok, agora vamos continuar preparando as animações para o inimigo Agora, a próxima coisa que precisamos fazer é acessar a pasta prefabs e, em seguida , abrir os prefabs inimigos pressionando os prefabs abertos aqui no inspetor, e ele entrará nos modos prefabricados e Agora, aqui no inimigo, podemos deletar o objeto cubo Para o inimigo, também podemos excluir a malha, o componente caps mash filter e também a renderização da malha Só temos o colisor, o agente de malha, o corpo rígido e o script inimigo Agora vou arrastar o modelo robô Kyle. Vamos até o arquivo do modelo e , em seguida, arraste-o como um objeto filho. Agora, se formos para a perspectiva ou a visão isométrica da vista direita, se eu selecionar o inimigo, você verá que o robô está basicamente nessa posição aqui Vamos apenas alinhar o objeto do jogo do robô à base do colisor e do agente NM Selecione o robô Kyle, basta mover isso para baixo. E aí está. Também podemos ajustar a altura da cápsula. Vamos selecionar o colisor de cápsulas. E se você ultrapassar a parte superior do codificador de cápsulas, verá um quadrado amarelo muito pequeno É como uma alça e você pode arrastá-la, arrastá-la e movê-la, para que fique alinhada com a parte superior da cabeça do robô Para o agente de massa NF, podemos alterar a altura, e aqui temos o valor do nosso planador de cápsulas, basta selecionar a cópia do valor da altura e colar isso dentro do valor de altura do nosso agente Nap mas e colar isso dentro do valor de altura do nosso agente Nap Teremos a mesma altura. Agora que temos essa configuração, precisamos criar um controlador de animação. Se formos para a pasta de animações, vou criar outra subpasta dentro da pasta de animações e vou chamar esse controlador Aqui, vou criar um controlador de animador e vou chamar essa base de inimiga Se clicarmos duas vezes aqui, você verá que temos essa janela do animador aberta Precisamos montar uma árvore sem graça. Indique aqui e esse será o estado padrão. Dentro dos três brandos, teremos as opções para alterar o tipo dos três brandos Vou usar um livre de direcional, dois d livre de direcional, ele precisa de um parâmetro Se acessarmos o parâmetro, ele criará automaticamente um parâmetro flutuante com o nome de bland Vou criar o outro parâmetro float. Essa será a velocidade x. Vou renomear isso clicando duas vezes nele e chamando isso de velocidade x, e essa será a velocidade z. E agora vamos usar as velocidades x e Z como parâmetros do nosso tipo de plano três aqui. Precisamos criar alguns movimentos. Vamos apenas adicionar o campo de movimento. Precisamos de cinco moções. O primeiro movimento será o rifle mirando em marcha lenta, este aqui, queremos ter um valor para a posição x 20 e a posição y 20 As posições x e y correspondem ao valor da velocidade x e da velocidade z aqui. A outra coisa que precisamos é do rifle Run Forward. A terceira seria a capa esquerda. Escolha a tampa esquerda novamente aqui. Para o último, esse seria o rifle Run Forward. Basicamente, vamos inverter as duas últimas animações. Isso irá para o lado direito e será executado para trás Para reverter a corrida para frente, precisamos alterar a velocidade para menos uma na entrada da animação, o rifle de avanço Para a capa esquerda, queremos habilitar a animação espelhada, para que ela espelhe a animação. E agora precisamos mudar seu valor aqui. Se estivermos em marcha lenta , queremos definir a posição x e a posição y20 e, se corrermos para frente, queremos definir a posição O valor z deve ser um para acionar essa animação, mas a velocidade x deve ser zero. Para a tampa esquerda, queremos definir esses dois negativos, corretos, e para a direita, que a tampa esquerda inverteu com as opções de espelho aqui, queremos definir esse 212 positivo e a posição Y 20. Para as corridas frente que são invertidas em termos de velocidade de animação aqui, queremos definir a posição x20 e a posição y dois menos um Agora temos uma configuração muito boa aqui. Se pressionarmos “plea” e eu expandir isso, você verá que temos a animação ideal Mas se começarmos a modificar a velocidade x aqui, você verá que ela vai para o lado direito e aqui, ela vai para o lado esquerdo, como você pode ver aqui Se definirmos a velocidade z como um, ela avançará e começará a retroceder E podemos testar isso arrastando, acho que podemos arrastar isso ainda Veja, se eu mover isso para o lado, teremos um movimento ligeiramente deslocado ou inclinado, e ele combina muito bem Como você pode ver aqui. Agora, configuramos a árvore sem graça corretamente. Vamos colocar isso de volta em zero, zero. Agora precisamos ir para a camada base e começar a configurá-la para que funcione com o script. Vamos voltar à visualização da cena aqui e selecionar o robô kyle, e agora queremos direcionar o controlador inimigo básico para o controlador robô kyle dentro do inspetor e deixar a aplicação de movimentos raiz Vamos ver o roteiro do inimigo. Agora precisamos adicionar uma variável privada do animador, vamos digitar animator e vamos chamar isso de my No início, queremos pegar o componente my digitando my igual e, em seguida, queremos obter Mas desta vez queremos colocar o componente em crianças. Por que isso? Porque se voltarmos para D, você verá que o script está no pai e o animador está no objeto filho Vamos voltar ao script aqui e pegar o componente animador A outra coisa que precisamos fazer é criar um método chamado Run blend. E guarde isso. Agora, a animação impulsionará a tradução ou o movimento dos inimigos. Precisamos desativar a posição de atualização nos componentes do agente. Basta digitar agente, atualizar a posição e definir isso como falso. A outra coisa que precisamos criar é uma variável privada para três. Vamos apenas digitar o vetor três como o tipo ou a classe, e vou chamar esse movimento de local. Ok. Agora, dentro do método run blend, queremos verificar se o m não está ou se o m não está desativado, então ativado, mas com o sinal de exclamação Então, queremos voltar. Mas se estiver ou se estiver desativado, queremos voltar. Esse método não será executado. Agora precisamos verificar se o agente está na próxima posição. próxima posição é basicamente obter ou definir a posição de simulação do agente NMS Dessa forma, obtemos a próxima posição, a posição simulada, e queremos subtrair com nossa posição atual Queremos verificar a distância dessa posição usando uma magnitude quadrada. Podemos usar a magnitude, mas a magnitude quadrada tem melhor desempenho porque não há operação de raiz quadrada É menor que, por exemplo, um valor muito pequeno de 0,01 Então, queremos ter certeza de que as animações estão sendo executadas para traduzir o inimigo Aqui dentro da declaração, queremos modificar o movimento local para a direção desse vetor aqui. Vamos apenas digitar ou simplesmente duplicar esse vetor de cálculo Mas queremos nos basear na transformação local do objeto do jogo de anime. Vamos apenas obter a transformação e depois usar a direção inversa da transformação Como esse é um método, quanto a uma direção de fator três, como você pode ver aqui na ajuda , estamos inserindo essa direção nesse método aqui. Certifique-se de colocar uma vírgula no final da linha. Agora, fora dessa instrução if, queremos acessar a variável anim, que é a companheira do animador Em seguida, queremos definir o valor flutuante, que é o, isso deve ser string, velocidade X, e isso deve ser nomeado corretamente como aquele dentro do animador Janela aqui, os parâmetros do animador. Agora, queremos passar o ponto local do movimento x. Então, para a próxima linha, ele deve ser o ponto flutuante definido para a velocidade z, e este seria o movimento local z. Agora, para testar isso, podemos simplesmente executar o método dentro do método de atualização Vamos executar o plano de corrida aqui e salvar isso. Vamos experimentar e voltar ao aplicativo UT. Vá até a cena aqui. Se sairmos dos pré-fabricados, você verá que nossos dois inimigos trocam ou mudam para o objeto do jogo do robô. Como se trata de um pré-fabricado, ele é afetado Agora, se insistirmos em plea, vamos testar isso. Ao parar, quando aparecer, ele deve reproduzir a animação correta. Há um problema aqui. Desculpe, há um erro de digitação no código aqui do meu lado. Basicamente, precisamos ter certeza de que a magnitude quadrada é maior que esse valor e, em seguida, queremos calcular o movimento local. Significa que, se a posição de transformação ainda não chegou , queremos calcular o movimento com base na direção. Agora vamos voltar para a unidade e pressionar para testar isso. Se pararmos aqui, ele deve começar a tocar. Aí está. Mas ele se move mais longe, como você pode ver aqui, o inimigo, porque o objeto do jogo principal fica aqui e o que está se movendo é o objeto do jogo infantil. Precisamos ter certeza de que o movimento raiz do nosso animador ou das animações está direcionando o objeto principal do jogo Vamos criar um script para isso. Aqui dentro da pasta de scripts, vamos criar um script CO e vamos chamar esse animador de movimento Em seguida, queremos excluir o início e o método de atualização do assunto, mova aqui. Vamos salvar o script inimigo. Aqui, queremos criar um método on animator move, que é um método incorporado do Unity, e esse retorno de chamada será invocado em cada quadro após as máquinas de estado e a animação terem sido avaliadas, mas antes no Vamos apenas usar isso. Basicamente, precisamos do componente ym. Vamos criar um animador privado, chamá-lo de anym, apenas recriar o método start e, em seguida, para o an ym, vamos pegar Dentro do movimento do animador, queremos deslocar a posição panorâmica da transformação com base na posição Delta da animação Desculpe, não isso aqui, mas dentro da anima, mova-se o movimento do animador Queremos acessar a posição de transformação de Parn e, em seguida, queremos incrementar isso pela posição m Delta Isso, eu sou isso e vamos voltar para a unidade. Aqui, vamos apenas modificar o prefep, então eu atualizo o objeto do jogo anima aqui na cena Vamos apenas abrir o prefácio. Sob o objeto do jogo Robot Kyle, aqui, objeto, queremos adicionar o script de movimento do animador Como você pode ver, uma vez que adicionamos o script de movimentação do animador aqui, o movimento raiz é tratado pelo animador reconhece que, dentro do script, temos isso no método do animador ou no callback, e vamos voltar à nossa cena aqui e Agora vamos tentar e ver se isso resolve o problema. Agora, se pararmos, veremos o robô aparecendo. Agora está se movendo e uma vez que chegou, parou, como você pode ver. Aí está. Agora temos os robôs os robôs e as animações funcionando No próximo vídeo, continuaremos com as implementações da animação 10. 09 Correção e animação de acerto do movimento inimigo: Vamos continuar trabalhando no roteiro do inimigo e vamos suavizar alguns movimentos neste vídeo. Vamos dar uma olhada no que temos agora, e eu vou apertar play. Você verá que, quando selecionarmos o inimigo e ativarmos o Gizmo, você verá que o agente do NMS está se movendo mais rápido e E se eu tentar jogar isso de novo, você verá também que o objeto robô ou o objeto do jogo estão atravessando a parede. Se eu fizer isso aqui embaixo, na janela do jogo, você verá que, se tentarmos repetir isso e eu pressionar play, você verá que o agente se moverá corretamente, evitando a parede, mas o objeto do jogo está tentando obter a direção mais próxima do dispositivo do agente aqui, o dispositivo do agente de malha N. Precisamos corrigir isso. Vou reverter o layout aqui. Para corrigir isso, vamos abrir o script inimigo, e agora eu abri aqui, e vamos criar algumas modificações dentro do método run bland A primeira coisa que precisamos mudar é que, em vez de medir ou comparar a magnitude quadrada entre a posição de transformação e a próxima posição do agente, podemos simplesmente pegar a distância restante do objeto agente. Digitamos a variável do agente. Podemos obter a distância restante e verificar se a distância restante é maior que 0,01 Então isso significa que ainda não chegamos ao destino. Também podemos usar a velocidade do agente em vez de calcular a direção Vou pegar a velocidade do agente aqui. E eu quero ter certeza de que o agente de bagunça NaF permaneça junto com o objeto do jogo ou com a transformação principal Aqui podemos colocar abaixo aqui, podemos digitar Agente, a próxima posição, e podemos atribuir a próxima posição à transformação. Basicamente, o que esse código está fazendo é garantir que a malha NaF não vá tão rápida quanto antes e grude no objeto do jogo Agora podemos salvar isso e vamos tentar. Vamos até a visualização do jogo e aperte play. Se eu destacar o inimigo aqui, você verá que agora a malha NF permanecerá com o planador da cápsula quando se move Aí está. E há um problema quando chegamos, então precisamos corrigir isso. Mas se você der uma olhada, verá que quando a bunda começar a se mover, ela se move corretamente. Ele segue o caminho. Ele não percorre mais o mundo porque estamos compensando a próxima posição da malha NAF até nossa posição de transformação , a cada quadro Então, estamos obtendo a velocidade, e ela faz com que a animação se mova com base em sua velocidade Mas depois disso, estamos corrigindo a próxima posição do agente Agora podemos ajustar isso ainda mais. Primeiro, podemos normalizar esse valor aqui. Então, é o primeiro sabor, e queremos adicionar uma condição else e, para a condição else, basicamente queremos definir o valor local do movimento 20 sempre que chegarmos. Vamos apenas digitar movimento local igual ao fator 30 e salvar isso. Agora vamos voltar ao Unity e experimentá-lo. Agora ele começa a se mover e, quando chegar, deve parar. Sim, ainda temos problemas. OK. Agora podemos mover essa linha aqui para estar dentro da instrução if aqui. Queremos ter certeza de que estamos atualizando a próxima revista quando ainda estivermos em movimento e, quando chegarmos ao destino, não queremos executar esse comando. Vamos jogar isso de novo. Agora ele se move e, quando chega , para. Aí está. Mas você vê que a transição de parada, animações duplas fazem uma transição muito abrupta. Precisamos corrigir isso. Vamos voltar ao estúdio fical. E aqui vamos adicionar uma árvore vetorial e depois executar o método erb Sem esquerda. Basicamente, esse lb interpolará dois vetores do vetor A, para o vetor B, queremos usar esse valor aqui, e para o vetor A, será nosso movimento local anterior Vamos usar o movimento local. Depois do vetor B, precisamos passar um float como valor de interpolação Vou usar o valor de dois aqui e multiplicar isso pelo tempo Delta T. Agora que temos isso. Quando chegamos, também queremos o valor vetorial desse vetor 30 aqui. Vamos apenas criar um novo método vetorial e, em seguida, passar o movimento local como vetor A e vetor B. Queremos definir esses dois vetores 30. Vamos definir o mesmo valor para o valor de interpolação a ser multiplicado por deta. Vamos E vamos voltar ao Unity e jogar novamente para ver se isso resolve o problema ou não. Agora, quando o inimigo começar a se mover, podemos ver que as animações pararão muito bem. Aí está. Corrigimos o movimento e agora o inimigo seguirá o movimento do agente do NAPM muito de perto A próxima coisa que precisamos criar é criar uma animação sempre que a bunda for atingida pela bala Vamos para a pasta prefs e vamos abrir o inimigo atualmente em um inspetor de depuração Vou voltar para o inspetor normal e, em seguida, pressionar abrir prefet Aqui, se eu selecionar o robô Kyle aqui, vá até o animador Vamos para a camada base. Só temos essa planta. Precisamos criar dois estados diferentes, e o primeiro deve ser o estado principal. E o segundo será o estado morto. Me desculpe. Esse deveria ser o sucesso e aquilo. Oh, eu cometi um erro aqui. Vamos apenas renomear esse estado padrão aqui. Esse deveria ser o plano três, e esse será o sucesso. Para a animação de sucesso, vamos escolher a reação do golpe e, para os mortos, vou escolher a foto frontal da morte Vamos criar uma transição de qualquer estado para o estado atingido e de qualquer estado para o estado morto. E vamos fazer transição do hit back para os três mais brandos aqui Provavelmente podemos reorganizar isso melhor. Precisamos criar alguns novos parâmetros dentro do animador Vamos criar um gatilho e este será disparado e outro gatilho. Morto, e também vamos criar um bulion, e digamos que isso está morto Portanto, o gatilho morto acionará a animação morta, e o bulion será um cofre ou uma verificação segura para a animação de sucesso Portanto, só podemos acessar a animação de sucesso quando somos baleados e ela é falsa. Agora vamos voltar ao roteiro aqui. E queremos definir quando o bot é isso, então queremos acionar a animação. Vamos tentar acionar a animação, definir o gatilho, e devemos acionar a animação morta. Também queremos definir o conjunto b, que seria o is b e a string deveria ser a mesma com o nome do nosso parâmetro aqui na janela do animador Vamos definir isso como verdade. Sempre que ainda estivermos vivos, precisamos adicionar uma condição else e, se ela ainda estiver viva, queremos jogar o gatilho hit, hit, shot gatilho e salvá-la. Agora, vamos atribuir aqui a transição de condição de qualquer estado a ser atingido, queremos adicionar um gatilho e garantir que sempre seja falso. O valor será falso por padrão. Para os mortos, queremos definir que queremos usar o gatilho morto. Precisamos ter certeza de que o horário de saída está desativado e, para retornar ao t brando, queremos ter certeza horário de saída é verdadeiro e não há nenhuma condição Ele voltará automaticamente ao tom suave sempre que a reação de golpe terminar de ser reproduzida OK. Agora, se verificarmos o roteiro, novamente, acho que está bom. Vamos testar isso executando o jogo e eliminando o bug quando ele chegar. Aí está. Ele reproduz a reação de sucesso. Oh, não podemos verificar os mortos porque os destruímos imediatamente, então podemos adicionar o atraso na destruição. Adicione um coma aqui, e então talvez possamos definir o atraso de dois 4 segundos por enquanto e voltar para a unidade, e vamos testar isso novamente. Um, dois, três, e está morto. Sim. Após 4 segundos, ele será destruído. Sim, aí está. Aqui neste vídeo, corrigimos o movimento, agora está muito melhor do que antes, e também adicionamos a reação do chapéu e a animação da morte. 11. 10 efeitos de sucesso básicos: Olá, neste vídeo, vamos criar os efeitos de partículas na superfície Então, quando queremos criar um recurso, sempre que fotografamos no chão ou na parede, queremos criar um efeito de partícula Então, para fazer isso, vamos criar um novo script C shop. E vamos chamar esse efeito. E vamos abrir o script. E neste script, queremos implementar a tabela Vamos fazer isso e, em seguida, vamos implementar a interface, para que ela crie o método público. Não precisamos do método uplate para esse script. E agora precisamos criar um campo em série para manter as preferências de partículas A partícula eff prefere. Vamos chamar essa partícula de prese ou eff prefs. Vamos salvar isso. Também queremos criar um sistema de partículas privado E vamos chamar isso de cache de partículas ou FX, talvez descreva melhor a variável E, para começar, queremos instanciar isso e criar esse objeto como filho desse objeto do jogo que contém esse script aqui E para as preferências de efeito, ele deve ter um sistema de partículas. Portanto, precisamos ter certeza de que o objeto que faz referência a essa variável aqui deve ter um componente do sistema de partículas anexado a ele Então, queremos verificar se as preferências do efeito não são nulas e, em seguida, queremos instanciar Então, vamos criar uma nova referência de objeto de jogo, efeitos temporários, e vamos apenas instanciar os efeitos perfeitos, e queremos definir esse objeto de jogo Então, vamos digitar transform. Em seguida, queremos definir a variável de cache de efeitos para os componentes do sistema de partículas de objetos do jogo que estão anexados a ela Vamos apenas digitar cache aqui e, em seguida, pegar o item de efeito e digitar get component particle system OK. Então, agora criamos isso. Queremos reproduzir a partícula sempre que esse método for acionado Então, vamos excluir isso e verificar se o cache do FX não é nulo Desculpe, coloquei o parêntese errado ali. O cache FX não é nulo, então queremos definir a posição do cache de efeitos como o ponto de vida Defina também a rotação, corte o normal e reproduza o efeito de partícula Vamos fazer isso. Podemos pegar o cache do sistema de partículas aqui e, em seguida, digitar a posição do tipo de transformação, e podemos definir isso até o ponto E também podemos definir a rotação acessando a variável do sistema de partículas A rotação da transformação, e podemos pegar usando a rotação com aparência de quatérnio, e queremos encarar o normal do ponto de vida ou a variável de impacto Cas Então, agora podemos salvar isso. E então também queremos tocar a partícula. Então, podemos simplesmente acessar o método de jogo. E como o cache Flex é um sistema de partículas , podemos acessar diretamente o método play Então, vamos salvar isso. E vamos tentar. Ok, aqui, se eu selecionar o cubo aqui, podemos adicionar os efeitos ha e ele pedir um ef prefab Então, se formos para esta pasta de exemplos de efeitos e, em efeitos de armas, em pré-fabricados, você verá que temos um impacto de metal Vamos apenas usar isso. Mas em vez de usar esse pref, vou duplicar esse prefab pressionando Control D e vou modificar Dessa forma, teremos o prefe original e sempre podemos duplicar os prefabricados originais quando quisermos fazer modificações neles Então, vamos direcionar isso para a pasta prefes. E eu vou abrir os prefbs e precisamos modificar Como as partículas residem no objeto filho aqui, vamos criar uma modificação. Podemos simplesmente remover todo o remetente aqui, e o filtro, também o colisor, e podemos duplicar sistema de partículas copiando o componente e depois copiando o componente e E queremos arrastar as faíscas, poeira e o decalque como filhos disso e simplesmente excluir isso Agora, se formos até os subemissores, você verá que eles ainda têm a mesma referência E como você pode ver, ele emite uma certa forma de lança. B aqui sob a forma, temos um hemisfério, queremos usar, eu acho, em vez de usar uma lança, deveríamos usar um cone Sim. Aí está. Agora temos o cone voltado para aquele lado. E provavelmente podemos mudar a direção do spawn aqui configurando o botão vamos verificar as faíscas Podemos girar o objeto filho. Vamos girar esse conjunto para 20, e agora ele deve estar voltado para a direção correta Ok, vamos selecionar todo o objeto do jogo infantil e definir o valor y 20. Então eu encaro da maneira correta. OK. E agora queremos ter certeza de que a partícula não está girando Vamos apenas desativar o loop e pressionar play. E está girando. Então, queremos definir a taxa ao longo tempo sob o painel de emissão para zero e definir a emissão de partículas usando birst Vamos pressionar mais nos pássaros aqui e definir isso. 21 deve ser suficiente. Para a criança, também queremos definir isso. Isso já está configurado corretamente, então vamos verificar também a poeira. Está usando burst a maior parte. OK. Então, se pressionarmos ph play apenas uma vez. Vamos parar e pressionar play novamente. Sim. Aí está. E queremos definir o mundo espacial de simulação para todas as partículas aqui Vamos selecionar todas as partículas e definir o mundo espacial de simulação OK. Agora, se tentarmos jogar novamente, sim. OK. Dessa forma, garantimos que a partícula não faça loops e só queremos reproduzir a partícula sempre que invocarmos o método de reprodução do script aqui e só queremos reproduzir a partícula sempre que invocarmos o método de reprodução do script OK. Outra coisa que precisamos configurar é que queremos desativar as opções de reprodução ao ativar na partícula mãe, então vamos fazer isso Portanto, a partícula não é reproduzida sempre que instanciamos Vamos voltar para a cena aqui e salvar a cena. E selecione o primeiro cubo aqui, e queremos arrastar os prefabs de impacto de metal da nossa pasta de prefes para os prefabs de para os Agora vamos salvar isso. E se apertarmos play, vamos tentar. Aí está. Se fotografarmos na superfície, você verá que temos o efeito de partícula instanciado E o bom disso temos apenas uma partícula, mas estamos basicamente movendo a posição da partícula com base em nosso tiro ou rac de impacto como local de impacto, e tocamos E como o espaço das partículas é rolado, essas partículas permanecem naquele local, mesmo que clicemos em outra área e movamos o p, não o pai, desculpe, movemos o objeto do jogo do sistema de partículas Como você pode ver aqui, temos traços de nossa invocação ou jogo de partículas anterior Então, agora temos essa configuração. Podemos simplesmente duplicar o componente aqui. Desculpe, eu colei por engano. Então, eu vou apenas desfazer isso. E podemos copiar o componente desse componente de efeitos de sucesso e , em seguida, selecionar todos os outros e, e podemos colar isso como novo. OK. Esses e, no próximo vídeo, são os efeitos básicos de golpe e, no próximo vídeo, criaremos efeitos de golpe específicos para o inimigo sempre que fecharmos o inimigo. 12. 11 efeitos de acertos inimigos: Oi. Neste vídeo, continuaremos nosso projeto de jogo virtual Cp. E neste vídeo, vamos criar os efeitos de golpe para o inimigo. Portanto, para criar efeitos de golpe no inimigo, podemos simplesmente reutilizar o script anterior que criamos, que é o efeito de golpe, e atribuir o efeito Mas há um problema aqui. Isso não funcionará imediatamente porque o script inimigo também implementa I hitable, e os efeitos de golpe também implementam isso Então, se dermos uma olhada aqui no script do player aqui, você verá que sempre que o jogador pressionar o botão esquerdo do mouse e começar a atirar, ele detectará apenas um componente afetado Portanto, precisamos mudar isso para que funcione com vários hits ou com um componente múltiplo que implemente I hitable Então, vamos fazer isso. E primeiro, vamos mudar a classe itable aqui para uma matriz, e vamos chamá-la de itables E então vamos usar o método get components, o caso pleural para o método get component Então, queremos verificar se os hits não são o comprimento de u e hables É maior que zero. Isso significa que temos pelo menos um componente adequado dentro dessa tabela, em uma matriz atingível Então, queremos executar esse código dentro da instrução. Vamos usar uma declaração de quatro cada e, basicamente, podemos criar uma tabela em uma matriz ou coleção Vamos cortar isso aqui e colar isso dentro das quatro frases de cada frase. Vamos salvar isso. E agora vamos voltar à unidade. E eu já preparei uma preferência de efeito, e ela está anexada na descrição desse curso aqui, dê uma olhada Basicamente, precisamos importar esse pacote. É chamado de pacote de unidades elétricas FX e, quando acabou de ser importado. E aqui, ele usou a textura do exemplo de efeito de partícula da unidade Portanto, não precisamos reimportar isso. Podemos apenas importar o pré, as preferências elétricas e a importação da prensa E agora temos essas preferências. Se clicarmos duas vezes nas preferências, você verá que temos um efeito elétrico muito bom Aí está. Vamos usar isso como preferência de efeito para o inimigo. Vamos abrir as preferências do inimigo e queremos mudar isso no nível de pré-fabricados Então, vamos adicionar o componente Hat ex novamente e selecionar o arrasto elétrico fx como preferência de efeito no componente at ex. E se voltarmos à cena aqui, veja que temos vários componentes, basta remover este. OK. Aí está. Usamos o componente hit ex que adicionamos no nível de prefabs e vamos salvar a cena E isso deve ser aplicado também ao outro inimigo. Sim. E agora, se apertarmos play, começaremos a atirar no inimigo. Vou desativar o aparelho para que possamos vê-lo melhor. Aí está. Teremos um efeito elétrico muito bom. Aí está. E ainda funciona na parede, independentemente das mudanças no script do nosso jogador aqui. Porque ele pegará qualquer quantidade de table ou qualquer quantidade de componente de script que implemente hittable Então, se houver apenas uma, essa roda de aço será executada. 13. 12 adereços explosivos: Olá novamente. E neste vídeo, continuaremos nosso projeto de jogo Virtual Cp. E neste episódio, vamos criar itens explosivos ou adereços que podemos atirar e depois explodir e também causar danos ao inimigo Então, para fazer isso, vamos criar primeiro o prefexo de explosão Se examinarmos os exemplos de efeitos e a explosão de incêndio na pasta de preferências, teremos esse grande prefácio de explosão Vamos apenas duplicar isso. E então queremos ir para a pasta prefs, desculpe, não para a pasta prefs Queremos arrastar o prefet duplicado para a pasta prefet para a pasta prefet Vamos fazer isso. E agora temos uma versão duplicada dela. Se eu clicar duas vezes aqui, você verá que temos uma explosão muito boa. Atualmente, ele é configurado para ser repetido, então queremos desabilitar isso. Selecione todo o objeto do jogo e o objeto do jogo infantil aqui, e todos eles têm esse componente de sistema de partículas anexado a ele, ou seja, desative as opções de loop Agora, se eu for até o objeto mais antigo do jogo e pressionarmos play, ele só será reproduzido uma vez. Aí está. E agora vamos criar o script de explosão que trata da aplicação de danos após a explosão e vamos para a pasta de scripts. E eu vou criar um novo script ChoB, e vou chamar isso de dano de explosão E vamos abrir esse equipamento. Agora podemos criar algumas variáveis. O primeiro deve ser o raio de dano do flutuador. O alcance do dano da explosão, que distância essa explosão danificará o inimigo ou outro objeto que tenha implementado a interface compatível. Também queremos criar um atraso na flutuação até que seja destruído. Sim. Então esse será o atraso, quanto tempo falta para que esse objeto de explosão do jogo seja destruído, e não precisamos do método do objeto, então vamos excluir isso. E agora queremos criar um método, um método embutido chamado dro Gizmos selected E isso é basicamente para lidar com qualquer Gizmos quando esse objeto é selecionado Queremos acessar a classe Gizmos e acessar a cor. E eu vou definir a cor para vermelho. Então, com a cor de pontos dos gizmos, isso aplicará qualquer Geismo que implementarmos abaixo desta linha aqui a E, por exemplo, se implementarmos alguns códigos aqui e depois implementarmos outra mudança de cor para verde, por exemplo, essa implementação afetará todos os Geismos que implementamos após essa linha aqui Então é assim que as cores de pontos dos gizmos funcionam. Então, vamos deletar isso. E então vamos deletar toda essa linha usada, e vamos acessar a classe Gizmos novamente, e podemos desenhar alguns dos nossos vários cubos, e podemos desenhar alguns dos nossos rustum , gutura Vou usar a esfera de arame. E isso é um método. E para o centro, vou usar a transformação da posição do objeto de jogo com dano de explosão aqui. E para o raio, você adivinhou que vamos usar esse valor aqui Então, eu apenas dupliquei isso e colo aqui. E segurança. E se voltarmos à unidade aqui, você verá que se aplicarmos o script de dano de explosão, você verá que se aumentarmos o raio de dano, teremos um indicador de raio Então, quando aproximamos o tamanho do raio de dano na tela, podemos estimar o tamanho ideal antes que essa explosão afete Então, vamos definir esse 23. E aqui, se formos para a vista superior aqui, você verá que pressione play, a explosão tem aproximadamente o tamanho de três em termos de raio Isso deve ser suficiente. Para o atraso até a destruição, podemos verificar a duração, que atualmente é de 2 segundos. Vamos definir o atraso até ser destruído para também 2 segundos, mas vou adicionar 2.2. Demorou mais até destruirmos esse objeto do jogo. Vamos voltar ao Fiscal Studio e continuar com o roteiro aqui. Agora queremos executar o método destroy e, em seguida, vamos destruir esse objeto do jogo após o atraso até a chegada dos segundos de destruição. Agora, a próxima coisa que precisamos fazer é criar um método e esse será um método personalizado. Vou chamar isso de dano de objetos próximos. Aqui, quando executamos esse método, queremos pegar todo o colisor dentro de uma esfera que estamos lançando Então, vamos criar uma classe de colisão aqui ou objeto e uma matriz de colider, e vamos chamar isso de colisor de chamadas E podemos usar a classe física para acessar seu membro do método e usar a esfera de sobreposição Isso também solicita uma posição e também um raio. Vamos apenas passar a transformação nessa posição e, para o raio, vamos usar o raio danificado Agora, teremos vários colisores armazenados dentro dessa matriz de chamadas e precisamos examinar esse colisor Vamos apenas criar uma declaração de quatro e. Para a variável, vou chamar essa chamada de Stans Form Collider, e para a coleção, podemos simplesmente pegar a coleção de chamadas aqui e salvá-la Basicamente, queremos verificar se a variável ou o objeto que estamos iterando no momento, queremos verificar se o objeto tem componentes habilitados anexados a ele ou não Vamos apenas criar uma matriz capaz, ou podemos simplesmente copiar o código do script do player. Vamos dar uma olhada. Podemos pegar isso e colar aqui. Aí está. Basicamente, precisamos mudar o quadril para o objeto do jogo de chamadas aqui. Vamos apenas digitar a chamada. Como isso já é o colisor, não precisamos acessar o colisor Vamos simplesmente deletar isso. E queremos passar um raio dentro dessa declaração if aqui. Então, basicamente, em cada olhar de nossos quatro aqui, queremos criar um raio lançado da posição central do dano da explosão para o objeto do jogo que atingiu Als preso a ele. Então, vamos criar uma nova projeção de raios , vamos chamar isso de hit. E então vamos criar outra declaração if. E essa seria a física que Rak tem, e vamos usar substituições na oitava anulação Então, queremos usar essa variante do método. Basicamente, queremos usar a origem da explosão e a direção, e o rac hit como parâmetro de saída Então, vamos digitar transformar essa posição aqui como a origem. E para a direção, podemos simplesmente pegar o objeto do jogo collider que estamos iterando no momento Pegue-o para transformar essa posição, e podemos subtraí-lo com a posição de transformação E com a subtração de fatores, obteremos a direção da posição central até a posição do posição central até a posição jogo do colisor Aqui, para o terceiro método, enviaremos a operação de conversão resultante para o parâmetro ou variável de ocorrência que declaramos aqui e agora podemos salvá-la. Aqui dentro desse hables ou no segundo de cada loop aqui, podemos passar o hit cast como argumento para o método de hit e a segurança Mas, quanto aos danos causados pela explosão, queremos garantir que ele mate o inimigo com apenas um golpe. Precisamos modificar nossa interface ou a interface hittable. Também precisamos transmitir um dano inteiro e podemos definir esse padrão como um OK. Basicamente, com esse valor padrão, se não especificarmos o valor do dano , ele passará um como o valor do dano por padrão. Podemos simplesmente deixar a implementação anterior sem alterar o código aqui, por exemplo, o objeto dinâmico. Podemos, sim, ainda precisamos implementar os danos. Então, vamos digitar o dano, definir esses dois iguais a um. Vamos verificar o outro script. Para script inimigo. Também precisamos modificar a tabela de acerto. Sim. Aí está. Temos um erro. Vamos usar o método de acerto e, em seguida, adicionar um dano h igual a um. Agora, aqui no script inimigo, podemos usar esse dano para subtrair nossa saúde atual. Vamos apenas e com segurança. A outra coisa que precisamos verificar são os efeitos do chapéu. Sim. Precisamos modificar isso também no primeiro dano. Não usaremos esse número inteiro aqui, mas ainda assim, como implementamos isso em nossa interface, precisamos passar esses valores aqui E agora, se analisarmos os danos causados pela explosão, você verá que o método do chapéu agora em breve solicitará um dano inteiro Mas, como definimos o valor padrão como um, não precisamos passar isso. Mas para esse dano de explosão, queremos ultrapassar um valor muito alto, por exemplo, 100. Então, ele matará o inimigo instantaneamente e salvará isso. Posteriormente, também usaremos esse valor de dano para criar uma variante de arma em que podemos ter uma arma melhor ou maior que tenha um valor de dano maior. Para o script do player, no momento, podemos simplesmente iluminar isso como está. OK. Agora temos isso implementado. Precisamos executar isso no início. Vamos executar o método de dano próximo aos meus objetos no início e salvá-lo. A última coisa que precisamos fazer é criar um script de spawn on shot que gerará a explosão após o tiro ou Vamos criar um subscrito U, e vamos chamar isso de spawn em um let's just open this Para o script spawn on it aqui, esse é um script bastante simples, na verdade, então podemos excluir o método start e o método de atualização, e precisaremos implementar a interface able e, em seguida, vamos implementar a interface Agora vamos criar um campo de séries, e esse será o objeto do jogo Podemos chamar isso de pata pré-fabricada. Então, podemos criar outro campo Serres, que será A B e podemos chamar isso de destruição nele E vamos implementar o método hit aqui. Basicamente, queremos verificar primeiro se a pata p choose não é nula Para evitar a exceção de referência nula, e dentro dessa declaração , queremos instanciar a pata escolhida e definir o spawn no objeto de jogo atingido para jogo atingido E depois de transformar essa posição, queremos passar uma rotação padrão, que é quaternion E agora queremos verificar se o acerto é verdadeiro, então queremos destruir esse objeto do jogo. E o spawn do objeto do jogo será o objeto que gerou a explosão, por exemplo, ou qualquer outra coisa Por exemplo, um barril, barril de gás ou algo que seja explosivo ou inflamável Vamos salvar isso e voltar para o Unity. A próxima coisa que precisamos fazer é: já baixei esses ativos do Unity *** É grátis. É chamado de amostra Ci Barrels 40, e vou colocar o link para a descrição aqui Vamos apenas pressionar importar. Vamos apenas importar isso. Mas eu não vou importar a cena aqui porque não precisaremos disso OK. Vamos apenas importar isso. Depois de importado, vou direcionar a amostra da pasta sci fi barrel para dentro da pasta do jogo underscore game project Agora, vamos até o prefeito aqui e selecione o que queremos usar Provavelmente vou usar esse. Vamos apenas adicionar um barril branco S ao grupo de ambientes aqui, objeto do jogo E deveria estar em algum lugar da nossa cena aqui, está aqui, e vamos colocá-la aqui. Vamos apenas verificar o tamanho do. Acho que podemos colocá-lo lá. Vamos apenas esconder esse guia aqui. Não precisaremos mais disso. Vamos apenas desativá-lo e salvar a cena. Agora, se selecionarmos o objeto de jogo branco de barril aqui, adicionarei primeiro um colisor Precisamos de um colisor. Vamos adicionar um colisor de caixas e ele se encaixa Em seguida, queremos adicionar o componente spawn on hit. Para que o pref apareça, vamos até o suporte do prefixo e arrastemos a grande explosão que preparamos anteriormente, e vamos ativar a destruição ao acertar Agora vamos abrir a janela do console aqui e pressionar play. Então, vamos esperar um pouco até que o inimigo apareça. Aí está. Ele aparece e também aparece, e vamos atirar o explosivo aqui Aí está. Isso mata todo o inimigo. Portanto, é muito bom que tenhamos isso e possamos usá-lo para ajudar o jogador a navegar em uma área mais difícil. E se você der uma olhada aqui, temos um problema de que a distância restante de obtenção só pode ser acionada por um agente ativo. E isso está acontecendo porque aqui no runbland, estamos verificando se a distância restante do agente é maior que esse valor aqui, e isso é executado na atualização Então, depois que o inimigo é morto, estamos desativando o agente Aí está, e isso está causando um problema. Então, vamos adicionar uma condição aqui em cima da instrução if. E adicione se o agente estiver desativado. Basicamente, queremos verificar se o agente não está habilitado e, seguida, queremos retornar e salvar isso. E vamos tentar mais uma vez para ver se esse erro ainda está aparecendo ou está acontecendo ou não. Vamos apertar play e esperar pelo inimigo. OK. Então, agora vamos atirar no barril novamente. OK. Aí está. Matamos os dois inimigos e não temos mais esse erro. Sim, é assim que criamos adereços explosivos, e você pode usar qualquer outro tipo de explosão se quiser Basta adicionar o dano da explosão às explosões. 14. 13 Arma personalizada: Oi Neste vídeo, vamos criar um mecanismo de arma personalizado. Assim, podemos mudar arma com base na arma que pegamos e, se o MO acabar nessa arma, queremos voltar à arma padrão Ok, primeiro, precisamos criar um novo script CS, e isso derivará do objeto programável Então, vou criar uma nova subpasta dentro da pasta de scripts e vou chamar isso de objetos programáveis Aqui dentro da pasta de objetos descritíveis, vamos criar um novo script Shap, e vamos chamar essa arma Dados. E vamos abrir um script. Como esse script será um objeto programável, precisamos alterar o tipo de comportamento mono aqui para um objeto programável E o objeto programável é basicamente um script que podemos salvar como um ativo na pasta do nosso projeto, e ele pode conter e também um método E também queremos mover o método up aqui do script do player para os dados dessa arma. Queremos mover todo esse script ou código de tiro para os dados da arma aqui. Outra coisa que precisamos fazer definir um menu para criar um menu fixo aqui. Além disso, vamos criar um atributo e ele pedir dois argumentos. O primeiro é o nome do arquivo. Ambos são cordas. O primeiro é o nome do arquivo e o segundo é o nome do menu. Para o nome do arquivo, podemos definir esses dois nomes de arquivos como dados de armas iguais ou podemos adicionar dados de armas personalizados. Então, aqui dentro do nome do menu entre parênteses, queremos passar os dados da arma E feche isso com os pais e com segurança. Basicamente, isso nos permitirá criar esse objeto programável usando o menu dentro da pasta do projeto Vamos excluir a atualização e começar, não precisaremos disso Vamos criar dados personalizados aqui. Primeiro, precisamos criar um enumerador personalizado. Vamos criar um A personalizado aqui fora da nossa classe de dados de armas. Vamos digitar public am, e vou chamar esse tipo de fogo. E haverá um único e rápido. Rapid é para o tipo de arma automática e single é para a arma normal ou a arma padrão. Vamos criar as variáveis necessárias aqui. Primeiro, precisaremos do tipo de fogo. Vamos apenas digitar o tipo de fogo como o tipo de variável, e vou chamar esse tipo. E a segunda será a taxa, mas essa deve ser uma flutuação, então digite float e chame Vou definir esse padrão para 0,15. O próximo campo será um número inteiro e esse será o MO máximo. E o outro também seria um número inteiro e esse seria o valor do dano Também precisamos criar outro bleion para definir se os dados dessa arma são a arma padrão ou não Vamos apenas criar um bleion chamado arma padrão. E também precisamos declarar algumas variáveis privadas Primeiro, precisamos ter uma referência à nossa câmera. Vamos apenas criar um tipo de câmera privada. Vamos chamar isso de CM. Também precisamos ter uma referência ao script de nossos jogadores. Vamos chamar esse jogador, e também uma referência ao O atual, e também precisamos criar uma variável flutuante para manter nosso próximo tempo de disparo Ok. E como precisamos uma referência ao script do player e também à câmera, precisamos inicializar esse objeto programável usando um método, e esse método será chamado a partir do script do player Então, vou criar uma arma pública de configuração de vazio. E eu vou passar a câmera como primeiro argumento, e o segundo seria o roteiro do jogador. Eu também ligo para esse jogador. Ok. Então, dentro desse método aqui, podemos primeiro definir a variável KM aqui usando essa declaração, esse K igual, e isso será referido a essa variável aqui, a variável local que temos dentro de nossa classe, e isso será referido ao argumento que estamos passando aqui. O segundo deve ser de jogador para jogador igual, e também queremos definir que o próximo tempo de disparo seja zero, para possamos atirar imediatamente sempre que o jogo começar. Também para o MO atual, queremos preencher isso para o próximo MO que configuramos para o inspetor aqui Isso será tudo para a configuração da arma, e o outro método que queremos criar é o fogo vazio público Para incêndios, não precisamos ser públicos, então podemos definir isso apenas para ser privado. Vamos ver o script do player aqui, vamos copiar tudo isso aqui dentro do método de atualização. Desculpe, vou destacar todos eles, desde a declaração I até os colchetes de fechamento, clicar com o botão direito do mouse, pressionar copiar e colar isso dentro do método fire Teremos erros. Bom. Não há erros porque já definimos o CM aqui para que possamos usá-lo imediatamente. E eu vou criar um vazio público, e vou chamar essa arma de atualização E esse é o método que vamos chamar a partir da atualização do script do player, substituindo tudo isso aqui. Ok. Dentro da atualização da arma, basicamente, queremos verificar se o tipo de fogo é um tiro único ou um tiro rápido. Vamos apenas criar a instrução if e se o tipo for igual ao tipo de disparo único. Então, queremos ter outro código separado. Se for rápido, então devemos ter um tipo diferente de mecanismo de disparo. Na primeira, usaremos a entrada if, pressionaremos o botão do mouse e clicaremos com o botão esquerdo. Esse valor zero indica o clique esquerdo e, aqui dentro, queremos executar o método fire. Queremos rodar este aqui. Oh, desculpe. No método fire, não precisamos mais da instrução get button down de entrada. Então, vamos excluir isso e o último colchete aqui, e vou organizar isso voltando para o recuo E então, quando estamos atirando, queremos subtrair o MO atual E aqui, dentro do tipo de disparo rápido, queremos usar uma entrada que obtenha o botão do mouse. Zero. Portanto, este é para segurar e retornará o suporte sempre que pressionarmos o botão do mouse E isso ocorre somente no primeiro quadro quando o usuário pressiona o botão do mouse. Então, isso só aconteceu uma vez, e isso acontece em vários quadros, depende de quanto tempo o usuário está pressionando o botão esquerdo. E queremos adicionar uma declaração que a hora é maior do que a hora do próximo disparo. E teste seguro. Também queremos verificar se o MO atual é maior que zero. Também queremos verificar se o MO atual é maior que zero e queremos criar uma instrução if, e esta se o O atual for menor ou igual a zero. Para isso aqui, podemos simplesmente criar a instrução else. Aqui, vamos apenas digitar o log de bugs e o tipo O se esgota, por favor, recarregue Podemos simplesmente copiar esta linha aqui e colá-la aqui, para que ela envie a mesma mensagem. E agora, aqui, queremos executar o método de fogo e também subtrair o MO atual Então, queremos definir o próximo tempo de disparo para ser igual ao nosso tempo atual em que estamos atirando neste momento aqui e, em seguida, adicionar o valor da taxa Esse é o valor da taxa. Portanto, só poderemos atirar automaticamente neste momento ou se o tempo for maior que o nosso último próximo tiro. Haverá um intervalo entre os disparos. Embora seja muito curto, assim como uma arma automática, podemos alterar esse valor de taxa no inspetor, que possamos ajustar esse valor para se adequar melhor à característica de nossa arma, e vamos guardar isso Agora que temos isso na atualização da arma, também queremos criar uma condição de casal. E este seria se atualmente estivéssemos usando a arma padrão e pressionando o botão. Desculpe, para não apertar o botão, aperte a maioria dos botões. E este será o clique com o botão direito. É por isso que estou usando um como argumento. Em seguida, queremos reabastecer o O. A corrente O é igual ao MO máximo E isso é para a arma padrão. Queremos definir que podemos recarregá-la com a arma padrão, mas para uma arma personalizada, não poderemos recarregá-la E aqui, também queremos declarar se essa não é uma arma padrão, e o O atual é igual ou menor que zero, então queremos voltar para a arma padrão Mas ainda não implementamos isso no script dos jogadores, então vou digitar um comentário aqui. Ok, guarde isso, e acho que deve ficar tudo bem. Vamos ver o script do player. Vou arrastar o roteiro da peça para ser o local de nossos dados de armas, para que seja mais fácil trocá-lo. E agora podemos excluir com segurança tudo isso, a atualização. Vou criar um novo campo SURIs, e isso seria um dado de arma, e essa seria a arma padrão E eu vou criar uma variável privada, e vamos chamar essa arma de dados, e essa seria a arma perfeita. Na atualização, queremos verificar se nossa arma curn não é nova, então queremos usar a arma curn. E aqui, vamos criar um método público, e vamos chamar esse switch de arma. E para trocar de arma, precisamos passar os dados da arma como argumento, mas queremos definir um valor padrão de nulo aqui Portanto, podemos executar esse método sem passar nenhum argumento e ele passará automaticamente os dados uL para esse método aqui. Então, queremos definir o valor atual da arma para o que estamos passando aqui. Queremos verificar se não é nula, então queremos passar a arma e, se for nula, queremos passar a arma padrão Parece que eu digitei isso incorretamente, então deve ser a arma padrão E eu vou usar esse nome aqui. Então, basicamente, esse é um operador ternário. E se essa afirmação for verdadeira, ela será passada para a arma atual. Mas se isso for falso, então este será passado para a arma atual. E depois de trocarmos de arma, queremos usar a arma atual, configurar um método de arma e precisamos passar pela câmera. Então esse seria o CM aqui. E o próximo argumento é o próprio script do player, então podemos simplesmente passar essa declaração como um argumento. E aqui, sempre que começamos, queremos usar a arma do switch sem discutir. Então, estamos atribuindo a arma padrão à arma carino, e essa será a arma que usaremos dentro do método de atualização Vamos salvar isso. E para os dados da arma, eu também vou usar a arma de troca aqui dentro desta declaração if aqui. Então, basicamente, se não é a arma padrão e estamos ficando sem MO, então queremos voltar para a arma padrão. Então, podemos simplesmente acessar a variável player que preparamos. E vamos chamar o switch de arma, e não precisamos passar o argumento para devolvê-la à arma padrão. Guarde isso. Ok. Então, vamos voltar ao Unity aqui e experimentá-lo. A compilação já foi concluída. Então, se formos para a câmera principal aqui, agora temos um slot de arma padrão dentro da câmera ou do script do jogador. Vou criar uma pasta. Oh, desculpe, isso deve estar dentro do jogo, então vou arrastar isso dentro da pasta do jogo. E dentro dos dados, vou criar os dados da arma aqui. Como você pode ver, agora temos esse menu de ativos , criar menu de ativos. Então, vamos clicar aqui, e essa seria a arma padrão. E para a arma padrão, podemos definir essas duas armas simples, e para o valor do dano, podemos definir essa 21 e o máximo de MO 210, provavelmente, e vamos verificar essa arma padrão. E para a arma padrão, podemos selecionar a câmera principal e atribuí-la à arma padrão aqui. Ok. Então, agora eu vou criar outra arma e esta será uma metralhadora. E para a metralhadora, teremos um MO máximo de 13. Defina esse tipo de dois envoltórios e um maior valor de dano para mastigar, e eu vou desativar a arma padrão aqui. Guarde isso. Agora, vamos testar isso. Basicamente, esse código aqui ainda não funcionará porque precisamos implementar a coleta de armas mais tarde. Mas vamos testar isso se você perceber que, se alterarmos os dados da arma, o script do jogador funcionará? Vamos testar isso. Vou apertar play. Agora eu só posso atirar uma vez a cada clique. E precisamos atirar três vezes para matar a bunda. Desculpe, há um problema com a bunda aqui. Vou verificar isso primeiro. Não tenho certeza do que estava causando o erro antes, mas agora parece estar funcionando bem. Então, vamos tentar novamente. Agora usando a arma padrão, arma padrão. Preciso atirar três vezes um, dois, três, um, dois, três. Vamos mudar isso para uma metralhadora. Vou voltar para o objeto programável da metralhadora aqui Vou mudar o valor do dano para três. Então, veremos que só precisamos atirar uma vez para matar o inimigo, mas há uma coisa que precisamos modificar no script aqui. Na arma que temos aqui, temos o valor do dano declarado. Mas aqui, sempre que atingimos, não passamos um valor de dano, então o valor padrão é um, como você pode ver no casaco. Então, vou adicionar a variável de valor de dano como segundo argumento e segurança, e isso deve funcionar. E não precisamos testar a arma padrão porque é Desculpe, V. Sim, porque a arma padrão tem um valor de dano de um. Portanto, ele deve se comportar da mesma forma que antes, porque temos o valor padrão de um. E a metralhadora tem um valor de dano de três. Quando o inimigo saiu, podemos ver que podemos atirar uma vez e ele matará o inimigo imediatamente. Oh, desculpe. Eu esqueci de substituir isso. Ainda estamos usando os dados da metralhadora. Então, vamos mudar isso para a metralhadora e salvar a cena novamente. Ok. Vamos escrever. Você atira nesses robôs. Aí está. Um tiro e ele mata automaticamente. Então, sim, aí está. Temos uma arma personalizada e podemos criar várias armas diferentes, e podemos criar várias armas diferentes dependendo da característica da arma em si. 15. 14 recolhimento de arma: Então, vamos continuar com nosso mecanismo de armas personalizado. E agora vamos criar o mecanismo para pegar uma arma a partir de um bônus. Então, primeiro, vamos criar um script, e isso seria um novo script CH, e vamos chamar essa arma de coleta e isso seria um script muito simples, na verdade. Então eu vou abrir isso agora aqui, vá para o estúdio iso. Sim. Agora está aberto. Vou salvar novamente os dados da arma E aqui, precisamos criar um novo campo serializado, e esse será um tipo de dado de arma, e vamos chamá-lo de arma E também precisamos de uma variável privada do script dos jogadores, e vamos chamar esse jogador. E eu começo, queremos pegar o roteiro do player da nossa cena. Então, vamos digitar player igual ao objeto fino do tipo e passar o script do player como o tipo, e queremos remover o método de atualização. E, basicamente, queremos garantir que a arma pegue implemente a interface i hable Vamos apenas digitar o i hittable e vou implementar a interface automaticamente aqui E vamos excluir a exceção aqui. OK. Então, basicamente, sempre que disparamos esse objeto de coleta de arma, queremos fazer com que o jogador troque de arma e, em seguida, queremos passar essa variável de arma aqui. Então, isso configurará uma nova arma no lado do jogador, e podemos usar essa nova arma personalizada imediatamente quando atirarmos neste objeto do jogo. E então queremos destruir esse objeto do jogo. OK. Então, vamos voltar para o Unity, e vamos criar um novo cubo, e eu vou reduzir isso aqui, 20,6 Então vamos adicionar a arma, pegar o script. Se formos para a pasta de dados, queremos definir isso para a metralhadora. E vamos salvar isso. Se formos para a câmera principal, ou se selecionarmos o objeto da câmera principal, queremos definir a arma padrão volta para a arma padrão aqui. Vamos salvar isso e mudar o inspetor para a janela de depuração aqui para que possamos ver nossa arma atual Vamos renomear esse cubo aqui que acabamos criar como o coletor da metralhadora E vamos salvar isso como um pré-fabricado. Se formos para as preferências, vou arrastar essa metralhadora como um objeto preferencial, e vamos excluir essa da cena e duplicar esse objeto em Mas em vez de gerar uma explosão, vou gerar a metralhadora aqui e vou garantir que ela seja destruída ao ser atingida Vamos desabilitar esse aqui. Podemos apenas testar as preferências de coleta dessa arma. Guarde isso. Agora, se apertarmos play, vou tentar atirar e só posso atirar uma vez antes de atirar com a outra arma. E agora está vazio. Eu não posso mais atirar. Se eu clicar com o botão direito do mouse, poderei recarregar. Eu vou atirar neste cano, e você vê que ele mudou para a nossa arma, pegue e vamos clicar aqui Agora, se eu clicar aqui, se formos para a câmera principal, você verá que nossa arma atual é metralhadora. Vamos tentar filmar isso tantas vezes, e estou segurando o botão do mouse agora, como você pode ver. Agora, quando está vazio, ele volta automaticamente para a arma padrão. Obviamente, vamos implementar a interface do usuário, para que ela dê ao jogador uma indicação se estamos usando atualmente a arma padrão ou a arma personalizada, e também nos mostrará aviso ou uma mensagem se precisarmos recarregar nossa arma 16. 15 FX de arma: Oi. Neste vídeo, vamos criar um efeito de arma. Então, vamos começar. Primeiro, vamos para a scripts abaixo da pasta de objetos programáveis, abra o script de dados da arma Agora, queremos criar uma nova variável de campo S zero, e isso seria um tipo de objeto de jogo. Vamos chamar esse focinho de ex. Também queremos criar uma nova variável flutuante, que seria a escala ex. Provavelmente, queremos definir isso como 0,1 por padrão. Também queremos criar um sistema de partículas privado. Campo aqui, e vamos chamar isso de efeitos de cache. Aqui, dentro da arma de configuração, queremos adicionar uma declaração if e verificar se o efeito do focinho não é nulo Então, se não for nulo, queremos instanciar isso e salvar o componente do sistema de partículas como um Primeiro, precisamos criar um novo objeto temporário do jogo de objetos e queremos instanciar o efeito focinho E aqui, precisamos criar um novo método dentro do script do player, e vamos criar um novo vazio público E vamos apenas chamar o conjunto de efeitos musculares. Em seguida, queremos passar a transformação dos efeitos. E também precisamos criar uma nova transformação e vamos chamar isso de efeito criança. Primeiro, vamos verificar se o efeito filho não é nulo e, se não for nulo, queremos destruir o objeto filho do jogo Em seguida, queremos definir o objeto que estamos passando da arma para ajustá-lo a esse objeto do jogo. Então, queremos matar a criança. Para esses efeitos atuais que estamos passando atualmente. Guarde isso. Vamos voltar aos dados da arma aqui. E então queremos executar o script do player, que é o player aqui, e então queremos executar o método set muzzle effect E vamos passar o objeto do jogo tamp, mas precisamos passar o componente de transformação Vamos apenas digitar a transformação. Então, aqui abaixo, queremos armazenar em cache o sistema de partículas que está conectado a esse objeto do jogo Vamos digitar esse componente e, em seguida, vamos chamar o sistema de partículas E agora precisamos usar o método de fogo aqui. Sempre que disparamos, queremos reproduzir a partícula do efeito cache Para fazer isso, vou criar um novo fator três e, em seguida, vou chamar essa posição do focinho Vou usar o objeto da câmera e, em seguida, acessar o método chamado tela dois pontos mundiais e tela dois pontos mundiais como argumentos do fator três. Vou criar um novo e vou pegar a posição x do mouse no eixo x. Para o Y xs, vamos pegar a entrada mais na posição Y. Para o z xs, queremos definir um valor muito pequeno que esteja muito próximo da câmera Por exemplo, 0,2 deve ser suficiente, e então queremos terminar essa linha aqui. Outra coisa que queremos ter certeza é criar uma instrução if e, em seguida, verificar se os efeitos do cache não estão. Então, queremos executar esse código aqui. Vamos colocar a posição do focinho dentro da declaração if Então, vamos definir os efeitos do cache, a posição do transform do. A pausa no focinho que acabamos de criar. Em seguida, vamos definir a rotação do efeito de cache. A rotação do quatérnio, e vamos obter a direção do raio. Queremos usar a direção do raio aqui. A última coisa que queremos fazer é tocar as partículas. Vamos apenas chamar o método de reprodução de efeitos de cache e salvá-lo. Agora isso deve funcionar. Vamos voltar à unidade e testar isso. No exemplo do efeito, vamos aos efeitos da arma e, em seguida, nas preferências, temos essa carne muscular Vamos apenas duplicar isso e, em seguida, arrastar esse muscle flash duplicado para nossa pasta prefs E agora vou abrir o efeito do flash do focinho e modificar isso Se formos aqui, veja bem, na verdade já é um flash muscular muito bonito, mas precisamos alterar um pouco as configurações. Aqui, queremos desativar o loop, para que ele não faça mais loops, apenas Vamos definir a rotação y 20. Vamos sair dos prefabs e vou renomear esses objetos prefabricados para muzzle flash only. Aqui dentro da pasta de dados, queremos definir os efeitos de focinho para esse objeto do jogo Vamos apenas abrir os prefeitos e depois arrastar os efeitos do cano até o objeto programável de nossa arma e, para a metralhadora, também podemos usá-los Mais tarde, porém, podemos criar oito efeitos de focinho diferentes. Agora vamos testar isso. Se eu pressionar play, devemos ser capazes de ver o. Temos um problema aqui. Como você pode ver aqui, se eu selecionar a câmera, os planos de recorte são definidos 0,3 nas propriedades próximas, mas aqui, quando posicionamos o flash do focinho aqui, veja, definimos isso para um valor menor do que os planos de recorte um valor menor do que os planos de recorte Então, para corrigir isso, podemos simplesmente definir o valor próximo para um valor muito pequeno, digitar zero, e ele se encaixará em 0,01 e salvará Agora, se apertarmos play, novamente, podemos, mas temos um efeito muscular muito grande. Então, precisamos aplicar a escala que declaramos aqui. Se você ver aqui abaixo do campo serializado, temos campos de escala fX declarados, mas nunca usamos isso Então, para usar isso, podemos simplesmente ir aqui e inserir uma nova linha e acessar a escala do nosso objeto de jogo temporal, e então definir esse valor como igual ao vetor três pontos um, e eu quero multiplicar isso com nossa escala f X. E para o valor padrão é 0,1. Então, vamos escalar a partícula em um décimo de seu tamanho padrão Vamos voltar à unidade aqui. E se verificarmos a arma padrão e a metralhadora, teremos uma escala de efeito de 0,1. Então, se pressionarmos play agora, o efeito do focinho deve ser menor. Sim. Aí está. Se quisermos diminuir isso, podemos simplesmente definir esses dois valores ainda menores. E para a metralhadora, podemos configurá-la como um pouco maior do que a padrão. Então, vamos digitar 0,07 aqui. OK. Agora, se atirarmos, você verá que temos um flash de focinho muito pequeno Mas se eu disparar isso e depois pegar a metralhadora, você verá que temos um flash de cano maior OK. Há outra coisa que precisamos corrigir aqui. Se eu apertar play, você vê as partículas de impacto. Os decalques estão voltados para o lado errado. Basicamente, ele tem uma rotação celular. Devemos alinhar essa partícula com a parede aqui. Vamos abrir a partícula de impacto de metal aqui, o p, abrir aqui se expandirmos isso, vá até o objeto decalque me, e você verá abaixo do renderizador aqui, temos os conjuntos de alinhamento de renderização Vamos mudar isso para local e voltar. Vá para a cena aqui e vamos testar isso. Agora, se eu fotografar aqui, os decalques se alinham perfeitamente Aí está. Sim, isso é basicamente como criar efeitos de arma. 17. 16 extensões de ação de atraso: Neste vídeo, vamos criar um conjunto de ferramentas em um script de extensão. Para fazer isso, vamos até a pasta de scripts e, dentro da pasta de scripts, vamos criar uma nova pasta chamada extensão. Dentro dessa pasta, vamos criar um novo script do Shop e vamos chamar essa extensão. E vamos abrir isso. Então, para você que se pergunta sobre o script de extensão. Talvez alguns de vocês vejam com frequência que sempre que criamos controle ou detecção de entrada, estamos usando a classe de entrada dessa forma e, em seguida, estamos executando um método como get button ou get button down. E isso é basicamente uma extensão para fazer coisas relacionadas à entrada. E também podemos criar nossa própria extensão para outro conjunto de ferramentas o objetivo de fazer outras coisas Então, vamos deletar isso, e vamos começar o método upput E também vamos excluir a herança de comportamento mono E vamos definir essa classe para ser uma classe estática. E agora podemos criar um método estático que será usado em outra classe, e esse script não precisa ser anexado a um objeto na cena. Então, agora eu vou criar um novo método público estático, e vou chamar isso de ação retardada. E precisaremos de alguns argumentos internos. A primeira coisa, vamos usar essa palavra-chave, e então o tipo será comportamento mono, e eu vou chamar isso de B, e o segundo será uma ação, que possamos passar um método ou delegar para o segundo parâmetro Vamos apenas digitar a ação do sistema. E vamos chamar essa ação e salvá-la. E também precisamos criar um novo enumerador estático para fazer a rotina principal aqui Então, vamos chamar isso de rotina principal atrasada. E então queremos passar uma ação novamente. Vamos digitar system that action para declarar a classe de ação e, em seguida, vamos chamar essa ação E também precisamos de um flutuador como atraso. E aqui também precisamos passar um float como terceiro argumento E agora, dentro do enumerador, podemos simplesmente usar o rendimento, retornar um novo peso por um segundo e depois passar o atraso como valor E depois disso, podemos simplesmente executar a ação. Podemos verificar se a ação é nula ou não usando o ponto de interrogação e depois digitar dot Então, isso é basicamente verificar se a ação é nula ou não, e se não for nula, então queremos invocar o método dentro Então, segurança, e agora dentro da ação retardada, podemos simplesmente digitar o MV, que é nosso comportamento mono, porque a corrotina inicial só pode ser executada a partir de uma classe de comportamento mono, então precisamos passar isso, iniciar a rotina co, e então podemos passar o nome da corrotina, que é a corrotina atrasada que E então podemos aprovar a ação, que é a ação, e com o atraso, podemos aprovar o atraso. Segurança. E essa palavra-chave será uma extensão do comportamento mono Então, agora, se formos para o player skip, por exemplo, podemos usar essa extensão usando a palavra-chave dis, e isso se referirá a esse comportamento mono agora que temos o script do player, e então podemos executar a Como você pode ver aqui, agora temos esse método, e ele diz que é uma extensão ali. E agora podemos passar um método. E depois de passarmos o método, podemos passar o atraso. Por exemplo, se eu quiser executar um determinado método ou um determinado delegado e, em seguida, passar cinco para o atraso, esse delegado será executado 5 segundos após a execução do início Então, agora vou apenas criar um novo delegado aqui. E então eu vou criar um código. Vamos apenas digitar debug nesse log. E então vamos terminar o código aqui. Podemos simplesmente digitar execuções de ação atrasadas após 5 segundos e salvá-la. E isso reside no script do jogador. Agora, se voltarmos para o Unity, verificarmos o painel do console e pressionarmos play, você verá que teremos essa mensagem. Em 5 segundos. Aí está. Aqui, você vê que esse código dentro do delegado é executado após 5 segundos. Agora, criamos essa extensão de ação atrasada, e ela será bastante útil para executar um método atrasado ou um código atrasado, se necessário, e é assim que criamos essa extensão. Basicamente, podemos estender qualquer tipo de classe, comportamento do humor, fator três ou qualquer outro objeto 18. 17 estados do gerente de jogo: Neste vídeo, começaremos a criar nosso gerenciador de jogos e também começaremos a implementar os estados do jogo. Assim, em cada estado, podemos executar códigos separados, como quando estamos iniciando o nível, podemos prepará-lo para provavelmente cerca de 3 segundos e podemos mostrar animações de texto e depois iniciar o jogo E também no final, queremos mudar o estado para o nível para que possamos começar a calcular a pontuação. Então, para fazer isso, vamos até a pasta de scripts e vamos criar um novo script em C sharp, e vamos chamar esse game Manager. Você notará que, depois de criarmos o gerenciador de jogos, ele tem ícones diferentes, e esse é o ícone padrão que o Unity fornece para qualquer script que esteja usando o nome Game Manager. Agora podemos abrir isso no fisial studio e, para o gerente de jogo, primeiro, queremos declarar um gerenciador de jogos estático público, e vamos chamar essa instância Isso será uma propriedade, então vou definir um getter público Mas para o setter, vou definir um setter particular. Dessa forma, essa propriedade só pode ser definida a partir desse script aqui, mas ela pode ser ou pode ser acessada de qualquer outro script. E a referência estática, certifique-se de que essa variável tenha apenas uma instância transversal no projeto. Então, é compartilhado. E agora queremos criar um novo método de peso vazio, inicializar a variável de instância ou as propriedades e passar esse script Agora, fora dessa classe, vamos criar um novo final público e esse será o estado do jogo. E para o estado, vou definir um estado padrão e para o estado inicial. E o estado da jogabilidade, e o último deve ser o nível e o estado. Agora que declaramos o estado do jogo, podemos usar isso em nossa classe de gerenciador de jogos. Então, vamos criar um novo campo selado e, para um tipo, esse será um estado do jogo, a soma que declaramos aqui, e para o nome do objeto ou o nome da variável, vamos chamar esse estado E também precisaremos de uma referência ao script de movimentação do jogador. Vamos apenas criar um novo campo serializado. E vou digitar movimento do jogador para um tipo, e vamos chamar esse movimento do jogador. E agora queremos excluir o método de atualização, já que não o usaremos no momento, e vamos criar um novo vazio público, será um método switch state E nesse método, vamos lidar com o estado de mudança de nossa jogabilidade. Então, para o argumento, vamos apenas digitar game state e vamos chamar esse novo estado para o novo estado que estamos passando. E queremos verificar se nosso estado atual é igual ao novo estado que estamos passando quando estamos executando esse método, queremos retornar esse método. Portanto, não execute nenhum código abaixo aqui. E se for diferente, queremos definir o estado para o novo estado pelo qual estamos passando. E aqui queremos usar o caso do switch e verificar o valor do estado atual. Então, aqui, vamos abrir um colchete e, se for o caso de início do estado do jogo, queremos executar um determinado código aqui e depois adicionar break E então podemos simplesmente duplicar esses blocos de código e colá-los duas vezes. E vamos mudar o estado da jogabilidade, este, e o último deve ser o nível. Então, agora temos uma declaração de switch que trata de três estados de nossa jogabilidade. E, no momento, não configuramos nenhuma interface de usuário ou texto para o estado inicial. Então, vamos executar um registro de depuração e digitar game Start Então, podemos ver isso no console. E aqui, podemos usar a ação retardada que implementamos no último vídeo e, em seguida, podemos simplesmente passar um novo delegado. Como a ação. E para o delegado, queremos executar o método switch state E então, para o estado, queremos mudar isso para a jogabilidade. E aqui, como segundo argumento, podemos simplesmente passar a duração. Então, queremos executar esse código aqui após 3 segundos. E agora podemos simplesmente executar um backlog aqui dentro do nosso jogo e digitar o estado da jogabilidade. E podemos adicionar tempo aqui. Hora, hora. Você vê que o tempo termina quando esse código é executado. Então, agora, para começar, também queremos ter certeza de que o script de movimentação do jogador esteja desativado. Oh, eu digitei isso errado. Deveria ser a jogada do jogador. Portanto, queremos ter certeza de que a movimentação do jogador esteja atualmente desativada nesse estado. Então, vamos definir o valor ativado para quedas. E podemos simplesmente copiar essa linha aqui e, ao iniciar o jogo, queremos habilitar o script. Agora temos isso implementado. Vamos expandir isso mais tarde. Mas agora, no método de início, vamos apenas executar o estado do switch e configurá-lo para o início do jogo. Não usaremos o valor padrão, mas queremos garantir que, quando estivermos executando start na primeira vez em que esse nível foi iniciado, o estado e o novo estado sejam diferentes. padrão será o estado padrão e, quando executarmos o switch state start no método start, eu mudarei o estado Judi aqui Então, agora vamos salvar isso. E como criamos uma referência de instância estática para esse gerenciador de jogos, podemos acessar esse script de qualquer lugar a partir de qualquer outro script. E como esse também é um método público, podemos acessar esse método a partir de qualquer outro script. Então, mais tarde, quando terminarmos o jogo, podemos acionar esse nível e estado a partir de outro script. Agora vamos voltar ao Unity. Depois de compilado, vou criar um novo objeto anti-jogo e redefinir o valor da transformação, vou chamar esse gerente de jogo, adicionar o script e atribuir o movimento ao jogador. Direcione a câmera principal para esse movimento do jogador e ela registrará o script de movimento do jogador que está anexado à câmera principal aqui. Vou colocar o gerenciador de jogos no topo aqui para que possamos acessá-lo facilmente e salvar a cena. Agora, se abrirmos o console aqui, vou limpar isso, e se pressionarmos play, você verá que o jogo começará e, após 3 segundos, ele será executado. Aqui, quando começamos a registrar o estado do jogo aqui, ele imprime o estado de tempo que é de 3 segundos. Então, depois de 3 segundos, podemos começar o jogo. Nesses 3 segundos depois, podemos criar uma animação de interface como um texto pronto ou outra coisa. Mais tarde, quando terminarmos o jogo, podemos mudar para o nível e o estado e começar a acionar os cálculos de pontuação. Isso é para criar o estado do jogo e, posteriormente, expandiremos esse gerenciador de jogo adicionando um cálculo de pontuação e vida ou saúde para o jogador. 19. 18 pontuação e vidas do gerente de jogo: Neste vídeo, continuaremos nosso gerente de jogo e, nesta parte, criaremos as vidas e a pontuação. Então, vamos ao estúdio sal, e eu abri o gerenciador de jogos aqui. Então, agora precisamos declarar algumas variáveis privadas. Então, vou criar um novo número inteiro privado, e o primeiro seria o inimigo atingido e depois disparado E também precisamos de um carro alegórico particular para nossa saúde atual, para a saúde do jogador E aqui, ambos, precisamos criar um novo campo serializado, e isso seria um tipo de número inteiro, e vamos chamar esse jogador de saúde e definir seu valor padrão como dez de segurança Abaixo, vamos criar um novo método chamado nele. Aqui, queremos inicializar a saúde atual com a saúde do jogador que declaramos no campo Ses aqui A próxima coisa que precisamos fazer é criar um novo método de vazio público Vamos chamar isso de hit de bulion, e nós queremos ultrapassar um bulion, e vamos chamar isso de hit de bulion E se o acerto for verdadeiro, então queremos adicionar o valor do acerto do inimigo. E também queremos somar o valor dos tiros disparados, quer erremos ou acertemos o inimigo. E vamos usar essas duas variáveis para calcular a precisão de nossos disparos. O próximo método que precisamos criar é o anulado público do jogador atingido, e isso é para que o jogador receba danos do inimigo Queremos passar por um dano flutuante. E ao executar esse método, queremos subdividir a saúde atual pelo valor do dano E certifique-se de que todos os métodos estejam usando o modificador de escopo público, para que ele possa ser acessado a partir de outro script. Então, vamos salvar isso. E agora vamos aos dados da arma, e dentro dos dados da arma, temos o método de fogo. E aqui queremos verificar se atingimos o inimigo ou não. Então, dentro dos quatro H, podemos verificar se nosso objeto atingido atual é uma instância de um script inimigo. Assim, podemos verificar usando a palavra-chave e depois digitar o tipo do script. E aqui podemos acessar a instância do gerenciador de jogos e executar o método shot hit e passar por ele como argumento. E certifique-se de que retornemos o método aqui. Portanto, ele pulará as outras tabelas de sucesso. Porque se encontrarmos uma escrita inimiga no hitable, isso significa que deve ser o inimigo Aqui podemos adicionar uma declaração L porque, se atingirmos outras instâncias de hitable que não sejam o script inimigo , queremos passar false como argumento do método de tiro aqui E queremos ter certeza de que retornaremos o método quando atingirmos algo. Portanto, de acordo com essa afirmação, a física tem colchetes. Queremos devolver o método. E aqui, se não acertarmos nada, também queremos executar o tiro com argumentos falsos. Então, vamos copiar essa linha aqui e depois colá-la aqui. Então, basicamente, o que estamos fazendo aqui verificar se o hitable é uma instância de um script inimigo ou não E se for verdade, então estamos transmitindo o verdadeiro argumento como o tiro acertado. E retornamos o código porque não queremos verificar se há mais componentes habilitados E se não encontrarmos nenhum script inimigo, então estamos executando esse código aqui. E aqui, se errarmos “ Não acerta em nada” , ainda queremos contar o tiro acertado passando o argumento falso. Então, vamos salvar isso e voltar para o Unity. E aqui, podemos selecionar o gerente do jogo. Na guia Inspetor, queremos ter certeza de clicar com o botão direito do mouse nela e selecionar o bug Assim, podemos ver a variável privada em nosso inspetor. Então, agora vamos apertar play e testar isso. E agora você vê que se eu atiro no ar, adicionamos os tiros. E se eu atirar na parede, também adicionamos os tiros, mas o inimigo atingido permanece zero. E agora, se atingirmos um inimigo, você vê que adicionamos o inimigo atingido e também os tiros disparados. E vamos tentar matar o inimigo aqui. E você vê que temos seis inimigos atingidos e oito tiros disparados porque tentamos atirar no local porque tentamos atirar antes de atirar no inimigo, e estamos atirando na cena sem atingir o inimigo Portanto, temos dois tiros adicionais disparados em comparação com o inimigo atingido e podemos usar esse valor para calcular a precisão posteriormente. Há uma coisa que precisamos fazer no script do gerenciador de jogos. Vamos para o estúdio oficial. Sob o comando do gerente do jogo. No início, queremos executar o método init Vamos apenas digitar isso. E queremos garantir que a saúde atual definida como o valor de saúde do jogador no início. Agora, se tentarmos novamente, verificar nossa saúde atual, deve ser dez. Aí está. Mas ainda não implementamos isso, então vamos implementar isso no próximo vídeo. 20. 19 Visual de captação de arma: Neste vídeo, continuaremos criando uma visualização para nossa coleta de armas Então, para fazer isso, primeiro precisamos ir à loja de ativos e baixar qualquer modelo de arma. Eu escolhi esta, a luz da pistola Sipi, e vou colocar o link na descrição Então, eu já baixei e importei esse ativo, e agora ele está sob a luz da pistola Sipi Então, vou arrastar essa pasta e colocá-la dentro da pasta do nosso jogo. E só para deixar as coisas ainda mais organizadas, vou criar uma nova subpasta dentro da pasta do jogo e chamar isso E vamos colocar todos os modelos dentro dessa subpasta que acabamos de criar Para o Robot Kyl, vou movê-lo também e também para a luz da pistola Sipi Agora, colocamos todos os modelos nossa subpasta de modelos Vamos ver a visualização do jogo aqui e, primeiro, precisamos modificar o objeto prefs para nossa coleta de armas Aqui temos a metralhadora pegando prefs na pasta prefs Vamos apenas abrir as preferências. E se você for até a cena aqui, verá que estamos em um modo preferencial E agora podemos arrastar a lâmpada preferida da nossa arma de ficção científica que acabamos Então eu vou para a pasta prefs, e dentro da pasta de luzes da arma, a arma tem cinco variações de cor, então podemos escolher uma delas. Acho que vou escolher este ou talvez este mais leve e configurá-lo como filha de nossa metralhadora pegue objetos do jogo E agora está em cena, mas a posição não é zero, então está em algum lugar aqui. Para centralizar a arma acordo com a posição original, vamos zerar a transformação, para que possamos clicar nas configurações da roda **** aqui e definir a posição de reinicialização E vamos até o objeto principal do jogo e simplesmente excluímos o componente do filtro de malha e também a renderização da malha. E vou aumentar o tamanho da escala de coleta de nossa arma mastigando em cada eixo E então vamos posicionar o objeto filho ao redor do centro do objeto pai. Então eu acho que sim, isso deve ser suficiente. E se você tiver dificuldade em reposicionar isso por causa da grade profissional, basta segurar o sinal negativo no teclado e alterar pressionando negativo e o sinal de mais perto do teclado de espaço traseiro Você pode alterar o tamanho do incremento ou o valor dos encaixes da grade Então, agora eu reposicionei minha arma aqui. Vou voltar à nossa cena aqui. E agora precisamos modificar o script. De nossa coleta de armas e também do spawn no script de sucesso. Vamos até a pasta de scripts, selecionarei o script de coleta de armas e o abrirei no Fis Studio Agora precisamos criar um novo tipo de campo serializável de flutuação, então vamos criar isso, e vou chamar isso de velocidade de Vamos definir esse padrão 290, e isso é em graus E como vamos multiplicar esse valor pelo tempo Delta , será por segundo. Então, agora vamos criar um método de atualização do FOID. E dentro da atualização, vou acessar o componente de transformação e seguida, acessar o método de rotação E vou usar a segunda sobrecarga do método, que é para um eixo e um ângulo Para o eixo, vou digitar Vector três pontos acima, então é o eixo y, e para o ângulo, vamos apenas alimentar a velocidade de rotação, mas vamos multiplicar isso pelo tempo Delta Portanto, a velocidade da rotação será consistente, seja , 90 graus por segundo. Então, vamos salvar isso. E a outra coisa que precisamos modificar é o spawn no script de sucesso, deixe-me mostrar agora que se pressionarmos play, e se eu atirar nesse captador de arma, você verá que nossa arma está de alguma forma submersa Isso ocorre porque a arma está sendo instanciada na posição zero do nosso objeto de jogo principal neste aqui Então, ele é instanciado neste momento. Para corrigir isso, vamos abrir o spawn no script de sucesso e adicionarei um novo campo serializado E para o tipo, será um flutuador, e vou chamar isso de deslocamento y. Então esse é o deslocamento na posição y. E eu vou definir esses dois deft 0.5. E ao instanciar o spawn pré-fabricado, queremos deslocar a posição y aqui adicionando o fator três, e isso basicamente compensará a posição de transformação por um no eixo y, e então queremos multiplicar Então, mais tarde, podemos ajustar a altura dependendo do valor do nosso deslocamento y. Vamos salvar isso e voltar à unidade. Agora, se virmos o script, ele está atualizado e tem um novo campo, que é um deslocamento y, e podemos alterar esse valor de acordo com nossas necessidades, dependendo do tamanho do objeto ou da posição do objeto Eu testei isso e 0,5 parece ser um bom valor neste caso. Vou deixar isso como está, e vamos salvar nossa cena. Agora, se pressionarmos play, se eu atirar no cano, você verá que nossa arma está agora na posição correta, e podemos pegá-la atirando nela, e agora temos a metralhadora ativada Então, sim, é assim que mudamos a visualização do modelo de coleta de armas e, com isso, podemos criar número possível de coletores de armas 21. 20 sistema de ataque inimigo: Neste vídeo, continuaremos implementando o script inimigo e, desta vez, criaremos uma habilidade para o inimigo atirar no jogador. Para fazer isso, vamos abrir o script inimigo, e aqui precisamos implementar um novo golpe para manter o valor do intervalo de disparo do inimigo. Vamos ver aqui abaixo e fora da classe de script inimiga. Vamos criar uma nova greve pública, e vamos chamar esse intervalo. Alcance. E vamos tornar isso serializável adicionando um sistema de atributos do Agora vamos criar um novo campo serializado, para que fique disponível no inspetor, e isso será um tipo de flutuação, e vamos chamar isso de mínimo Então, queremos criar um construtor público para os atingidos Vamos digitar public e, seguida, o intervalo de intervalo do nome marcado. E então abrimos com um conjunto de parênteses e precisamos passar o valor mínimo e máximo aqui E isso basicamente não é essa variável aqui. É um argumento para o construtor, e vamos criar um colchete de abertura E aqui queremos definir esse valor mínimo usando a palavra-chave este ponto médio igual ao mínimo e, em seguida, esse máximo igual ao máximo e seguro. Agora temos o construtor. A última coisa que queremos criar é um tipo público de float getter, e vamos chamar isso de get value Aqui podemos usar um getter. Como essa será apenas uma linha, podemos usar uma expressão direta ou uma expressão Lamda Em seguida, basta digitar return random range, e podemos passar o mínimo e o máximo. Oh, desculpe, não precisamos da palavra-chave escrita aqui, basta digitar um intervalo de pontos aleatório. E o alcance será o mínimo e o máximo. Isso retornará esse valor aqui sempre que chamarmos essas propriedades. Vamos salvar isso. Agora, dentro da nossa pasta de scripts inimigos, vamos criar um novo campo serializado dessa estrutura que acabamos Vamos digitar intervalo de intervalo e chamar esse intervalo, e queremos definir um novo valor padrão usando o construtor com o valor padrão de provavelmente 1,5 segundos e 2,7 segundos Isso definiria o valor padrão de nossas variáveis de intervalo, mas podemos mudar isso no inspetor A próxima variável que queremos criar é uma variável flutuante, e essa será a precisão do disparo E vamos definir isso como 0,5 por padrão. Portanto, a precisão será de 50% nessa taxa aqui. E agora vamos criar um novo cabeçalho para organizar melhor o inspetor, e vamos chamar isso de propriedades de captura E agora declaramos as propriedades de filmagem. Vamos começar a criar a co-rotina para lidar com as filmagens. Aqui abaixo, o método public void it. Vou criar uma nova rotina principal e, como acontece com a corrotina, precisamos retornar o tipo de numerador do IE Vamos chamar isso de filmagem, e não precisamos de nenhum argumento ou parâmetro. Agora, dentro da corrotina de filmagem, precisamos atrasar nossa rotina principal até que o jogador chegue à sua posição Podemos usar o retorno de rendimento e, usando a nova palavra Q, teremos que esperar até. Basicamente, isso espera até que o método suspenda execução da corrotina até que o delegado de suprimento avalie Q verdadeiro E, basicamente, ele pede delegados que retornem um tipo de booleano Para usar isso, podemos usar apenas uma expressão Landa, e é muito fácil usar a expressão Lamda, precisamos fornecer um conjunto de parênteses, e isso seria a assinatura ou o argumento Como ele solicita que os delegados retornem um tipo de touro sem qualquer discussão, podemos simplesmente inserir um conjunto de parênteses e, em seguida, um sinal de igual com um sinal Após a assinatura, precisamos colocar um conjunto de colchetes para definir a condição Agora, aqui podemos criar a condição para esse peso até avaliar. Basicamente, queremos verificar se o inimigo já chegou à sua posição ou não. Podemos pegar aqui usando a distância restante do agente, e vamos copiar essa linha aqui e depois colá-la aqui. Mas em vez de verificar se a descida restante é maior, podemos apenas verificar se é menor E podemos aumentar o tamanho aqui para aumentar o limite e depois adicionar um ponto e vírgula no final, como de costume E agora você vê que ainda temos um erro porque precisamos usar a palavra-chave return. Portanto, precisamos retornar a condição ou a comparação dessa afirmação aqui, seja ela verdadeira ou falsa. E então, se for verdade, então vamos executar o código mais abaixo aqui. E se for falso, esperará até que essa afirmação seja verdadeira. Agora, depois que o inimigo chegar, queremos verificar se o inimigo não está morto. Podemos apenas verificar se isso é falso. Esse ponto de exclamação, veja se esse lingote é falso. Se for falso, o código dentro do colchete será executado E se o inimigo estiver morto ou se isso for verdade, o código será ignorado ou não será executado, e a corrotina será interrompida E agora, aqui dentro dos blocos wild, queremos gerar um certo valor aleatório, um intervalo aleatório, e queremos marcar 0-1, é menor do que nossa precisão de tiro, então queremos causar dano ao jogador E já declaramos como danificar o jogador dentro do nosso gerenciador de jogo acessando o método de acerto do jogador Então, vamos usar esse tipo de gerenciador de jogos e pegar a instância ou a referência estática e seguida, executar o método player hit, e podemos subtrair isso por um Além disso, podemos executar um registro de depuração aqui e depois adicionar uma mensagem informando que o jogador foi atingido E depois de filmarmos aqui, queremos atrasar a corrotina usando o valor do intervalo de intervalo Vamos apenas digitar return, new weight for seconds, e ele solicita um valor flutuante E isso atrasará nossa co-rotina usando o valor flutuante que passamos aqui em segundos. E podemos pegar nossa variável de intervalo ou objeto aqui. Ao digitar o nome do intervalo, podemos usar a propriedade get value, e a propriedade retornará um valor aleatório entre nosso valor mínimo e máximo Então, agora vamos salvar isso. E a próxima coisa que precisamos fazer executar essa corrotina na inicialização Então, se verificarmos aqui dentro do método init, podemos executar a rotina co depois definir o destino do nosso agente E certifique-se de que a corrotina corra após esta linha aqui. Por que isso? Porque aqui porque aqui estamos esperando que esse valor se torne realidade. E se tivermos definido um destino , isso será verdade imediatamente e será executado imediatamente. Então, agora vamos começar o Curtin passando o nome do Curtin, filmar e salvar E agora, se voltarmos para o Unity, podemos conferir no console. Além disso, podemos selecionar o gerente do jogo e alterar o Inspetor para mastigar o bug clicando com o botão direito do mouse, e vamos verificar nosso valor de saúde atual Se pressionarmos play, podemos esperar até o início do jogo e depois que o inimigo chegar. Podemos verificar, aí está. Fomos atingidos. Fomos atingidos imediatamente e, como você pode ver, nossa saúde atual está diminuindo à medida que somos atingidos Mas há um problema aqui porque a caixa de filmagem foge imediatamente. Encontrei o problema aqui dentro da rotina de filmagem. Precisamos atrasar um pouco esse código. Para corrigir isso, podemos simplesmente adicionar um novo rendimento, retornar um novo peso por segundo e, em seguida, passar um valor muito pequeno. Nesse caso, vou passar 0,2 segundo. Por que precisamos adiar isso? Precisamos ter certeza de que o destino definido do motor foi executado e já foi inicializado Caso contrário, se a rotina co acontecer no mesmo quadro com essa execução de código aqui, isso retornará verdadeiro imediatamente Precisamos adiar isso. E quando tivermos um destino, a distância restante do agente mudará para um valor bastante grande dependendo da posição do inimigo em relação à posição alvo. Ao atrasar isso, se voltarmos para o Unity, você verá que, se eu pressionar play agora, assim que o jogo começar, podemos ver o registro de bugs aqui, que nos dirá se o inimigo foi girado e o primeiro já foi gerado e o segundo foi gerado, e ele começará a atirar quando parar de ficar de pé ou chegar Agora ele já atira no jogador duas vezes três vezes e você vê que nossa saúde atual é de seis e está diminuindo ainda mais Então, temos o ataque inimigo funcionando e, posteriormente, precisamos criar um visual para dar feedback ao jogador de que ele ou ela foi atingido. 22. 21 Visual de ataque inimigo: Neste vídeo, continuaremos trabalhando no mecanismo de ataque do inimigo e, desta vez, trabalharemos no aspecto visual dele. Então, para fazer isso, vamos para a pasta de modelos e para a luz da pistola Sipi E, sob o prefácio, temos algumas variantes aqui. Vou duplicar o vermelho e direcioná-lo para a pasta pref E agora vou renomear isso para ganho inimigo. Depois de renomear isso, vou abrir esse prefeito e começar a trabalhar nos visuais de filmagem E com os visuais de filmagem, vamos usar um sistema de partículas Agora vamos criar um objeto-filho, um objeto filho vazio e, em seguida, para o objeto filho, vamos chamar essa foto de X. Em seguida, vamos adicionar um sistema de partículas A primeira coisa que queremos fazer é expandir a guia de emissões e, em seguida, garantir que o valor da taxa ao longo do tempo seja 20, e queremos usar a emissão de explosão em vez da taxa ao longo do tempo Vamos pressionar mais aqui e depois definir a contagem 21. Isso emitirá apenas uma partícula por vez. Vamos definir a duração um aqui, para que possamos ver a cada um segundo. Vamos mover a posição do emissor em torno dessa posição aqui para o barril na frente da posição do barril E queremos ter certeza de que a posição z está voltada para frente. A próxima coisa que precisamos fazer é expandir a guia de formas aqui e definir o ângulo 20 e também o raio zero Então, teremos partículas dianteiras. Agora, seguindo o eixo z aqui. Agora vamos para a guia de renderização aqui, expandi-la e alterar o modo de renderização para malha, e podemos usar a malha padrão da unidade, a cápsula. Vamos apenas usar isso. Para o alinhamento da renderização, vamos mudar isso para local A próxima coisa que precisamos fazer é acessar a guia principal aqui e, em seguida, ativar a rotação inicial de três d e definir o valor de x para 90 graus. Agora, a bala se alinha perfeitamente com a arma e também com a direção da partícula No momento, é muito grande, então precisamos alterar o tamanho inicial para um valor muito pequeno e 0,07 para que seja um bom tamanho inicial E agora temos efeitos de bala de partículas muito bons. Acho que vou tornar isso ainda menor, 20,05 K. E agora precisamos habilitar também o rastro dessa partícula aqui Vamos rolar para baixo e, na guia de trilhas , habilitar isso e expandir isso. Agora temos uma trilha, mas o tamanho é aproximadamente o mesmo do diâmetro da nossa cápsula, então não podemos mais ver a cápsula porque ela está sobreposta uma à outra Então, vamos alterar o tamanho modificando a largura da trilha aqui Vou definir essas duas curvas clicando no menu suspenso no lado direito e, com a curva aqui, podemos modificar o tamanho da trilha n para uma muito pequena. Agora você vê que temos um n muito e também podemos diminuir um pouco o tamanho inicial. Como você pode ver, temos uma trilha muito bonita aqui. E agora precisamos criar um material para essa partícula. Vamos até as pastas de materiais e eu vou criar um novo material, e essa será a bala inimiga E a segunda seria a trilha. Vamos criar um novo material novamente e depois chamar esse inimigo de trilha de balas Para a bala inimiga, vou mudar o material para partículas padrão let e vou ativar a emissão Para o LBD, vou mudar isso para uma cor vermelha. Para a emissão, vou definir isso para uma cor laranja e definir as intensidades para 0,5 Com os efeitos de disparo de partículas, objeto do jogo selecionado, vamos direcionar a bala inimiga para o material aqui E eu deveria mudar o material da bala, como você pode ver. Para a trilha, vamos configurá-lo como um material t e definir essa um material t e cor para a cor laranja em forma de bala Podemos simplesmente usar o seletor de cores aqui e depois escolher a cor laranja aqui Vamos definir essa trilha de balas inimiga como material da trilha. Se formos abaixo no componente do sistema de partículas aqui, podemos direcionar a trilha de bala inimiga para o material da trilha, e agora temos isso OK. Agora, precisamos definir a velocidade inicial para um valor maior, provavelmente dez, para que seja mais rápida, e também queremos desativar o loop e também reproduzir a caixa de seleção de ativação Portanto, ele deve ser reproduzido apenas uma vez, e vamos acionar essa partícula de script Então, vamos voltar à cena aqui e abrir os prefeitos inimigos Agora vamos expandir a raiz óssea aqui e até o ombro, o antebraço e o punho Depois de vermos o pulso direito se unir aqui, vamos sacar a arma inimiga enquanto a criança do pulso direito E vamos reiniciar a transformação da arma inimiga aqui. E vamos girar isso, está alinhado com os ossos da mão Vamos apenas girar isso. Ao manter o controle, podemos ajustar a rotação a cada cinco graus Eu vou girar também no eixo z aqui. Agora podemos mover isso, mas como o progrid está ativado, vamos desabilitá-lo primeiro, para que possamos movê-lo com mais precisão E se quisermos verificar se a arma está alinhada corretamente, enquanto o poste está apontando, vamos selecionar o objeto do jogo Robot Kyle Acesse a janela de animação aqui. E se você não vê a janela de animação, vamos entrar pela janela. Em animação, basta abrir o painel de animação aqui. Vou fazer isso, isso e, em seguida, bloquear a janela do painel de animação aqui. Sempre que selecionarmos outro objeto do jogo, o robô permanecerá no poste de mira Agora vamos ajustar a rotação da arma aqui. E então vamos girar o eixo z também um pouco e movê-lo pouco para cima e girá-lo no eixo x aqui OK. Então, sim, isso deve ser suficiente, e agora vamos voltar à cena aqui. Agora vamos trabalhar no roteiro do inimigo. Então, vamos até a guia do projeto aqui e, em seguida, abriremos o script inimigo. E agora temos o script do inimigo aberto. Precisamos criar um novo campo de tamanho. E isso será um tipo de sistema de partículas. E vamos chamar isso de efeitos de tiro. Essa será a referência ao sistema de partículas do canhão inimigo. Guarde isso. E aqui abaixo, dentro da corrotina de filmagem, queremos ajustar a direção dos efeitos de foto acordo com o status do acerto ou não Então, aqui queremos definir os efeitos de tiro que transformam a rotação, e passaremos a rotação com aparência de quatérnio com base na transformação do inimigo para frente e, em seguida, adicionaremos um valor aleatório usando a esfera unitária interna Isso adicionará desvio. Aqui dentro da instrução I, queremos substituir a rotação novamente. E desta vez, precisamos garantir que a direção da partícula atinja a câmera Vamos usar a rotação com aparência de quatérnio novamente. Desta vez, vamos pegar a referência do jogador e, como já fizemos isso, podemos simplesmente digitar o jogador, pegar sua posição e subtraí-la com os efeitos de tiro, transformando essa posição Dessa forma, a parte dianteira de nossa partícula alinhará perfeitamente à posição da câmera e dará a ilusão de que a bala está atingindo Guarde isso. E fora da instrução if, queremos acessar o sistema de partículas shot ex novamente e depois executar o método play E isso acionará a partícula uma vez e a salvará. Vamos voltar à unidade aqui, vamos até o detentor do prefe e abrir as preferências inimigas E aqui, sob o script inimigo, devemos ter um novo campo de efeitos de tiro, e vamos apenas abrir o canhão inimigo, expandir o canhão inimigo aqui e, em seguida, arrastar o objeto do jogo de tiro como o sistema de partículas desses efeitos de tiro Então, vamos voltar à nossa cena aqui, e depois vamos testar isso. Pressione play e veja se o inimigo agora tem uma representação visual do ataque. Aí está. Temos uma representação física do nosso ataque, mas precisamos modificar a partícula. Vamos fazer isso. Agora vamos para a guia do projeto. Abaixo das preferências. Vamos abrir as preferências do inimigo. Aqui, selecione o Robô Kyle e queremos jogar o ídolo da mira. E vamos bloquear a janela de animação novamente. E aqui, sob os efeitos de foto, queremos selecionar esses efeitos de foto e reduzir a vida útil de nossa trilha Aqui, vamos rolar para baixo na guia da trilha e abri-la. Para toda a vida útil, vamos definir 20,1, ou até menos 0,08 A outra coisa que precisamos mudar aqui no painel principal ou na guia principal aqui, para o espaço de simulação, precisamos definir esses dois mundos. E vamos aplicar o jogo de armas inimigas o, pressionar aplicar tudo, para que as configurações fiquem seguras para o prefácio. Agora, se apertarmos play, a partícula fica muito mais curta do que a trilha E se estivermos nos movendo atualmente, a partícula permanecerá no espaço mundial Não gira com o objeto principal do jogo. Agora vamos voltar para a cena aqui e testar isso novamente. Pressione play. E você pode esperar até que o inimigo chegue. E agora você pode ver que ele dispara e atinge a gente. Atualmente. Se expandirmos a depuração, você verá que nossa saúde está muito baixa agora Então, aí está a visualização do ataque inimigo. 23. FX de dano de 22 jogadores: Neste vídeo, vamos criar um efeito quando o jogador está sendo baleado pelo inimigo. Então, para fazer isso, primeiro precisamos importar um novo ativo, e esse ativo é uma e esse ativo é falha do Keno criada por K Jio É um efeito de imagem, e vou colocar o link na descrição. Então, para não notar isso, podemos ir até o commit aqui e selecionar o pacote Keno glitch unity Quando estivermos na página do pacote Kino Glitch Unity, basta baixar o arquivo aqui e ele fará o download Eu já baixei. E agora vamos importar esse pacote. De volta ao Unity, vamos ao menu de ativos importar pacote, clicar em pacote personalizado e eu vou importar o pacote Kino glitch Unity e, em seguida, pressionar Agora, depois de importar a falha do kino, vamos até a câmera principal aqui e, em seguida, adicionar o e, em seguida, adicionar o Agora vamos trabalhar no script do player. Vamos para a pasta de scripts e, em seguida, abrir o script do player. Aqui eu tenho o script do player aberto e, primeiro, queremos criar um efeito de vibração da câmera. Então, para fazer isso, vou criar um novo cotin aqui abaixo E eu vou chamar isso de agitar a câmera. Vou acrescentar alguns argumentos. O primeiro seria um tipo de flutuador, e esse será um cronômetro O segundo também seria um flutuador, e essa seria a amplitude, e o terceiro também um flutuador, mas essa seria a frequência Dentro da rotina c, queremos criar um novo vetor t para armazenar a posição inicial da nossa câmera. Então, vamos digitar a pausa e, em seguida, pegar a transformação dessa posição, e também queremos criar uma nova variável vetorial t, e essa será a nova posição Mas, para começar, também vamos usar a transformação dessa posição. E aqui embaixo, queremos criar um novo flutuador chamado duração e queremos passar o cronômetro como o valor da nossa variável de duração Abaixo, vou atrasar o código aqui um valor muito pequeno, 0,2 segundo. E então eu vou criar o loop aqui. Então, vamos usar a declaração curinga e, em seguida, passar o valor da duração se for maior que zero. Portanto, embora a duração seja maior que zero, queremos executar o método shake aqui. E aqui, primeiro, vou subtrair a duração pelo tempo, o valor do tempo Delta E então eu vou executar o yield return No, para ver esta declaração while. E ao subdividir a duração um tempo no tempo Delta, estamos tornando a duração como um cronômetro Agora, a primeira coisa que queremos fazer verificar a distância entre o novo fator de posição e a posição atual. Se a distância for muito pequena ou a posição da câmera estiver muito próxima da nova posição , queremos calcular uma nova posição aleatória. Então, vou definir a nova posição para a posição inicial novamente. Mas desta vez vou modificar a posição x adicionando um intervalo aleatório de menos um a positivo, e vou multiplicar isso pela amplitude E para a posição y, vamos fazer o mesmo. Vou colar esse código aqui e, em seguida, alterar o componente para o valor y e usar o mesmo intervalo aleatório multiplicado pelo valor da amplitude Então, basicamente, queremos verificar se a câmera está ou está quase chegando à nova posição, então queremos definir uma nova posição aleatória nos eixos x e y. E então queremos definir a posição da nossa câmera para a nova posição. Mas vamos usar um fator três pontos b para interpolar nossa posição anterior, que é nossa posição atual, para a nova posição E para o valor de interpolação, vamos usar o argumento de frequência que estamos transmitindo a corrotina e, em seguida, vamos multiplicá-lo pelo ponto temporal delta T. Então, a frequência será relativa ao tempo, não ao quadro não ao E depois dessa declaração selvagem, queremos definir a transformação dessa posição de volta para a posição inata E agora precisamos de um método público para executar essa rotina principal. Então, vamos criar uma nova câmera pública de vibração de vazios. E precisamos do mesmo argumento de nossa co-rotina. Então, vamos copiar todo o argumento aqui e depois colá-lo dentro do método shake camera. Dentro do método shake camera, queremos iniciar a rotina co e depois passar o nome da rotina co, depois passamos o argumento, o cronômetro, a amplitude e, em seguida, a frequência OK. Então, agora vamos ao gerente do jogo, e sempre que o jogador pressiona, precisamos executar esse método de vibração da câmera. Então, agora precisamos de uma referência ao script do jogador do nosso gerente de jogo. Então, vamos criar um novo campo de serialização e digitar o script do player E então vamos chamar esse player de script. E aqui, podemos simplesmente executar o método de script do player chamado shake camera que acabamos de criar e, em seguida, passar o tempo, a amplitude e o valor da frequência. Para o cronômetro, vou ajustar esses dois segundos e, para a amplitude, vou definir 20,2 unidades, e para a frequência, vou definir Você pode alterar esse valor para ajustar o shake ao seu gosto, mas esse será o meu valor aqui E agora vamos voltar à unidade. Primeiro, no gerenciador de jogos, precisamos atribuir a referência do script do jogador. Então, vamos arrastar a câmera principal para esse slot de script do jogador aqui no gerenciador de jogos, sacudir a cena e pressionar play. Então, depois que o jogo terminar, vou esperar até que o inimigo apareça e depois esperar que sejamos baleados pelo inimigo. Aí está. Temos um efeito de agitação. E agora vamos abrir o script do inimigo e corrigir a direção do tiro F X quando o inimigo errar de atirar em nós. Então, aqui dentro de um tempo não está essa afirmação. Temos essa linha aqui. E o que queremos fazer é multiplicar essa esfera unitária interna aleatória por um valor muito pequeno Portanto, temos um desvio muito pequeno. Caso contrário, teremos um desvio máximo de uma unidade, o que é bastante, se você ver Então, vamos multiplicar isso por 0,1. OK. E a próxima coisa que queremos fazer é implementar o efeito de falha digital que acabamos de importar no início do vídeo Então, para fazer isso, vá para o script do player e, em cima do script do player, vamos usar o namespace Keno E aqui, vamos criar uma nova falha digital privada, e então vamos chamar essa falha No início, queremos inicializar essa falha eff. Vamos apenas usar o componente get e passar o tipo de falha digital E agora podemos usar isso em nossa rotina de agitação de carvão com câmera. Aqui, durante toda a duração, podemos simplesmente acessar os objetos do efeito de falha e depois modificar a intensidade Mas antes de modificarmos a intensidade aqui, precisamos criar uma curva para modificar a intensidade dos nossos efeitos de falha Vamos criar um novo campo s, e esse será um tipo de curva de animação. E vamos chamar isso de curva de falha. E, basicamente, com essa curva, podemos definir um valor de forma curva. Então, podemos pegar esses valores de nossa curva avaliada pelo tempo ou pela duração da forma. Então, aqui dentro da corrotina, vamos pegar a curva de falha , executar o método de avaliação e passar o tempo Por enquanto, vou usar a duração, mas vou normalizar a duração, então vou dividir isso pelo valor do cronômetro O cronômetro é constante nesse caso, e a duração que estamos modificando é a variável de duração Vamos salvar isso e voltar para a unidade. Agora estamos de volta à unidade. Precisamos definir a curva de falha para algo assim, para que ela comece zero e, com o tempo, a falha aumente para um e diminua novamente 20 E podemos testar isso, executar a cena e ver o efeito de falha Aí está. Temos o efeito de falha funcionando e, se for muito forte, sempre podemos ajustar a curva para empurrar a posição intermediária para algum valor menor que um, provavelmente 0,7 aqui, e vamos ajustar a tangente básica aqui Então, linha, e vamos testar isso novamente. Agora você verá que sempre que somos baleados pelo inimigo, a intensidade da falha digital aumenta para Aí está. Agora está funcionando, mas precisamos garantir que a intensidade da falha digital B seja zero sempre que terminarmos de sacudir Então, vamos voltar ao estúdio visual, o script do player aqui. Queremos definir a intensidade dos efeitos de falha aqui, zero. Então, isso será tudo para criar o efeito de dano para nosso jogador. 24. 23 configuração de refém: Neste vídeo, vamos criar um aspecto civil ou refém do jogo Então, queremos criar um novo roteiro para lidar com o movimento de reféns e também garantir que, e também garantir que se atirarmos no refém ou no civil, nossas vidas E a primeira coisa que precisamos fazer é abrir a pasta de animações e importar o arquivo de animações E eu já preparei o FBX para isso e também incluo os arquivos necessários nas videoaulas Então, vamos direcionar o refém Hands in the air FBX para a E então vamos para a pasta Models, textura Robot Kyle, e eu vou importar a cor do robô refém. Então, vamos direcionar isso. E agora vamos começar a implementar o refém. Agora vamos para a pasta prefs e, para o inimigo, selecione o inimigo e pressione Control D para duplicar, e vamos renomear esse refém E agora vamos abrir esse Pref e vamos modificar isso. Então, não precisaremos da arma. Podemos simplesmente remover a arma inimiga. E então queremos criar um novo material para o refém. Então, vamos para a pasta de modelos abaixo da pasta Robot kyle Há uma pasta de materiais. Vamos apenas duplicar a cor do robô, e vamos chamar essa cor do robô de refém E vamos mudar a cor base ou o albedo para a cor do robô refém . É o verde. Vamos apenas selecionar este e ele criará um novo material. E então vamos arrastar essa cor refém para o modelo do robô Agora teremos um robô com cores diferentes. Então está claro que esse é o refém. A próxima coisa que precisamos fazer preparar o script do refém Vamos para a pasta de scripts e, em seguida, vamos criar um novo script C sharp, e vamos chamar esse script de refém Antes de modificarmos o script, vamos para a pasta de animações e para a pasta do controlador Vou duplicar o controlador inimigo básico, e vamos chamar esse controlador de reféns E agora queremos modificar isso. Então, vamos clicar duas vezes no controlador de reféns. E agora precisamos criar uma nova camada, e vamos chamar essa camada da parte superior do corpo. Também queremos criar uma máscara de avatar. Vamos clicar com o botão direito do mouse no projeto, criar e depois ir até a máscara do avatar, e vamos chamar essa máscara da parte superior do corpo. Agora, com a máscara da parte superior do corpo selecionada, expanda o humanóide aqui, e queremos desativar o chão, a perna, a perna e o Queremos deixar a mão no IK e a cabeça ativada. Agora, com a massa da parte superior do corpo, podemos acessar as configurações da camada Queremos definir a largura como um e, em seguida, escolher a massa da camada como a massa da nossa camada superior do corpo aqui. Vamos pressionar o círculo aqui e depois escolher a máscara da parte superior do corpo. E agora, a próxima coisa que precisamos fazer é colocar as mãos dos reféns nos arquivos FBX aéreos Humanóide Rock tipo Q. Então, vamos definir o tipo de animação che humanoid e, em seguida, pressionar uma E agora, se já configuramos esse humanóide, desmarcamos isso e depois o selecionamos novamente, vá para a guia vá para a Você verá que temos isso aqui. E as animações têm apenas 50 quadros. Então, precisamos alterar o valor de n para 50, e vamos chamar os clipes ou renomear os clipes para refém E também queremos garantir que o tempo de loop esteja ativado. Então, agora pressionamos aplicar. Depois de prepararmos as mãos do refém no ar, queremos criar um novo estado et e, para o estado, vamos chamar isso de pose de refém E vamos expandir as mãos do refém no ar e direcionar o clipe do refém para esse espaço de movimento no estado postal do refém OK. Depois de configurarmos isso, queremos voltar à nossa cena aqui no modo prefs, selecionar o root kyle e, em seguida, mudar o controlador para o controlador de reféns Agora que configuramos o robô, vamos começar a fazer o script. Agora vamos criar o script do refém. Então, nós já criamos o arquivo. Vamos abrir isso no Visual Studio e queremos ter certeza de que o script do refém foi derivado ou herdado do script inimigo Vamos apenas renomear o comportamento mono aqui para script inimigo. E agora, se salvarmos isso, excluiremos o início vazio e o método de atualização Se voltarmos à unidade aqui, você verá que, se eu for até a pasta prefax e a pref do refém, abri-la, posso deletar o script inimigo e depois adicionar o E o script do refém terá as mesmas propriedades do inimigo porque esse script do refém herda do Posteriormente, ocultaremos algumas das opções que não usaremos para o script de reféns Mas agora precisamos modificar algumas coisas no script inimigo. Vamos abrir o script inimigo aqui e modificar essas coisas. No topo, queremos garantir que o agente NMS, o modificador de acesso ao escopo, esteja definido como protegido Então, vamos digitar protegido. Dessa forma, podemos usar esse agente no script filho. Caso contrário, se for privado, o agente não estará disponível no script secundário ou em uma turma secundária. E aqui, no script do inimigo, queremos excluir o tiro inicial do cotin shot do script do refém Não queremos executar esse cotin no script do refém. Para fazer isso, precisamos criar um novo método protegido, deve ser um método virtual e, em seguida, vazio Vamos chamar esse comportamento de set Com esse comportamento configurado, queremos cortar essa linha aqui e depois colá-la aqui. Agora podemos chamar esse método dentro dele se o agente não for uma declaração agora. Vamos chamar esse comportamento de configurado. A outra coisa que precisamos fazer aqui é para mudar isso para o script do refém Para fazer isso, precisamos extrair isso também em um método virtual. Vamos digitar outro vazio virtual protegido, e vamos chamar isso de comportamento E então aqui, queremos cortar isso e depois colar aqui. E então queremos executar esse método dentro dessa instrução if aqui. Então, vamos digitar esse comportamento. E agora, a próxima coisa que queremos fazer é, no script do refém, sobrescrever esses dois métodos que criamos Então, para fazer isso, vamos digitar overwrite. E então podemos escolher o método que queremos sobrescrever Criamos a configuração do comportamento e o comportamento morto. Então, vamos criar primeiro a configuração do comportamento. E eu quero remover as chamadas de configuração do comportamento básico. E vamos sobrescrever isso digitando agent set destination E essa seria a posição alvo. E, como você pode ver aqui, não temos a posição alvo porque a posição alvo está definida como um campo privado. Então, para corrigir isso, vamos voltar ao script inimigo. E para transformar a posição de destino desta, adicionarei uma palavra-chave protegida. Dessa forma, a postagem de destino ainda será serializada no inspetor, mas a classe secundária terá acesso a ela Então, agora podemos simplesmente digitar alvo, a posição e as seguranças Dessa forma, quando o método init for chamado dentro do refém crítico, a configuração do comportamento que será executada será diferente E será essa configuração de comportamento. Portanto, não precisamos iniciar o método de filmagem de rotina. Dessa forma, o inimigo não atirará no jogador. Agora, a próxima coisa que precisamos fazer é também substituir o outro método que criamos, que é o comportamento morto, que é o comportamento morto, e aqui queremos remover chamadas básicas. Em vez de adicionar a quilha inimiga, como esta aqui, queremos subtrair a saúde do jogador Então, vamos digitar game manager, a instância, e então vamos chamar player it. E agora podemos subtrair isso por um, mas provavelmente precisamos subtrair com um valor maior Então, é mais punitivo quando matamos um refém ou civil Ok, vamos salvar isso. E agora vamos voltar para a unidade. E para o refém aqui, vou colocar o Mx Então, só precisamos dar um tiro para matar o refém. E agora, aqui, vamos criar uma nova área de tiro no segundo ponto de tiro. Queremos adicionar o refém aqui para testar isso. Então, vamos arrastar o refém para ser o filho do tiroteio em 0,2 aqui, e vamos posicionar isso Acho que podemos posicionar o refém nesta área aqui. E gire em 90 graus. E precisamos criar um objeto vazio para a posição alvo. Vamos fazer isso, criar um novo objeto de jogo vazio. Vamos chamar essa posição-alvo de um. Vamos colocar isso em torno dessa posição aqui. OK. Agora, se selecionarmos o refém, vamos colocar a posição alvo no espaço POS alvo aqui Vamos apenas arrastar isso e definir isso como a posição de destino. Agora, salve isso. Vamos testar isso. Agora, vamos matar esse inimigo aqui. Aí está. Vamos ver se o refém está saindo. Ok, há um erro aqui. Aparentemente, o erro foi que eu esqueci de colocar o objeto do jogo de reféns aqui no slot inimigo aqui Então, agora vamos direcionar o refém aqui para a vaga inimiga E como o script de refém é a classe secundária do script inimigo, é por isso que podemos direcionar o objeto do jogo de reféns para o slot inimigo e o script de refém é registrado por esse E precisamos criar outro espaço para o inimigo e duplicar o inimigo Vamos duplicar esse inimigo aqui e fazer dele o filho do segundo ponto de tiroteio, e vamos colocar esse inimigo aqui e girá-lo 90 graus no Vamos criar uma nova posição alvo duplicando esta e provavelmente colocando-a aqui E ao selecionar o inimigo aqui, queremos definir a segunda posição alvo como posição alvo. Vamos renomear isso, selecionar o inimigo e arrastar essa posição alvo até o espaço de posição alvo do script inimigo aqui E agora, se selecionarmos o ponto de disparo, vamos arrastar o objeto do jogo inimigo para o segundo espaço inimigo aqui. E salve isso e vamos testar isso. No momento, haverá um problema em que precisaremos matar o refém e os inimigos para passar pela área do ponto de tiro E vamos corrigir isso. Eu vou matar isso. E agora aqui você vê isso quando o inimigo chegou. Depois de matarmos o primeiro inimigo, ele não progredirá porque precisamos matar o refém e o ponto de tiroteio registrar o refém como Agora, depois de filmarmos, podemos continuar. Precisamos corrigir isso. Então, vamos voltar para a pasta de scripts e abrir o script do ponto de tiro E aqui, OK. Dentro do método kilt inimigo, em vez de comparar o valor do kilt inimigo com o tamanho da lista de inimigos, precisamos criar um novo número inteiro para contabilizar o inimigo total naquela área de tiro Então, vamos chamar esse inimigo total e criar uma nova variável. E agora, quando estamos enviando o inimigo, vamos adicionar a variável total do inimigo dependendo da classe inimiga aqui. Podemos apenas usar um operador ternário, e aqui precisamos verificar se o objeto inimigo e a entrada do inimigo a partir do objeto inimigo, que é um script inimigo, d não é um script de refém Agora temos esse ponto de exclamação, e isso verificará se essa afirmação é negativa, então queremos adicionar o inimigo total Total de inimigos adicionados por mais um, queremos que você adicione o total de inimigos por zero. Dessa forma, se o inimigo for um script de refém , o inimigo total não será adicionado por um E vamos ver abaixo aqui, e agora vamos comparar o inimigo morto com a variável total do inimigo. E agora, depois de modificar isso, vamos adicionar um log de depuração para ver se isso é executado ou Então, vamos imprimir o nome do objeto do jogo em A, string, limpar e salvar isso. Vamos voltar ao Unity e testar isso. Então aperte play, e eu vou abrir a área do console aqui. Então, vamos atirar no inimigo. E atirar em 0,1 está livre, e vamos matar o segundo inimigo. Aí está. O tiro de 0,2 está livre. Então é assim que implementamos o refém usando herança, e podemos nos comportar substituindo o método 25. 24 configuração do temporizador de área: Oi. Nesta lição, vamos criar um cronômetro de área para cada ponto de tiroteio Em cada área, iniciaremos um cronômetro e, se o cronômetro terminar, prosseguiremos para a próxima E isso criará a possibilidade de o jogador não matar todos os inimigos, então podemos criar um sistema de pontuação posteriormente com base nisso Agora, para fazer isso, primeiro, queremos abrir o Pis Studio e depois modificar a classe de entrada de tiro. Vamos lá abaixo e o script de movimentação do jogador aqui. Temos uma classe personalizada para o objeto de entrada do tiroteio. E aqui queremos criar um novo tipo de campo flutuante, e vamos chamar essa área de cronômetro E também queremos definir o valor padrão para o cronômetro de área E eu vou definir esses dois 15 segundos. E dentro do script do ponto de tiro, queremos adicionar um novo método para substituir a área limpa Vamos criar um novo método público chamado area Clear. Dentro desse método, queremos verificar primeiro, não podemos usar o nome da área limpa porque ele já foi usado por essa propriedade aqui. Então, vamos chamar essa área definida de limpa. E queremos verificar se a área limpa do bulion é verdadeira, então queremos retornar isso e não executar mais o método E se a área ainda não estiver limpa, queremos limpar a área e retomar o movimento do jogador. Vamos acessar os objetos ou variáveis de movimento do jogador aqui e definir o movimento do jogador como verdadeiro. E agora, sempre que a área estiver limpa, queremos impedir que o inimigo atire. Então, para fazer isso, precisamos adicionar um novo método público dentro do script inimigo. Vou abrir o script do inimigo aqui. Dentro dessa classe aqui, vou criar um novo método público, e vou chamar isso de parar de fotografar. Para parar de fotografar, podemos simplesmente parar todas as cártinas dentro desse comportamento monocromático Como temos apenas uma corrotina dentro do script aqui, podemos simplesmente executar esse método a partir do comportamento mono, e ele interromperá todas as proteínas dentro dessa classe Ok, vamos voltar ao ponto de tiro aqui, e queremos examinar o inimigo aqui. E para os capazes, vamos chamar isso de inimigo. E para nossa coleção de inimigos, ela é chamada de lista de inimigos. Vamos digitar a lista de inimigos. Para cada inimigo, queremos acessar o subobjeto inimigo E esse subobjeto inimigo é um tipo de script inimigo, então podemos acessar o método stop shoot imediatamente. Oi, aqui é Roma do futuro. E nesse roteiro, o ponto do tiroteio, há um bug que foi apontado por Matt Muito obrigado por detectar esse problema, e precisamos verificar se o inimigo foi destruído ou não Porque se terminarmos uma área, quando o cronômetro chegar a zero, mas não tivermos matado todo o inimigo e matarmos alguns inimigos, esse inimigo provavelmente já será destruído, e isso gerará um erro Então, para fazer isso, precisamos verificar se o inimigo é basicamente a entrada inimiga, e cada entrada inimiga terá o objeto de script inimigo nela, então precisamos verificar esse objeto. E queremos verificar se o script inimigo que pertence a essa entrada inimiga é nal, então queremos continuar com as próximas iterações disso para cada loop, para que possamos simplesmente digitar continue, e isso pulará esse código aqui Então, para essa entrada inimiga, se o objeto de script inimigo já foi renovado ou foi destruído, queremos pular esse código e ele irá para o próximo inimigo na lista Então, com esse pequeno código, vamos evitar que esse bug aconteça. Agora temos esse método declarado. Queremos modificar o método start shoot out. E a primeira coisa que queremos adicionar é queremos passar uma flutuação e vamos chamar esse cronômetro E dentro desse método, queremos usar a extensão de ação retardada que criamos. E com essa ação atrasada, queremos executar a área definida limpa com o atraso do nosso cronômetro aqui para que passemos o método Agora, se salvarmos isso, vamos voltar ao script de movimento do jogador, aqui, e você verá que temos um erro porque agora o início dispara uma discussão por flutuação Vamos passar o argumento float acessando o índice de entradas de disparo de I, e queremos passar o cronômetro da área Agora, basicamente, quando isso for executado aqui, o ponto de disparo inicializará o valor ou as variáveis necessárias e, em seguida, atrasaremos o método definido de área limpa com o tempo como intervalo atrasado Agora, vamos voltar para o Unity e testar isso. Então, eu seleciono a câmera principal aqui. Você verá que agora temos o cronômetro de área de 15 segundos. Vamos fazer disso um valor muito pequeno. Por exemplo, 5 segundos. Agora vamos testar isso, apertar play e ver quando chegaremos à área de filmagem. Você vê que depois de alguns segundos, ele começará a se mover. Aí está. Começa a se mover. Isso significa que o cronômetro já terminou e ele começa a se mover para a próxima posição Vamos adicionar uma interface de usuário mais tarde. Mas agora, a próxima coisa que precisamos fazer é criar um novo objeto de cronômetro para contar o cronômetro da interface do usuário posteriormente Vou criar um novo script em C sharp e vamos chamar esse objeto. E vou abrir esse script dentro do Visual Studio e vou remover o comportamento mono Então, essa será uma classe personalizada. Dentro dessa classe de objeto de tempo, queremos criar um novo objeto de co-rotina privado, e vamos chamá-lo, e queremos criar um novo método público chamado starter E como vamos usar uma rotina co aqui, precisamos passar um comportamento mono para esse método Vamos apenas digitar um comportamento mono como primeiro argumento, e vou chamá-lo de B. E para o segundo argumento, vou passar a duração E, basicamente, queremos pular se o objeto timer não for nulo aqui ou se já iniciarmos a, então os valores do objeto de tempo não devem ser Então, vamos verificar se a hora é, então queremos retornar esse método aqui. Vou adicionar um registro de depuração aqui, para que possamos ver se algo acontece Vamos apenas digitar o log de depuração e amarrar o cronômetro que já está Precisamos criar a corrotina do cronômetro. Vamos apenas digitar o enumerador I para o tipo escrito e vamos chamar esse cronômetro de execuções Queremos passar a duração aqui para a cotina . Dentro da corrotina, queremos criar um loop selvagem com uma condição se a duração for maior que zero Então, queremos começar a contar o cronômetro. Aqui, podemos subtrair a duração com um valor de um e, em seguida, adicionar um retorno de rendimento Mas em vez de usar o Nu, que retornará todos os quadros. Portanto, os loops while serão executados a cada quadro. Vou atrasar o loop a cada segundo. Vou usar o novo peso 4 segundos e definir o valor como um. Isso funcionará exatamente como um cronômetro. A cada 1 segundo, vamos subtrair a duração em um Se a duração for zero, queremos sair desse circuito e executar qualquer código abaixo aqui. Quando o cronômetro acabar, queremos definir a contagem do cronômetro de volta para null E agora temos esse objeto temporizador. Vou expor um número inteiro público e vou chamar esse cronômetro de exibição, para possamos ver o cronômetro no inspetor, e vou passar o valor da duração para valor da duração Então, vamos definir o valor do cronômetro de exibição para a duração que está sendo executada atualmente no loop atual Então é um número flutuante, e isso é um número inteiro, então precisamos converter isso em um Vou adicionar um casting antes do valor da duração. Portanto, isso não gera mais o erro. Vamos salvar isso. A próxima coisa que queremos fazer é adicionar esse objeto de cronômetro ao gerenciador de jogos Você pode perguntar por que criamos outro script para o objeto timer Isso é para cumprir o padrão de responsabilidade única. Então, vou tentar fazer com que cada roteiro sirva apenas a um único propósito de responsabilidade. Portanto, é mais fácil para nós depurar mais tarde. Quando há um erro, podemos isolar um erro em um único script Em vez de colocar o cronômetro dentro do gerenciador de jogos, também com todas as rotinas e o método E isso é muito fácil de usar aqui. Como esse não é um comportamento monel, podemos simplesmente criar um novo campo privado e com um tipo de objeto de tempo E vamos chamar esse objeto de tempo aqui. Me desculpe E eu vou inicializar isso. E guarde isso. E agora podemos usar todo o método dentro do objeto timer Então, aqui dentro do gerenciador de jogos, queremos criar um novo método público para iniciar o cronômetro. Então, aqui abaixo, vou criar um novo vazio público e vou chamar esse cronômetro de início, e vamos perguntar a duração do cronômetro como argumento E agora, para iniciar o cronômetro, podemos simplesmente acessar nosso objeto de tempo e, em seguida, executar o método start timer e, em seguida, transmitir o comportamento mono E como o gerente do jogo tem um comportamento mono, podemos simplesmente passar essa classe aqui e depois passar a duração Outra coisa que precisamos criar é criar um método para parar o cronômetro. Então, vamos ao objeto timer aqui, e eu vou criar um novo vazio público ou um método público, e vou chamar esse temporizador de parada E para o cronômetro de parada, vamos pedir um comportamento mono como argumento E aqui queremos verificar se o cronômetro está atualmente nulo ou se não há tempo em execução no momento, então queremos retornar esse método Ou podemos simplesmente adicionar um registro de pontos de depuração aqui e digamos que não há nenhum em execução no momento E eu quero devolver esse método. Mas se o cronômetro não for nulo, queremos parar o cotin usando o comportamento mono que passamos aqui e, em seguida, executar o E para o crotin, podemos simplesmente passar esse objeto ter cotin Vamos apenas definir o argumento da cotina para o método stop protein E depois de parar o cotin, queremos ajustar o cronômetro de volta para Criamos o método stop timer. Vamos voltar ao gerente do jogo e, em seguida, queremos criar um novo cronômetro de parada de vazio público E aqui, podemos simplesmente acessar o objeto timer, executar o método stop Ter e depois passar o comportamento mono com essa Ok, agora que criamos o cronômetro de início e o cronômetro de parada, queremos acionar isso a partir do ponto de partida Sempre que executamos o método start shoot out para o ponto de tiro aqui, também queremos iniciar o cronômetro dentro do nosso gerenciador de jogo Vamos apenas acessar a instância do gerenciador de jogos e executar o cronômetro de início E isso quanto à duração, então podemos simplesmente passar o tempo como a duração. E aqui, queremos parar o cronômetro se todo o inimigo já tiver sido morto Então, aqui, vamos acessar a instância do gerenciador de jogos , executar o método stop timer e salvar isso Para limpar a área definida, não precisamos parar o tempo porque, quando a área for limpa, isso significa que o tempo acabou, então o cronômetro parará sozinho e salvará Agora vamos voltar para a unidade. E vou modificar o cronômetro novamente e fazer isso provavelmente para 10 segundos e salvar a cena E se selecionarmos o gerente do jogo, não poderemos ver o objeto timer porque não definimos a classe como uma classe serializável Então, vamos voltar para o estúdio fiscal e para dentro do objeto ter Vou adicionar um atributo serializável. Então, digite o sistema considerável. Guarde isso. Outra coisa que precisamos fazer é, esqueci, como o objeto do cronômetro é privado, não podemos vê-lo Mas se quisermos ver, podemos adicionar um atributo de campo de tamanho ou simplesmente ativar a visualização de desenvolvimento do nosso inspetor Então, aqui podemos ver nosso objeto cronômetro e podemos ver o campo do cronômetro de exibição. Agora vamos salvar a cena aqui e jogar isso. Agora, se chegarmos à área de filmagem, você verá que o cronômetro do display começa de verdade. OK. Há algo que eu esqueci que você fez, e é por isso que o cronômetro do display não está funcionando Então, vamos voltar ao estúdio Fiscal aqui. E dentro do nosso objeto Tier, esquecemos de executar a rotina co dentro do método start timer. Então, agora precisamos executar a corrotina se a corrotina for. Então, vamos apenas t igual a iniciar a rotina co, e queremos executar a rotina runs co e, em seguida, passar a duração como argumento. Antes que esse enumerador termine, nunca é executado porque esquecemos de executá-lo Então, agora vou salvar o script aqui e voltar para o Unity. Agora, depois que o script for compilado, vamos executar e ver esse valor aqui. Observe o valor do cronômetro de exibição. Quando chegamos à área, ela começa a contar nove, oito, sete e, quando esse valor se torna zero , ela continua se movendo um, zero. Aí está. E na próxima área, ele começará a contar a área. Ele começará a contar o cronômetro novamente. É assim que criamos um cronômetro com um objeto separado, para que ele manipule todo o código de tempo No próximo vídeo, começaremos a criar a interface do usuário do nosso jogo aqui. 26. 25 estatística de jogo: Neste vídeo, antes de continuarmos a criar a interface do usuário, queremos criar primeiro as estatísticas do jogo. Então, queremos registrar quantos tiros foram disparados quantos inimigos foram mortos e quantos inimigos existem no total na cena Então, vamos começar com isso. Vamos ao estúdio visual aqui e, dentro do gerenciador de jogos, já criamos duas variáveis inteiras para o inimigo atingido e os tiros disparados Isso serve basicamente para calcular a precisão posteriormente, mas também queremos adicionar o contador de inimigos mortos e o total de inimigos Contador, e também contador de reféns mortos. Então, agora precisamos criar um método para adicionar esse valor aqui. Então, vamos criar um novo método público abaixo aqui. O primeiro que queremos criar é criar um método de registro de inimigos. E isso é para registrar um inimigo, e para registrar, precisamos apenas adicionar o inimigo total por um, e isso será chamado pelo script do inimigo no início O próximo método que queremos fazer também é um método público e é chamado de morte de reféns Para este, queremos adicionar o valor do refém morto. A próxima coisa que queremos criar é criar um método de matar inimigos. Vamos apenas criar um novo método público e chamar esse inimigo de morto. Vamos apenas adicionar a variável inimigo morto por um. Agora, criamos esses três novos métodos. Vamos ver o script do inimigo aqui e, após a inicialização, na configuração do comportamento, queremos adicionar o inimigo de registro da instância do gerenciador de gays Sempre que o inimigo é inicializado, queremos registrar um inimigo aqui Aqui embaixo, sempre que o inimigo é morto. E eu acho que sim, aqui, queremos registrar a morte. Então, vamos executar a instância do gerenciador de jogos dot enemy killed. Oh, desculpe, em vez de adicionar isso aqui, podemos simplesmente adicionar isso dentro do comportamento de morte. Então, vamos fazer isso. E isso adicionará o contador de inimigos mortos. E para o script de refém, queremos adicionar a instância do gerenciador de jogo do refém morto sempre que o comportamento de morte no script de refém Vamos salvar isso. Agora vamos voltar para a unidade. Com o inspetor configurado para depurar, poderemos ver as variáveis privadas que criamos Agora vamos testar isso. Acho que preciso aumentar o cronômetro, então vou até a câmera principal aqui Em primeiro lugar, vou ajustar o cronômetro da área para 30 segundos. Então, temos tempo para matar todos os inimigos e salvar isso. Agora vamos apertar play e testar isso. Vamos selecionar o gerente do jogo e veremos as estatísticas aqui. Então, agora vamos matar esse inimigo aqui. E matamos dois inimigos. Agora vamos tentar matar o refém primeiro para ver e vamos matar esse inimigo. Preciso recarregar Aí está. Agora você vê que eu atirei 15 vezes e atingi o inimigo 13 vezes, e também matamos três inimigos do total de três inimigos na cena, e também matamos o refém Posteriormente, usaremos esse valor para calcular as pontuações no final do jogo. 27. 26 Barra de saúde da interface do usuário: Olá, neste vídeo, vamos começar a trabalhar na interface do usuário. E neste capítulo, vamos criar a Health UI para o jogador. Então, para criar a Health UI, eu já preparei um pacote. Então, vamos importar esse pacote. Vou até o menu de ativos, importarei o pacote e escolherei o pacote personalizado. E então aqui eu tenho o pacote UI Pa. Depois de aberta, a janela de importação do pacote, vamos importar tudo. E vou arrastar o UPAC para dentro da nossa pasta de jogos de sublinhados Agora, se você abrir o UIPac, teremos uma pasta prefabs e dentro dessa pasta prefabs e Eu já preparei um objeto HUD de jogador e podemos arrastá-lo para a câmera principal Vou arrastar isso para ser o filho da câmera principal. E agora vamos ajustar o parâmetro. Como você pode ver aqui, temos uma barra de ajuda. Também temos o contador de MO e também a notificação de recarga A forma como as preferências são configuradas já está voltada para a direção correta em relação à câmera Se você pode ver aqui, se formos para a visualização do jogo, verá que temos a interface de usuário seguindo a câmera porque está vinculada à câmera e é levemente girada no eixo y. Então, agora estamos prontos para ir. Também vou importar um fundo personalizado e, para esta etapa, você pode simplesmente escolher seu próprio lago e substituir o fundo no texto após essa etapa. Dentro da pasta underscore do jogo, vou criar uma nova subpasta, e vou chamar isso de fundos, e eu já preparei uma diversão Vou apenas arrastar esse fundo que vou usar. E agora, depois de importarmos o fundo para cá, vou clicar com o botão direito do mouse no telefone e escolher criar o menu . No menu de texto Mash, vou clicar no ativo encontrado Portanto, ele gerará o recurso preferido para o texto Mash pro. Então, agora que geramos o ativo fond, podemos simplesmente selecionar o objeto filho que tem os componentes text mesh pro anexados a ele E aqui podemos escolher o telefone que geramos. Então, agora temos um telefone mais bonito. E para o texto real, eu também vou mudar o texto do telefone aqui. Aí está. E agora podemos começar a trabalhar no script do UI Manager. Então, vamos para a pasta de scripts, e eu vou criar um novo script C sharp, e vou chamar isso de UI Manager. E vamos abrir esse gerenciador de interface do usuário. Então, agora que abrimos o script do UI Manager, vou excluir o método de início e atualização. Também vou excluir a herança de comportamento mono E vou adicionar um atributo serializável do sistema. E vou usar essa classe de gerenciador de interface do usuário exatamente como a classe de tempo ou objeto que criamos anteriormente. Então, vamos até o gerente homossexual, e eu vou mover o gerente do jogo para ficar ao lado do nosso script de gerenciamento de interface, para que seja mais fácil trocar. E aqui podemos declarar o UI Manager como um campo ou objeto dentro do script do gerenciador de jogos Então, aqui vou adicionar um campo serializado. Para o tipo, vou usar a classe UI Manager aqui e vou chamar esse UI Manager. Agora que criamos isso de volta para nossa classe de gerenciador de interface de usuário, queremos primeiro importar a biblioteca profissional Tex Mash Vou digitar usando a classe tex TM pro e, em seguida, também vou usar a interface do motor Unity Aqui, dentro da classe UI Manager, queremos criar um novo campo serializado, e isso seria um tipo de controle deslizante, e isso é para nossa barra de saúde Vou ligar para esse bar de saúde. Em seguida, queremos criar um método público para atualizar a barra de saúde. Mas antes de criarmos esse método, queremos criar um novo método public void init, é para inicialização E para inicializar, queremos passar o máximo de saúde que temos para esse jogador Vamos apenas digitar float e vamos chamar isso de float Mx health como argumento para o método E aqui para a barra de saúde, queremos atribuir seu valor x à saúde Mx que acabamos de passar por esse método e também queremos definir o valor da barra de saúde para o argumento de saúde Mx aqui. A próxima coisa que queremos criar é criar um novo método público para atualizar a saúde. Vamos chamar isso de atualização de saúde. E então podemos simplesmente passar um valor flutuante, e vamos chamar esse valor flutuante E agora, sempre que chamamos esse método, queremos atualizar o valor da nossa barra de saúde. Vamos apenas digitar barra de saúde, valor, igual ao valor que passamos aqui e salvar isso. Agora, se formos para o gerenciador de ganhos, queremos inicializar o gerenciador de interface do usuário Vamos igualar o novo gerenciador de interface do usuário. Instance e salve des, e aqui abaixo. Dentro do método de saúde do jogador, queremos atualizar a saúde atual para o valor da barra de saúde aqui. Vamos digitar aqui abaixo o substrato de saúde atual pelo dano Digite UI manager, atualize a integridade e, em seguida, passe o valor da integridade atual. E isso atualizará o valor da barra de saúde e o salvará. E agora vamos voltar para o Unity. Agora, se selecionarmos o gerenciador de jogos aqui, você verá que temos um novo campo chamado UI Manager, e podemos expandi-lo , e podemos ver o campo dentro da classe UI Manager. Agora, queremos arrastar a barra de saúde até o slot aqui. Então, basta selecionar a barra de saúde principal abaixo do HUD do jogador aqui, e eu já preparei o componente deslizante aqui e defini seu valor dez, e você verá que, se deslizarmos esse valor aqui, nossa barra de saúde diminuirá Então, vamos selecionar o gerenciador de jogos novamente, arrastar o objeto do jogo Health Bar e salvá-lo. Uma coisa que eu esqueci é que precisamos executar esse método inicializado Então, vamos até o gerente do jogo. Dentro de seu método inato, queremos ter certeza de que estamos inicializando o UI Manager Vamos apenas chamar o método init objeto gerenciador de interface do usuário e, em seguida, transmitir a integridade atual que estamos inicializando antes E guarde isso. Agora, vamos voltar para o Unity e agora vamos testar isso. Vou pressionar play e ver se, desculpe, precisamos primeiro ocultar o texto lido , então vou esconder isso. E agora vamos ver se a barra de saúde for atualizada sempre que formos baleados pelo inimigo. Aí está. É assim que criamos a barra de saúde. Sinta-se à vontade para explorar o prefeito que eu criei e como eu criei a interface do usuário aqui Também para essa recarga, ele tem um componente animador Basicamente, está apenas animando seu valor Alpha. Aqui, como você pode ver, ele anima o valor Alfa das quatro cores do texto aqui No próximo vídeo, continuaremos trabalhando nas informações sobre armas do nosso HUD. 28. 27 HUD de arma de interface: Neste vídeo, continuaremos trabalhando em nosso sistema de interface de usuário. E desta vez, queremos mudar o ícone da arma se pegarmos uma nova arma, e também atualizar o contador de MO aqui e também ativar a notificação de recarga quando o MO acabar Agora, para fazer isso, vamos ao Sudio, e precisamos acessar primeiro a arma e também os jogadores Dentro do script do player, queremos criar um novo evento estático público. Então, vamos criar uma nova estática pública e, para o evento, vou definir isso como um sistema, não uma ação. E eu vou passar um objeto para o nosso evento aqui. Para a assinatura, vou adicionar os dados da arma e vou convocar esse evento sobre troca de armas. E vou preencher esse evento com um delegado vazio. Portanto, não precisamos verificar se há nenhum assinante sempre que quisermos invocar esse evento. Guarde isso. E eu propositalmente faço isso estático. Portanto, é mais fácil acessar isso de qualquer outro script sem ter uma referência ao script do player. OK. A próxima coisa que precisamos fazer é entrar no método de troca de armas. E aqui, depois de configurarmos a nova arma, queremos transmitir esse evento. Vamos invocar o evento de troca de armas e passar os dados da arma de carbono Como os dados atuais de armas são dados de armas, podemos passá-los para nosso próprio evento de troca de armas, e esse evento transmitirá esses dados, e quem estiver se inscrevendo nesse evento receberá novos dados de armas Agora, a próxima coisa que queremos fazer é acessar os dados da arma e, dentro da classe de dados da arma, criar um novo evento público, e esse não será um evento estático. Será apenas um evento público, então podemos simplesmente digitar a ação de pontos do sistema. E queremos passar o MO como a assinatura ou o objeto que estamos transmitindo por meio desse evento Então, vamos adicionar um número inteiro como sua assinatura. E então podemos simplesmente chamar isso de arma de fogo, e podemos simplesmente configurar um antidelegado, como fizemos no roteiro do jogador, segurança e/ou talvez possamos simplesmente chamar isso de fogo de arma E queremos transmitir o evento sem arma disparada aqui na atualização da arma aqui e sempre que pressionarmos o botão do mouse aqui. Então, agora vamos invocar o evento de não disparo de arma aqui e depois ultrapassar o carro em MO E para a metralhadora aqui, queremos também invocar o evento aqui. Agora vamos salvar isso. E também queremos adicionar o ícone da arma. Vamos ao topo da nossa declaração de campo. E eu vou adicionar um novo campo serializado, será um tipo de sprite E vamos chamar esse ícone de arma. Vou expor esse campo serializado usando uma propriedade Abaixo, vou criar um novo tipo de sprite de propriedade pública E então eu vou chamar esse ícone de GT. E então, para o acessador GT, vou devolver o ícone da arma Aqui. OK. Agora podemos salvar isso e vamos para o UI Manager. Então, agora dentro do UI Manager, queremos declarar algumas variáveis, e eu vou adicionar o atributo de cabeçalho, e vou passar uma string para esse atributo de cabeçalho E vou chamar essa arma de HUD e, abaixo, vou criar uma nova imagem para o ícone da arma Então, para os outros campos que precisamos criar, há um texto Mash pro Vamos apenas pesquisar o texto Mash pro object, UGI, verificar o UGI, e vamos chamar isso de imposto MO E a outra coisa que precisamos criar é um objeto de jogo para o aviso de recarga Vamos chamar isso de aviso de recarga. E aqui dentro do método in, queremos assinar um evento no script dos jogadores, o evento estático que declaramos. Então, vamos acessar o script do jogador e, em seguida, acessar o evento on weapon change. Queremos assinar esse método que temos aqui dentro do UI Manager. Então, precisamos criar o método primeiro. Vou apenas assinar um método. E eu vou criar o iso Studio para gerar isso automaticamente. Aí está. Temos isso na arma e ela já passou os dados da arma aqui. Então, vou remover a nova exceção não implementada do Trow nova exceção não implementada E aqui também queremos criar uma nova variável privada para armazenar nossos dados de armas. Vamos digitar dados de armas privadas e chamá-la de arma atual. Aqui, dentro do método de atualização de armas. Queremos verificar se a arma atual não é nula. Então, se não for nulo, queremos remover o segundo evento on weapon fire , um método chamado update MO, e ainda não o criamos, então vamos criar um novo vazio, chamado update MO, e passar um inteiro para E aqui queremos atualizar o texto do MO. Usando o método set text do text mesh pro e passe o O que passamos como argumento aqui no método e converta esses dois em uma string, e eu vou formatar essa string dois como um valor de dois dígitos aqui usando o argumento string desse método de duas strings Agora, se a arma atual não for nula, queremos cancelar a inscrição do evento de arma disparada desse método aqui Vamos digitar negativo igual a atualização MO, e isso cancelará a inscrição porque estamos alterando os dados da arma para uma nova arma que passamos por este evento aqui Então, agora queremos atualizar a arma Caron para o novo objeto de arma que passamos neste argumento aqui E então queremos assinar este novo evento de dados de armas em nosso método MO de atualização. E aqui embaixo, também queremos atualizar o sprite do ícone da arma acessando as propriedades do sprite e seguida, passando a arma Caron, obtendo as propriedades do sprite C Agora que temos uma assinatura de evento, também precisamos removê-la sempre que esse gerenciador de interface de usuário for desativado Então, vou criar um novo método público e chamar esse evento de remoção. E então eu vou copiar essa linha aqui, colar aqui. Mas em vez de usar o sinal positivo, vou mudar isso para sinal negativo para cancelar a inscrição desse método neste evento aqui Vamos salvar isso e, dentro do gerente homossexual, queremos criar um novo método vazio ao desativar Este é um método incorporado da Unity. Basicamente, ele será executado sempre que esse script for desativado, quer paremos o editor ou se o gerente homossexual for destruído, isso também será invocado Dentro do método undisable, queremos acessar o gerenciador de interface do usuário e, em seguida, queremos acessar o método remove event Outra coisa que queremos adicionar aqui, dentro do gerenciador de interface do usuário. Sempre que atualizamos o O, queremos também ativar o aviso de recarga, sempre que o O for zero Aqui, antes de definirmos o texto O aqui, vamos apenas acessar o objeto do jogo de aviso de recarga e executar o método ativo Então, para o argumento, o valentão e o valor, podemos simplesmente passar O menor ou igual a zero Então, isso verificará se o MO é igual ou menor que zero, então isso será verdade e o aviso de recarga será ativado. E vamos salvar isso. E vamos voltar para o Unity. Vou esperar um pouco até que o script seja compilado e agora ele está concluído. Vamos selecionar o gerente do jogo. E aqui temos novos campos para o HUD da arma. Para o ícone da arma, queremos direcionar esse objeto do ícone da arma a partir das preferências do HUD do nosso jogador O texto do MO apenas direciona esse objeto fiscal e, para o aviso de recarga, queremos cavar o objeto de recarga do jogo. Vamos salvar isso. Agora vamos testar isso. Ok, houve um problema e, aparentemente, está relacionado à condição da corrida. Então, para corrigir isso, precisamos ir ao estúdio fiscal e, basicamente, as armas de troca são executadas desde o início do script do nosso player. E no UI Manager, o init também é acionado desde o início do gerenciador de jogos Se o início do script do jogador for anterior ao do gerente do jogo, gerente da interface do usuário não obterá os dados da nova arma que o script do jogador está transmitindo Para corrigir isso, precisamos atrasar um pouco. Vou usar essa extensão que criamos, a ação retardada, e depois vou passar um delegado que executa esse método E então vou passar um valor muito pequeno, amostra de 0,1 segundo e salvar isso. Outra coisa que precisamos corrigir também está nos dados de nossas armas. Sempre que atualizamos ou recarregamos o MO aqui, como você pode ver, também queremos lançar esse evento aqui Vamos apenas copiar essa linha e depois colá-la aqui. Portanto, isso atualizará o MO em nosso gerenciador de interface do usuário. Outra coisa que precisamos fazer é voltar para o Unity e, dentro da pasta de dados, adicionar um sprite para o ícone da arma Então, vou selecionar a arma padrão aqui. E com o UiPac que importamos antes, teremos esse ícone de arma, e eu vou usá-lo como arma padrão E para a metralhadora, vamos usar a outra arma de ícone da interface aqui. E vamos salvar isso. Depois de configurarmos o ícone aqui, também precisamos adicionar algumas modificações nos dados da arma aqui, e vamos copiar essa linha de tiro da arma aqui. E também queremos realizar o evento de disparo de arma sempre que instalarmos essa nova arma aqui. Então, vamos executá-lo aqui. E depois de iniciarmos o evento no método de configuração da arma, queremos acessar o script do jogador. E então queremos mudar a ordem do nosso evento aqui. Então, queremos ter certeza de que o evento foi disparado ou transmitido antes de configurarmos os dados da arma de carbono Então, vamos colar aqui e excluir essa linha vazia aqui. Guarde isso. E agora vamos voltar para o Unity. OK. Então, agora vamos testar isso novamente, e se isso funcionar, o texto real fica oculto imediatamente e o Oh é atualizado imediatamente. Então, vamos apertar play. E aí está. Como você pode ver aqui, o O é atualizado imediatamente, e podemos atirar e, quando recarregamos, ele é atualizado, e também podemos escolher essa arma e ela mudar o ícone Também atualize o O, mas não podemos recarregar com esta arma. Então, se essa arma estiver vazia, ela retornará à arma padrão aqui. E vamos começar, e se o MO acabar, você verá que a taxa de recarga está ativada E quando recarregarmos, ele será desativado Então, sim, terminamos com nosso sistema HUD de armas e, no próximo vídeo, trabalharemos em outros elementos da interface do usuário 29. 28 Temporizador de interface: Nestas videoaulas, continuaremos trabalhando no elemento de interface do usuário. E desta vez vamos trabalhar no horário. Então, para trabalhar no cronômetro, vamos até o gerente homossexual aqui e eu vou criar um novo objeto UI Canvas como filho do nosso gerente homossexual Agora, com essa tela selecionada, vou alterar sua configuração para o modo de escala da interface do usuário no escalar Canvas Vamos alterar essas duas escalas com o tamanho da tela e vou definir as resoluções de referência full HD 11920 por 1080 Vou definir o modo de correspondência de tela para 0,5, que fique a meio caminho entre a largura e a altura e salve a cena novamente E agora, dentro dessa tela, se formos para a visualização D aqui e pressionarmos F enquanto selecionamos a tela, você verá que temos uma tela muito grande aqui E todas as interfaces de usuário que preparamos nessa tela aqui serão sobrepostas à frente de nossa câmera na visualização do jogo aqui Agora vou criar um novo objeto filho, que será um tipo de text-mesh pro. E se ampliarmos isso aqui, esse será o contador do cronômetro Vou ligar para esse cronômetro e colocá-lo aqui em cima, mas vou mudar seu tamanho primeiro Vou definir sua altura para 75 e a largura para 150. Para o texto, vou definir 200 e também definir o tamanho limite a ser ativado. Vou alinhar isso ao meio. E também altere os ativos do telefone para o rex LA que criamos no vídeo anterior. Agora temos essa configuração do cronômetro. Vamos alinhar isso acessando as predefinições de âncora e segurando o botão de saída no teclado, podemos simplesmente escolher essa parte central superior aqui, e ela encaixará nosso cronômetro na parte superior da tela Agora vamos abrir o script do UI Manager. Vamos até o FSO Studio e acessemos o gerenciador de interface do usuário. E aqui, para o gerente de interface do usuário, queremos adicionar um novo campo abaixo da nossa barra de saúde. Vamos apenas digitar um novo campo Serialize e, para o tipo, será uma interface de usuário P de malha de texto, e vou chamar isso de Tier tex Agora, queremos modificar o script de objeto Tier que criamos anteriormente, então vamos abrir o script Tier. Aqui, queremos criar um novo evento estático público. O evento estático é bastante poderoso. Isso nos facilita a comunicação entre scripts sem depender um do outro , geralmente chamado de desacoplamento Vamos apenas digitar public static, e queremos definir isso como uma ação do sistema e, em seguida, queremos passar um número inteiro Vamos apenas adicionar um número inteiro como sua assinatura, e vamos chamar isso de mudança de horário E crie um antidelegado. Com o evento estático, declare, podemos ir para nossas corridas de tempo aqui e, aqui, antes de subtrairmos a duração, podemos passar essa duração por meio de nosso evento de mudança de horário Vamos apenas invocar isso ou transmitir a mudança de horário e queremos passar um número inteiro Mas como a duração é flutuante, precisamos converter isso em um número inteiro Vou adicionar uma conversão para o tipo inteiro usando parênteses de ativos e, em seguida, a palavra-chave integer e , em seguida, digitar o nome da variável o Isso converterá a duração em número inteiro e o evento de mudança de horário transmitirá isso Agora, dentro do gerenciador de interface do usuário, queremos nos inscrever neste evento de mudança de horário. Dentro do método init, vamos apenas adicionar um novo objeto time e acessar o evento on time or change, e queremos criar um novo método chamado update Ter Mas não criamos isso, então vamos pedir ao Visual Studio que gere automaticamente. E agora temos isso. Vou mudar o nome dos argumentos para o Ter atual. Dentro desse cronômetro de atualização, vamos apenas atualizar o texto do cronômetro aqui Vamos apenas digitar time tax, definir o texto e, em seguida, queremos converter a hora atual em uma string usando o método string e, em seguida, formatar esses dois como um número de dois dígitos Usando o argumento string. Guarde isso. Agora que temos algumas assinaturas no gerenciador de interface do usuário, precisamos garantir que elas também sejam removidas sempre que o objeto for desativado. Dentro do evento de remoção, queremos colar essa linha aqui e depois alterá-la para o tipo de assinatura. E aqui, também queremos ter certeza de que estamos cancelando a assinatura da arma disparada dentro do evento de remoção, então basta copiar essa linha, colá-la aqui e salvá-la Agora vamos voltar para o Unity e testar isso. Primeiro, precisamos configurar o texto do cronômetro aqui e já criamos o objeto de jogo TR com o componente de malha de texto anexado a esse objeto de jogo temporal Vamos apenas arrastar isso para este slot de texto Ter aqui, e ele registrará o componente de texto Mash Pro UI Agora vamos salvar isso e testar isso. Agora, quando chega, ele atualiza o cronômetro e começa a contar o cronômetro aqui, como você pode Então, vamos matar o inimigo e ir para a próxima área, e ele fará a contagem regressiva da área novamente quando chegar. Então aí está, como você pode ver, é muito fácil implementar o I usando o evento estático. 30. 29 refém da interface do usuário morto: Neste vídeo, continuaremos trabalhando na interface do usuário e, desta vez, adicionaremos um texto sempre que matarmos um refém Mas antes de nos aprofundarmos no texto da morte de reféns, vou mostrar que criei outro ponto de tiroteio, o terceiro ponto de tiro, e dupliquei o terceiro do segundo No terceiro ponto Shula, ele também consiste em refém e inimigo, e eu o coloquei nesta posição aqui Para o refém, eu coloquei aqui, também a posição do alvo nesta posição E para o inimigo, eu o coloco aqui, e a posição alvo é correr nesta posição. Então, você pode fazer isso sozinho para acompanhar este vídeo. Outra coisa que queremos corrigir aqui, vamos rodar este jogo para testar isso. Mas você verá que, no final, a câmera está um pouco inclinada. Aí está. Está um pouco inclinado. Queremos corrigir isso. Mas antes de consertarmos isso, certifique-se de que o terceiro ponto de tiroteio inserido no script de movimento do jogador como o terceiro ponto de tiroteio Eu adicionei uma entrada aqui e, em seguida, arrasto o terceiro objeto de ponto de disparo até o slot E então eu defino a distância em 17 aqui. Agora vamos corrigir isso. Precisamos ir até a visualização da cena aqui e selecionar o movimento do caminho da câmera. Em seguida, selecione o último ponto aqui. E se selecionarmos o ponto individual aqui, e se você selecionar girar, você verá que temos esse dispositivo de rotação e podemos girar apenas esse ponto para ajustar Mas descobri que o melhor valor para isso é 358, então vou apenas inserir aqui o ângulo sob as opções de pontos selecionados no componente criador do caminho Agora, se você selecionar a câmera novamente e eu limpar isso para atualizá-la, você verá que temos uma rotação correta da câmera, não levemente inclinada Vamos apenas habilitar a opção Voltar e, em seguida, vou definir a distância de visualização de volta para zero. Desculpe, vou habilitar isso e depois desabilitar isso. Agora que configuramos o terceiro ponto de tiroteio, vamos criar o texto da quilha de refém No gerenciador de jogos Canvas, expanda isso. E vou criar um novo UI text mesh pro, vou ver aqui e depois pressionar F para focar nesse objeto de malha de texto. E ao diminuir o zoom, vou aumentar a largura do texto, talvez em torno de 350, para a altura, vou fazer isso 100 e vou digitar refém kel E agora, dentro do gamevi, podemos ver o texto aqui e vamos ajustá-lo para que fique melhor Vou definir o alinhamento no centro e no meio. Também para as cores verdes, vou escolher uma cor vermelha e, em seguida, escolher o recurso de fonte que criamos anteriormente E então eu vou definir isso de tamanho, mas eu quero torná-lo maior. Então, vou aumentar a largura para cerca de 450 e depois a altura em torno de 150. Então, temos um imposto maior aqui. E vamos apenas aumentar o máximo. OK. Acho que esse é o tamanho máximo do imposto acordo com a largura e nossa configuração de altura. Então, se quisermos aumentar isso, precisamos aumentar o tamanho aqui. Então, vamos aumentá-lo novamente. OK. Acho que deve ficar tudo bem. E vamos chamar esse refém de Kel. E agora queremos modificar o script. A primeira coisa que precisamos fazer é abrir o gerenciador de interface do usuário. E aqui dentro do UI Manager, queremos criar um novo campo de seriais com o tipo de transformação Então, vou apenas digitar isso. E depois para a transformação de tipo. E para esse campo, vamos chamar essa mensagem de texto de refém morto E agora, dentro desse UI Manager, precisamos criar um novo vazio público para mostrar esse texto aqui Vou criar um novo vazio público e, em seguida, chamar o método show hostage kill, e precisamos pegar uma posição Então, vou passar um fator três como argumento. E também queremos passar um Bulion por mostrar isso. E queremos habilitar o imposto com base no bilhão aqui. Vamos apenas acessar o objeto do jogo da variável de imposto refém keel, executar esse método ativo e passar o show E queremos verificar se o show é falso e, em seguida, queremos retornar essa função, para que não precisemos executar mais códigos abaixo. Agora precisamos criar uma função auxiliar para manter nossa interface dentro da tela Porque se o refém estiver bem próximo à nossa tela, podemos mostrar o texto da quilha do refém aqui, mas alguma parte estaria fora da tela aqui devido à posição da quilha do Precisamos contar isso para garantir que a interface do usuário não saia da tela. Para fazer isso, vamos abrir nossa classe de extensão aqui e criar um novo método estático público. Vou criar um novo método estático público, mas esse método retornará um fator três Vamos chamar isso de get position inside screen. Aqui, queremos passar um vetor para a resolução, a resolução básica. Vamos chamar essa base de res e, em seguida, queremos passar um vetor dois também para a posição ancorada Então, vamos criar o método. Dentro desse método, queremos criar um novo float, e vamos chamá-lo com limites Para o limite de largura, queremos usar a resolução base x. Substrato com a largura da retransformação Em vez de uma pausa ancorada, precisamos passar por uma transformação Vamos mudar isso para t, e então vou subtrair o componente base re x aqui com a largura do retângulo t e vamos criar o limite de altura Essa será a base S ponto y, substrato com altura direta do ponto Estamos calculando a largura e a altura do nosso componente de interface do Além disso, queremos adicionar um ponto flutuante para o deslocamento e, em seguida, também queremos subtrair esse valor resultante com Temos alguma margem até a borda da tela aqui. E então, para a altura, também queremos adicionar o deslocamento Então, agora que temos a largura e a altura limitadas, podemos usar isso para fixar a posição ancorada da transformação rec Vou explicar isso um pouco para essa fórmula aqui. Vamos voltar à unidade e criar uma nova imagem. E agora, como você pode ver, essa imagem tem 100 pixels de largura com 100 pixels de altura. Se quisermos aumentar esse tamanho para cobrir a tela, precisamos inserir a resolução básica com o Sizo Nesse caso, é 1920. E com isso, precisamos obter a metade do tamanho da tela aqui. E então precisamos levar em conta nossa largura na metade dos nossos elementos de interface do usuário. Então, por exemplo, se eu colocar isso no 960, que é o 1920 dividido por, então esta é a nossa posição Mas isso fará com que a interface seja cortada ou que alguma parte da interface fique fora da nossa tela. Então, para corrigir isso, precisamos subtrair isso com metade do tamanho da nossa largura, que é 250 Isso é basicamente o que estamos fazendo. E para o lado esquerdo da tela , precisamos apenas multiplicar isso por menos um. Aí está. Com essa fórmula, podemos calcular o elemento da interface do usuário, para que ele permaneça dentro da nossa tela. Vou deletar essa imagem aqui e voltar para o estúdio fiscal. Agora vou criar um novo vetor u, e vou chamar essa posição ajustada, e vou definir o valor da posição ajustada para ser o retângulo, o retrans do objeto que passamos e sua posição ancorada Vou pegar a posição da âncora como o valor base da nossa posição ajustada Em seguida, vou ajustar o componente x da variável de posição ajustada usando o clam matemático F e, para o valor, vou passar o próprio valor x. E para o mínimo, vou usar o limite de largura, multiplicar isso por menos zero, desculpe, menos 0,5 Porque queremos dividir isso por dois e, para a posição mínima, queremos multiplicar isso por menos um Então, podemos fazer isso de uma só vez multiplicando por um valor de meio ou menos meio. E então, para o valor máximo, podemos simplesmente usar o limite de largura novamente e multiplicá-lo por mais 0,5 Dessa forma, obteremos a posição dentro da tela. E para a posição y, queremos fazer exatamente o mesmo modificando o componente y, e então usar a classe matemática f aqui e o método clam e , em seguida, passar a posição y da nossa posição ajustada, e então usar os limites de altura, multiplicar isso por menos 0,5, e então também para o máximo y, queremos multiplicar isso por 0,5 positivo e então também para o máximo y, queremos multiplicar Agora que temos a posição ajustada, queremos retornar essa posição ajustada, digite retornar posição ajustada. Agora temos isso. Podemos usar isso para posicionar o imposto sobre o refém morto. Vamos voltar ao gerenciador de interface do usuário, mas vou salvar isso primeiro. E dentro desse gerenciador de interface de usuário, vamos definir a posição fiscal do refém k, e essa é a posição mundial Para a posição que estamos passando aqui. E então vamos criar um novo vetor para ajustar a posição. E aqui queremos executar a classe de extensão e o método get position inside script. Para a resolução básica, vou criar um novo vetor dois. E como já declaramos isso, vamos digitar o valor que é 1920 por 1080, e isso estará em fluxo, então vou adicionar um Para o segundo argumento, vou aprovar a taxa de kel de reféns e, para compensar, provavelmente vou adicionar 25 pixels Agora salve isso. Uma vez que tenhamos esse valor aqui, precisamos aplicar esse valor à posição ancorada de nosso imposto sobre kels de reféns Vou acessar a posição ancorada e vamos ajustar essa posição aqui e salvá-la Agora terminamos com o gerente de interface do usuário Park. Precisamos modificar o gerenciador de jogos para adicionar a função para acionar esse método aqui. Aqui eu vou criar um novo método privado, e vou chamar esse programa de refém Kel E queremos passar uma posição de três vetores, e também queremos passar um bulion para mostrar o texto aqui E agora, dentro desse programa, refém, precisamos criar um novo ator três, e podemos chamar esse vetor de três posições na tela E para a posição da tela, vamos pegar a câmera do objeto de movimento do jogador. E como este é um player, podemos pegar isso, e então podemos usar o componente de lacuna e digitar câmera. E aqui, podemos usar o ponto de tela Mundial e, em seguida, passamos o vetor três que passamos no método aqui. E receberemos essa posição vetorial T de nossa posição de refém no mundo E depois de convertermos a posição da tela mundial, queremos executar o gerenciador de interface do usuário, desculpe, o gerenciador de interface do usuário, e depois executar o show hostage Keel e queremos passar a posição da tela E também o argumento show bulion que apresentamos no método aqui Vamos digitar show e salvar isso. E agora precisamos modificar a quilha do refém. Em primeiro lugar, precisamos passar a posição mundial do vetor três. Isso é chamado de posição mundial, então é mais claro. Então, aqui abaixo, queremos executar o programa Hostage Keel que acabamos de criar E também queremos ultrapassar a posição mundial que ultrapassamos aqui. Sempre que o refém é morto, queremos que o programa B seja o primeiro. E então queremos executar essa ação atrasada. Como de costume, precisamos criar um novo delegado aqui, e podemos passar essa linha aqui dentro desse delegado Mas em vez de mostrar o texto, podemos simplesmente definir isso como quedas para ocultar o texto e podemos adicionar um atraso de 3 segundos. E então feche isso. Agora modificamos o gerenciador de jogos e o gerenciador de interface do usuário. Há uma coisa que precisamos corrigir aqui. Dentro do script do refém, precisamos consertar o calcanhar do refém, e isso é Podemos simplesmente passar a transformação da posição do refém. Mas como o pivô do nosso refém está a seus pés, queremos somar um fator três e provavelmente multiplicar isso por Portanto, a posição provavelmente será no peito do refém ou no torso do refém e Agora vamos voltar para o Unity. A outra coisa que queremos fazer aqui é adicionar uma animação, uma animação intermitente, e podemos simplesmente adicionar um animador Em seguida, use o controlador do animador que usamos para recarregar o texto Então, vamos pegar o controlador do animador de leitura aqui, e ele usará a mesma animação aqui Isso fará com que o texto pisque assim. Então, agora temos essa configuração. A outra coisa que precisamos fazer é dentro do gerenciador de interface do usuário, precisamos garantir que esse texto seja desativado na inicialização. Aqui dentro do método init, vou adicionar isso. Mas em vez de definir esse valor show, vou definir esses dois como falsos e salvar isso. E agora podemos realmente testar isso. Ok, então vou focar em nossa câmera aqui, e então, dentro do gerenciador de jogos, também precisamos definir o texto aqui, aqui sob o texto da quilha do refém, precisamos arrastar o objeto com quilha de refém do nosso Canvas, e agora podemos salvar Agora vamos jogar e testar isso, e vamos tentar atirar no refém Vamos tentar matar o refém. Aí está. Temos o texto aqui mostrando, e vamos matar o inimigo aqui. Agora, se os reféns aparecerem aqui, vamos filmar e sim, tentar manter o texto dentro da tela Na verdade, podemos testar isso alterando o tamanho do nosso refém para um valor muito grande, por exemplo, definindo isso como um e 500 na altura, e podemos aumentar o tamanho máximo aqui E podemos testar isso apenas para testar se a extensão que criamos está funcionando ou não. Então, vamos tentar novamente. Embora queiramos reverter isso depois disso. Re. Aí está. E provavelmente podemos ver isso com esse refém aqui. Vamos apenas atirar. Aí está. Tente manter nosso texto dentro da tela aqui. Agora vamos reverter isso. Uma coisa que precisamos ajustar aqui, acho que precisamos ajustar a altura. Não acho que precisemos multiplicar isso por 1,2, então vamos apenas fatorar isso E vamos verificar o pivô do refém aqui porque não tenho certeza se está nos pés ou não, então vamos nos concentrar em e esse é Este é o centro, esse é o pivô. Sim, podemos multiplicar isso com o vetor para cima, mas precisamos torná-lo ainda menor Vou definir isso para 0,4, multiplicar isso por 0,4 Então, veremos o texto ao redor do baú e vamos tentar mais uma vez. Sim. É muito bom, a posição correta no torso ou no peito do refém Sim. OK. Sim, é assim que criamos uma interface de usuário que pode aparecer com base na posição mundial e também podemos manter essa interface dentro nossa tela com o método de extensão que criamos. 31. 30 tela de introdução e final da interface: Neste vídeo, continuaremos trabalhando em nossa interface de usuário. E desta vez vamos trabalhar na introdução e também na interface da tela final Então, agora vamos ver a análise aqui e depois expandir o gerenciador de jogos. Também o Canvas. E vou me concentrar em nosso Canvas aqui. E a próxima coisa que eu quero fazer é ir para a pasta UIP Dentro da pasta prefabs, temos o prefab nscreen Então, vou direcionar esse pré-fabricado nscreen para ser filho do nosso Canvas Agora temos isso na tela aqui. Queremos modificar o texto primeiro. Então, vamos expandir isso, expandir o layout e, dentro do layout, temos muitos objetos filhos que contêm uma área para o título aqui. E abaixo do objeto de jogo da área de título, temos um text mesh pro. Então, vamos selecionar o recurso divertido xia que criamos anteriormente para o novo texto. E para a área de pontuação, vamos expandir tudo isso. Vou derrubar isso e depois resistir e depois expandir todos eles. E para o subtexto e o valor, vou selecionar todos eles juntos. E também o título e a classificação, e vou mudar o ativo do fundo também para Raglea Então, vamos fazer isso. Agora temos tudo isso. E a próxima coisa que queremos fazer é criar uma animação para isso. Então, para fazer isso, selecione o objeto do jogo na tela final. E em Janela, vou para o menu de animação e, em seguida, criarei a animação. E teremos uma janela de animação aqui. E se parecer flutuante, você pode simplesmente clicar no nome do painel, direcioná-lo e, em seguida, navegar até essa área aqui. Agora, com a tela final selecionada, podemos criar uma animação. Vou pressionar criar aqui para criar a animação para a tela final. E abaixo da animação da pasta do jogo, vou criar uma nova animação para o fade in da tela final E agora podemos mover o objeto do jogo na tela final aqui. Vou usar essa ferramenta de movimentação aqui e depois vou movê-la no eixo y. E vou ativar o botão de gravação e, em 1 segundo de duração, vou colocá-lo de volta para dentro. Vou arredondar o número, a vista superior 2200 e a vista do botão 2200 Ok, então temos isso aqui. Vamos pressionar play e ver na visualização do jogo. Aí está. excluir esse quadro-chave aqui porque não precisaremos dele OK. Agora podemos acessar a visualização do projeto aqui e, dentro da pasta de animações, queremos garantir que a animação da nossa tela final apareça aqui e que os tempos de loop estejam desativados os tempos de loop Então, vou desativar isso, para que não fique em loop, e vou desativar a tela final E vamos salvar a cena. E para começar o jogo, vou criar um novo objeto de jogo Text Mash pro e defini-lo para 500 ou 600 e para a altura, vou definir isso para 150 E eu vou digitar pronto e mudar o telefone para Axle. Para este texto pronto, vou habilitar o tamanho automático e definir o máximo para cerca de 400. Portanto, temos um imposto muito grande aqui. Vou definir o alinhamento no centro e também no meio. Para a cor, vou escolher uma cor laranja, talvez essa. Mais laranja. Sim. E eu vou imitar esse texto Antes de animarmos o texto, vamos renomear o texto para dois textos prontos E queremos verificar nosso script aqui no gerenciador de jogos, temos o estado e o estado de início do jogo, que está atrasando o estado S para o jogo em 3 segundos Então, queremos criar animações com duração de 3 segundos. Então, vamos voltar à unidade aqui. E selecionando o texto pronto, vamos para a animação e, em seguida, vamos criar uma animação de texto pronta. Agora temos esse clipe de animação. Podemos criar uma animação. Aqui, eu vou gravar. Vou adicionar uma propriedade da transformação de destruição e vou pegar a posição ancorada Então, vou pegar a posição aqui. E para o quadro inicial, vou mover isso para o lado esquerdo da tela e provavelmente definir a posição para menos 1.500 Então, temos algo assim. E eu vou manter isso por 2 segundos. E vamos copiar esse quadro-chave aqui selecionando o quadro-chave , pressione Control C e, em seguida, pressione Control V. Então, ele copiará esse quadro-chave Vamos excluir esse quadro-chave duplo. S. Vamos ampliar e vamos excluir o segundo aqui. E em 3 segundos aqui, vou mover isso talvez para um e 500 na posição. Agora temos essa animação. Então, vamos salvar isso e podemos desativar o DVU de volta ao nosso aparelho Agora que preparamos a interface do usuário, podemos começar a modificar o código para criar um método de cálculo de pontuação Então, agora vamos para a pasta de scripts. E a primeira coisa, primeiro, vou abrir o script do gerenciador de interface do usuário. Aqui eu tenho o script do UI Manager aberto. Vou criar algumas variáveis. Mas antes de criar as variáveis, vou criar um novo cabeçalho e vou chamar isso de propriedades de pontuação. Para essas propriedades de pontuação, precisamos criar algumas variáveis de malha de texto pro. Vamos apenas criar o primeiro. Para a primeira entrada, vou adicionar o texto de matar o inimigo. Eu digitei isso errado aqui, então deve ser um campo serializado Vamos copiar essa linha aqui e eu vou colar isso algumas vezes. Agora, o segundo seria o refém kel. E o terceiro seriam os tiros. E o quarto seria o se, e o quinto deveria ser a precisão. E também queremos criar um novo campo serializado com um tipo de objeto de jogo, que seria o painel da tela final, e salvá-lo Aqui abaixo, queremos criar um novo método público para mostrar esses valores da tela final. Vamos criar um novo vazio público, e vamos chamar isso de tela de exibição Com esse método, vamos passar algumas variáveis. O primeiro seria o kel inimigo. O segundo também seria um número inteiro, mas esse é o inimigo total A terceira também seria uma morte inteira, com reféns. O quarto seriam os tiros, ou podemos simplesmente dizer o total de tiros. E o quinto deve ser o acerto total. Agora, dentro desse método, primeiro, queremos habilitar o painel da tela N, para que possamos simplesmente executar o método ativo definido e , em seguida, passar a through como argumento. Para o texto do kilt inimigo, queremos definir sua taxa como o valor do kel inimigo dividido pelo total do inimigo e queremos multiplicar isso por 100 para obter a porcentagem Multiplique isso por 100 e, depois disso, queremos converter essas duas cadeias A usando o método de duas cadeias com um argumento de dois dígitos aqui e, em seguida, queremos adicionar um sinal de porcentagem Mas como esses dois valores são inteiros, isso produzirá um inteiro Portanto, precisamos converter um desses valores em um float. Então, teremos um valor fracionário. Então, podemos usar esses valores para serem multiplicados por 100 para obter a porcentagem do nosso inimigo kl Então, vou transformar o inimigo total aqui em um valor flutuante E para o próximo texto, vou modificar o texto do refém kel E podemos simplesmente passar a quilha do refém e converter essas duas em uma corda Então, para o total de fotos, você pode simplesmente pegar a variável shot aqui, definir sua taxa para o total de fotos, converter essas duas. Para a taxa de acerto, podemos simplesmente modificar a variável h, definir sua taxa e, em seguida, passar o parâmetro total aqui e, em seguida, converter essas duas em uma string. O último, queremos modificar o texto de precisão aqui. Usando a mesma fórmula com a quilha inimiga aqui, queremos dividir o acerto total dividido pelo total de tiros, mas precisamos transformar o divisor em flutuador e, em seguida, multiplicar isso por 100 e depois converter E então adicione isso com um sinal de porcentagem. Preciso converter isso em uma string. OK. Vamos verificar se o pai está em C aqui. OK. Vamos adicionar um pai a C aqui e ver. Somos um dos pais, então eu adicionei, e agora está correto e salve isso. Ok, a próxima coisa que queremos modificar é ir até o gerente homossexual e, dentro do gerente do jogo, queremos criar um vazio privado aqui Vou criar um novo vazio privado abaixo. E eu vou chamar isso de tela do programa. E para a tela final, queremos executar o gerenciador de interface do usuário, e seu método show en Screen. E queremos passar toda essa variável aqui. Então, vamos ignorar toda a morte do neme. Acho que não, inimigo mata. Sim. Inimigo total, e também o refém morto E para o total de tiros, acho que deveriam ser tiros disparados. E pelo sucesso. Acho que sim, é um inimigo atingido, e vamos salvar o script do gerenciador de jogos. Depois de modificar o gerenciador de jogo, vamos ver o script de movimentação do jogador aqui e queremos criar um novo método para limpar uma área Então, aqui precisamos criar um novo vazio público, e vamos deixar essa área limpa E aqui em cima, na área variável aqui, precisamos criar um novo número inteiro privado, e vamos chamar essa área de clara Dentro desse método de área limpa, queremos incrementar a variável inteira da área limpa e verificar se a área limpa é igual ao comprimento das entradas eliminadas igual ao Então isso significa que limpamos toda a área neste nível Então, queremos transmitir um evento aqui. Precisamos criar esse evento. Aqui acima, vou criar um novo evento público estático com um tipo de sistema que age. E vou chamar isso no nível de acabamento e inserir um delegado vazio E, como expliquei antes, evento estático público é um recurso muito poderoso que pode facilitar a comunicação entre scripts ou que um script acione outro método em outro script. Mas uma coisa que precisa ser lembrada que a estática é um objeto compartilhado. Portanto, ao usar o evento estático, devemos garantir que os scripts sejam anexados apenas a um único objeto em nossa cena. Se houver vários scripts , a estática não funcionará porque só pegará o primeiro, mas ignorará o outro. Portanto, certifique-se de usar o evento estático corretamente. Então, agora temos esse evento criado. Vou voltar ao método de área limpa e invocar esse evento E então eu vou retornar esse método. E se ainda houver área restante neste nível, significa que a afirmação é falsa, então queremos continuar o movimento fazendo com que o movimento definido do jogador seja verdadeiro. Ok, agora terminamos com a mudança do jogador para cá. Vamos voltar ao gerente do jogo e queremos inscrever esse método de exibição de tela no método de acabamento de nível que acabamos de criar. Então, dentro do gerenciador de jogo, sob o método I, queremos inscrever a classe de mudança de jogador aqui e o evento de conclusão de nível, e queremos inscrever o método show and screen neste evento aqui. E nessa tabela, também queremos remover essa assinatura. Então, vou copiar essa linha aqui e depois alterar assinaturas para o método de cancelamento de assinatura. Guarde isso. E agora, a última coisa que precisamos modificar é o script do ponto de tiroteio Então, vamos abrir o script do ponto de tiro aqui. E agora, aqui embaixo, sempre que o inimigo e nós matamos todo o inimigo, não queremos retomar o movimento aqui, mas em vez de retomar o movimento, queremos usar o método de área limpa E com o método de área limpa, ele retomará automaticamente o movimento se ainda houver um ponto de tiroteio que precisemos terminar Depois de modificarmos a linha de movimentação do jogador aqui, precisamos também ter certeza de que modificamos a que está aqui. Então, na área definida limpa, em vez de retomar o movimento, queremos também limpar a área, e isso será chamado quando o tempo acabar em um determinado ponto de tiroteio Então, com essas mudanças, mesmo que não tenhamos matado todos os inimigos, devemos ser capazes de avançar para o próximo ponto de tiroteio sempre que o tempo acabar Então, vamos mudar isso para o método de área limpa. E dessa forma, podemos terminar o nível, mesmo que não tenhamos matado todos os inimigos, mas correndo o risco de uma pontuação menor. Então, vamos salvar isso. Agora vamos voltar ao Unity e configurar a tela final. E depois que o script é compilado, podemos selecionar o gerenciador de jogo e, no gerenciador de interface do nosso script de gerenciador de jogos aqui, temos muitos novos campos declarados. Então, vamos arrastar a tela final como painel da tela final aqui. E se expandirmos todo o objeto do jogo infantil aqui, podemos arrastar o valor do kilt hostil enquanto o inimigo cai aqui. E para o kilt de reféns, arraste seu valor para o kit de reféns Para os tiros, arraste o valor dos tiros disparados aqui. E para o valor do acerto do tiro, podemos direcioná-lo para o slot de acerto, e para a precisão é direto para o slot de precisão. E vamos salvar isso. E agora vamos tentar. Então, agora temos esse imposto pronto. Oh, desculpe. Esquecemos uma coisa: por padrão, a animação que criamos está configurada para ser repetida Portanto, queremos selecionar a animação fiscal pronta e desativar o tempo total do loop aqui. E então vamos testar isso novamente. Vamos tentar matar um dos reféns. E vamos esperar que o inimigo apareça e vamos matar esse. Aí está. Matamos 75% do inimigo. Ok, há um problema. Preciso verificar isso. Há uma condição de corrida em que, quando mostramos a tela final e começamos a calcular a porcentagem do inimigo total, nem todas as mortes de inimigos foram registradas Então, para corrigir isso no gerenciador de jogos, precisamos atrasar esse método aqui. Para garantir que toda variável inteira, que é o inimigo morto, o total de reféns inimigos mortos, mostre fogo e inimigo atingido, tenha sido contada corretamente e certifique-se de que não haja condições de corrida Então, vamos usar essa extensão de ação atrasada e criar um delegado vazio aqui E vamos cortar esse código aqui e depois colar dentro desse delegado. Vamos atrasar esse código aqui em um valor muito pequeno. Por exemplo, 0,2 segundo e depois vamos limpar um pouco esse código. Guarde isso. E agora vamos dirigir o Unity. E vou alterar a depuração do Inspector para que possamos ver todos os nossos campos inteiros aqui no gerenciador de jogos e depois Então, vamos pegar a arma aqui e começar a atirar no inimigo. Vamos esperar por esse inimigo aqui. Até agora, somos 100% de todos os inimigos. E vamos terminar isso. Aí está. Temos a porcentagem correta de inimigos mortos. 32. 31 correções de erros parte 1: Neste vídeo, vamos corrigir algumas coisas e aperfeiçoar os códigos. Até agora, existem problemas em nosso projeto aqui. Então, agora vamos inspecionar quais são os problemas. Então, vou jogar esse projeto e vamos dar uma olhada. OK. A primeira seria sempre que matássemos um inimigo aqui, você vê que temos esse erro. E, basicamente, esse erro indica que obter distância restante só pode ser chamado em um agente ativo. Então, de alguma forma, o inimigo está longe, mas com o inimigo já morto, isso está causando um problema Então, precisamos corrigir isso. E vamos continuar com isso. E a outra coisa que temos é que o refém ou o inimigo é visível no início Por isso, queremos garantir que todos os inimigos e reféns sejam exagerados desde o Então, na terceira área de tiroteio aqui, quando chegarmos a esta posição, não deveríamos ser capazes de ver o refém primeiro E quando paramos , o refém treme aparece e começa a entrar na tela Também vamos corrigir isso. E a terceira, é sobre a contagem total de inimigos. Em nosso ponto de tiroteio aqui, estamos basicamente contando o total de inimigos aqui para comparar sempre que matamos todos os inimigos e, em seguida, queremos limpar a área Mas há um problema aqui. Agora vamos testar isso e dar uma olhada na variável total do inimigo aqui. Como você pode ver aqui, no início, temos um inimigo total de um. Mas, na verdade, temos dois inimigos aqui. E o segundo é registrado um pouco depois que o primeiro inimigo começa a se mover. Por isso, queremos garantir que o total de inimigos seja contado imediatamente quando o ponto de tiroteio for inicializado ou iniciado Então, precisamos corrigir isso também. Então, aqui, eu criei uma lista. Então, basicamente, os inimigos e o refém devem estar escondidos no início E quando o inimigo é morto, ocorre esse erro em relação à distância restante do componente do agente NAF Mash, e devemos garantir que a contagem de inimigos ocorra Então, agora vamos corrigir todas essas coisas aqui. Vamos para o Isle Studio. Aqui no roteiro do ponto de tiro, queremos esconder todo o inimigo e o refém no início Então, para fazer isso, vamos criar um método inicial e, em seguida, dar uma olhada na lista de inimigos aqui. Então, vamos chamar a variável inimigo e a coleção de lista de inimigos. E em toda a minha lista de inimigos, queremos esconder o objeto do jogo. Vamos apenas acessar o inimigo, e vamos acessar o objeto do jogo inimigo aqui. Mas como o inimigo é um script inimigo, precisamos acessar o objeto do jogo e, em seguida, acessar o método ativo definido e, em seguida, definir essas duas quedas Depois de definirmos os dois inimigos como falsos aqui, no início, vamos copiar essa linha aqui, e precisamos ter certeza de que queremos ativar o inimigo dentro da rotina de envio de inimigos aqui. Então, sempre que os inimigos forem inicializados, também queremos ativá-los Então, vamos colar o código aqui e definir esse valor como verdadeiro. E a outra coisa que queremos modificar está dentro do script inimigo, queremos garantir que toda essa inicialização aconteça no OA Porque com as mudanças feitas no ponto de tiroteio, estamos habilitando o objeto de jogo inimigo e inicializando o método init do script inimigo no Isso pode causar condições de corrida e pode ignorar a execução do método de configuração de comportamento Se, no momento, o agente ainda não tiver sido capturado, fazendo com que os valores do agente ainda Dessa forma, garantimos que isso aconteça primeiro, mesmo que o objeto esteja desativado. Para a contagem do inimigo aqui, podemos simplesmente copiar essa linha aqui ou cortar essa linha, e podemos colar essa linha aqui dentro do método start. Então, vamos colar aqui. Vamos contar o total de inimigos quando as cenas começarem. Vamos salvar isso. A próxima coisa que queremos corrigir é essa aqui. Para corrigir isso, precisamos acessar o script do inimigo, e isso acontece porque a proteína do tiro ainda está em execução, e esse código aqui é avaliado, mesmo que o inimigo já tenha sido morto. Então, agora precisamos ter certeza de que executamos o método stop shooting, que interromperá a co-rotina dentro dessa classe de script inimiga. Então, vamos executar esse método de parar de atirar dentro do comportamento morto. Então, vou adicioná-lo aqui, parar de fotografar e salvar isso. E agora vamos voltar para o Unity e testar isso e ver se todos os bugs foram corrigidos. Então, eu também vou salvar a cena. E vou reduzir o atraso para três ou quatro e dizer isso. Agora vamos dar uma olhada no valor total do inimigo aqui se pressionarmos play. Agora, quando pressionamos play, isso conta imediatamente. Temos dois inimigos no total. Agora, quando o inimigo aparecer, podemos matar os dois ou podemos simplesmente atirar nesse barril, matar usando a explosão E agora você verá que não temos mais o refém Mas quando entramos no ponto Shota, o refém chega e podemos simplesmente matar o inimigo aqui E agora, se você der uma olhada aqui, não temos mais o erro get remaining distance. Então, resolvemos todos os problemas relacionados ao inimigo aqui. Vamos parar com isso. Há uma coisa que precisamos corrigir aqui, uma solução muito fácil em relação à interface do usuário. Vamos apenas expandir a câmera principal aqui e selecionar o HUD do player Se formos para a visualização do jogo e selecionarmos a câmera principal, vou mudar isso de volta ao normal, e vamos ativar a opção Voltar e limpar isso À medida que avançamos para cá, você verá que nossa interface de usuário é cortada pela parede nessa área, nessa área específica Vamos apenas modificar isso aqui. E, basicamente, precisamos garantir que o HUD esteja muito mais próximo da câmera. Vamos apenas movê-lo. Vou mudar a posição z para 0,2. E vou limpar a posição x para que possamos vê-la. Lá está você e limpa a posição y. Mas agora é muito grande. Portanto, precisamos ter certeza de que a escala é muito menor do que antes. Vamos tentar um décimo disso. E agora precisamos esfregar o I novamente para agarrá-lo. Vamos dar uma olhada no editor aqui. Aí está, então eu vou me mover no eixo x. Vamos mudar isso para local e movê-lo aqui. Temos esses profissionais habilitados. Vou desabilitar o prog e isso manualmente. E podemos usar o scrub aqui para ver a interface do usuário. Agora temos essa interface de usuário aqui e ela é bem pequena, então vou definir essa 20 e, em seguida, vou me certificar de que ela esteja muito mais próxima do eixo z. Vá um pouco mais longe e esfregue a posição. Vamos fazer isso 23 ou quatro, menos 0,0 45, e vamos fazer isso menos 0,08 Eu acho que esta é uma boa posição aqui. Agora, vamos selecionar a câmera principal e esfregar a distância de visualização na opção de depuração, para que possamos ver se nossa interface de usuário está recortando Porque está muito perto da câmera agora. É visível até o fim aqui. Sim. Isso deve corrigir o problema da interface do usuário. E vamos salvar isso. Então, sim, corrigimos todos os pequenos bugs dentro deste projeto aqui. E depois disso, vamos trabalhar no sistema de áudio. 33. 32 urso personalizado: Neste vídeo, vamos criar uma cruz para substituir o cursor do mouse Vamos ver a vista da cena aqui. E sob o gerenciador do jogo, queremos acessar o objeto do jogo Canvas e criar um novo objeto de imagem. Então, vou clicar com o botão direito do mouse aqui e, em seguida, ir para o menu da interface e criar uma nova imagem. Para esta imagem, vou chamá-la de mira. E vou definir sua largura e altura 250. E para a imagem de origem, vou escolher a cruz de interface que preparei no pacote de interface do usuário. Então, vamos escolher isso. E se você ampliar aqui, verá que temos a cruz, e eu vou mudar sua cor para vermelho. Então, vamos até aqui e eu vou escolher o vermelho. E agora criamos essa mira. Precisamos ter certeza de que a mira está na ordem mais baixa no Canvas child Isso será renderizado por último. E agora vamos abrir o script do gerenciador de jogos. Aqui, dentro do script do gerenciador de interface do usuário, precisamos criar uma nova variável e eu vou declarar uma com um atributo de campo serializado Para o tipo, vou definir essas duas transformações e vou chamar isso de mira E aqui dentro do método init. Queremos verificar a mira. Se a mira não for nula, queremos esconder o mouse Então, podemos simplesmente digitar cursor, o ysible, e definir esse valor como falls E guarde isso. E agora, aqui abaixo, queremos criar um novo método para mover a mira. Então, vamos criar um novo método público, e vou chamar isso de move cross hair. E queremos passar uma árvore vetorial como argumento, e vamos chamar essa posição do mouse. Então, aqui, basicamente, precisamos verificar se a mira não é Nula, então queremos mover a mira Vamos apenas digitar cross hair, e então queremos acessar sua posição, e então queremos aplicar a posição do mouse que passamos por esse método aqui como argumento. Agora vamos salvar isso e vamos até o gerente do jogo. E aqui dentro do gerenciador de jogos, precisamos criar um novo método de atualização. Então, vamos criar um novo vazio e chamar isso de atualização E, basicamente, queremos executar o método de gerenciamento de interface de usuário que acabamos de criar, que é o mood cross hair, e então, para a posição, podemos simplesmente passar a posição de entrada do mouse. E vamos salvar isso. OK. Agora vamos voltar para a unidade. Depois que o código for compilado, devemos ter os parâmetros de mira em nosso inspetor, e agora podemos arrastar o objeto do jogo com mira e colocá-lo no slot de mira do nosso script de gerenciamento de jogo Agora vamos salvar a cena aqui, e se formos até a visualização do jogo, vamos testar isso. Você verá que, ao jogar, o mouse está escondido e podemos mover a mira enquanto movemos o mouse e podemos atirar exatamente onde a mira está. É assim que criamos uma cruz personalizada ou um cursor de mouse personalizado no Unity. 34. Desenvolvimento de 33 olhares: Neste vídeo, vamos desenvolver um look para esse jogo aqui modificando os filtros de pós-processamento e também modificando os materiais em nossa cena aqui Então, agora vamos começar. Aqui, importei uma nova textura e material para o robô inimigo e também para o Robot refém, e vou colocar o pacote E agora vamos substituir o material pelo nosso inimigo e também pelo refém. Então, primeiro, vou para a pasta prefet e abro a preferência do inimigo aqui, e vou para a pasta atualizada na pasta Robot Kyle aqui dentro dos E temos dois novos materiais, que são o robô atualizado e o robô refém atualizado Vou arrastar o robô atualizado para esse inimigo aqui. E, como você pode ver, temos um material mais brilhante, e ele ficará melhor quando aplicarmos o pós-processamento em nosso seno E agora vamos voltar para a pasta prefs e eu vou abrir as prefs do refém e, desta vez, vamos arrastar o material atualizado do refém abrir as prefs do refém e, desta vez, vamos arrastar o material atualizado do refém aqui. E aí está. Ok, agora modificamos o inimigo e o refém. Vamos voltar à nossa cena aqui e criar uma caixa celeste personalizada para substituir essa caixa celeste original. Então, vou até a pasta de materiais e vou criar um novo material, e vamos chamar isso de caixa celeste personalizada. Para este material, vou trocar o sombreador pelo sky box one e, embaixo do skybox, vou escolher um procedimento Vou alterar algumas configurações aqui. Se eu for para a visualização do jogo aqui, vou mudar a cor do solo para ficar o mais próxima possível da cor do nosso objeto de grade aqui. Vamos usar esse seletor de cores e depois escolher a cor aqui Para aplicar essa skybox personalizada, precisamos abrir o menu de configurações de renderização e iluminação E eu já reduzi minhas configurações de iluminação aqui, então posso simplesmente arrastar essa camarote personalizada para esse material de camarote, e isso mudará nossa camarote, como você pode Então, agora aplicamos o skybox à nossa cena aqui. Podemos modificar ainda mais a caixa celeste indo até o inspetor e, em seguida, usar o seletor de cores ou a amostra de cores aqui para modificar o Portanto, é um pouco uniforme com nosso solo. Sim, acho que isso deve ficar bem. E agora, para a lata celeste, podemos mudar para uma determinada cor, se quisermos. Vou escolher uma cor levemente roxa, azul e roxa aqui, e depois mudar a cor para uma mais escura Para a espessura da atmosfera, vou diminuir esse valor até que tenhamos um céu mais escuro. Algo parecido com isso. Podemos mudar a exposição se quisermos. Vou apenas definir isso para o valor padrão, que é 1,3. E agora temos o Skybox personalizado aplicado e configurado corretamente Vamos criar o perfil de pós-processamento. Para aplicar o pós-processo, precisamos acessar nosso objeto principal do jogo de câmera na hierarquia e, em seguida, adicionar um componente de camada de pós-processamento Aqui nas configurações da camada de pós-processamento, precisamos alterar a camada para uma camada específica que queremos usar. Aqui, já temos uma camada de pós-processamento e, se você não a tiver, você sempre pode acessar as opções de camada aqui e, em seguida, pressionar na camada e criar uma nova camada. Mas como eu já tenho essa camada de pós-processamento, vou usar essa. Volte para nossa câmera principal e eu vou mudar isso para a camada de pós-processamento. Para o anti-sing, vou mudar isso para formigas temporais. Agora configuramos a camada de pós-processamento. Precisamos criar um objeto de pós-processamento para ser aplicado à nossa câmera aqui. Precisamos criar um novo objeto anti-jogo. E eu vou chamar isso de processo de postagem. Vamos zerar a transformação e adicionar um componente de volume pós-processamento. E também precisamos alterar a camada para pós-processamento e garantir que ela seja global esteja marcada, para que a folha de pós-processamento aplique a cena globalmente Agora podemos criar um novo perfil aqui, mas eu prefiro criar em nossa pasta de ativos. Vou até a pasta do jogo aqui e vou criar uma nova subpasta, vamos chamar esse processo de perfil Dentro desse perfil de pós-processamento, vou criar um novo perfil de pós-processamento aqui. Vou chamar esse jogo de jogabilidade PP. Agora podemos atribuir isso ao nosso objeto de pós-processamento aqui. Vamos direcionar esse processo de postagem de jogabilidade dentro desse espaço de perfil aqui, e agora podemos adicionar efeitos. O efeito que vou adicionar é a oclusão do ambiente e também O próximo seria a gradação de cores. Vou adicionar uma reflexão do espaço da tela e também uma multa. Agora podemos modificar o volume de pós-processamento, cada um dos direitos. Primeiro, queremos habilitar a oclusão do ambiente. Vamos ativar o modo aqui e depois a intensidade. Além disso, podemos ativar o modificador de espessura, se quisermos. A próxima coisa que precisamos mudar é a intensidade. Como você pode ver aqui, a intensidade padrão é 20, então precisamos aumentar esse valor e você verá que temos uma oclusão de ambiente aplicada à Vou fazer com que esse valor seja muito pequeno. Talvez em torno de 0,5 ou um. Provavelmente menos de um seria melhor. Vamos definir isso como 20,75. E podemos ver a diferença sempre que desativamos e ativamos a oclusão do ambiente aqui. A próxima que queremos definir é a floração aqui. Vou apenas ativar a intensidade e o limite da floração Agora podemos aumentar a intensidade aqui. Mas não vemos nenhum efeito de floração porque nosso material não tem um valor MIF de alta faixa aqui Então, vamos testar isso definindo a intensidade primeiro 24, e podemos diminuir o limite Então, vamos diminuir à medida que diminuímos o limite, você verá que a floração afetará cada vez mais as cores em nossa cena Vou definir o limite para 0,8. Isso deve ser suficiente. O próximo que eu quero definir é a gradação de cores, e vou definir o modo aqui para faixa de alta definição E para o mapeamento de tons, vou definir o modo para ACS, e teremos uma cor muito mais escura da nossa cena aqui, mas podemos compensar isso com a opção de pós-exposição Vamos apenas habilitar isso e aumentar a pós-exposição para cerca de 0,5. E teremos uma imagem muito mais contrastante. E se quisermos, também podemos ativar as bolas de trilha aqui, ativando a elevação, a gama e o ganho Vou ativar o elevador e o jogo aqui. E vou mudar o elevador, que é a área escura, para uma cor azulada E para ganhar, vou mudar isso para a direção oposta do azul, que é a cor laranja para equilibrar a cor da nossa cena aqui. Então é isso que temos até agora. E se quisermos ter muito mais linhas brilhantes aqui em nosso objeto de grade, podemos ir até a cena aqui e selecionar um dos objetos do cubo e modificar os materiais nele Então, vou até as opções de emissão aqui e depois pressiono a cor HDR e vou aumentar a intensidade para 1,5 E como você pode ver aqui, à medida que eu aumento a intensidade, agora as linhas ficam mais brilhantes Ok. E, como você pode ver aqui, temos a interface do HUD do jogador também aplicada pelo filtro brilhante, mas não temos esse kilt pronto e refém aplicado pelo B para a tela, a tela principal aqui está configurada para sobreposição de espaço na tela e, para o HUD do player, o modo de renderização da interface do usuário está definido como É por isso que isso é afetado pelo filtro de pós-processamento. Portanto, para garantir que essa tela também seja afetada, precisamos alterar o modo de renderização para a câmera espacial da tela e, em seguida, escolher nossa câmera como a câmera de renderização dessa tela aqui. Então, vamos direcionar a câmera principal para o slot da câmera aqui. E agora não podemos mais ver a interface porque ela está muito distante da nossa câmera, então, na verdade, está atrás do nosso objeto de jogo aqui. Então, vou fazer disso um vale muito pequeno, que é 0,1. E você vê que nossa interface de usuário está confusa. Então, para atualizar isso, podemos simplesmente desabilitar e habilitar isso E, como você pode ver, temos uma interface de usuário atualizada e ela está brilhando agora E como estamos mudando o modo de renderização da interface para a câmera espacial da tela, a mira personalizada não funcionará mais, então precisamos separar esse objeto em uma nova Então, vou criar uma nova tela de interface de usuário aqui. Vamos chamar isso de Cross Hair Canvas. Vamos colocar o objeto do jogo de mira embaixo da criança dessa tela de mira. Vamos definir essa tela em uma escala com tamanho da tela abaixo da escala Canvas configurá-la para uma resolução full HD e definir a correspondência Para a mira, podemos ajustar a escala de volta para um, e vamos zerar esse valor aqui Então, podemos ver isso aqui no meio. E a outra coisa que precisamos modificar é a taxa sobre a quilha de reféns, porque a forma como mostramos a taxa sobre a quilha de reféns é semelhante à mira semelhante à Então, para corrigir isso, precisamos colocar o kilt de reféns também nesta tela aqui Então, vamos arrastar isso. E coloque-o acima da mira. Então, a mira fica menos renderizada. Portanto, isso deve resolver o problema com a interface do usuário. Outra coisa que precisamos modificar. Precisamos ter certeza de que a transformação do refém em quilha está de volta ao valor padrão aqui Então, vamos selecionar a quilha do refém e, como você pode ver, temos todos os tipos de números na posição, na rotação e na escala Então, vou colocar a posição de volta em zero. E para a rotação, também vou colocar todo o eixo de volta em zero. E para a escala, queremos reduzir isso para um. Porque antes do refém, o texto estava nessa tela, a tela da câmera espacial e tinha valores diferentes para a transformação direta Quando voltamos para a sobreposição do espaço da tela aqui, o valor da transformação direta é transferido daqui para a tela em cruz Portanto, temos uma transformação diferente. E é por isso que temos todos os valores errados na transformação do texto do refém. Então, agora vamos salvar a cena e testar isso. E como você pode ver aqui, temos uma mira funcionando. E agora vamos dar uma olhada se os kells do refém estão posicionados na posição correta na tela Ok. E agora temos outro problema aqui. Se atirarmos no inimigo, você verá que não temos os efeitos elétricos. Com o refém, ainda temos esses efeitos elétricos, mas com o inimigo, não temos mais esses efeitos. E essa é uma solução rápida, na verdade. Precisamos ir até a pasta prefe e abrir as prefs inimigas E aqui, se selecionarmos o inimigo, precisamos mover os efeitos de golpe para que estejam no topo do script inimigo aqui. Então, vamos avançar e garantir que o método de acerto dentro nossos efeitos de golpe também seja executado sempre que o inimigo receber um tiro ou dano. E agora vamos voltar à nossa cena e testar isso mais uma vez. E eu vou tentar atirar no inimigo. E aí está. Nós temos o efeito. E vamos atirar essa bomba aqui. E pegue essa arma e mate esse inimigo. Sim. Ok. Então, tudo funciona bem até agora e, com a aplicação de filtros de pós-processamento, você pode ver que temos um jogo muito mais bonito. Portanto, recomendo que você experimente o filtro de pós-processamento e também as configurações do material para obter uma aparência melhor. 35. 34 Correção da parte superior do corpo do inimigo: Neste vídeo, vamos corrigir o movimento da parte superior do corpo do inimigo. E aqui, se eu pressionar a alegação, você verá que atualmente nosso inimigo ao se mover, tem um movimento estranho na mão, a mão segurando as armas Como você pode ver aqui. É estranho E também queremos corrigir a animação inativa, às vezes não era acionada corretamente. Então, vamos fazer isso. Eu vou parar com isso. E agora vamos para a janela do animador, e se o animador inimigo não estiver aberto, podemos simplesmente ir para a pasta de animações abaixo do controle e clicar duas vezes no controlador inimigo básico E agora aqui no controlador básico, primeiro, eu quero mudar a transição para o estado morto aqui. Então, vou mudar a condição para usar o interior do gatilho morto. Vamos usar o bulion morto e configurá-lo como verdadeiro E nas configurações, queremos desativar a transição para si mesma. Então, vamos desabilitar isso. Portanto, a transição só acontece uma vez quando o inimigo está morto. E então queremos criar uma nova camada para a parte superior do corpo. Então eu vou chamar isso de parte superior do corpo. E para as configurações, queremos aumentar o peso para um, e para a massa, queremos usar a massa da parte superior do corpo que criamos para o refém Então, vamos usar isso. E aqui, precisamos criar três novos estados. Então eu vou chamar esse ídolo. Vou duplicar isso, e a segunda será a reação de impacto, e a terceira será a toca Como estamos substituindo a parte superior do corpo da animação, precisamos ter certeza de que temos cada animação para cada condição Então, se eu for para a camada base aqui, você verá que temos três estados e queremos substituir todo o movimento da parte superior do corpo dentro da árvore de mistura por esse estado ocioso aqui E para o estado de impacto, ele será sincronizado com o estado de impacto da área superior do corpo, e o estado morto também será sincronizado com o estado morto da camada superior do corpo aqui o estado de impacto da área superior do corpo, e o estado morto também será sincronizado com o estado morto da camada superior do corpo Então, agora vamos criar uma nova transição de qualquer estado para o estado atingido e também de qualquer estado para o estado morto. E queremos criar uma transição do hit back para o ocioso, assim como nossa camada base aqui Então, agora dentro do estado ocioso, queremos usar a animação de mira do rifle e, para o estado de acerto, queremos usar a queremos usar a Para o estado de morte, queremos usar a morte por tiro na cabeça E agora, para as configurações de transição, para o golpe, queremos definir uma condição sempre que o inimigo for baleado ou os parâmetros do tiro forem acionados. E queremos definir se o ouro morto é falso no momento. O que significa que o inimigo ainda está vivo e, como você pode ver aqui na camada base, temos as mesmas configurações de transição. Portanto, queremos ter certeza de que as configurações de transição as mesmas da camada base. Então isso já está correto. E queremos ter certeza de que, do hit ao inativo, esteja usando o tempo de saída Então, isso também já está correto. E agora, quanto à morte, queremos ter certeza de que eu, o Ban, acione essa animação Vamos escolher se é essa proibição e depois definir isso como verdadeiro. E então também queremos desativar a transição para as opções automáticas aqui. Então, agora configuramos o animador aqui. Vou salvar o projeto mais uma vez para salvar todas as alterações em nossos ativos. E agora vamos verificar novamente. O que colocamos? Já colocamos toda a animação, o clipe de animação correto. Vamos testar isso. E vamos dar uma olhada quando o inimigo está se movendo, ele deve ter a animação correta da parte superior do corpo. OK. Aí está. É muito melhor, e podemos acabar com isso. E, como você pode ver, essa animação é mais confiável agora, porque quando eu estava testando antes, às vezes ela é acionada, às vezes não é acionada, ou talvez haja um salto de quadro sempre que esse gatilho é acionado Então, agora temos as animações corretas, e é muito melhor quando nos movemos para os lados, a posição da mão do que segurar as armas Então, sim, é assim que consertamos o movimento da parte superior do corpo do inimigo. 36. 35 Configuração de biblioteca de áudio: Nesta seção, trabalharemos no sistema de áudio. E neste episódio, vamos definir nosso script de biblioteca de áudio. Então, para fazer isso, vamos para a do jogo underscore e ir para a pasta de scripts E aqui, vou criar um novo objeto programável para armazenar os dados da nossa biblioteca de áudio Então, vamos criar um novo script CHO dentro da pasta de objetos programáveis e vamos chamar essa biblioteca de áudio Outro script que precisamos criar é o suporte de dados de áudio. Vou criar um novo script CHR e vou chamar isso de dados de áudio E vamos abrir os dois scripts aqui. Agora tenho a guia Áudio e a biblioteca de áudio abertas. Vou trabalhar primeiro na biblioteca de áudio. Aqui na biblioteca de áudio, precisamos transformar a classe base em um objeto programável, a classe base E também queremos criar um menu de ativos. Então, vamos adicionar o atributo do menu create asset e, em seguida, para o argumento, queremos definir o nome do arquivo como Audio Lib E para o segundo argumento, vou definir o nome do menu como Biblioteca de áudio. E vou excluir o método start e o applet. Agora, queremos definir os dados de áudio que podemos preencher dentro da biblioteca de áudio Aqui dentro dos dados de áudio, vamos excluir a classe base aqui porque essa será uma classe personalizada para armazenar dados, e eu vou excluir todo o método interno. A primeira coisa que quero criar criar um campo serializado, será um tipo de string, e vou chamar esse campo de nome de áudio E para o próximo método, queremos criar uma matriz de clipes de áudio. Vamos apenas criar uma matriz de clipes de áudio e vamos chamar isso de clipse de áudio E a outra coisa que queremos configurar é criar uma nova variável flutuante, e essa será a afinação mínima E o segundo seria o tom máximo. Podemos definir um valor padrão aqui. Vamos definir essa flutuação de 20,9. E para o tom máximo, vamos definir 21,1 E vamos usar essa variável para randomizar o tom do nosso áudio sempre que estivermos reproduzindo os áudios Assim, tornará o som mais dinâmico. E como todo o campo é privado, precisamos criar um coletor público Vou definir o getter público abaixo aqui, como esse tipo público, e vou criar o nome de áudio getter E isso retornará o campo do nome do áudio. Também vou criar a coleta de clipes de áudio, e esse será o único clipe de áudio, não uma matriz. Vamos chamar isso de Obter clipe de áudio e podemos retornar o clipe aleatório da matriz de clipes de áudio Vamos apenas digitar clipes de áudio. Para o índice, podemos usar um intervalo aleatório e o mínimo deve ser zero, e o máximo seria o comprimento do ponto do clipse de áudio Isso capturará o áudio dependendo do número de membros dentro dessa matriz de clipes de áudio e escolherá aleatoriamente um dos clipes de áudio dessa matriz aqui Assim, podemos definir mais de um tipo de som para um tiro, por exemplo, e ele reproduzirá um áudio aleatoriamente diferente e também tocará com um tom diferente aqui O último que precisamos configurar é o coletor de flutuação para o tom máximo E aqui, vamos chamar isso de get pitch. Essa é a próxima coisa com Getter. Podemos criar uma expressão simples para retornar alguns dados. Com o Audi clipse, podemos retornar clipes aleatórios e, com o get pitch, podemos retornar um valor aleatório entre esse tom mínimo Vamos usar um método de intervalo aleatório e, em seguida, passar o tom mínimo. Como valor mínimo e passe o tom máximo como valor máximo. Ok, agora terminamos com os dados de áudio. Podemos acessar a biblioteca de áudio e criar uma matriz desses dados de áudio que acabamos de criar. Então, vamos definir um campo de seriais aqui e eu vou criar uma nova matriz de dados de áudio E eu vou chamar isso de lista de áudio. Dentro desse objeto programável, queremos criar um método público para retornar os dados de áudio pelo nome Vou criar um novo método público, e isso retornará dados de áudio. E eu vou chamar isso de get Audio by name. E aqui queremos passar o nome como argumento. Dentro desse método, vamos criar novos dados de áudio. Vamos apenas chamar esse valor e defini-lo como nulo por padrão E queremos dar uma olhada na lista de áudio aqui. Vamos apenas chamar a variável de áudio do membro. E para a coleção, podemos simplesmente passar a lista de áudio. E queremos verificar se o nome do áudio, é igual ao nome que estamos passando aqui como argumento, então queremos preencher o valor com esse áudio aqui com o áudio correto aqui. E depois disso, queremos retornar o valor. Portanto, com esse método, podemos simplesmente passar uma string do nome do áudio e, nesse método, retornamos o valor correto dos dados de áudio com base no nome, porque declaramos o nome aqui Então, ele comparará a string com esse campo aqui. Ok, vamos guardar isso. E agora vamos voltar para o Unity e criar o objeto da biblioteca de áudio dentro da nossa pasta de dados. Vou até a pasta de dados aqui, vou criar uma nova biblioteca de áudio e ligar para esse laboratório de áudio. Se selecionarmos isso, você verá que ainda não podemos ver a variável porque precisamos garantir que os dados de áudio sejam serializáveis Vou adicionar um sistema de atributos que pode ser serializado aqui e salvá-lo Agora, se voltarmos para o Unity, poderemos ver os dados. Aí está. Temos a lista de áudio e podemos expandir o tamanho. Então, por exemplo, eu posso definir o tamanho 21, e aqui eu posso preencher o nome. Então, por exemplo, isso seria o tiro. E podemos expandir o audioclipse, e então podemos preencher E eu não sei por que o tom mínimo e o tom máximo estão definidos em 20. Então, vamos definir isso manualmente. Vou definir isso como 20,9 e 1,11. E eu importei alguns sons dentro do áudio aqui, para que possamos escolher um dos áudios. Por exemplo, esse tiro de ficção científica, e podemos escolher este aqui E esses serão os primeiros dados de áudio que temos, e para o segundo exemplo, podemos expandir o tamanho aqui, e ele duplicará o primeiro, e podemos alterar esse valor Por exemplo, digamos que vamos chamar isso de ZP elétrico. Desculpe. Deve ser um ZAP elétrico Então, para o audioclipse, podemos mudar isso para o estalo elétrico Então, agora configuramos a biblioteca de áudio. No próximo vídeo, continuaremos implementando o áudio. 37. 36 Configuração de jogador de áudio: Neste vídeo, continuaremos trabalhando no sistema de áudio. E no último vídeo, já criamos a biblioteca de áudio. Então, agora precisamos criar a funcionalidade para reproduzir esse áudio. Então, vamos para a pasta Asset e, dentro da pasta de scripts, vou criar uma nova subpasta E eu vou chamar essa pasta de Áudio. E vou criar um novo Cc e vou chamar esse reprodutor de áudio. E vamos abrir esse script do reprodutor de áudio. Primeiro, vou excluir o método applic aqui. E então eu vou criar um novo campo serializado, e esse será o tipo de biblioteca de áudio, e vamos chamar isso de Audio ib E queremos ter certeza de que esse script aqui esteja disponível globalmente em nosso projeto. Então, vou criar uma referência estática, uma estática pública, e o tipo seria reprodutor de áudio. E eu vou chamar essa instância, será um getter público com um conjunto privado Portanto, somente o script pode definir esse valor, mas todos os outros scripts podem obter o valor dentro dessa referência estática. Então, vamos criar um método de despertar. E podemos preencher esse valor de instância com o script aqui. Vamos apenas passar essa palavra-chave como valor. E colocamos isso dentro do ak, então queremos ter certeza de que essa instância esteja disponível antes do início de qualquer outro script. Agora, no início, queremos inicializar as fontes de áudio necessárias para reproduzir um áudio neste projeto Mas primeiro, queremos criar um número inteiro, variável, e isso serve para definir quantas fontes queremos ter em nosso sc E eu vou definir isso para seis por padrão. E também queremos criar um grupo de mixagem de áudio para diferenciar as fontes de áudio efeitos sonoros e para a configuração do mixer de música Precisamos usar o Unity e s, Unity engine Audio, e vamos criar um novo campo serializado E esse seria o grupo de mixagem de áudio. E vamos chamar esse grupo de efeitos sonoros. E o segundo seria o grupo de música de fundo. E agora, a próxima coisa que queremos criar é criar um Q privado. E por que estou usando o Q, porque é muito mais leve do Vamos ver as breves descrições sobre Q. Q representa a primeira coleção de um objeto a entrar, primeiro a sair É usado quando você precisa ser o primeiro a entrar, primeiro a sair dos itens. Então, digamos que temos uma fila de objetos chamada M Q e a preenchemos com um objeto Quando você adiciona um item em uma lista, ele é chamado de Q e Q adiciona um elemento ao final da fila, como neste exemplo aqui Quando você remove um item, ele é chamado de Q. O Que remove o elemento mais antigo do início da fila e, para colocar o objeto na fila, podemos simplesmente usar E isso colocará o objeto de volta em nossa fila como o último elemento A outra forma de obter referência ao elemento mais antigo é usando pk Pak retorna o elemento mais antigo, que está no início do, mas não o remove da fila E vamos voltar ao nosso projeto. Para o tipo, será uma fonte de áudio, e vamos chamar essas fontes de áudio. E vamos inicializar isso. E agora queremos preencher essas fontes de áudio com o objeto do jogo que tem componente de fonte de áudio anexado a ele Vamos apenas criar um novo método in. Mas antes de continuarmos no método init, vamos criar outra fonte de áudio privada, e essa seria uma única fonte de áudio, e essa será a fonte BGM Então, agora dentro desse método init, queremos criar um novo objeto de jogo e, em seguida, definir esse objeto de jogo como a fonte BGM ou as fontes de áudio e, em seguida, garantir que esses objetos do jogo estejam definidos como filhos desse objeto de jogo do player de áudio Então, primeiro, vamos criar um novo objeto de jogo e chamá-lo de objeto BGM E eu vou criar um novo objeto de jogo e podemos passar seu nome aqui. Então, vamos chamar essa fonte de BGM. E para o campo Fonte de áudio da fonte BGM aqui ou objeto Fonte de áudio, queremos adicionar o componente Fonte de áudio a esse objeto de jogo BGM Vamos apenas digitar no componente. Do objeto do jogo ob aqui no componente, podemos passar o tipo, que é a fonte de áudio, e isso criará uma nova fonte de áudio anexada a esse objeto do jogo. E a próxima coisa que queremos definir é definir o valor de mistura espacial da fonte BGM 20, então esse será um som de dois D. E também queremos definir o valor do grupo de mixagem de saída, apenas o grupo de mixagem de áudio de saída, como o grupo BGM E a última coisa que queremos definir é definir esse objeto de jogo como filho do objeto jogo do nosso reprodutor de áudio. Então, vamos acessar o objeto BGM, transformar o componente e, em seguida, definir o pai para essa transformação de objeto E agora queremos criar as fontes de efeitos sonoros dentro de um loop aqui. Então, queremos fazer um loop, e queremos repetir essa quantidade de tempo aqui. Vou copiar esse nome inteiro e colar isso como o comprimento, e queremos executar esse código dentro de seis vezes com base nesse número de fonte de áudio, e podemos alterar isso no inspetor, para que possamos ter mais fontes de áudio em nossa cena Então, vamos criar um novo objeto de jogo. E esse será o objeto do efeito sonoro. E vou criar um novo objeto de jogo e passar um nome, que é a fonte do efeito sonoro. Mas eu vou adicionar o índice i mais um, então ele começará de um no conjunto de zero, e eu vou converter essas duas cadeias com um formato de dois dígitos aqui A próxima coisa que queremos criar é criar criar é criar uma nova fonte de áudio. Podemos chamá-la de temporária e, em seguida, adicionar a fonte de áudio a esse efeito, não o grupo de efeitos sonoros, mas o objeto de efeito sonoro. Podemos usar o método do componente at e depois passar o tipo, assim como fizemos com o objeto do jogo de música de fundo aqui. OK. Então, agora temos a fonte de áudio. Podemos configurar essa fonte de áudio e depois colocá-la dentro do pool de nossas fontes de áudio. Então, vamos definir o T espacial brando um desta vez, porque queremos criar um som de três D. E então a próxima coisa que queremos definir é o grupo de mixagem de áudio de saída, e esse deve ser o grupo de efeitos sonoros Queremos também definir o pai desse objeto de efeito sonoro para esse objeto do jogo aqui. Vamos apenas acessar o método parent do conjunto de transformações e, em seguida, passar a transformação desse objeto de jogo do reprodutor de áudio. E a última coisa que queremos fazer é colocar essas fontes de áudio dentro da nossa fonte de áudio Q aqui. Então, podemos simplesmente acessar a fonte de áudio Q, e então podemos executar o método n Q e podemos passar o objeto T do jogo. Então, isso preencherá a fila de fontes de áudio com a fonte de áudio que acabamos de criar dentro do barco E se o valor inteiro for seis, teremos seis fontes de áudio dentro da nossa fila de fontes de áudio E agora, antes de continuarmos trabalhando com o áudio, precisamos criar um método de extensão para reproduzir o objeto de dados de áudio aqui por meio de nossas fontes de áudio. Então, vamos abrir o script de extensão. Eu o tenho aqui. E vou criar uma nova estática pública. E o tipo de devolução deve ser preenchido. Podemos chamar isso de reproduzir dados de áudio. E queremos estender a fonte de áudio. Então, precisamos usar essa palavra-chave aqui e definir a classe ou o objeto que queremos estender, que é a fonte de áudio, e vamos chamar isso de fonte e começar o método aqui. Outra coisa que queremos transmitir são os dados de áudio. Então, vamos passar os dados de áudio aqui, e vamos chamar esses dados de áudio. E agora, como estamos estendendo essa fonte de áudio, podemos usá-la para configurar o tom e os clipes de áudio e reproduzir esses clipes de áudio Então, vamos apenas digitar A source e acessar as propriedades Pitch, e podemos passar os dados de áudio get pitch property ou access ou getup E isso retornará um valor aleatório do tom de áudio que configuramos nesses dados de áudio aqui. E para o clipe, queremos também atribuir isso aos dados de áudio Obter clipe de áudio. E isso retornará os membros aleatórios do clipe de áudio dentro da matriz de clipes de áudio de nossos dados de áudio aqui Agora, depois de configurarmos duas propriedades diferentes aqui, queremos reproduzir o clipe de áudio. Vamos apenas acessar a fonte A e executar o método play. Agora que configuramos esse método de extensão dentro da extensão, podemos voltar ao reprodutor de áudio e começar a criar um método para reproduzir um áudio. Aqui, queremos criar um novo vazio público. E vamos chamar isso de reprodução de efeitos sonoros, e queremos passar um nome de string de áudio porque vamos referenciar o áudio usando seu nome em vez de seus clipes E se abrirmos a biblioteca de áudio, vamos abrir a biblioteca de áudio aqui. Você verá que temos essa função, obtenha o áudio pelo nome aqui e ele retornará a taxa de áudio. Vamos usar apenas o nome para reproduzir um áudio. Para fazer isso, primeiro, precisamos criar uma fonte de áudio temporária aqui. E podemos obter essa fonte de áudio da nossa fila de fontes de áudio aqui ou da extração de fontes de áudio dentro da fonte de áudio Q. Então, vamos digitar as fontes de áudio e usar o método D Q, e isso retornará a fonte de áudio mais antiga em nossa fila E aqui também queremos passar a transformação da cor. Então, vamos chamar esse local de áudio. E queremos definir a posição da nossa fonte de áudio para essa posição aqui. Então, vamos pegar a posição a partir da localização do áudio. E então queremos reproduzir os dados de áudio. Como estendemos isso, temos o método de exibição de dados agora temos o método de exibição de dados de áudio para nossas fontes de áudio. Então, vamos usar isso e precisamos converter a string em dados de áudio. Como já temos referência à nossa biblioteca de áudio aqui, podemos usar o método digitando a biblioteca que obtém o áudio pelo nome e, em seguida, podemos passar a string do nome do áudio que passamos dentro desse Vamos usar esse nome de áudio. E feche isso. E isso reproduzirá os dados de áudio selecionando seus clipes de áudio aleatórios e também seu tom aleatório Portanto, teremos um áudio diferente a cada vez, o que tornará o som mais dinâmico. E então a última coisa que queremos fazer é colocar a fonte de áudio de volta seu pool usando o NQ e passar a fonte de áudio Tam aqui Portanto, alteraremos a fonte de áudio mais antiga antes de reproduzi-la e, depois de reproduzi-la, a colocaremos como a fonte de áudio mais recente em nosso pool E isso se repetirá repetidamente toda vez que tocarmos efeitos sonoros. E vamos salvar isso. Então, agora temos essa configuração. Precisamos criar um novo objeto personalizado Na verdade, podemos criar uma string para isso, mas vou criar um novo objeto personalizado para definir o áudio que queremos reproduzir. E você verá por que criei esse objeto personalizado no próximo vídeo. Primeiro, vou criar um atributo, um atributo serializável E isso melhoraria o áudio. E dentro desse coletor de áudio, teremos um nome de áudio de string público Ok, agora temos isso. Podemos abrir os dados da arma. E dentro desses dados da arma, podemos criar um novo campo serializado, cujo tipo será o captador de áudio E vamos chamar isso de efeitos sonoros de tiro. E agora queremos reproduzir esse efeito sonoro. Dentro desse método de fogo, acho que está sim, está no método de atualização de armas. Queremos tocar o som. Então, sempre que estivermos atirando, podemos simplesmente executar os efeitos sonoros dentro do método de fogo, porque temos esse método de fogo compartilhado por esses dois tipos diferentes de armas Então, vamos usar o método de fogo aqui. E agora podemos acessar o reprodutor de áudio nessa instância, pois já criamos uma referência estática e podemos executar o método play sound EfFx E isso é para um nome de áudio. Então, vamos passar o nome do áudio do som do tiro. E então queremos passar a transformação do nosso jogador. E como já temos uma referência ao player dentro desse objeto programável, podemos simplesmente passar essa transformação desse componente do player aqui Então, vamos digitar player do transform. Agora temos um efeito sonoro funcional para o efeito sonoro de tiro Vamos expandir isso no vídeo posterior, mas vamos tentar configurar isso dentro do Unity. Então, vamos voltar para o Unity. E agora, para o reprodutor de áudio, vou conectar esse reprodutor de áudio ao gerenciador de jogos. Então, vou adicionar o componente do reprodutor de áudio aqui. E queremos pegar a biblioteca de áudio que criamos em nossa pasta de dados. Então, vamos selecionar essa opção aqui e, em seguida, escolher a biblioteca de áudio. E podemos simplesmente deixar o grupo de efeitos sonoros e o grupo música de fundo vazios por enquanto. Então, vamos salvar a cena aqui. E agora, para configurar o áudio. Podemos ir até a pasta de dados, verificar o lábio de áudio e lembrar o nome aqui, o tiro e o zap elétrico Vou copiar esse nome aqui. E podemos ir para a arma padrão e, para o efeito sonoro do tiro, podemos simplesmente colar o nome da arma dentro do campo do nome do áudio. E para a metralhadora, vamos usar o efeito sonoro. Neste exemplo, mas podemos mudar isso mais tarde. OK. Então, agora nós já configuramos isso. Vamos testar isso. Acho que preciso ter certeza de que o áudio não está muito alto. Então, vou para as configurações do projeto e vou diminuir o volume para 0,1 aqui. E vamos testar isso. Há um problema aqui. Esqueci de executar o método init dentro do reprodutor de áudio. Então, vamos fazer isso. Vá para o reprodutor de áudio e queremos executar esse método init Vamos digitar isso. E agora vamos voltar à unidade. Agora, se eu pressionar play e pausarmos isso, você verá que temos muitos objetos de jogo abaixo aqui E isso é para a fonte de áudio que queremos usar para reproduzir efeitos sonoros, e isso é para tocar a música. Agora, se eu apertar play, vamos testar. Aí está. Sim, tenho sons, e é diferente a cada vez. Sim. Tem um tom diferente. Agora temos efeitos sonoros funcionais, e os efeitos sonoros também serão dinâmicos, o que é bom. E queremos simplificar a maneira como escolhemos o nome do áudio aqui usando uma gaveta personalizada Então, no próximo vídeo, vamos fazer isso. 38. 37 Editor personalizado de audio Getter: Neste vídeo, vamos criar uma gaveta de propriedades personalizada para nossa classe audio gator Agora, se formos para a pasta de dados e selecionarmos um dos objetos programáveis de dados da arma, seja a arma falsa ou a metralhadora, você verá que sempre que quisermos definir os efeitos sonoros que queremos usar, precisamos digitar o nome do áudio E isso está sujeito a erros ou enganos sempre que digitamos o nome do som Para facilitar isso, precisamos criar uma gaveta de propriedades personalizada para essa classe Para fazer isso, precisamos criar um novo script para substituir o editor Vou criar uma nova subpasta dentro da pasta de scripts e vou chamar esse editor E todo o arquivo CSR que está dentro dessa pasta do editor não será incluído na fatura Portanto, para cada funcionalidade do editor, devemos colocar os scripts dentro da pasta do editor, e essa pasta do editor pode ser criada em qualquer lugar dentro da pasta do projeto. Aqui, vou criar um novo script CHR, e vamos chamar isso de gaveta de coleta de áudio E vamos abrir isso. Agora, se formos para a biblioteca de áudio, é por isso que criamos uma classe personalizada para a string do nome do áudio. Caso contrário, sempre podemos usar uma string diretamente nos dados da arma, por exemplo, para definir o ID dos efeitos sonoros de áudio ou o nome. Mas agora, como queremos sobrescrever a tela ou o inspetor, é por isso que criamos uma classe personalizada para Então, agora vamos para a gaveta do Audio getter e precisamos excluir todo o método incorporado E precisamos usar a biblioteca do editor Unity. Então, vamos digitar usando o Unity Editor e queremos substituir a herança por uma gaveta de propriedades E aqui queremos adicionar um atributo chamado gaveta de propriedades personalizadas E dentro do argumento, precisamos adicionar um tipo de palavra-chave aqui e, em seguida, precisamos direcionar a classe que queremos modificar. Nesta aula, queremos modificar a coleta de áudio. Com a gaveta de propriedades, na verdade, é bem simples. Primeiro, precisamos substituir o método. Então, vamos digitar o método contínuo. E, como você pode ver aqui, o método contínuo tem três argumentos. O primeiro é um retângulo chamado posição. A segunda é a propriedade serializada, chamada propriedade, e a terceira é o conteúdo Gu, chamado rótulo, e rótulo é basicamente o rótulo do nome que definimos em outro script Sempre que mostramos um campo, rótulo é o nome do campo. Ok, basicamente, isso com base na interface do usuário com a propriedade de posição do argumento e o rótulo está desenhando o inspetor normal, e se quisermos sobrescrever isso, precisamos excluí-lo Então, vamos tentar aqui. E para desenhar um inspetor personalizado para a gaveta de propriedades, precisamos acessar a classe GI do editor Não podemos usar o layout U do editor ou o utilitário GUI do editor Então aqui, por exemplo, se eu usar o label file, como você pode ver aqui, ele pediu uma posição, um retângulo, então podemos simplesmente passar essa posição e ele saberá onde colocar esse texto E para o segundo argumento, podemos usar um rótulo de conteúdo de interface ou podemos usar um rótulo de string personalizado aqui. Então, vou criar uma string personalizada e digamos que modificamos do gether E vamos fechar isso e salvar isso. Agora, se voltarmos para Unity e depois que o script terminar de ser compilado, se formos para a pasta de dados e selecionarmos a arma padrão, você verá que há um texto aqui dizendo que modificamos o coletor de áudio e não podemos mudar isso Na verdade, esse não é nosso, mas apenas para mostrar como modificamos a gaveta de propriedades personalizadas E agora vamos remover isso. E agora queremos criar o rótulo do prefixo. Então, vou digitar a posição. E então vou preencher isso com o editor I, e podemos usar o rótulo do prefixo E esses rótulos de prefixo retornam uma classe ou objeto retangular É por isso que podemos ajustar isso à posição. E isso garantirá que esse rótulo seja desenhado antes de qualquer propriedade cruzada que desejemos modificar Ok, então vamos passar a posição. E para o rótulo, também podemos passar o rótulo. Para o coletor de áudio, queremos criar um menu suspenso onde possamos listar todos os nomes de áudio que preenchemos na biblioteca de áudio Para fazer isso, precisamos criar algumas modificações em nossa biblioteca de áudio e também em nosso coletor de áudio Dentro do coletor de áudio, vou digitar um ID inteiro público, e isso conterá o índice da lista de strings que criaremos em nossa biblioteca de áudio Para facilitar o acesso à lista de strings dentro da biblioteca de áudio, precisamos criar uma nova lista pública de strings. Vamos criar uma nova estática pública, e o tipo seria lista de string, e vamos chamar essa lista de nomes de áudio e inicializá-la Eu faço isso estático para facilitar o acesso a essa variável de qualquer outra classe porque precisamos acessar essas listas de strings a partir desse script de gaveta de propriedades personalizadas Queremos alterar esse valor sempre que fizermos alterações em nosso objeto programável Podemos usar o método chamado data válida. Vamos apenas digitar a data válida nula. Na verdade, esse é um método incorporado. De alguma forma, não está marcado como embutido, mas podemos testar isso. Vamos apenas digitar o registro de bugs. Digamos que biblioteca de áudio foi modificada. Vamos salvar isso. Agora, se voltarmos para a unidade, selecionaremos a biblioteca de áudio e, em seguida, acessaremos o console aqui. Se tentarmos modificar um dos valores dentro do inspetor de áudio aqui Por exemplo, vamos alterar a página máxima para o tiro Você vê que a data válida é executada aqui e o registro de pendências é impresso no console. Então, podemos usar isso para modificar a lista estática de strings que acabamos de criar na biblioteca de áudio. Então, vou deletar isso aqui. Vou limpar a lista de nomes de áudio e executar o método clear. E vou dar uma olhada na lista de áudio aqui. E vamos chamar esse áudio para cada membro e para a coleção. Queremos passar a coleção de listas de áudio. E aqui, queremos preencher a lista de nomes de áudio com os nomes de áudio de cada áudio dentro da lista de áudio aqui. Vamos apenas digitar audioam de áudio. Dessa forma, sempre que alterarmos a biblioteca de áudio no inspetor, ela atualizará os nomes de áudio aqui Guarde isso. Ok. Então, agora modificamos a coleta de áudio e a biblioteca de áudio. Podemos continuar trabalhando na coleta de áudio aqui. Então, para criar um menu pop-up ou suspenso, queremos usar o editor GY dot pop up e, para o pop-up, ele solicita uma posição, para que possamos simplesmente passar a posição. E o número inteiro do índice selecionado. E podemos usar esse ID que criamos no audio gator porque basicamente o valor que será seguro para o pop-up é o número inteiro E usando esse número inteiro, podemos pegar a string dessa lista estática de string aqui Mas para acessar o número inteiro que criamos no audio gator, precisamos acessar a propriedade aqui, que é a propriedade series, e então precisamos usar o método fine property relative, solicita um nome de string do caminho da propriedade relativa Nesse caso, é o nome da variável, que é apenas o ID do tipo. E então, para o último argumento, queremos usar uma matriz de strings. Então, podemos simplesmente digitar Audio, classe de biblioteca de áudio e pegar o áudio sem nome aqui Mas como isso é uma lista, precisamos convertê-la em uma matriz. Então, podemos simplesmente usar o método de matriz para converter esses dois e uma matriz. Aqui temos um erro porque propriedade fina relativa retorna uma propriedade serializada Então, precisamos pegar o valor inteiro. Aqui. E todo esse código aqui precisa ser atribuído a um valor inteiro Nesse caso, queremos atribuir novamente ao valor do ID. Então, vou copiar esse valor inteiro aqui e, em seguida, colar isso na frente do RGI e atribuir Portanto, sempre que alteramos o pop-up, queremos pegar o novo valor inteiro e esse valor inteiro ficará seguro para o valor inteiro do ID Então, estamos ignorando isso. E sempre que alteramos o pop-up aqui, queremos modificar o valor da string do nome do áudio. Então, vamos pegar a variável de nome de áudio, vamos verificar se a variável chamada Sim, é nome de áudio, vamos pegar a variável e, como essa é uma propriedade serIs, precisamos pegar o valor da string e atribuir esse valor usando a biblioteca de áudio, a string estática de list, que é a lista de nomes de áudio E para índice, podemos simplesmente passar o valor inteiro dos nossos campos de ID aqui Vamos colar isso aqui. E feche isso com Sam Colm. Agora vamos salvar isso. Agora vamos voltar à unidade e ver se esse código está funcionando. Vou limpar o console aqui e selecionar a arma padrão. E como você pode ver aqui, agora temos um bom menu suspenso para o efeito sonoro do tiro Então, podemos mudar isso para o z elétrico. E sempre que mudamos isso, não temos nenhum erro. Então isso é um bom sinal. E vamos tentar. Vamos até o lábio de áudio aqui e vamos adicionar um novo som. E vamos chamar essa arma de recarga e mudar o clipe de áudio para recarga de arma de ficção científica Agora, adicionamos esse novo nome de áudio. Vamos ver se a lista de nomes de áudio é atualizada. Selecione a arma padrão e abra o menu suspenso aqui. E aí está, como você pode ver, temos um novo som. Agora vamos experimentar nossa modificação aqui. Vamos mudar os efeitos sonoros do tiro para o zap elétrico aqui e apertar play, ver se essa modificação funciona ou não Ok. Aí está . Está funcionando. E se mudarmos para o tiro, você pode ver que mudamos o áudio E isso torna a seleção de sons muito mais fácil. 39. 38 Como otimizar o fluxo de trabalho de áudio: Neste vídeo, continuaremos trabalhando em nosso áudio. E há algumas coisas que quero mostrar para facilitar a configuração do áudio. E primeiro, queremos alterar a referência ao nome do efeito sonoro de áudio. Em vez de usar uma string, queremos usar o ID. Então, aqui dentro da gaveta de áudio, não precisamos disso. Então, vamos comentar isso por enquanto. E então vamos para o Audio getter. Está sob a biblioteca de áudio. E aqui queremos criar uma nova string getter pública. Então, vou mudar isso para um nome de áudio com A maiúsculo e definir isso como um jacaré E vamos retornar a lista de nomes de áudio da biblioteca com um índice do nosso ID. Ok, agora salve isso. Portanto, agora o coletor de áudio salvará nosso ID de índice com base no pop-up que selecionamos ao escolher os efeitos sonoros e, sempre que quisermos nos referir aos efeitos sonoros, na verdade estamos retornando a string da lista de nomes de áudio aqui Agora vamos voltar para o Unity. E você verá que temos um erro aqui porque mudamos o nome da variável, usando um A maiúsculo aqui. E agora, se clicarmos duas vezes nesse erro aqui, você verá que ele não consegue encontrar a variável do nome do áudio, porque mudamos isso. Então, em vez de usar o nome da string, vou excluir toda a string de áudio aqui. E vamos ao reprodutor de áudio. E queremos usar o coletor de áudio. Portanto, isso tornará a digitação do código muito mais rápida. E em vez de usar uma string, queremos pegar a string do coletor de áudio aqui, então vamos digitar o nome do áudio aqui E podemos simplesmente renomear esses dois efeitos de áudio e alterar esses dois efeitos de áudio S. Então está mais claro. E guarde isso. E agora, se voltarmos para o Unity, deveríamos ter eliminado o erro Ainda há um erro. Vamos verificar isso. Ok, guarde isso. Esqueci de salvar os dados da arma. Então, vamos voltar para o Unity. E agora eu termino a compilação, ele limpa todo o erro E se apertarmos play e depois testarmos isso, veja, ainda temos um som funcionando. E a razão pela qual eu troco a gaveta do Gether usando o ID Posteriormente, quando estivermos preenchendo nossa biblioteca de áudio e definindo o nome de cada lista de dados de áudio aqui, não precisamos reatribuir efeitos sonoros em cada entrada da coleta de áudio ou em cada script que usa a coleta áudio como referência de efeitos sonoros de áudio E dessa forma, saboreie, e estará menos sujeito a erros do que fazíamos antes E a outra coisa que queremos fazer adicionar uma opção para definir os efeitos sonoros como um som de dois D. Atualmente, se formos ao reprodutor de áudio, você verá que todos os efeitos sonoros mistura espacial estão definidos como 21. E, por exemplo, se tivermos efeitos sonoros de volume muito baixo que queremos reproduzir em um objeto distante, provavelmente não poderemos ouvir isso. Por exemplo, uma arma capta efeitos sonoros. Provavelmente, esse som não precisa ser um som de três D porque não é um som relacionado à imersão do jogo, como um tiro ou É mais um feedback de áudio para o jogo. Podemos definir o som 2a2d. Então, aqui, no método play SF X, queremos adicionar um valor padrão para a localização do áudio e definir esse canal Portanto, com esse conjunto, podemos simplesmente ignorar esse parâmetro se não quisermos passar uma transformação da localização do áudio. E aqui queremos criar uma instrução if se a localização do áudio não for nula, então queremos definir essa fonte de áudio áudio A três D. Então, vamos cortar essa linha aqui onde estamos definindo a posição e colá-la dentro da instrução I. E então queremos definir a branda espacial T de volta para um. E queremos criar uma declaração L. E isso é quando estamos executando esse método sem o argumento de localização de áudio. Então, aqui queremos reduzir a combinação espacial da nossa fonte de áudio em 20%. Então, esse será um som de dois D. E vamos salvar isso. Outra coisa que queremos criar é criar um método para tocar a música aqui acima, definir a fonte de áudio da nossa música de fundo, opção de loop como verdadeira, então vamos digitar BGM source loop e definir isso como true Para tocar música, vamos criar um novo método público, tipo escrito de vazio, e vamos chamar isso de play music Também queremos passar a coleta de áudio, e vamos chamar isso de música. Mas não precisamos de nenhum outro parâmetro. Aqui, podemos acessar a fonte BGM imediatamente, usar o método de reprodução de áudio e usar a biblioteca de áudio, obter áudio pelo método de nome e pegar a string do nome do áudio da música E aqui queremos ter certeza de que o campo está voltado para um. Queremos ignorar o valor aleatório do tom aqui porque queremos tocar a música em seu tom e com segurança originais. Vamos voltar para o Unity e ver se há erros. Não há erros, então é um bom sinal No próximo vídeo, começaremos a preencher o áudio 40. 39 Como aplicar FX de som: Neste vídeo, vamos começar a atribuir o som a cada objeto na cena que precisa do som. Então, agora vamos primeiro preencher nossa confiabilidade de áudio. Mas antes eu vou mostrar as configurações do nosso áudio aqui. Portanto, se você importou os arquivos de áudio na lição anterior, verá que temos alguns arquivos de áudio em nosso projeto aqui. Então, para todos os efeitos de áudio, vou selecionar todos eles juntos. E vou garantir que o tipo de carga esteja configurado para descompactar a carga ou compactar na memória, e queremos definir a qualidade 290 E para o formato de compressão, isso deve estar bem. Então, vamos pressionar aplicar. E você vê que, no momento, o tamanho original é de 1,7 megabytes, mas o tamanho importado é de 400 kilobytes, então já economizamos cerca de 75% E para a música de áudio, o arquivo BGM. Queremos definir isso para streaming e, para garantir a qualidade, podemos deixar 100 e pressionar aplicar. Como esse é um arquivo Petry, quase não há compressão, mas com o streaming, o arquivo Petry não caberia na memória Ele será transmitido de um disco. E, basicamente, com um tipo de carregamento de streaming, precisamos ter certeza de que há apenas uma fonte de áudio que está sendo transmitida do disco. Caso contrário, isso pode causar pernas, especialmente em dispositivos móveis. Portanto, o streaming geralmente é usado para música porque geralmente temos apenas uma música em nossa cena. Agora vamos para a pasta de dados e configuramos a biblioteca de áudio, e eu já criei algumas entradas aqui, mas vou preencher isso com o resto do áudio que temos em nosso projeto Então eu vou adicionar talvez 212, e então eu vou definir isso um por um, e então eu vou acelerar este vídeo E para o BGM, vamos definir o tom mínimo e o tom máximo como um, para que tenhamos variação de tom E agora eu já configurei tudo isso aqui. Vou salvar o projeto para que o objeto programável seja salvo E agora precisamos criar alguns scripts. Então, vamos para a pasta de scripts abaixo do Áudio. Vou criar um novo script de CHR chamado play Audio action, e o outro deve ser o play music action Agora vamos abrir o script de ação Play Audio. Aqui no script de ação de reprodução de áudio, queremos excluir todo o método incorporado e vamos definir a variável primeiro. Vamos criar um campo serializado e, para o tipo, isso seria um coletor de áudio. E vamos chamar isso de efeitos sonoros de áudio. E a segunda opção será um bulion, e vou chamar isso de som de dois D. E isso é para ativar ou desativar, se quisermos definir esse áudio como um som de dois ou três D. E o último seria um atraso. Então, queremos acrescentar que, desculpe, não demore, deve ser fluído, e vamos chamar isso de atraso Então, queremos adicionar um recurso em que possamos atrasar a reprodução do áudio. Então, agora vamos criar um novo vazio no método enable. Por que estamos usando o método enable? Porque a ativação é acionada quando o objeto é ativado e pode ser executada várias vezes. Uma vez que alguns dos objetos na cena são desativados na inicialização. Se usarmos o método start, talvez nunca ouçamos o áudio sendo reproduzido porque o método start já foi executado e, ao ativar o objeto posteriormente, a ação não será executada Aqui, dentro do método unenable, queremos usar a ação atrasada que criamos em nossa extensão e queremos passar uma ação usando delegate aqui Depois de passar o delegate, queremos passar o Vamos ignorar o atraso e depois fechar isso. Agora podemos digitar nosso código dentro desse delegado aqui. Então, dentro dessa ação delegada, queremos acessar o reprodutor de áudio e, em seguida, a referência estática, e queremos reproduzir o efeito sonoro de áudio, usando o método play SFX usando o método play SFX E então queremos passar o receptor de áudio. Então, vamos passar o efeito de som do áudio. Para a localização, queremos usar esse bleion para determinar se vamos passar uma transformação ou não Então, vamos digitar o som e depois o ponto de interrogação. E se for verdade, então queremos passar Null Mas se for falso, queremos passar essa transformação do objeto ao qual o script está anexado. Agora, basicamente, se habilitarmos o som d , o som será um som D quando estiver tocando. Mas se estiver desativado , será um som de três D. Para a ação de tocar música, podemos simplesmente duplicar todo o script aqui E eu vou abrir isso. E aqui, vou colar o script que copiamos antes e vamos criar uma modificação Vamos apenas excluir o ouro aqui, e podemos remover o segundo argumento, e queremos executar o método play music OK. Vamos salvar isso e voltar para o Unity. Agora, queremos abrir o script de dados da arma, adicionar a arma MT e o efeito sonoro de aviso de recarga Vamos abrir os dados da arma aqui. E se rolarmos até aqui, abaixo do campo Gunshot Sound effect Audio gaor, queremos adicionar mais algumas variáveis Vamos apenas adicionar um efeito de recarga, sonoros vazios e os efeitos sonoros de aviso de recarga E aqui, se você rolar para baixo, queremos adicionar um som sempre que o MO acabar. Mas queremos reproduzir o som somente se pressionarmos o botão do mouse. Então, vamos mudar essa declaração para uma declaração if. Então, vamos digitar a entrada com o botão GT do mouse pressionado e queremos clicar com o botão esquerdo. E aqui queremos adicionar uma condição se o MO for menor ou igual a zero. Se acabar, queremos reproduzir o efeito sonoro vazio. Vamos apenas acessar a instância do reprodutor de áudio e o método play sound EfFx Para o nome, podemos simplesmente passar o efeito sonoro vazio. E para a localização, podemos simplesmente usar a referência do script do player e acessar o componente de transformação. Vamos copiar essa linha aqui e colar aqui abaixo, e eu também quero reproduzir o efeito sonoro de aviso de recarga E podemos copiar essa linha aqui e depois colá-la no código da metralhadora aqui, e também queremos verificar essa declaração. Então, vamos copiar as duas primeiras condições e colá-las aqui abaixo e adicionar o seno final Criamos uma condição semelhante, mas com o O atual igual ou menor que zero aqui abaixo. Guarde isso. Sempre que recarregamos o MO, queremos reproduzir o som de recarga Vamos apenas copiar essa linha aqui, e aqui abaixo, vou tocar os efeitos sonoros de recarga e salvar isso Agora vamos abrir o script do player. Aqui no topo, queremos adicionar um novo campo serializado, e o tipo deve ser coleta de áudio, vamos chamar isso de efeitos sonoros danificados E, basicamente, queremos reproduzir o som de dano sempre que iniciarmos a trepidação da câmera. Aqui, podemos simplesmente colocar a instância do reprodutor de áudio, reproduzir efeitos sonoros. E então podemos simplesmente passar o coletor de áudio do efeito sonoro de dano e, para a transformação, podemos simplesmente passar a transformação desse objeto aqui Guarde isso. O próximo que precisamos modificar é o script it effect. Vamos apenas abrir o script de efeitos de sucesso e adicionar um campo ers de coleta de áudio, e vamos chamar isso de efeitos sonoros de sucesso. E sempre que tocamos algo aqui, sob o método hit, queremos reproduzir os efeitos sonoros. Então, vamos acessar o reprodutor de áudio. Por exemplo, execute o método de reprodução de efeitos sonoros e, em seguida, passe os campos de efeitos sonoros atingidos. E para a transformação, podemos simplesmente passar o sistema de partículas do cache de efeitos, mas podemos passar o componente de transformação aqui Portanto, o som se originará dependendo da posição da partícula, e esse será um ótimo O último deve ser o roteiro de coleta de armas. Então, vamos abrir o script de coleta de armas aqui. E, basicamente, sempre que atingimos a arma, queremos reproduzir um efeito sonoro bônus. Vamos apenas adicionar um campo de tamanho, coleta de áudio, e vamos chamar isso de captação de efeitos sonoros. E queremos reproduzir o efeito sonoro usando o reprodutor de áudio. E vamos passar o campo de captação de efeitos sonoros que criamos e, para a localização do áudio, podemos deixá-lo nulo porque queremos que seja um som seco e salvá-lo Agora vamos voltar à unidade, e vamos colocar essas coisas dentro da unidade. Então, aqui, se selecionarmos a câmera principal, vamos até o componente de script do player e selecionaremos o efeito sonoro de dano do player. E vamos também para a pasta de dados e selecionar a arma padrão e a metralhadora. E queremos preencher isso, vamos selecionar o tiro para o efeito sonoro do tiro Para a recarga, queremos selecionar a recarga da arma. Para o vazio, queremos selecionar o canhão vazio, e para o aviso de recarga, queremos selecionar o aviso de recarga E a outra coisa que queremos configurar em nossa pasta perfeita, podemos selecionar a metralhadora aqui, e agora a coleta da arma terá um campo de captura de efeitos sonoros Então, podemos simplesmente selecionar isso e, em seguida, escolher a arma escolhida. Para o refém, queremos modificar isso, vamos apenas selecionar o refém E aqui, vou adicionar a ação de reproduzir áudio e adicionar efeitos sonoros de refém, não fotografe, e vamos configurar isso para o som para que possamos ouvi-lo melhor, e vamos adicionar um atraso de 2 segundos E agora precisamos modificar o inimigo sempre que ele for atingido. Vamos apenas selecionar o prefeito inimigo e, sob o efeito de golpe, ativamos os campos de efeitos sonoros de golpe Vamos apenas selecionar o zap elétrico. Para o refém, também queremos colocar isso no zap elétrico Então, para a grande explosão aqui, queremos adicionar a ação de reprodução de áudio , definir o atraso C como zero e desativar o som D. Não queremos que isso seja um som de CD. E para o áudio SFX, vamos selecionar a explosão E agora, dentro da cena aqui, se expandirmos o ambiente, selecione todo o objeto do cubo aqui Todos eles devem ter um script de efeitos de sucesso anexado a ele. Vamos apenas selecionar o slot de impacto aqui. Salve a cena. E então queremos criar a música para nossa cena, então vamos criar um objeto de jogo vazio. Vou reiniciar a transformação e vou chamar isso de música, e vamos tocar a ação musical e definir o atraso em 20, e queremos reproduzir os efeitos sonoros de áudio BGM E vamos salvar a cena. E agora vamos apertar o play e testar isso. Então aí está, temos uma música, podemos filmar e temos um som. E como você pode ver, como você pode ouvir, se eu atirar perto da borda, você pode ouvir o som do impacto. E se formos atingidos pelo inimigo, temos esse som danificado e, se atirarmos no inimigo, podemos ouvir a eletricidade. E também podemos ouvir a explosão. E podemos matar o refém, e podemos ouvir a voz do refém e também a eletricidade e o disparo da arma. Há muito som acontecendo agora. Mas, basicamente, todos eles estão funcionando e não temos nenhum erro em nosso console. Então, é basicamente assim que atribuímos o som aos objetos em nossa cena. 41. Correção de bug de 40 tiros: Encontrei um bug relacionado ao cálculo de tiros disparados e tiros acertados. E neste vídeo, vamos corrigir isso. Então, para verificar esse bug, precisamos selecionar o gerente do jogo e alterar o tipo de inspetor para D bug E agora podemos ver todas as nossas variáveis privadas aqui. Então, vamos pressionar. E agora você verá que vou silenciar o áudio. E agora você verá que, se atirarmos no inimigo, aumentaremos o inimigo atingido e os tiros disparados. Mas os tiros disparados sempre disparam vezes que o inimigo acerta. E isso está acontecendo porque dentro do nosso código aqui nos dados da arma, se você rolar para baixo, sempre que dispararmos a arma, ele executa esse método aqui, e executa esse método para cada golpe no objeto. Então, por exemplo, no inimigo aqui, vamos apenas selecionar o inimigo. E agora, se você vender o inimigo, verá que temos dois itens de sucesso, que são os efeitos de golpe e os scripts do inimigo E podemos confirmar isso verificando o script no estúdio fiscal. Se abrirmos o script inimigo, você verá que essa classe aqui implementa o hitable E o mesmo acontece com os efeitos de sucesso. Ele também implementa essa tabela. Portanto, isso pode ser executado várias vezes, dependendo da quantidade de acertos que o objeto do jogo tem ou tem Então, para corrigir isso, primeiro, precisamos separar o método de acerto dos tiros disparados. Então, se formos até o gerente de jogo aqui abaixo, temos o método shot hit com um argumento bleion Precisamos separar isso. Então, vou criar um novo vazio público E vamos chamar isso de tiros disparados, e não precisamos passar nenhum parâmetro. Vou cortar essa linha de tiros disparados e colar aqui. Basicamente, sempre que disparamos uma arma, queremos aumentar esse valor aqui. E sempre que atingimos algo que queremos contar, executamos esse método aqui. Vamos apenas remover o argumento e remover a declaração if aqui. Vamos limpar isso um pouco. E guarde isso. E agora vamos voltar aos dados da arma, e podemos simplesmente excluir tudo isso aqui, a declaração e excluir a declaração de devolução. E agora o tiro não exige mais discussões, então vamos excluir o valor do bulion E eu vou deletar também essa declaração de retorno. E, basicamente, isso é tudo o que precisamos fazer aqui. Mas sempre que disparamos uma arma ou disparamos nossa arma, queremos usar o método de tiros disparados. Então, podemos simplesmente executar o método de tiros disparados aqui acima. Então, vamos acessar o gerenciador de jogos, por exemplo, e vamos executar o método de tiros disparados. Dessa forma, sempre que dispararmos nossa arma, a variável de tiros no gerenciador de jogo aumentará, e sempre que acertarmos algo que queremos contar, por exemplo, o script inimigo , a variável de acerto do inimigo também aumentará Se voltarmos à unidade aqui, vamos parar com isso. Se selecionarmos esse barril aqui, você verá que temos esse spawn E isso cria uma explosão, e o outro gera a metralhadora Então, queremos levar isso em consideração o spawn ao ser atingido como um inimigo atingido Caso contrário, sempre que fecharmos esses dois itens, isso contará como um tiro disparado, mas não como um inimigo atingido, e isso penalizará nossa precisão Então, precisamos voltar ao script aqui e aos dados da arma. Sob a declaração if aqui. Queremos adicionar uma segunda condição, desculpe, não n, mas usando a operação, e queremos comparar ou verificar se a tabela é um spawn nela Outra coisa que queremos verificar é vamos primeiro voltar ao Unity e selecionar a metralhadora branca de cano E precisamos verificar o spawn preferencial de dois aqui. Se você selecionar isso, podemos verificar o objeto. E aqui, a metralhadora também tem um roteiro adequado, que é a coleta da arma. Então, vamos abrir o script aqui. E também queremos verificar isso. Vamos voltar aos dados da arma e adicionar outra declaração. Se o alvo for um coletor de arma , também queremos contar o tiro atingido. Vamos salvar isso. Agora vamos voltar ao Unity e vamos jogar. Agora, se você selecionar o gerente do jogo, poderemos ver a variável e vamos tentar atirar no inimigo. Agora temos um tiro disparado. Mas se eu atirar no inimigo, agora temos dois tiros disparados e um inimigo atingido. Portanto, os tiros que apontamos para o inimigo são contados como um, tanto o acerto quanto os disparados. Então, vamos superar isso e depois testar novamente, e vamos tentar não perder a foto. Aí está. Vamos atirar no inimigo três vezes para matá-lo. E agora temos três ataques inimigos e três tiros disparados. Então, com essa mudança de código, corrigimos o problema em que os tiros disparados são sempre duas vezes maiores do que o inimigo atingido. 42. 41 Avaliação de posição: Neste vídeo, vamos criar um sistema de cálculo de classificação. Então, se formos para a interface do usuário aqui e expandirmos o gerenciador de jogos Canvas, você verá se seleciona a tela n aqui e a habilita. Você vê que temos uma interface de usuário de classificação aqui, e ela sempre exibe A atualmente. Então, precisamos implementar isso. Para implementar isso, vamos ao Fico Studio e abrir o script do UI Manager. E para o script do gerenciador de interface, primeiro, queremos criar um novo campo serializado E isso deve ser um tipo de interface gráfica P de malha textual, e vamos chamar isso de imposto de classificação E, basicamente, precisamos criar uma fórmula para calcular a pontuação, para convertê-la em classificação. Portanto, a proporção máxima do kel inimigo é de 100%. Além disso, a taxa máxima para precisão de fechamento também é de 100%. Com essas duas pontuações ou duas medidas, podemos decidir criar um sistema de classificação. Agora vamos definir. Para obter a classificação A, queremos ter certeza de que o kel inimigo esteja acima de, digamos, 90%. E como a precisão é um pouco mais difícil, queremos diminuir esse valor. Então, vamos verificar se a precisão está acima de 80%. E para B, queremos definir se o inimigo mata, é maior do que, digamos, 75%, mas ao mesmo tempo, menos de 90%, e com precisão, digamos maior que 70%, mas menor que 80%. Para C, vamos apenas copiar essa linha aqui. Vou colá-lo e vamos apenas modificar isso. Pois, queremos definir se a morte do inimigo é menor que 75%, e se é maior, digamos 60%, e para a precisão, queremos ter certeza de que é maior que 70, e se for maior que 55%, queremos dar a ela a classificação C. E se copiarmos essa linha, colá-la aqui, então queremos definir a classificação D. Vamos decidir que D é a classificação mais baixa. Então, se for menor que 60, o kel inimigo, e se a precisão também for menor que 55, queremos dar a ele a classificação D. Com isso aqui, podemos criar uma média total. Vamos criar uma nova variável. Vamos chamar essa média total. E esse deve ser o valor total dividido por dois. Isso é 170/2, e obtemos 85. Isso significa que a média total deve ser maior que 85 para obter a classificação A. Nesta, queremos ter um intervalo, que é se a média total for maior que o valor mais baixo aqui, então podemos pegar a média de 72% E, ao mesmo tempo, é menor que 85, então queremos dar a ele a classificação B, e se duplicarmos isso e depois o acompanharmos aqui para a corrida C, então queremos calcular o valor mais baixo, que é 6055, isso deve ser 57, e para o máximo, é sempre o valor mais baixo da nossa corrida anterior Então, vamos definir isso se for menor que 72, e aqui se a média total for menor que 57. Então, agora temos essa fórmula aqui. Podemos adicionar um valor de penalidade sempre que o jogador matar um refém. Por exemplo, matar reféns penalizará pontos em 15. Então, uma morte de refém subtrairá toda a nossa média em 15 Ok, com essa fórmula aqui, vamos copiar essa nota aqui e ir para o Visual Studio e, e ir para o Visual Studio com o script do UI Manager aberto, queremos rolar para baixo. E então vá para o método show and screen aqui, e eu vou adicionar um novo método abaixo. Vamos chamar isso de pontuação de cálculo de vazio. Vou colar o cálculo que criamos e defini-lo como um comando. Então, podemos ver isso aqui enquanto escrevemos nosso código, e vamos limpar isso. Agora temos esse método de pontuação Calcate. Limpeza. Queremos passar o argumento de todo o argumento dentro do nosso método show and screen. Vamos selecionar todo o argumento aqui, copiá-lo e colá-lo aqui. Ok, basicamente aqui, queremos declarar algumas variáveis flutuantes locais A primeira seria a penalidade por reféns. E podemos simplesmente calcular a quilha do refém, multiplicar por dez. Nós obtemos o valor. Desculpe, não dez, deveria ser 15 aqui, como você pode ver, então, para a proporção da quilha do inimigo flutuante, podemos simplesmente calcular a quilha inimiga dividida pelo total do Mas como ambos estão em números inteiros, precisamos converter um deles em um flutuador, então vou lançar o divisor e multiplicar isso Obteremos a porcentagem e, se incluirmos isso, queremos subtraí-la com o valor da penalidade de refém Então, vamos calcular também a taxa de precisão. E esse deve ser o acerto total dividido pelo total de tiros. Além disso, queremos transformar o divisor em um flutuador e multiplicar isso E não se esqueça de penalizar o ponto com a penalidade de refém. E agora temos isso. Então, vamos calcular a média total. E isso é bem simples, na verdade. Só precisamos adicionar a taxa de morte do inimigo com a taxa de precisão. E depois divida isso por dois. Agora que calculamos toda a fórmula aqui, queremos mostrar a classificação dependendo dessa classificação ou da especificação que criamos para a pontuação. Vamos apenas criar uma declaração if e, se a média total for maior que 85 aqui, como você pode ver, queremos imprimir A na classificação. Assim, podemos simplesmente acessar o imposto de classificação e executar o método set tax e, em seguida, inserir uma string como argumento. E queremos verificar se as médias totais são maiores que 72% Mas, ao mesmo tempo, é inferior a 85. Então, queremos imprimir B Mas uma das comparações aqui precisa ter um sinal de igual, então incluirá todo o intervalo. Então, vou adicionar incluir seno, então isso significa que se for igual ou maior que 85, então queremos imprimir isso Caso contrário, se não usarmos isso, se for exatamente 85, as duas condições não serão executadas. Então, vamos adicionar o sinal de igual. Oh, desculpe, eu digitei uma porcentagem aqui. Deveria ser F, então vamos corrigir isso. E agora queremos imprimir no texto de classificação um caractere de B. Então, vamos copiar isso para torná-lo mais rápido, e eu vou copiar o menor para o nível D, adicionar uma declaração L e colá-la aqui. Para C, sabemos que se for maior que 57 e, ao mesmo tempo, for 72, então queremos imprimir C. Aqui, para o valor maior, quero incluir o ponto flutuante 72 aqui, então vou adicionar um seno igual e também adicionar um seno igual dois, este E para D, queremos verificar se é menor que 57. Então, vamos digitar D aqui. Vamos salvar isso. E agora temos esse método criado. Precisamos executar esse método dentro do método show en screen. Então, depois de configurarmos o texto de precisão aqui, vou executar o método de cálculo da pontuação e, em seguida, passar todo o argumento aqui. Vamos ultrapassar a morte do inimigo, o inimigo total, a morte do refém, o total de tiros e também o acerto total e salvar isso, e vamos voltar para o Unity e testar isso Agora, aqui dentro do Unity, primeiro, precisamos selecionar o gerenciador de jogo e, em seguida, abrir o objeto da tela final aqui, abrir o layout. E para a área de pontuação, queremos abrir a classificação e ela tem um título e um objeto de jogo R. Queremos direcionar esse objeto do ring game como uma taxa de classificação do nosso campo de imposto de classificação no componente de gerenciamento de jogo. Vamos direcionar o imposto de classificação aqui. E tem um text mesh pro, então os campos registram o componente imediatamente. E agora vamos salvar nossa cena aqui. Agora vamos testar isso. E vou tentar jogar o mais rápido possível sem névoa de tiros e matar reféns Vamos usar isso para matar o inimigo, usar a explosão. E vamos ativar a depuração aqui, para que possamos ver nossas estatísticas e matar o inimigo. Aí está. Temos estatísticas perfeitas aqui, e agora vamos matar o inimigo aqui. Agora, como você pode ver aqui, temos uma estatística muito boa e temos R A. Mas se testarmos isso novamente e agora tentarmos fazer o nosso melhor novamente, mate o refém desta E agora, como você pode ver aqui, embora tenhamos 100% de precisão hostil ou precisão de matar inimigos, e também a precisão Mas como matamos dois reféns, temos uma classificação de C. Então, matar um refém será penalizado em uma grande quantia, que é E agora vamos testar isso mais uma vez para verificar a precisão dos tiros. Vamos tentar atirar em E, então temos uma precisão muito ruim, e vamos tentar matar o inimigo. E como você pode ver aqui, apesar de matarmos todos os inimigos, nossa precisão é muito baixa, então temos a classificação C. Ok, então é basicamente assim que calculamos o n da jogabilidade. 43. 42 Configuração de volume e parada: Desta vez, discutiremos um mecanismo anterior e também criaremos as configurações de uma folha ao abrirmos o painel anterior Então, para fazer isso, eu já preparei um pacote de interface do usuário do painel de pausa, e você pode baixá-lo no recurso desta palestra Então, depois que você não souber disso, basta importar o pacote, então vou importar um pacote personalizado e vou importar o pacote PUI E agora é só importar todos eles. Depois de importado, você vê aqui na pasta U PAC. Sob os prefbs, temos um novo prefps, chamado de tela de pausa Então, agora vamos arrastar essas preferências para a tela em forma de cruz Se formos para a visualização da cena aqui, se quisermos ver a tela pos, precisamos ativá-la primeiro porque ela está desativada por padrão. Vamos habilitar isso e você verá que temos essa interface de usuário pus e ela tem dois controles deslizantes de volume, que é um objeto deslizante, e vamos unir grupos do mixer de áudio com esse A próxima coisa que precisamos criar é criar o mixer de áudio. Mas antes disso, vamos desativar a tela Po novamente, ir para a pasta de áudio e criar um novo mixer de áudio. Vou criar um novo mixer de áudio e vou chamar esse mixer principal. Agora vamos clicar duas vezes no mixer aqui. Depois que as janelas dos mixers de áudio estiverem abertas, temos essas poucas aqui e precisamos criar alguns grupos aqui Então, vamos selecionar o mestre e pressionar o botão de adição aqui e criar um grupo de efeitos sonoros. E selecione o mestre novamente. E o próximo grupo que eu quero criar é o Begron Music Group. Então, agora temos dois volumes adicionais aqui. E agora, se formos ao gerenciador de jogos no reprodutor de áudio, ele tem dois campos chamados efeitos sonoros e Grupo de música de fundo. Precisamos atribuir esse objeto ao slot aqui. Então, vamos fazer isso e selecionar o grupo de efeitos sonoros para o slot do grupo de efeitos sonoros. E para o Begron Music Group, vamos selecionar o mixer do grupo musical de fundo OK. Vamos salvar isso. E agora precisamos criar um novo script. Então, vamos para a pasta de scripts. Abaixo do áudio. Vou criar um novo script chamado Configurações de volume. E vamos abrir o script. Ok, agora abrimos o script aqui. Vamos criar algumas variáveis primeiro. Mas antes disso, precisamos importar o namespace Audio e o namespace UI Aqui acima, vamos adicionar o uso Unity Engine, não do editor, e vamos apenas importar o namespace Audio e também o namespace UI E vamos remover a herança do comportamento mono aqui porque vamos instanciar esse script ou classe no gerenciador de jogos, como a classe UI manager e a classe e E vamos simplesmente excluir o método incorporado. E agora precisamos declarar algumas variáveis. Vou criar um novo campo serializado. E isso seria um tipo de objeto de jogo, e vamos chamar esse painel. E o próximo campo será um controle deslizante. E esse seria o controle deslizante de efeitos sonoros e o controle deslizante BGM E o último campo que queremos criar é o campo do mixer de áudio. E vamos chamar esse mixer principal. Também precisamos criar uma string privada para salvar o valor do nosso volume de acordo com a preferência do player. Sempre que reiniciarmos o jogo ou entrarmos em uma nova sessão, ele carregará a configuração de volume anterior. Vamos apenas criar uma nova string privada. A primeira, vou chamar essa tecla de efeito sonoro, e a segunda seria a tecla Música de fundo. Também queremos criar um getter para o painel. Vou criar um novo coletor público de objetos de jogo aqui. Vou chamar esse painel com P maiúsculo e, dentro do getter, vou recuperar o campo do painel Portanto, podemos acessar esse painel a partir de outro script, mas outro script não pode alterar o valor. Então, a próxima coisa que queremos criar é criar um novo método para modificar os efeitos sonoros e a música de fundo. Então, vamos criar um novo vazio, e vamos chamar isso de efeitos sonoros de aj E queremos passar um float como valor aqui. Como esse método será chamado pelo controle deslizante, ambos os controles deslizantes no evento de alteração Precisamos passar um valor flutuante aqui, e esse parâmetro, pegamos qualquer valor do controle deslizante sempre que alteramos o controle deslizante sempre que alteramos o Antes de podermos modificar o mixer, precisamos expor alguns dos parâmetros no mixer de áudio Vamos voltar para o Unity e vamos para a pasta de áudio. E vamos selecionar o mixer principal aqui. E se abrirmos o mixer, podemos selecionar o grupo de efeitos sonoros e o grupo de música de fundo. E agora queremos expor o parâmetro. Aqui, como você pode ver, ainda não temos nenhum parâmetro de exposição Então, para expor um parâmetro, podemos selecionar o mixer e, em seguida, sob o nome do volume aqui, no inspetor, podemos clicar com o botão direito nele e, em seguida, podemos expor o volume a E se tivermos esse sinal de seta, isso significa que esse parâmetro está exposto Então, agora, se pressionarmos o botão de parâmetros de postagem, podemos ver um parâmetro de postagem. Podemos renomear isso Então, vou clicar duas vezes em um nome e renomeá-lo para volume SoundEx E então eu vou selecionar o Grupo de Música de Fundo e também clicar com o botão direito aqui, e então vou expor isso Agora temos dois parâmetros expostos. Para esses novos parâmetros que criamos, o volume do grupo musical Bagrand Vou renomear esses dois volumes do Bagran Music. Agora temos dois parâmetros. Precisamos lembrar o nome e a capitalização do nome porque é importante Agora vamos voltar ao roteiro aqui. Agora, expomos esses parâmetros. Podemos acessar o mixer principal e definir seu ponto flutuante, e quanto ao nome do parâmetro exposto aqui, o nome da string Vamos apenas passar o nome do volume do efeito de som. E para o valor, queremos passar esse valor aqui. Então, vamos passar o valor. Dessa forma, quando estivermos alterando o volume arrastando o controle deslizante, esse método será executado e o valor do controle deslizante será passado por esse parâmetro, e esse parâmetro modificará o volume dos efeitos sonoros A próxima coisa que queremos fazer é salvar o valor do controle deslizante Vamos usar a classe player prefs e ela tem um método set float, e é como uma chave de string, e é aqui que vamos usar a string que criamos Para a tecla sun effx, vamos usar a chave aqui E queremos economizar o valor. E depois disso, queremos salvar a preparação do jogador. Então, vamos executar o método seguro a partir das preferências do jogador. Precisamos inserir uma string aqui, eu vou criar uma string. Vamos chamar essa tecla de efeito solar, e essa seria a tecla de música de fundo. Eu faço isso propositalmente como privado, então o valor só pode ser alterado dentro do script, não pode ser alterado no inspetor E dessa forma, o valor será mais consistente. O próximo método que queremos criar é criar um volume de música Bground aqui Vamos copiar tudo isso aqui. E vou colar aqui e depois renomear o método para ajustar a música Bground, e queremos alterar a flutuação, que é o volume da música de fundo E para a chave, queremos usar a chave Big GM aqui. Então, queremos salvar o valor uma chave separada nas preferências do player. Então, vamos colar isso aqui e salvar isso. Agora temos esses dois métodos. Precisamos atribuir esse método ao controle deslizante, então precisamos criar um novo método de inicialização público E isso precisa ser público porque esse método init será executado pelo gerenciador do jogo Então, aqui, primeiro, queremos acessar o objeto deslizante Son EfFx e, em seguida, executar o evento de mudança de valor e adicionar E podemos passar o método para seu ouvinte aqui. Então, vamos executar o S Soon EfFx. E você vê que esse ouvinte de anúncios tem uma assinatura flutuante. evento Unity float, e precisamos que esse método tenha um parâmetro float porque ele solicita um float Para o controle deslizante de música de fundo, queremos fazer o mesmo, então vamos acessar o evento on value change e, em seguida, adicionar o ouvinte, que é a música de fundo JS aqui Ok, agora criamos isso. Isso deve funcionar, mas ainda há coisas que precisamos adicionar aqui acima Queremos carregar as configurações de volume que salvamos das preferências do player. Então, para carregar o volume, podemos simplesmente executar o método de ajuste, que são os efeitos sonoros, e então podemos passar o valor aqui. Então, para carregar as preferências do jogador, podemos simplesmente acessar a classe player prefs e, em seguida, usar o método GT float, e precisamos recuperá-las usando Vamos apenas passar a seqüência de teclas Sound ex. E há uma sobrecarga, que se eu selecionar a sobrecarga aqui, você verá que podemos passar um valor padrão Então, se não houver valor nas preferências do jogador, podemos simplesmente passar o valor padrão , ou seja, pode ser qualquer coisa, mas vou definir 20 E eu vou executar o método jazz Background music, e vou passar as preferências do player, também o método Get float E aqui, vou pegar a tecla Background e definir o valor padrão também como zero. E agora, com essa configuração, carregamos o valor padrão ou o valor seguro do nosso volume nos efeitos sonoros e na música de fundo. Mas também queremos ajustar o valor do controle deslizante para esse valor flutuante aqui Vamos apenas acessar o controle deslizante de efeitos sonoros pegar as propriedades do valor e, em seguida, passar , pegar as propriedades do valor e, em seguida, passar o valor dos criminosos do player aqui Vou copiar essa linha aqui e depois colar aqui. E para o valor do controle deslizante de fundo, vou passar o segundo get float OK. Agora configuramos o script de configuração do volume Vamos até o gerente do jogo e criar um novo campo SS para instanciar essa classe aqui Aqui abaixo do campo do gerenciador de interface do usuário, vou criar um novo campo SURALs, serão as configurações do Folum, e vou chamar isso de configuração de tudo E então vamos inicializar isso e salvar isso. Aqui no gerenciador de jogos, precisamos criar um novo tipo de propriedade pública de b. Vamos apenas criar isso. Vou criar um b público e vou chamar esse jogo de pausado e esse será um evento público, mas um conjunto privado Ele só pode ser definido a partir desse script de gerenciador de jogos, mas todos os outros scripts podem obter seu valor em ouro E aqui dentro do método init. Queremos inicializar as configurações de volume. Vamos apenas acessar a configuração val e, em seguida, executar o método inato E isso executará esse método inato. E agora queremos modificar o método de atualização da nossa classe de gerenciador de jogos. Então, vamos descer até aqui e já temos um método de atualização Aqui, vamos criar uma declaração I e queremos verificar se há uma tecla pressionada. Então, vamos usar para obter o método key down. E eu vou passar o código de escape para fazer uma pausa. E aqui queremos modificar a escala de tempo do nosso jogo aqui. Vamos apenas acessar a escala de tempo. E queremos verificar se a escala de tempo é igual a zero e, em seguida, queremos definir a escala de tempo de volta para um. Caso contrário, se não for zero, queremos definir isso como 20. E sempre que estivermos pausando, queremos ativar o painel da configuração de volume Vamos apenas acessar o objeto de configuração fs aqui e temos as propriedades do painel. Vamos apenas executar o conjunto ativo e depois passar a escala de tempo igual a zero. Então, isso significa que, se essas condições forem verdadeiras, queremos ativar o painel de volume e, se isso cair, o painel de volume será ativado. E também queremos definir propriedades do game pas bulion com esse valor Desculpe, há uma coisa que eu esqueci aqui, nas configurações de volume Precisamos marcar isso como esterilizável. Vamos usar o atributo s do sistema aqui e salvá-lo. Agora isso deve funcionar, e vamos para o Unity. E aqui, uma vez compilado o script, você vê que temos esse campo de configurações de volume, e ele tem muitos campos. Então, primeiro, para o painel, queremos arrastar o painel da tela de pus. E para o controle deslizante, vamos abrir a tela de pus, abrir o objeto de layout e temos o controle deslizante para o efeito sonoro Então, vou abrir os dois objetos do jogo deslizante e arrastar o controle deslizante do efeito sonoro até o slot do effler de som E para a música de fundo, vou arrastar o controle deslizante até o slot do controle deslizante de fundo E para o mixer principal, precisamos pesquisar isso a partir do projeto. Então, vamos usar esse botão circular e, em seguida, escolher o mixer principal entre os ativos. E salve a cena. E agora vamos tentar. Vamos pressionar play e ver se pressionamos escape, o jogo pausa, e eu posso mudar o volume aqui Eu ainda posso atirar porque não evitamos isso. Mas em um momento, eu vou te mostrar como. Agora vamos tentar baixar a música. Aí está. Se apertarmos o controle deslizante. Você pode ver que diminuímos o volume da música e podemos aumentá-lo Então, vou colocar isso nessa posição aqui, e vamos ajustar os efeitos sonoros para um volume mais alto Sim. E também podemos torná-lo menor. Aí está. E se nos sentássemos nessa posição aqui, então parássemos. E se pressionarmos play e depois pararmos novamente. O valor é carregado, como você pode ver aqui. Ele obtém as configurações de volume do player craft. Então, podemos salvar isso. E essas configurações também são seguras em diferentes sessões. Ok, vamos verificar se há erros no console. Até agora, sem erros. Isso é bom. A próxima coisa que queremos fazer é evitar que o jogador atire ao ser ultrapassado. Então, vamos abrir o Visual Studio e vamos abrir o script do player. E se formos até o topo aqui sob o método de atualização, temos essa linha, na verdade está executando a atualização a partir do objeto programável de nossa arma ativa atual E podemos adicionar uma condição aqui. Podemos verificar se a instância do gerenciador de jogos Game Pause é falsa e podemos simplesmente adicionar um ponto de exclamação aqui na frente, e isso significa que, se esse valor for falso, queremos executar a atualização do método Mas se esse valor for verdadeiro, queremos pular esse código aqui E vamos salvar isso e voltar para a unidade. Agora, quando terminar a compilação, vamos testar isso. E vamos tentar fazer uma pausa um pouco mais tarde, quando o inimigo chegar Então agora é uma pausa. Todo o jogo de elementos está pausado aqui e não podemos atirar Como você pode ver, não há som de disparo e o movimento também não diminui. OK. Sim, é basicamente assim que criamos um mecanismo de pausa e também uma configuração de volume. 44. 43 configuração inoperante do jogador: Agora, neste vídeo, vamos criar um mecanismo de morte. Atualmente, não temos isso, então sempre que nossa saúde chega a zero, o jogo continua, precisamos adicionar esses recursos. Então, vamos para o estúdio fiscal. E a primeira coisa que queremos modificar aqui ir ao gerente do jogo. E dentro do gerenciador de jogo, no topo da área do campo, queremos criar uma nova propriedade pública para declarar se o jogador está morto ou não Então, vamos criar um novo ouro público e chamar esse jogador de morto, e também queremos definir isso como um coletor público, mas um setter privado E aqui, dentro do método de acerto, o método de acerto do jogador, queremos verificar se nossa saúde atual é zero ou não. Vamos apenas criar uma instrução if, e se a saúde atual for menor ou igual a zero, então queremos executar o método show and screen, e também queremos definir o jogador que vai E isso será definido como falso por padrão. Então, precisamos mudar essas duas verdadeiras sempre que o jogador estiver morto. Precisamos modificar alguns outros scripts, e eu vou modificar o script inimigo. Então, vamos abrir o script inimigo. E aqui dentro da filmagem, aqui, dentro do loop selvagem, eu quero verificar se o jogador está nesse estado. Vamos apenas acessar o gerenciador de jogos. Referência estática, que é uma instância, e podemos apenas verificar esse valor para o jogador E se o jogador estiver morto, queremos parar de atirar, e o método stop shoot executará , na verdade, o método stop all co routines Então, essa co-rotina será cancelada e o inimigo ficará ocioso. Guarde isso. A próxima coisa que queremos modificar é o script do player. Basicamente, aqui, também queremos adicionar uma condição quando o jogador está vivo e, em seguida, queremos executar a atualização da arma. Vamos apenas adicionar uma condição N e verificar se o gerente do jogo, a instância em que o jogador está morto, é falso. Dessa forma, quando o jogador estiver morto, ele não poderá mais atirar. Também quero impedir que o jogador se mova sempre que o jogador estiver morto. Atualmente aqui no ponto de tiroteio. Você vê que sempre que isso for acionado, o jogador continuará se movendo. E isso é um problema porque, quando entramos no tiroteio, temos uma ação atrasada para executar o método de limpeza da área definida E isso não será cancelado se o jogador estiver morto no momento Isso ainda estará executando essa rotina principal aqui. Então, precisamos cancelar isso aqui. Podemos simplesmente adicionar uma condição aqui, A ou condição. Se a instância do gerenciador de jogo e o jogador estiverem mortos, queremos devolver isso. O método ainda será chamado por essa ação atrasada. Mas quando for chamado, se o jogador estiver morto, ele retornará e todo esse código aqui será ignorado. Vamos salvar isso. A próxima coisa que queremos modificar é a hora ou o objeto aqui. Aqui dentro do objeto cronômetro, temos essa rotina central que executa o cronômetro Isso também não será cancelado sempre que o jogador estiver morto no estado atual Então, precisamos acrescentar que aqui dentro da declaração curinga, podemos apenas verificar se a instância do gerenciador de jogo jogador estão e o jogador estão mortos e, se estiverem mortos, queremos quebrar essa rotina principal. Podemos simplesmente quebrar a cotina usando a declaração de quebra de rendimento aqui dentro da corrotina, e isso cancelará essa rotina principal Agora vamos continuar modificando o último script que precisamos modificar, que é o gerenciador de interface do usuário, então vou abri-lo. Aqui dentro do gerenciador de interface do usuário, temos essa tela final do show e precisamos corrigir isso. Porque basicamente sempre que terminarmos o jogo ou sempre que o jogador estiver morto, mostraremos essa tela final. E existe a possibilidade de que esse valor total de disparos seja zero e isso cause um erro. Portanto, precisamos verificar se, desculpe vou criar um novo conjunto de pais aqui. E vou verificar se o total de tiros é igual a zero. Então eu vou passar o valor de um. Mas se não for zero, então queremos passar o valor do total de tiros. Então, vamos salvar isso, e esse é um operador ternário. E aqui, também precisamos fixar a taxa de precisão na pontuação calculada. Vamos copiar essa linha aqui e depois colá-la aqui, e depois colá-la aqui pois ela usa o mesmo nome de variável, então isso deve funcionar imediatamente. E agora queremos criar outra declaração LSF. Mas vou criar isso acima da classificação D aqui. Então, vamos criar uma nova declaração LSF e, desta vez, se a média total for igual a zero, queremos passar n de E. Então, vamos definir que essa é a menor execução possível Vamos salvar isso. Agora, modificamos todo o script aqui. Vamos testar isso. Vamos para o Unity e vamos rodar o jogo. Vou fazer uma pausa e depois baixar a música e continuar E agora vamos ficar quietos e receber tiros inimigos o máximo possível. Assim, podemos testar se o jogador está morto. Aí está. Agora, fomos mortos e o inimigo para de atirar. Os tempos param. Não podemos mais atirar. E como os tempos param, o jogo não progredirá. Então é assim que criamos o recurso morto. 45. 44 Cena de menu de titulo: Agora vamos criar a cena do título. Para criar uma cena-título. Vamos criar uma nova cena aqui na pasta de cenas. Então, vamos criar uma nova cena, e vamos chamar essa cena título. Vamos abrir a cena do título. Com a cena do título aberta, vou selecionar a câmera e vou definir a bandeira transparente para uma cor sólida. E vou mudar a cor do detalhamento para preto. Não veremos a caixa celeste, e agora vamos salvar a cena. A próxima coisa que precisamos fazer é criar um Canvas. Vou acessar o menu da interface do usuário aqui e criar um novo Canvas. Para o objeto de tela sob o escalador Canvas, vamos mudar isso para a escala com tamanho verde e definir a resolução para 1920 por 1080 Essa é a resolução que estamos usando e, para as propriedades de correspondência, vamos definir isso como 0,5. Ele será equilibrado entre a largura e a altura. E eu já preparei algumas prefbs para a cena título Então, vamos importar isso. Vou incluir o arquivo no recurso, e aqui vou importar o pacote, chamado pacote Title UI. E ao importar este pacote, certifique-se de não importar os fundos, basta selecioná-lo e desmarcar também o sprite Como já temos isso em nosso projeto, isso pode atrapalhar o projeto Então, vamos importar a pasta do pacote de interface do usuário aqui. Agora que importamos os prefabs, vamos para o U IPAC Sob o prefe, temos um novo prefs. Um é o menu de opções O e o outro é o menu de título. Queremos colocar o menu de título em primeiro lugar. Vamos apenas arrastar o menu do título até o objeto do jogo vas, e você pode ver o objeto aqui. Há um problema com o botão. Para corrigir isso, vamos apenas expandir as preferências do menu de título, e ele tem esses três botões, a opção de início e o quid, e falta o sprite Então, precisamos gerar um sprite transparente. Para fazer isso, vamos para a pasta Sprite em nosso sprite de interface do usuário Queremos abrir esse editor de sprites e vou arrastar um novo sprite aqui para uma área e tamanho vazios . Isso realmente não importa. E eu vou renomear esse sprite para UI underscore sprites , underscore transparent Então, depois de renomearmos isso, vamos pressionar aplicar. Agora que temos um sprite transparente, podemos usar esse sprite transparente Como você pode ver aqui, porque eu coloquei o mesmo nome com aquele que eu montei esses prefabs Agora ele ocupa automaticamente. Mas se você estiver usando um nome diferente, basta selecionar todos os botões aqui, do botão iniciar até sair, e depois escolher a imagem de origem usando o sprite transparente que você gerou Agora esse botão já está configurado corretamente, ele tem um sprite diferente selecionado aqui Se pressionarmos play, você verá que, se clicarmos no botão, ele tem uma borda. Vamos usar isso para mover usando o teclado para cima e para baixo. Agora, vamos parar com isso. A próxima coisa que queremos colocar é o menu de opções. Vamos colocar o menu de opções no objeto do jogo Canvas, e agora temos esse bom menu de opções. Aqui, no menu de opções prefep, temos muitos objetos secundários Aqui nas opções, temos uma entrada, a primeira entrada, que é a resolução, e a segunda entrada é a qualidade. E aqui temos uma lista suspensa para a resolução e também para a qualidade. Vamos preencher o menu suspenso usando um script e recuperaremos toda a resolução suportada no PC do player E quanto à qualidade, vamos pegar as configurações de qualidade da configuração do nosso projeto. Se formos às configurações do projeto aqui, e abaixo da qualidade, você verá que temos isso. Queremos pegar isso e, em seguida, preencher essa lista suspensa com base nesse valor aqui E queremos garantir que esse menu suspenso possa alterar a resolução e a qualidade da versão final do jogo Agora vamos salvar a cena e precisamos criar um novo script para a cena do título. Agora vamos para a pasta de scripts. Vou criar uma nova subpasta e vou chamar essa cena do título Aqui, sob a cena do título, queremos criar dois novos scripts. O primeiro será o gerenciador do menu de títulos. Vamos apenas criar esse. E o outro seria o script de opções. Agora vamos abrir esse script aqui. Eu vou abrir o script de opções primeiro. Aqui dentro do script de opções, queremos criar uma nova variável para manter o menu suspenso. Vamos apenas criar um novo campo de séries. Para o tipo, vou digitar o espaço nominal do texto Mash pro porque o menu suspenso é o menu suspenso text mesh pro, e aqui podemos usar apenas a classe suspensa TMP E vamos chamar a primeira de lista suspensa de resolução e a segunda de lista suspensa de qualidade. Em seguida, queremos criar uma nova variável privada para armazenar os dados de resolução. Vamos apenas digitar a resolução privada. E isso será uma matriz, e vou chamar isso de resoluções Aqui, dentro do método de inicialização, queremos obter todas as resoluções suportadas nesse PC Vamos digitar a resolução, a matriz que criamos aqui, e então podemos ajustá-la às resoluções da classe de tela Isso retornará todas as resoluções de tela cheia suportadas pelo monitor. Vamos apenas usar isso. Aqui, queremos criar uma nova lista de strings para manter as opções ou as resoluções no formato de string, para que possamos ajustar essa lista de strings ao menu suspenso de resolução Vamos apenas digitar essas opções e inicializá-las E então queremos examinar as resoluções que acabamos de pegar aqui Vamos apenas passar a resolução e pegar seu comprimento. E para cada resolução, queremos criar uma nova string a ser adicionada à lista de opções de strings aqui. Vamos chamar isso de resto e, para a string, queremos pegar o índice de resolução da largura I e adicionar isso com uma string x com um espaço nos dois lados do caractere x. E então adicione isso com o índice de resoluções de I e é com valor A próxima coisa que queremos fazer é adicionar a string a essa lista de strings aqui. Vamos apenas adicionar a string restante, e isso preencherá a lista de opções de string com essa string, mas com todas as resoluções que o monitor atual suporta Aqui abaixo, queremos pegar o menu suspenso de resolução e, em seguida, executar o método de opções claras. Isso apagará todas as opções anteriores. Em seguida, queremos preencher o menu suspenso com novas opções usando o método At options, e ele solicita uma string menos diferente do sprite ou menos diferente Então, podemos simplesmente passar as opções aqui. E agora queremos definir o valor suspenso da resolução para a resolução atual selecionada ou a resolução ativa atual nesse monitor. Para fazer isso, precisamos criar uma nova variável inteira e vamos chamar essa ID de resolução de tela atual e definir como 20 E aqui queremos verificar se a tela e vamos pegar a resolução atual e pegar sua largura, e precisamos comparar a largura e a altura com o valor da largura e a altura com o resolução no índice de I. Para a largura, precisamos comparar com a largura do índice de resoluções de I. Se o valor for igual, precisamos verificar também a Vamos apenas adicionar um operador n e verificar se a resolução atual da tela é resolução atual da tela igual às resoluções, índice dela Vou quebrar a linha aqui, que seja mais fácil de ler, e se ambas as condições forem verdadeiras, então estamos nessa resolução. Queremos definir esse ID de resolução de tela atual para o valor de I. Agora definimos esse valor. Queremos ir aqui abaixo e acessar o menu suspenso de resolução e definir seu valor para esse número inteiro aqui Vamos passar isso aqui. E isso definirá o menu suspenso para a resolução ativa. E agora queremos preencher o menu suspenso de qualidade. Isso é muito mais simples, então podemos acessar o menu suspenso de qualidade e limpar as opções Para adicionar opções, queremos acessar o menu suspenso de qualidade novamente e executar o método de adição de opções Em seguida, queremos passar as configurações de qualidade, e a classe Configurações de qualidade tem uma matriz de strings chamada nomes, e essa é a lista de índice das configurações de qualidade disponíveis. Mas, como é uma matriz de strings, precisamos convertê-la em uma lista nas opções quanto em uma lista de strings. E se apenas passarmos a matriz, isso gerará um erro aqui. Para converter isso em uma lista, podemos usar um link do sistema de namespace dentro do namespace do link, temos uma função temos uma Podemos usar isso e isso converterá essa string em lista. Aqui, queremos definir o valor suspenso de qualidade para qualquer configuração de encerramento que esteja definida atualmente. Vamos definir o valor aqui para igualar a classe de configurações de qualidade e queremos obter o nível de qualidade. E isso retornará um número inteiro do índice, a qualidade em que estamos definidos atualmente . Vamos salvar isso. E aqui, vamos voltar ao Unity, e vamos experimentá-lo aqui. Primeiro, vou colocar o script de opções no objeto do jogo Canvas aqui, e vamos abrir o menu de opções. Para o menu suspenso de resolução, queremos escolher o primeiro menu suspenso e, para o menu suspenso de qualidade, vamos arrastar o segundo menu suspenso. Não podemos testar a lista suspensa de resolução porque ela só funciona em uma compilação, mas na lista suspensa de qualidade, podemos testar isso Então, vamos abrir as configurações do projeto. Atualmente, estamos fantásticos se pressionarmos play. Agora, você vê que temos muita resolução aqui. E também temos todas as configurações de qualidade, que são as mais rápidas, rápidas, simples, boas, bonitas e fantásticas. E atualmente temos dois filmes fantásticos. E aqui, se mudarmos isso, nada acontecerá agora porque precisamos registrar um método em que alteraremos as configurações de qualidade desse ouvinte suspenso Então, vamos fazer isso. Aqui, queremos criar um novo método público. Vamos simplesmente excluir esse método de atualização. Não vamos usá-lo. Vou criar um novo método público e vou chamar esse conjunto de qualidade. E eu vou passar uma variável inteira. Vamos chamar isso de ID de qualidade. E aqui queremos acessar as configurações de qualidade, definir o nível de qualidade e, em seguida, passar essa ID de qualidade aqui. E guarde isso. E agora queremos atribuir o ouvinte a essa lista suspensa de qualidade Sempre que a lista suspensa de qualidade for alterada, queremos executar esse método de qualidade definida E qualquer que seja o valor alterado nessa lista suspensa de qualidade, queremos passar esse valor como ID de qualidade aqui. Então, aqui no método inicial abaixo, podemos simplesmente acessar o menu suspenso de qualidade e, em seguida, podemos pesquisar o evento on value change aqui. E então podemos executar o método do ouvinte de anúncios e, em seguida, podemos passar o método de qualidade definida E aqui, como você pode ver, ele solicita uma ação com uma assinatura de número inteiro Portanto, é um método. Mas com um argumento, isso é um número inteiro Então, se tivermos outro método que não tenha um inteiro como argumento, isso gerará um erro E do jeito que funciona, sempre que alteramos o menu de qualidade , estamos alterando o valor. Então, quando estamos alterando o valor, na verdade estamos alterando o número inteiro, representando as opções de zero até o tamanho máximo das opções E sempre que alteramos esses valores, esses valores são enviados para esse método aqui para o método de qualidade definido. E quando executarmos esse método, esses novos valores passarão como um argumento aqui, e esse argumento mudará o nível de qualidade em nossas configurações de qualidade aqui. E agora vamos criar um método de resolução definida. Aqui, vamos criar um novo vazio público e vamos chamar isso de resolução definida Para a resolução, também queremos passar um número inteiro. Vamos chamar isso de ID de resolução. E guarde isso. E para a resolução definida, queremos criar dados de resolução temporários. Então, vou chamar isso de RS, e vou pegar a matriz de resoluções, e queremos pegar o ID que passamos aqui Então, vamos apenas passar o ID da resolução. E isso funciona exatamente como o método Set quality. Isso será registrado no menu suspenso de resolução no ouvinte de alteração de valor E agora, depois de obtermos a resolução, queremos aplicá-la ao método de definição de resolução da tela. Para o método de resolução definida, ele solicita um número inteiro de largura, altura inteira e a opção booleana de tela cheia Vamos apenas passar a largura do resto e, para a altura, podemos simplesmente passar a altura do resto. Para a tela cheia, podemos apenas acessar a tela f. Vamos salvar isso. E também queremos registrar a resolução definida no menu suspenso de resolução. Vamos apenas digitar o menu suspenso de resolução e acessar o evento de alteração de valor, adicionar o ouvinte e passar o método de resolução definida E agora configuramos o ouvinte para o menu suspenso de resolução Percebi que há um erro no meu código aqui, aqui, na string res. Essa deve ser a altura. Vamos apenas alterar o segundo parâmetro de resolução para o valor da altura e salvar isso. Agora, se voltarmos para o Unity aqui e, em seguida, se tentarmos executar isso, vamos abrir as configurações do projeto. E vamos tentar mudar a qualidade aqui. Se eu alterar a qualidade para simples, você verá que alteramos as configurações de qualidade nas configurações do nosso projeto. E isso afetará toda a fidelidade visual que configuramos aqui ou que a Unity configurou aqui Isso diminuirá a textura dependendo da qualidade que temos. Sim, vamos continuar terminando a cena do título no próximo vídeo. 46. 45 Menu de Title continuado: Agora, vamos conectar todo o botão, para que possamos iniciar o jogo ou abrir o painel de opções ou sair do jogo. Para fazer isso, vamos abrir o script do gerenciador do menu de título. Aqui dentro do menu de título Manager. Vamos criar uma nova variável e definir esses dois objetos do jogo, e esse seria o painel de opções. E a outra variável que eu quero criar é uma variável de string, e vou chamar essa cena de jogo. E também queremos adicionar um campo de série, que será um botão Mas, para usar o botão, precisamos importar o namespace da interface do usuário Vamos automatizar isso aqui e precisamos criar isso automaticamente Vou criar um novo botão iniciar, botão opção e, em seguida, botão de fechamento de opção, e o último seria o botão Qi. Vamos excluir o método de atualização. Não vamos usar isso. Aqui, queremos criar alguns métodos. O primeiro seria o método de início do jogo. E o segundo seria o painel de opções aberto. O terceiro seria o método do painel de opções fechado e o quarto seria o método do jogo quid Pois o jogo Quid é muito fácil, na verdade, podemos simplesmente acessar a classe do aplicativo e executar o método QID, e isso encerrará o jogo no jogo autônomo construído Não fará nada no editor. E para começar o jogo, queremos carregar a cena do jogo com base em seu nome aqui. Portanto, precisamos importar o espaço de nome do gerenciador de cenas. Vou digitar usando o Unity Engine Scene Management. E aqui dentro do jogo inicial, quero ter certeza de que não podemos iniciar jogo se o painel de opções estiver aberto. Então, queremos verificar se o painel de opções está ativo na hierarquia e, em seguida, queremos retornar isso Mas se não for, então queremos acessar a classe de gerenciador de cena e, em seguida, queremos executar o método load scene, e podemos passar o índice de criação da cena ou o nome sen, e vamos passar essa string aqui. Assim, podemos preencher o nome da cena no inspetor e salvá-lo. Para o painel de opções aberto, vou acessar o painel de opções e executar o método set active, o valor como verdadeiro para fechar o painel de opções Podemos simplesmente acessar o objeto do jogo do painel de opções novamente. Execute o método ativo definido e , em seguida, passe o valor falso. Sempre que estamos fechando o painel de opções, queremos selecionar o botão de opção. Vamos apenas acessar o botão de opção e executar o método select. E o método de seleção definirá esse botão para ser o botão selecionado na cena aqui. iniciar, queremos definir o botão Iniciar para ser o selecionado, usando o método select. Então, aqui, queremos atribuir todo esse método aqui a esse botão aqui. Podemos simplesmente acessar o botão Iniciar e, em seguida, acessar o evento de desclique Então, podemos adicionar um ouvinte. E aqui queremos passar o método de início do jogo. Para o botão de opção, também queremos acessar o evento de clique no Listener e abrir o painel de opções aqui Para a opção botão fechado. Queremos passar o método do painel de opções fechado. O último para o botão quid, queremos passar o método do jogo quid como ouvinte aqui e salvá-lo Aqui dentro do método de início, também queremos ocultar o painel de opções imediatamente. Vamos apenas acessar o painel de opções no início e, em seguida, executar o método ativo definido, passar o valor falso como argumento e salvá-lo. Agora, criamos o script do gerenciador do menu Título. Vamos voltar ao Unity e adicionar o script ao objeto do jogo Canvas. Defina o jogo Canvas, direcione o gerenciador do menu Title e agora precisamos preencher a variável no inspetor Vamos para a pasta de cenas e eu vou digitar a cena em que está nosso nível, que é a cena de amostra. Para o painel de opções, podemos simplesmente arrastar o menu de opções aqui. Como objeto do jogo. Para o botão Iniciar, queremos abrir o menu do título e arrastar o botão Iniciar aqui. O botão de opção, queremos arrastar o botão de opção. Para o quid, queremos arrastar o botão do quid. Para o botão fechar da opção, queremos escolher o botão prefabs do menu de opções Vamos apenas arrastar esse botão aqui. Na verdade, é esse botão aqui. Queremos fechar o painel de opções sempre que clicarmos nesse botão. Vamos salvar isso. Agora vamos tentar. Ele iniciará a cena com o botão Iniciar selecionado e, se descermos, podemos selecionar outras opções e, se selecionarmos as opções, isso abrirá a janela aqui. Se pressionarmos ok, ele fechará isso novamente. Vamos parar com isso e corrigir uma coisa aqui dentro do gerenciador do menu de título sempre que abrimos o painel de opções, queremos selecionar a opção fechar Paton Aqui vou acessar a opção fechar Paton e, em seguida, vou executar o método select aqui e salvá-lo Desta vez, sempre que jogarmos isso, e se abrirmos o painel de opções, isso selecionará automaticamente esta patente aqui. Se pressionarmos enter, ele será fechado novamente automaticamente. Podemos navegar pelo menu da cena do título sem o mouse. Agora vamos testar isso novamente e pressionar Iniciar. Atualmente, as cenas de carregamento não funcionarão porque não definimos as cenas que devem ser incluídas na configuração de construção. Para corrigir isso, precisamos ir ao menu Arquivo nas configurações de compilação. Vamos apenas arrastar as cenas que vamos incluir na construção. Vou arrastar a cena do título aqui e também a cena de amostra. Eu vou salvar o projeto. Agora, se pressionarmos play e pressionarmos enter no início, você verá que a cena será carregada aqui. Agora, se formos para a cena de amostra aqui, também precisamos ter uma maneira de voltar ao menu do título ou cena do título quando terminarmos o jogo. Para fazer isso, vou abrir o script do gerenciador de jogos e vamos acessar o script do gerenciador de interface aqui. Aqui, nas propriedades doloridas, vamos criar um novo campo serializado, será um tipo de botão, e vamos chamar esse botão de retorno, e precisamos criar um novo método para voltar à cena do título Vamos criar um novo método privado e vamos chamar isso de go to Title scene. E queremos usar a classe Scene Manager. Precisamos importar o melhor da nossa classe aqui. Vamos digitar usando o Unity Engine Scene Management e abaixo da variável do botão aqui, queremos criar um novo campo de string e vamos chamar esse título de nome de cena. Aqui abaixo, vá para o método Title Scene. Queremos acessar o gerenciador de cenas, Carregar cena, e então podemos simplesmente passar o nome Title Sen aqui. Precisamos registrar esse método no botão Voltar que criamos aqui. Dentro do método init, podemos simplesmente acessar o botão B no evento de clique e, em seguida, adicionar o ouvinte, e então podemos simplesmente passar o método para o Método Title Sen E guarde isso. Agora, se voltarmos para o Unity, precisamos definir esse botão Voltar e o título C Name. Para o nome C do título, podemos digitar com segurança a cena do título e, para o botão, queremos expandir o gerenciador de jogos e abrir o Canvas. Na tela final aqui, queremos expandir isso e arrastar o botão como botão Voltar aqui e salvá-lo. Agora vamos jogar isso para testar essa modificação que acabamos de criar. E isso não está funcionando porque a mira está bloqueando o Portanto, não precisaremos desse alvo lançado sob a mira do Podemos simplesmente desativar isso com segurança. Agora, se desativarmos isso e tentarmos clicar no botão Voltar, você verá que funcionará. Então eu parei o jogo aqui e, como mudei as opções no tempo de execução, precisamos colocar isso de volta aqui. Vamos selecionar a mira e verificar o alvo RC. OK. Agora, aqui, podemos voltar para a cena do título e, a partir da cena do título, também podemos ir para a cena do jogo. 47. 46 Crie o jogo!: Agora vamos finalizar o jogo. Queremos transformar o jogo em um aplicativo independente. É bem fácil, na verdade. Podemos simplesmente acessar o arquivo, criar as configurações e pressionar este botão construído aqui. Podemos decidir se queremos definir a arquitetura para 64 bits ou 32 bits. Tudo isso depende. Se você estiver usando dois bits, você terá uma grande variedade de públicos que também estão usando o Windows de dois bits. Porque se você construiu para 64 bits , a versão compilada não será executada no Windows de 32 bits. No futuro, acho que todo o usuário mudará para 64 bits. Então, vou levantar esses 264 bits no meu caso. E a próxima coisa que queremos fazer é abrir as configurações do player aqui. E aqui queremos mudar o nome da empresa. Então, vou mudar o nome da empresa para o meu nome aqui. E pelo nome do produto. Vou mudar o nome do produto para o nome do jogo, que é nexus Versão, você pode simplesmente definir esta 21. Também precisaremos aplicar o ícone padrão. Eu já preparei o ícone. Vou para a pasta de texturas aqui e vou abrir meu ícone aqui, e vou incluir esse ícone na pasta de recursos, e vamos rastrear esse ícone na pasta Texturas Agora importamos o ícone. Podemos escolher o ícone padrão e escolher o ícone do aplicativo aqui. E a próxima coisa que queremos configurar está aqui sob a resolução e a apresentação. Queremos desativar o diálogo de resolução da tela. Vamos apenas desativar isso. E agora que definimos as configurações do player, vamos verificar as outras configurações. A parece bom. E se você quiser alterar o identificador do pacote, faça isso aqui Então, podemos definir isso para o nome da empresa, que é meu nome, e então para o nome do jogo, você pode simplesmente digitar o nome do jogo. Isso será tudo para definir as configurações do player. E agora vamos salvar o projeto, para que todas as configurações do player sejam salvas. Vou importar um ativo gratuito do repositório de ativos para corrigir erros na compilação Se você for até a loja de ativos, poderá pesquisar menos registros. E esse é um ativo muito bom. Você pode usar isso, não este, mas este aqui, o pescador de madeira, é grátis E, basicamente, podemos mostrar o console em nossa versão construída. Isso é muito útil quando você está depurando sua compilação. Então, vamos importar isso. E agora, depois de transmitir o pacote, podemos acessar o visualizador de registros do Unity aqui e verificar o ritmo Então, vamos mostrar no Explorer e abrir o arquivo Rhythm. E aqui, como você pode ver, para usar os registros do console, basta fazer um gesto circular usando o mouse, clicar em arrastar ou com o dedo no celular Agora vamos adicionar os ativos à nossa cena inicial aqui. Aqui temos um novo menu chamado Reporter, e vamos pressionar criar, e isso criará automaticamente um objeto de jogo para habilitar os registros na construção e salvar a cena aqui Agora adicionamos o repórter à nossa cena. Vamos apenas criar uma modificação de som em nosso script de opções e no gerenciador do menu de títulos. Vamos ao Fis Studio, e eu vou adicionar um som para os cliques Aqui no script de opções, vamos criar um novo campo Sudo S, será o Audio ger E vamos chamar isso de efeitos sonoros de clique. Aqui, sempre que alteramos a resolução ou definimos a qualidade, queremos reproduzir esse som. Então, vamos acessar a instância do reprodutor de áudio e executar o método de reprodução de efeitos sonoros, e então podemos simplesmente passar os efeitos sonoros de clique sem transformar. Este será um som em dois D e podemos simplesmente duplicar essa linha aqui e depois colá-la aqui dentro do método de qualidade definido Agora, também queremos adicionar o som ao gerenciador do menu de títulos. Aqui, sempre que iniciamos o jogo, queremos reproduzir o som do clique. E também queremos reproduzir o som do clique sempre que abrirmos o painel de opções. Também sempre que fechamos o painel e sempre que saímos do jogo. Mas não temos a variável de efeitos sonoros de clique definida aqui. Vamos copiar o que temos aqui, colar aqui como um novo campo e salvá-lo. Agora vamos voltar para o Unity e também precisamos importar o som do clique. Vou para a pasta do jogo abaixo do áudio. Vou abrir o arquivo aqui. E vou incluir esse novo som na pasta de recursos. Então, aqui temos a onda de pontos do botão UI. Vamos direcionar isso para o Unity e, em seguida, colocar o arquivo dentro da pasta de áudio. E agora temos esse novo som. Vamos até a pasta de dados e atualizemos a biblioteca de áudio. Então, vou adicionar uma nova entrada e, para a última entrada, vou definir isso. Vou chamar esse botão de interface do usuário. E vamos escolher a onda de pontos do botão UI aqui. E vamos salvar o projeto. Aqui na tela de título, queremos criar um novo objeto de jogo vazio para o reprodutor de áudio. Vou chamar esse reprodutor de áudio e adicionarei o componente do reprodutor de áudio. Para a biblioteca, vou escolher a biblioteca de áudio. E para o número da fonte de áudio, não precisamos de seis fontes de áudio, então podemos definir esse 21, e podemos configurar o mixer para o mixer que criamos anteriormente e salvar a cena novamente. Agora, se formos até o objeto do jogo Canvas, veremos que temos o efeito click Son. Vamos mudar esses dois botões de DUI e, para o gerenciador de títulos, vamos também alterar esses dois botões de DUI, efeito So Agora salve isso e agora vamos criar o jogo. Pressione configurações da fatura e, em seguida, pressione fatura. E aqui podemos simplesmente selecionar a pasta criada. Eu já criei uma pasta e escolhi selecionar pasta. Você pode simplesmente criar o embutido em qualquer pasta que desejar. Crie uma nova pasta e selecione essa pasta. Agora está construindo. Vou cortar o vídeo e continuaremos depois que a construção estiver concluída. Ok, agora a compilação está concluída e Unity abre automaticamente a pasta. Então, agora podemos testar isso. E agora vamos experimentar o painel de opções. E de alguma forma isso não funciona. Vamos tentar parar. Ok. Há um problema aqui e precisamos verificar os problemas. É por isso que instalei o visualizador de registros. Podemos simplesmente criar um movimento circular usando o mouse clicando e arrastando e uma vez pronto E como você pode ver aqui, há um problema aqui. Você vê que temos um erro, e vamos verificar isso aqui. Ok. Há um problema com o efeito sonoro do audio getter aqui Então, quando executamos o painel de opções aberto, de alguma forma ele não consegue reproduzir os efeitos sonoros. Então, precisamos corrigir isso, e há alguns erros aqui, como você pode ver. Então, vamos voltar para o Unity. Vou sair do jogo pressionando F quatro. Ok, então eu suspeito que o problema esteja na classe Audio Getter Então, se abrirmos a biblioteca de áudio aqui, no coletor de áudio, sempre que recuperarmos o nome do áudio, ele realmente será recuperado da lista de nomes de áudio da E essa é na verdade uma classe estática, como você pode ver aqui, e se você for até aqui, verá que na verdade é uma classe estática. O problema com esse código aqui o invalidate só é executado em um editor, sempre que alteramos o valor no inspetor ou sempre que selecionamos o objeto no painel do Mas isso nunca é executado na construção. Portanto, precisamos ter certeza de que executamos esse código aqui na compilação. Felizmente, em um objeto programável, podemos forçar isso adicionando o E dentro do método await, podemos simplesmente adicionar o método validate. Então, isso chamará esse método aqui e, em seguida, preencheremos a lista de nomes de áudio estáticos aqui Então, uma vez preenchida, sempre que estivermos recuperando o nome do áudio para reproduzir os efeitos sonoros, essa lista estática de strings estará disponível e retornará a E há outro problema que eu notei na construção. Ao gerar o inimigo aqui, teremos um quadro de referência ausente do componente ym E isso está acontecendo porque o movimento do animador pode ser executado antes do início Portanto, precisamos ter certeza de que sempre que o movimento do animador for executado, precisamos verificar a referência do objeto anim Então, aqui vou adicionar uma instrução if e, se o enim for nulo, queremos retornar esse método e salvá-lo Eu sei disso porque já verifiquei a versão anterior e isso causará um pequeno problema. É apenas uma mensagem, uma mensagem de erro, mas seria melhor também evitar esse tipo de erro. Então, vamos adicionar essa linha aqui e salvá-la. Agora, de volta aqui na unidade. Vou tentar construir isso mais uma vez. Mas antes disso, vou para a pasta de configurações do projeto e abaixo do áudio. Vou ajustar o volume global de volta para um. Eu configurei isso para 0,05. Então, no editor , não dá certo, mas vou reduzir isso para um E eu vou apenas conhecer o áudio aqui no editor. Está tudo bem, e eu vou salvar o projeto. E agora vamos criar o jogo mais uma vez. Agora o jogo está construído, e vamos rodar isso. E agora vou tentar pressionar a opção, e aí está. Temos o som tocando. E agora, se você alterar a resolução, verá que isso diminui a resolução e podemos simplesmente voltar para a resolução máxima Você pode escolher uma resolução, por exemplo, essa. E também podemos mudar a qualidade. Aqui. Vou mudar para fantástico e pressionar. E agora vamos começar o jogo. Assista. Veja isso. Agora, vamos testar isso. Vamos voltar ao sim, mas há um problema. Quando voltamos ao menu, não podemos ver o cursor do mouse aqui. Vamos apenas corrigir isso. E aqui, se você voltar para o Unity, vá para o estúdio aqui. No gerenciador de interface do usuário, estamos escondendo o cursor no início do nível. Então, vamos copiar essa linha aqui e queremos ter certeza de que o cursor está visível novamente na tela de título. Então, podemos simplesmente adicionar essa linha aqui ao gerenciador do menu Título. E dentro do método de inicialização do Gerenciador de menu de títulos, podemos simplesmente adicionar essa linha e colocar o cursor de volta em direção e segurança. Ok. Então, sim, é basicamente assim que criamos um verdadeiro jogo de tiro no Unit, e é basicamente assim que você prepara a construção Uma dica do método: sempre que terminar de testar a compilação, você deve remover esse objeto relator do jogo Portanto, o player não pode ativar a depuração do console no console construído por acidente Mas para o desenvolvimento construído, você deve deixar esse objeto de jogo portur em cena, para que você possa sempre depurar o desenvolvimento Quero agradecer a todos por se matricularem neste curso. Se houver algum problema ou bug no jogo, informe-me e eu atualizarei o curso para corrigir os bugs relacionados, porque eu sei que, como pessoa, não sou uma pessoa perfeita, posso cometer erros neste curso, então agradeço muito qualquer contribuição de todos vocês. Obrigado novamente e espero ver você no próximo curso meu. 48. 47 Resolução de bug com área limpa: Olá, neste vídeo de atualização, vou mostrar a correção de um bug relatado por Kyle Cooper Muito obrigado por relatar isso. Então, basicamente, no jogo de tiro que temos aqui, a mecânica limpa da área tem um pequeno problema Ou seja, se selecionarmos a câmera principal e definirmos o bug do Inspetor aqui, podemos ver que a área limpa não está sendo limpa corretamente. Então, por exemplo, se eu pressionar play agora, e neste exemplo, defini nossa saúde para 100. Então, demorou um pouco até que o inimigo matasse o jogador apenas para depurar isso E aqui, eu vou apenas matar um dos inimigos aqui. E vou aumentar o tempo como está até que ele acabe e possamos verificar o valor da área limpa aqui Então, aqui você vê que a área limpa não aumenta Então, agora não podemos terminar o jogo no estado, apesar de termos limpado toda a área E isso fará com que o jogo resolva bugs, na verdade, quando o painel de estatísticas não é exibido e não podemos progredir mais em nosso jogo Como temos nesta cena, eu tenho três grupos de tiro e a área limpa só aumentou para dois até agora Portanto, o valor nunca é igual e isso nunca acionou a interface do usuário. Então, para corrigir isso, vamos ao estúdio Fisial aqui, e no script de shoot out point aqui. Basicamente, no método de área definida limpa, precisamos chamar essa área de movimentação do jogador Então, basicamente, isso é chamar esse método no script de movimentação do jogador aqui, e precisamos fazer o mesmo neste código aqui. Então, vou apenas copiar essa linha aqui e colá-la aqui acima da área limpa igual ao verdadeiro método e segurança E isso resolverá esse problema porque sempre que o cronômetro acabar, chamaremos esse método definido de área limpa E agora vamos tentar. E dê uma olhada na variável área limpa aqui. Vamos matar um dos inimigos e deixar os outros vivos. OK. Agora você vê que a área limpa aumenta, mas há outro problema Se matarmos esse inimigo , nossa área limpa aumentará 22, mesmo que não tenhamos limpado a segunda área, o causará um problema sempre que limparmos a segunda área, ela mostrará a tela final do jogo e não iremos para o próximo Então, para corrigir isso, basicamente, precisamos acessar o script de movimentação do jogador aqui e adicionar um Boulan nesse método Vou adicionar um argumento de Boulan, e vou chamar isso de claro anteriormente Basicamente, vou verificar se o valor previamente apagado é verdadeiro Vou retornar essa função. Então, agora precisamos passar um bulion para esse método aqui, e teremos um erro em nosso script de ponto de tiro Aqui em nosso script de ponto de tiro, basicamente, sempre que chamamos o método de área limpa, precisamos passar as propriedades do bulion para essa área limpa Então, eu vou passar isso aqui. E, basicamente, isso passará o ouro para esse método aqui Então, se ainda não limparmos a área, esse lingote será falso E sempre que executarmos esse método, todo esse casaco será executado Então, vamos aumentar o valor da área limpa, acionar o evento e continuar a movimentação do jogador E se isso, por algum motivo, for executado novamente, por exemplo, se limparmos a área, esse método será chamado e a área limpa será passada, e isso será falso porque não alteramos esse valor verdadeiro e mudamos isso depois de chamarmos esse Mas por algum motivo, durante a transição para a próxima área, matamos um inimigo e terminamos de matar todo o inimigo. Isso também será chamado. Mas agora, com esse cheque em ouro, a área limpa será verdadeira anteriormente, embora estejamos definindo isso como verdadeiro porque ela já foi alterada para verdadeira anteriormente Então, se esse valor for verdadeiro, basicamente isso ignorará todo o código abaixo e não será mais chamado. E isso evitará que a área limpa aumente mais de uma vez no mesmo ponto de filmagem aqui Então, se voltarmos para a unidade aqui, vou executar isso novamente. Agora podemos dar uma olhada em nossa variável area clear. E vamos fazer o mesmo aqui. Vou apenas matar um dos inimigos aqui no primeiro ponto de tiro e deixar os outros vivos. E quando o tempo acabar, vamos tentar matar o inimigo. Então, agora a área limpa aumenta aqui, e vamos matar o inimigo E agora, uma vez que eu tenha eliminado o inimigo, a área limpa permanece 21 Só aumentará por área, e agora eu posso matar esta aqui, e agora limpamos duas áreas E então, para o terceiro, se matarmos esse inimigo aqui, ele mostrará as estatísticas. E agora vamos fazer outra tentativa. E desta vez, vamos deixar o segundo inimigo vivo na primeira área aqui e não matá-lo, mesmo que estejamos fazendo a transição para a segunda Então, vou verificar todos os cenários possíveis em nosso jogo. Agora o tempo acabou. Vamos continuar jogando na outra área aqui. E está contando corretamente. A variável area clear aqui. Vamos matar esse. Sim, aí está. Então, basicamente, conseguimos corrigir esse bug aqui. E obrigado Kyle Cooper por relatar esse problema. E se vocês encontraram algum outro bug, por favor, relate-o nas seções da Chave A, e eu tentarei resolver isso rapidamente.