Crie um jogo para celular 2D com Unity | Max Vynnyk | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


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

Crie um jogo para celular 2D com Unity

teacher avatar Max Vynnyk, Software Developer

Assista a este curso e milhares de outros

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

Assista a este curso e milhares de outros

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

Aulas neste curso

    • 1.

      Introdução ao curso

      1:28

    • 2.

      S1L0: introdução da seção

      0:55

    • 3.

      S1L1: configuração principal da cena

      4:36

    • 4.

      S1L2: adicione o criador de caminho

      2:37

    • 5.

      S1L3: mova bolas

      8:24

    • 6.

      S1L4: bolas de geração

      12:21

    • 7.

      S1L5: destrua bolas

      9:33

    • 8.

      S1L6: atirar bolas

      12:10

    • 9.

      S1L7: adicione cores diferentes

      6:09

    • 10.

      S1L8: bolas de terra

      16:04

    • 11.

      S1L9: destrua as mesmas cores

      5:58

    • 12.

      S1L10: refatoração de seção média

      1:56

    • 13.

      S1L11: mova bolas separadas de volta

      5:57

    • 14.

      S1L12: Mover → Ciclo de destruição

      2:53

    • 15.

      S1L13: adicione bolas especiais

      8:25

    • 16.

      S1L14: adicione bola do tipo bomba

      5:02

    • 17.

      S1L15: adicione bola do tipo reverso

      5:26

    • 18.

      S1L16: adicione bolas do tipo lento

      3:14

    • 19.

      S1L17: refatoração de final de seção e correção de erros

      1:49

    • 20.

      S2L1: adicione novos sprites

      3:51

    • 21.

      S2L2: sprites de bolas ativadas

      4:50

    • 22.

      S2L3: sprite ativo de tiro

      5:00

    • 23.

      S2L4: adicione música e SFX

      7:12

    • 24.

      S2L5: adicione sprites de caminho e spawner

      1:21

    • 25.

      S2L6: adicione animação de destruidor

      3:12

    • 26.

      S3L1: menu principal

      7:00

    • 27.

      S3L2: menu de parada

      6:36

    • 28.

      S3L3: adicione níveis

      11:19

    • 29.

      S3L4: adicione cenário de jogo

      6:17

    • 30.

      S3L5: comece um novo jogo

      6:06

    • 31.

      S3L6: corrija erros e otimize

      14:35

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

1

Projetos

Sobre este curso

Obtenha nova experiência fazendo um jogo móvel 2D ao estilo de masmorra!

Ambos sabemos que, para melhorar em algo, precisamos praticar.
Especialmente se se trata de ser um desenvolvedor, precisamos atualizar continuamente nosso conhecimento e ganhar habilidades.
Como nos jogos, precisamos melhorar nossas habilidades, subir de nível para continuar jogando.

Este curso não é um tutorial para ensinar você a ser um desenvolvedor de jogos do zero.
Há muitos cursos na internet que você pode tomar para esse objetivo.
Em vez disso, este curso é como uma missão em um jogo e projetado para dar a você nova experiência, ferramentas, habilidades de prática e
confiança.Este curso foi criado para você se você já tiver alguma experiência de iniciante com Unity e C# e entender conceitos básicos de desenvolvimento de jogos e programação em
C#.Ele vai dar a você um bom ganho de experiência e você vai obter novas habilidades práticas na criação de jogos de correspondência de azulejos semelhantes.

Eu fiz isso para ajudar você a obter um nível como desenvolvedor de jogos.

Não tenha medo de cometer erros.Durante o curso, você vai ver que os erros são realmente uma maneira de obter conhecimento e compreensão mais
profundos.
Tudo o que precisamos é encontrá-los e consertá-los.
E prepare-se para gastar mais tempo do que pode parecer que levaria e obter muito mais experiência do que pode parecer dar.

Você está pronto para a missão?

Espero que você goste do curso e fique à vontade para me mandar uma mensagem ou deixar seus pensamentos na conversa abaixo de cada palestra!

Conheça seu professor

Teacher Profile Image

Max Vynnyk

Software Developer

Professor
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: Bem-vindo ao curso. Este curso não é um tutorial para ensinar você a ser um desenvolvedor de jogos do zero. Existem muitos cursos na Internet que você pode fazer para esse objetivo. Em vez disso, este curso é como uma missão em um jogo e foi desenvolvido para oferecer uma nova experiência, ferramentas, habilidades práticas e confiança. Eu fiz isso para ajudá-lo a subir de nível como desenvolvedor de jogos. Este curso é dividido em três seções. Na primeira seção, faremos apenas um protótipo funcional do jogo Na segunda seção, faremos com que pareça e soe como um bom jogo. E no terceiro, adicionaremos menus, salvamento e outras coisas. Não tenha medo de cometer erros. Durante o curso, você verá que os erros são na verdade, uma forma de obter conhecimento e compreensão mais profundos. Tudo o que precisamos é encontrá-lo, consertá-lo e nos preparar para passar mais tempo do que parece ser necessário. Mas, em vez disso, você terá mais experiência do que parece oferecer. 2. S1L0: introdução da seção: Bem-vindo à primeira parte do curso. Nesta parte, aprenderemos como o jogo funciona. Manteremos as coisas simples com um preço básico e ainda não usaremos nenhuma música ou efeito sonoro. Começaremos fazendo as bolas se moverem ao longo do caminho com a ajuda de uma ferramenta gratuita chamada Baja Pass creator Depois disso, criaremos uma forma de atirar bolas para que elas caiam no caminho. Em seguida, exploraremos como atirar, destruir e trazer bolas de volta, além de alguns detalhes extras. Para finalizar esta seção, adicionaremos algumas bolas especiais, como reversos, bombas e outras que diminuem 3. S1L1: configuração principal da cena: Nesta breve lição, configuraremos os elementos básicos do nosso jogo: bola, palavra e atirador Vamos começar criando um novo projeto. Usaremos a versão 2021, pois ela tem a maior comunidade online e ainda recebe atualizações frequentes de suporte. Em seguida, selecionaremos o projeto e a placa MT two D. Adaptaremos nosso jogo aos requisitos específicos do celular depois terminar a lógica principal do jogo. Chamaremos o projeto Eternal Dungeon e clicaremos no botão Criar A primeira etapa é acessar as configurações de compilação e garantir que estamos desenvolvendo para uma plataforma móvel , como IOS ou Android. Selecione IOS e clique no botão alternar. Em seguida, vamos reorganizar o layout dois a três e mover a visualização do projeto para baixo. Esse arranjo coloca a cena e as janelas do jogo à esquerda, com o resto à direita. Também vamos verificar a resolução. Para este curso, trabalharemos com uma resolução específica de 1080 por 1920 pixels Podemos ajustar nosso jogo para acomodar outras resoluções posteriormente Precisamos ajustar o tamanho ortográfico da nossa câmera para 9,6 Essa configuração é essencial, pois determina quanto da cena a câmera pode capturar. Você pode se perguntar por que exatamente 9,6? Isso porque o tamanho ortográfico é metade da altura da área de visualização da câmera em unidades de palavras Ao lidar com uma resolução D vertical mais completa, que no nosso caso é de 1080 por 1920 pixels E para obter uma renderização perfeita em pixels ou uma escala de visualização específica, você precisa calcular o tamanho ortográfico correto com base na resolução vertical e nas configurações de pixel por unidade escolhidas. Resumindo, PP. PPU define quantos pixels representam uma unidade no mundo unitário. Portanto, se nosso valor de PPU estiver definido como o padrão, que é 100 e a altura da tela é 1920 pixels , a metade da cabeça será de 60 pixels Portanto, o tamanho ortográfico de nossas câmeras deve ser 960/100 igual a 9,6. É isso mesmo. Salve a cena, navegue até a pasta desde e renomeie-a para jogo Em seguida, clique em Recarregar. Primeiro, crie uma nova pasta chamada sprites e coloque as imagens fornecidas nesta lição na pasta Em seguida, arraste cada tipo de imagem para os objetos da cena individualmente, nomeando cada um conforme necessário Em seguida, crie um objeto vazio e nomeie-o como quadro. Esse objeto gerenciará a maioria das funcionalidades do jogo relacionadas às bolas. Precisamos garantir que a bola e o atirador tenham sua própria ordem de camadas para que a bola esteja sempre sobre o atirador Vamos ajustar isso agora. Vamos atribuir dez para a bola e cinco para o atirador. Vou criar uma nova pasta chamada scripts. Em seguida, gerarei scripts para cada objeto que temos na cena, ou seja, bola, atirador e tabuleiro Cada script será atribuído ao seu respectivo objeto. Portanto, esse é o objetivo principal com o qual trabalharemos principalmente. 4. S1L2: adicione o criador de caminho: Nesta lição, adicionaremos ativo criador do passe e aprenderemos como editá-lo para criar o passe desejado. Vamos encontrar o componente criador de passes que vamos usar em nosso jogo. Eu já o editei, então há apenas o botão Abrir no Unity do meu site, mas você provavelmente precisaria clicar no botão Adicionar ao meu Avaliar e depois abrir no Unity. Portanto, se seu projeto Unity já estiver aberto, você verá essa janela do gerenciador de pacotes Vamos esperar até que ele termine de carregar os pacotes. E então você precisa encontrar o componente BuspsGreator aqui. Clique em Baixar. E então o botão Importar. Na janela pop-up, clique em outro botão Importar. Espere até terminar. Em seguida, você verá uma nova pasta de ativos aqui. Vamos criar um objeto vazio e chamá-lo de criador de passes. Quando você cria um objeto vazio, sua posição é definida no centro da SNU, mas será mais fácil para nós posteriormente se a definirmos como zero Vamos fazer isso pelo tabuleiro e passar os objetos do criador. E então, para o objeto criador do passe, adicionarei um script com o mesmo nome do criador do passe. Agora podemos editar essa passagem, mas certifique-se de que a ferramenta de movimentação esteja selecionada na parte superior. Podemos mudar o caminho movendo os pontos de ancoragem vermelhos e podemos ajustar o tornozelo movendo esses pontos de controle azuis Você pode saber mais sobre esse criador de passes na página da loja*** Você pode adicionar outro ponto simplesmente deslocando, como se estivesse clicando. Para tornar a movimentação desses pontos mais conveniente, podemos aumentar a escala da alça. Ótimo. Concluímos o passe com sucesso. Bem feito. 5. S1L3: mova bolas: Esta lição é para aprender como mover arcos no caminho. Vamos abrir o roteiro da taça. Não precisamos desses bens comuns porque já conhecemos essas informações, então podemos removê-las Estou adicionando o campo do criador do passe aqui. A função find object of type apenas retornará o criador do passe, objeto que temos na cena. Portanto, não precisamos configurá-lo explicitamente e teremos um campo de distância percorrida pelo fluxo público E para nos movermos, precisamos aumentar essa distância com o tempo. Então, com base nesse valor usando o criador de passes, podemos obter o ponto no caminho. Tudo bem, está se movendo. Vamos criar um objeto vazio e chamá-lo de slot de bola. Em seguida, crie um script para isso. E atribua-o ao objeto. Vou abrir esse script. Basta copiar e colar todo o código que tínhamos no script da bola. Corrigindo as dependências. Vou mover o objeto da bola no objeto do slot da bola. Vamos garantir que a posição esteja definida como zero. E podemos ver que está funcionando tão bem quanto antes. Vou adicionar o colisor circular ao slot da bola, pois precisaremos dele mais tarde E agora podemos ver que nossa bola é um pouco grande demais. O raio do colisor circular é 0,5. Portanto, seu diâmetro é exatamente um ponto da bola dos sprites e podemos alterar o valor do pixel por unidade aqui Você pode brincar com ele, dependendo do tamanho do sprite Aqui, 200 funcionarão. Arraste e solte a ranhura do arco na pasta Assets para torná-la pré-fabricada Vamos criar uma pasta prefabs e colocá-la lá. Vou instanciar o slot do arco a partir do script Bar Para isso, preciso de uma referência ao prefab com ranhura em arco. Podemos excluir esse objeto da cena. Vamos ter acesso à cratera da passagem aqui no script do quadro Então, precisamos do comprimento do caminho. R: Como o diâmetro da nossa parede é um ponto, podemos colocar a parte inteira do comprimento do número de bolas nessa banheira. Como o diâmetro da nossa parede é um ponto, podemos colocar a parte inteira do comprimento do número de bolas nessa banheira Então, por exemplo, se o comprimento do banho for 30,5, poderemos colocar 30 bolas lá Então, para cada uma dessas contagens, vou instanciar um slot em cada parte do caminho de acordo Chamaremos esse método no início e verificaremos se ele está funcionando. Como você pode ver, ele criou muitos slots de bola, mas parece que eles se movem todos juntos no mesmo ponto. Para corrigir isso, precisamos definir a distância inicial percorrida de cada um dos dois slots. Vamos mudar o tipo do slot da bola preferindo o slot do arco em vez do objeto do jogo. Em seguida, podemos acessar o campo de percurso de distância do slot da bola e configurá-lo como o índice do iterador Como podemos ver, todas as bolas estão se movendo separadamente, mas há um problema com cada uma delas Para corrigir isso, basta remover todo o código que deixamos no script bow. Uma vez que movemos essa funcionalidade para o slot da bola. Vamos verificar novamente e está funcionando. Você pode ver o pequeno espaço entre a primeira e a segunda bola. Vamos corrigir isso também. É porque ignoramos essa parte não inteira do comprimento do caminho Vamos dividi-lo com cada uma das fendas do arco e o comprimento do degrau entre duas fendas seria o comprimento do caminho dividido pela contagem de slots. Oh, estamos definindo esse valor em dois lugares, então é melhor movê-lo para uma variável e usar essa variável em vez disso. Vamos verificar novamente. E é perfeito. 6. S1L4: bolas de geração: Nesta lição, faremos parafusos amarrados um por um e depois seguiremos pelo caminho Também adicionaremos animação a esse processo. Vamos arrastar a bola até a mancha e remover a bola dela Abrimos o pré-fabricado, retiramos a bola e voltamos. Agora podemos remover a cédula pré-fabricada do local. Vamos verificar se não quebramos nada. Vou clicar em qualquer ranhura do parafuso e ver se ele está se movendo Ótimo. Vamos limpar um pouco e colocar toda a ranhura do parafuso ralado em um objeto Estou criando um objeto vazio e chamando-o de contêiner lento Certifique-se de que sua posição esteja definida como zero. Precisamos de uma referência a esse contêiner no script do quadro. E depois de instanciarmos o slot do arco, precisamos configurá-lo como pai, seja a transformação do contêiner Vamos preencher esse campo de contêiner das placas. E, por favor, não importa a exceção do meu lado. É apenas por causa da falta de configuração dos plug-ins. Vamos verificar se funcionou ou se funcionou? Para instanciar ambos, precisamos ter acesso aos dois Vamos criar o objeto bola novamente e torná-lo um pré-fabricado Podemos excluí-lo agora e preencher a bola pré-fabricada preenchida no tabuleiro Precisamos acessar os slots de bola no tabuleiro, então vamos mantê-los em uma matriz. Isso deve ser inteiro em vez de flutuante. R Você pode classificar todos os slots pelo campo de distância percorrida e obter o primeiro, que é o mais próximo do início do caminho E vamos instanciar uma bola nesse slot Confira o que temos. Não funciona. Vamos ver se definimos um índice adequado na camada para a bola quando a criamos novamente. Ok, agora podemos colocar a bola, mas só há uma. E o problema é que, na ranhura da bola, precisamos redefinir a distância percorrida Cada vez fica maior do que o comprimento do passe. Vamos verificar novamente. Legal. Agora vemos que criamos muitas bolas no mesmo slot. Para corrigir isso, precisamos verificar se o slot já tem uma bola nele. Criaremos um novo campo. Será uma bola. E atribuímos uma tigela recém-criada a esse slot. Vamos fazer a verificação para criar uma nova tigela. Agora podemos ver que tudo está funcionando perfeitamente. Eu criei um novo campo no script da bola. A bala pública está surgindo. Vamos fazer uma falsificação, que rastreará a escala da bola. Na atualização, verificaremos se a bola está surgindo E aumentaremos esse contador e definiremos ou transformaremos a escala local em Vetores 31 multiplicados pelo Se esse contador for maior ou igual a um, definimos que sua fundação é falsa Vamos colocar o cheque antes de aplicarmos a balança. E adicione uma declaração de devolução aqui. Além disso, quando criamos uma bola, vamos fazer com que ela apareça como Ótimo. Se você vê aquele pequeno vislumbre quando criamos uma bola, é porque a escala inicial da bola é uma, então vamos corrigir Eu estou ótimo. Vamos aumentar a velocidade do aumento de escala. Parece que é um pouco rápido demais, para tornar mais fácil brincar com a velocidade e escolher o que é melhor para nós. Vamos mover o valor da velocidade para o objeto onde podemos armazenar propriedades semelhantes a essa. Posteriormente, podemos depurá-lo a partir do editor. Crie um objeto Idi e nomeie-o como propriedades do jogo. Além disso, estou criando um script com o mesmo nome. Atribuindo-o ao objeto. Portanto, a propriedade é uma bola flutuante pública de grande velocidade. Vamos dizer que são dois. Precisamos de uma referência a esse objeto a partir do script da bola. E vamos repetir essa madeira com o valor que criamos agora Dançando muito bem. Você pode ver que podemos jogar com esse número em tempo real. Mas, por enquanto, vamos deixar que sejam dois. 7. S1L5: destrua bolas: Criaremos um objeto no final do caminho que destruirá qualquer bola que colida com ele Vamos fazer com que os slots de bola se movam mais rápido e armazenar o valor da velocidade no objeto de propriedades do jogo como fizemos na seleção anterior. Vamos verificar. Ótimo. Então, vamos criar um objeto destruidor de bolas. Será um objeto vazio. Vamos renomeá-lo. Para precisar de um colisor circular para o. Vamos configurá-lo para ser um gatilho. Para possibilitar a colisão com a fenda da bola, precisamos adicionar um corpo rígido ao componente da fenda da bola Vamos criar um script de destruidor de Bol. Atribua-o a esse objeto. No script, precisaremos inserir a função no gatilho e verificar se o objeto com o qual colidimos é o correto Então, para isso, precisamos marcar esse objeto. Vamos trazer o slot de bola para a cena. Clique em Tecnologia, adicione Tecnologia, clique no ícone de adição e nomeie-o como slot Bol. Clique em Salvar e selecione o slot da bola novamente. Clique em Tech e clique no slot Bol no menu suspenso. Vamos salvar o progresso. E agora podemos remover a prova da cena novamente. No roteiro. Verificamos se o objeto colidido tem um slot de arco tecnológico usando a função de tag de comparação Nesse caso, podemos obter o componente do slot de pausa desse colisor E verifique se o Blot tem uma bola. Aqui, simplesmente destruiremos o objeto de jogo da bola. Vamos verificar se está funcionando. Vou mover o objeto destruidor de bolas para mais perto para que não precisemos esperar E ótimo, está funcionando. Para criar uma melhor animação de destruição, precisamos verificar se a bola está destruindo Precisaríamos de outra variável semelhante à desova e. Mas quanto mais variáveis tivermos, mais difícil será mantê-las. Portanto, a melhor maneira é ter uma variável de estado que apenas fale sobre o estado da bola. Então, vamos criar um script de um vazio. E, por enquanto, teremos três estados gerando e destruindo Islat Vamos substituir a propriedade e spawning pelo estado aqui e corrigir os problemas Teremos outro caso se o estado estiver destruindo. Posteriormente, teremos mais estados, então é melhor lidar com isso no caso do switch em vez de if ande O caso destruidor seria muito semelhante ao caso do desânimo Vamos reduzir a escala em vez de aumentar a escala. No caso de destruição, vamos substituir o contador de alto nível pelo contador de baixo custo H adiciona outro valor ao objeto de propriedades do jogo. Será a velocidade de redução da escala da bola. Aqui não mudaremos de estado, apenas destruiremos o objeto do jogo. Vamos corrigir problemas no script do tabuleiro. Além disso, no script ball destroyer, definiremos o estado a ser destruído Retirou a bola da ranhura da bola. Vamos verificar. Uau. Esquecemos de mudar alguma coisa Portanto, nesse caso, verificamos se nosso contador de downscale é menor que zero em vez de maior que um, porque o tornamos cada vez menor com o tempo Vamos verificar novamente. Ótimo. Está funcionando. 8. S1L6: atirar bolas: Ah, hein. Nesta lição, faremos o atirador atirar bolas Vamos criar um método que mudará o estado da bola para chute. Ao mover a bola do ponto A para o ponto B, também precisamos lembrar a direção. Então, precisamos de um campo separado para isso. A direção pode ser passada do atirador usando os parâmetros do método Então, o estado, precisamos adicionar o novo arremesso estadual da bola. Agora podemos implementar o caso de mudança de estado. Essa será uma lógica simples de mudar a posição ao longo do tempo. Vamos aumentar a posição de transformação da bola pelo vetor de direção do tiro multiplicado por algum valor de velocidade, que começaremos no assunto da propriedade do jogo E , claro, precisamos multiplicá-lo de tempos em tempos Agora podemos acessar o roteiro do atirador. Vamos saber a direção da filmagem. Para conseguir isso, precisamos de uma posição do atirador. Podemos fazer isso apenas chamando posição de transformação e precisamos da guia da tela sensível ao toque ou da posição do clique do mouse Nesse método, obteremos a carta dessa maneira. Além disso, não precisamos desse valor de acesso, então definir zero pode facilitar nossos cálculos. Uma referência à câmera principal pode ser utilizada na função de partida É melhor para o desempenho. Portanto, a direção do disparo é a posição do mouse menos a posição de transformação Essa linha fará com que o objeto atirador pareça na posição do mouse ou na direção da guia Podemos mover essa lógica para um método separado para mantê-la limpa. Agora podemos trabalhar na geração de uma bola que vamos atirar. Já temos uma lógica semelhante no script do quadro, então eu o moveria para um script separado e o reutilizaria em vez de apenas copiar e colar Isso também é uma boa prática. Como de costume, ele começará uma fábrica de toupeiras de objetos vazia Em seguida, criarei um script com o mesmo nome, mas sem espaço em branco, e o atribuirei ao objeto. Como no script boll, precisamos de uma referência à bola pré-fabricada Esse método usará um vetor de três pontos como parâmetro e criará uma bola nele. Podemos retornar ao nosso script de tiro agora e usar a fábrica de bolas Precisamos nos lembrar de uma bola que estamos nos preparando para atirar. Então, criarei um campo aqui e criaremos outra bola somente se essa referência não estiver definida. Então, uma bola por tiro. Finalmente, podemos verificar se acontece um clique ou toque na tela sensível ao toque e, em seguida, atiramos a bola Para isso, precisamos novamente de uma direção, mas desta vez, ela deve ser normalizada Isso significa a mesma direção , mas no escopo de um quadrado 0-1 Então, podemos finalmente chamar o método de arremesso da bola e limpar a referência Vou começar a preparar outra bola. Ainda precisamos fazer algumas alterações no editor Unity na fábrica de boll. Preencha o campo pré-fabricado da bola. E podemos mudar a lógica de instanciação da bola para nosso novo uso na fábrica de bolas. Não precisamos mais de preferência aqui. Salvando. Vamos dar uma olhada em como isso funciona. Oh, não, quebramos alguma coisa. Mas o ponto positivo é que o arremesso de bola funcione conforme desejado. Vamos ver o que está errado. A lógica de mover as bolas pelo tabuleiro está nos scripts word e bol. O que mudamos no script do quadro? Se você comparar a instanciação, podemos ver que antes criávamos bolas na transformação de ponto de zero espaço, mas agora estamos usando apenas a posição de transformação de zero espaço Então, para corrigir isso, precisamos definir o pai da transformação da bola para a transformação de zero ponto no slot. Vamos verificar se a correção está funcionando. Legal. Há mais uma coisa que vamos fazer nesta lição. Veja um momento em que nossa bola de tiro colide com qualquer bola no caminho Assim como acontece com o destruidor de bolas, podemos usar o botão ligado para entrar hoje Agora, verifique se o objeto colidido tem um deck com ranhura para taças. Se sim, usando a função Get component, podemos usá-la como uma ranhura para taças. Então, podemos verificar se não está vazio e, em caso afirmativo, vamos enviar uma mensagem. Verifique. Ainda não. O motivo é que a bola pré-fabricada não tem um planador circular Então, vamos adicioná-lo e transformá-lo em um gatilho. Verificando novamente. Podemos ver a saída antes mesmo de lançarmos qualquer bola, e isso não é o que se esperava. Vamos descobrir o que está errado. Se você der uma olhada na equação aqui, ela não verifica se uma das duas bolas colididas é a bola que está atirando Ele só é acionado quando duas bolas irmãs no Então, vou adicionar esse requisito. Verificação final. Ótimo. Você pode ver que às vezes ele colide com duas bolas ao mesmo tempo, mas não se preocupe Tudo bem. E está funcionando conforme o esperado. 9. S1L7: adicione cores diferentes: Na lição, adicionaremos as cores das bolas vermelha e verde. Semelhante ao estado da bola nas lições anteriores, vamos criar outro hum chamado tipo de bola. Por enquanto, teremos bolas vermelhas, verdes e azuis. Vou adicionar um tipo de campo ao script da bola. E no script da fábrica de bolas, teremos um método que cria um arco aleatório na posição dada. Estou começando criando uma matriz com todos os tipos de bolas disponíveis. Vou chamá-lo de cores. Vermelho, verde, azul. Só pode ser estático e vermelho , pois não vamos modificá-lo. Além disso, precisamos de referência aos sprites da bola. Esse método agora deve aceitar o tipo de bola como parâmetro. Definiremos o tipo de campo de uma bola. E aqui precisamos obter o componente de renderização do sprite e definir o sprite correto Vou apenas definir o sprite azul por enquanto, mas vamos criar um método que retornará o sprite com base no tipo de bola Agora podemos usar o método. Precisamos de uma funcionalidade que crie uma bola aleatória. O método será muito semelhante ao existente. Podemos usá-lo lá dentro. Mas precisamos escolher um tipo de bola aleatório. Estou criando outro método privado. Aqui, certifique-se de transmitir uma mensagem aleatória do motor Unity Basicamente, escolhemos um elemento aleatório da matriz e agora podemos chamá-lo aqui. Vamos substituir o uso do método antigo por um novo. Parece que podemos ser privados, então não é visível fora da sala de aula. Vamos consertar isso. Substituindo métodos no script de tabuleiro e atirador. Nós terminamos com o bacalhau. Estou mudando para o editor Unity agora. Vamos mover esse destruidor de bolas até o final do caminho. A última coisa que precisamos fazer é definir os campos de preços da fábrica de bolas. E verifique o valor unitário do pixel dos sprites. No início da seção, alteramos o valor do sprite da bola azul para 200 Portanto, seu tamanho é igual a exatamente uma unidade. Podemos ver como fica se você não mudar isso. Então, precisamos fazer isso. Verifique novamente. Perfeito. 10. S1L8: bolas de terra: Vamos ajudar as bolas de tiro a pousarem. Começaremos adicionando dois novos estados de bola, slots de aterrissagem e troca. No script do javali, vamos criar um método que lidará com a aterrissagem Precisaremos saber as referências à ranhura do colisor e à bola de aterrissagem Seria bom ter todos os slots classificados por distância aqui Podemos simplesmente copiar e colar essa parte de uma linha de cima por enquanto. E aqui precisamos saber o índice da bola colidida. Em seguida, vamos encontrar o índice do primeiro espaço vazio após o slot da bola colidida Quando a bola de arremesso cair, todas as bolas que estão na frente da linha devem ser empurradas uma fenda para frente. Poderíamos pegar o primeiro e o último deles. Mas, caso haja uma lacuna entre eles, precisamos descobrir o índice do último slot que não está vazio ou o índice do primeiro slot vazio. Vamos dar um passo a passo e verificar se um slot tem uma bola nele. Caso contrário, lembraremos o índice e interromperemos o loop. Mas vamos passar isso para um método separado. E, como boa prática, se não houver esse índice, retornaremos menos um Temos os índices. Então, agora, vamos deslocar todas essas bolas um espaço para frente. É mais fácil fazer isso na ordem inversa porque um slot após o último estará sempre vazio Aqui, devemos pegar um espaço por índice e colocar uma bola do espaço anterior lá Mas também precisamos garantir que essa bola não seja mais colocada no slot. Seria ótimo ter um método que lidasse com essa lógica. Vou criar esse método nos scripts do slot. R precisaremos de Também precisaremos de uma referência a um slot a partir de um script de bola. Então, vamos usar esse novo método. Y. Depois disso, precisamos decidir o que queremos fazer com nossa bola de aterrissagem Deve pousar antes ou depois da colisão? Podemos fazer isso dessa maneira usando a distância mais próxima ao longo do caminho. Ele retorna uma distância no caminho de qualquer projeção de ponto até ele Então, não esse e também não esse, mas o mais próximo. Portanto, se a distância percorrida pela bola colidida for menor que a distância projetada da bola de aterrissagem, é melhor colocar a bola de aterrissagem antes da bola Caso contrário, empurraremos a bola colidida uma fenda para frente e colocaremos a bola de aterrissagem depois dela O que fizemos foi colocar todas as bolas nos espaços onde elas deveriam estar. Agora precisamos movê-los fisicamente para lá. Primeiro, vamos criar um método de aterrissagem no script da bola e chamá-lo de bola de aterrissagem. Será apenas uma mudança de estado. Para o resto das bolas, as bolas que não estão pousando e desovando, precisamos criar outro método, mas muito semelhante, mover para E também ligue para eles. Y. E adicionaremos esses casos de data Mas primeiro, vamos realmente chamar esse método de palavra e bola. Vamos ligar daqui. Precisamos de uma referência ao conselho. Então, o colisor fechou essa bola. Voltando às caixas de troca. Estou gerando todos os casos de switch ausentes, mas vou deixar apenas dois deles. Podemos usar torres de movimento vetoriais de três para mover gradualmente a bola de aterrissagem até sua fenda Vamos colocar cinco aqui como um valor de velocidade e depois vamos movê-lo para as propriedades do jogo. Agora, como de costume, precisamos verificar se nosso objeto está próximo o suficiente de sua posição alvo para que possamos terminar a aterrissagem. R Mas precisamos ter certeza de que atualizamos o campo principal da bola transformando a bola se movendo junto com o slot. O estojo de troca de slots será muito semelhante. Voltando ao script de barras, precisamos colocar o novo método de atribuição de bola Em todos os lugares, atribuímos uma bola a um slot. A pesquisa nos ajudará a encontrar o resto desses lugares. Além disso, vamos mover essa linha para um método separado. Substituindo essa linha dois, acho que é hora de verificar o que temos. E temos algumas exceções. Se você segurar um controle ou comando no Mac e clicar no link aqui, ele abrirá o script exatamente onde o erro ocorreu. Esqueci de utilizar as palavras referência. Agora, meio que funciona, mas não move outras bolas. A equação do loop está incorreta. É melhor, mas às vezes move uma bola que não deveríamos mover. Eu posso ou não resolver o problema, mas precisamos lidar com um caso em que colidimos duas bolas ao mesmo tempo Para corrigir isso, precisamos desativar o colisor de bolas de tiro quando a bola não estiver voando Vamos tentar se isso ajudar. Não, precisamos encontrar outro motivo. Como está movendo uma bola extra , os problemas devem estar em algum lugar aqui. Deveríamos mover as bolas que estão atrás da colidida, mas esse loop ainda pode capturar um índice da colidida. Vamos consertar isso. A 11. S1L9: destrua as mesmas cores: Uh hein. Neste vídeo, faremos com que três ou mais bolas iguais sejam destruídas. Aqui, logo no final do método land ball, vamos chamar uma rotina, que criaremos em breve. Essa rotina destruirá três ou mais bolas iguais em uma sequência Vamos esperar até que as bolas estejam prontas. Ou o lote não tem bola ou a bola está em um estado adequado. Vamos ver como isso funcionaria. Precisamos de um parâmetro de entrada aqui para encontrar bolas irmãs daquela que caiu Podemos ultrapassar o slot da bola aterrissada. Vamos obter um índice desse slot. Estaremos procurando as bolas que precisamos destruir, precisamos de uma lista para mantê-las lá. Vou criar dois loops. O primeiro loop voltará para o início da matriz de distância baseada no slot da bola e o segundo voltará para o outro lado da matriz Nesses loops, procuraremos bolas que correspondam à bola que caiu e, assim que encontrarmos uma bola errada, o loop deverá O primeiro sairá direto do slot após o aterrissado e deve parar pelo menos no início da matriz Precisamos ter certeza de não adicionar a mesma bola duas vezes. Vamos fazer essa verificação. Aqui, exigimos que a bola seja do mesmo tipo que a que caiu Finalmente, adicionar a bola à matriz, se as condições estiverem boas. Da mesma forma, devemos procurar as bolas em outra direção. Depois de escolhermos todas as bolas que devem ser destruídas, podemos invocar a função de destruição Mas primeiro, precisamos criar um método para isso. Vamos ao roteiro do baile. Desta vez, novamente, o método fará apenas uma mudança de estado. E a data já está implementada. Podemos voltar e invocar esse método. Além disso, precisamos limpar o espaço da bola. Vamos verificar a mudança. Nós temos um problema. Aqui, quando verificamos se a ranhura dessa bola é do tipo adequado, também precisamos ter certeza de que a ranhura tem a bola para que não seja nula E podemos interromper a iteração se encontrarmos a primeira bola que não se encaixa em nossos critérios. Vamos verificar novamente. Temos outro problema aqui. Vamos ver o que está errado. Precisamos verificar se a quantidade das bolas correspondentes é maior ou igual a três. Caso contrário, destruiria as bolas mesmo se tivéssemos apenas duas partidas. Além disso, como você pode ver, nem sempre funciona. Vamos descobrir o motivo. Provavelmente, esquecemos de adicionar a bola de aterrissagem às partidas E parece que aumentamos onde deveríamos ter diminuído Vamos corrigir isso e tentar novamente. Ok, está funcionando muito bem. Nos vemos na próxima aula. 12. S1L10: refatoração de seção média: Vamos deixar nosso código um pouco mais limpo. Primeiro, começarei removendo os registros não utilizados. Além disso, o ID sugere fatorar essa linha. Podemos mover esse código de pesquisa para outro método. Também vou colocar uma quebra de linha aqui para torná-la mais legível Todos esses códigos, eu também posso passar para um método separado. Mais uma sugestão do ID é criar modificadores de acesso explícitos Também podemos remover essas dependências não utilizadas. Você pode ver que eles são classificados se não forem usados. E esse valor, podemos mover para o objeto de propriedades do jogo. E, finalmente, podemos reescrever essas condições para tornar a estrutura mais plana 13. S1L11: mova bolas separadas de volta: Depois de destruirmos as bolas correspondentes, precisamos remover a lacuna e mover algumas bolas para trás. Depois de destruir e antes de movermos as bolas separadas para trás, precisamos fazer uma pausa 0,5 vai ficar bem. Eu criarei um método privado de movimentação de bolas separadas por vazio e o chamarei logo após a pausa O que vamos fazer é descobrir quantos espaços vazios existem entre o grupo de bolas e mover todas as bolas do grupo A para esses espaços. Para fazer isso, primeiro, no slot de boll por distância, podemos encontrar um índice de um primeiro slot que está vazio E segundo, podemos descobrir onde essa sequência de espaços vazios termina. O primeiro slot não vazio na matriz. Mas partindo do índice encontrado anteriormente. Aqui está o número de espaços vazios entre dois grupos de bolas. Agora, vamos mover as bolas do segundo grupo para esses slots. O loop começa no primeiro slot vazio e vai na direção do final da matriz, mas aceita o número de slots vazios, pois eles ficarão vazios. Essa parte da matriz deve ser nossos slots vazios. Então, precisamos de outro para eles. A, vamos passar para a fenda de cada bola que estamos movendo. Verificando o resultado. Temos algum erro. Vamos ver do que se trata. Precisamos verificar se o slot tem uma bola antes de chamar seu método. Faça o check-in novamente. Outro problema. Aqui, precisamos ter certeza de que realmente temos a lacuna entre dois grupos de bolas. Se não houver nenhum espaço vazio, alguns desses índices serão menos um, pois não serão encontrados Agradável. Parece que está funcionando, mas teremos que corrigir um pequeno problema de animação. Como podemos ver, quando as bolas estão se movendo para a posição-alvo, elas estão se movendo para fora da pista. Isso ocorre porque estamos usando torres de movimento Vector Three, que faz com que as bolas se movam diretamente para seus pontos e, no caso de ângulos, elas estão apenas sendo cortadas O que podemos fazer para corrigir isso é fazer com que as bolas se movam ao longo do caminho, como fazemos com os slots de bolas. Vamos ao script da bola e adicionar o campo de viagem de distância. Além disso, precisamos de uma referência ao criador do passe. E aqui, onde dizemos a uma bola que se mova para a fenda, precisamos utilizar o campo de distância percorrida Como fizemos antes, usando essa função, podemos obter a distância percorrida com base na posição atual da bola Vamos ver o tratamento do estado e atualizar a lógica aqui. Precisamos mover a bola em direção à sua fenda ao longo do caminho. Caso a fenda esteja mais longe do que a bola, podemos simplesmente aumentar a distância percorrida pelo campo até que a bola chegue à fenda. Mas em outros casos, quando a fenda está do outro lado, que significa que o campo de distância percorrido é menor do que o que temos para a bola , precisamos diminuir esse campo da bola. Então, basicamente, se você quiser que a bola alcance sua posição no lote, no primeiro caso, precisamos adicionar algum valor positivo ao campo de distância percorrida da bola e, no segundo caso, precisamos subtrair algum valor, que significa adicionar algum valor negativo Podemos expressar a direção na qual movemos a bola dessa maneira e podemos simplesmente multiplicar o delta que estamos adicionando por essa direção Vamos transferir o valor da velocidade para as propriedades do jogo. Portanto, para a posição da bola, podemos simplesmente usar Get boot at distance. E para verificar se a bola está perto o suficiente de sua fenda, podemos usar essa expressão. Vamos verificar. Ótimo. 14. S1L12: Mover → Ciclo de destruição: Vamos fazer com que o jogo se repita, destrua e retroceda até que não haja mais bolas iguais perto da bola lançada Vou mover todo esse código para fazer Wil Loop. Esse loop faz uma iteração. Em seguida, ele verifica a equação e, com base no resultado , para ou repete novamente. Precisamos saber quando parar e vamos parar o ciclo quando não houver bolas iguais suficientes para destruir. Vou tirar essa definição do loop para possibilitar o acesso à lista no loop condicional Aqui podemos definir um valor para essa variável. Novamente, verificamos se havia algumas bolas iguais , mas não menos que três. Além disso, em cada iteração, a bola com a qual comparamos outras bolas mudará, então precisamos de outra variável para ela valor inicial será o slot da bola aterrissada, e vamos garantir que, após uma iteração, ainda tenhamos essa A ideia sugere reverter esse bloqueio. Isso tornará o código mais simples e plano. Então, depois de destruirmos a bola correspondente, podemos definir um novo valor para o espaço da bola colidida Pode ser confuso, mas será o primeiro lugar na lista O problema é que depois de destruirmos as bolas nesses espaços, esses espaços ficam vazios. Em seguida, recuamos as bolas que estavam na frente das destruídas. Assim, o espaço da bola colidida não fica vazio novamente e podemos usar sua nova bola para compará-la E se não houver bolas depois das destruídas, o espaço ficará vazio. Para cobrir esse caso, vamos usar o método de obter bolas semelhantes e fazer um cheque. Além disso, vamos garantir que ele sempre retorne resultados ordenados pela distância percorrida E estamos prontos para verificar como isso funciona. Então, estamos prontos para ir. 15. S1L13: adicione bolas especiais: Vamos criar uma base para algumas bolas especiais que adicionaremos nas próximas palestras Por enquanto, haverá três deles. Bomba quando explode, destrói uma ou mais bolas irmãs. Reverter quando explode faz com que a bola se mova para trás por alguns segundos tempo lento faz com que os slots se movam a 50% da velocidade por alguns segundos. Começaremos adicionando campos para três novos sprites no script do fator bola Se você estiver usando o Credr, você pode pressionar Control e D ou comentar e D no Mac para duplicar a linha e, em seguida, basta alterar o nome do campo Precisamos adicionar novos tipos de bola no tipo de bola NM. Voltando à fábrica de bolas, vamos criar uma matriz que lista todos os tipos especiais de bolas. Esse método deve ser renomeado para ficar mais claro sobre o tipo que ele retorna e podemos criar um semelhante , mas com tipos especiais Com esses dois métodos, vou criar o método Get Random ball. Novamente, mas agora, em alguma porcentagem dos casos, ele retornará um tipo especial. Portanto, essa parte fixa um valor aleatório de 0 a 1, e somente valores maiores que 0,2 levarão ao retorno de um tipo de cor normal Isso acontecerá basicamente em 80% dos casos, porque 80% dos valores 0-1 são maiores que 0,2 Portanto, os 20% restantes dos valores resultarão no retorno de um tipo especial de bola. Usando a sugestão de ID, estou gerando casos adicionais para que o bloco switch retorne os sprites adequados Há um arquivo com novo Sprite anexado a esta lição Vamos até o editor do Unity e adicionemos os novos arquivos ao SprizFolder Depois disso, vamos atribuí-los ao objeto de fábrica Bol. Agora, vamos ao Br Script e chamar nosso novo método aqui. Além disso, aqui no método get similar em que comparamos bolas por tipo, precisamos fazer atualizações para oferecer suporte aos novos tipos de bola. Para isso, vou criar um script wall Util. Essa classe de utilitário será uma classe estática publicada. E teremos um método para obter cores por tipo. Esse método usará um tipo negrito como parâmetro e retornará sua cor correspondente como um valor numérico do tipo negrito. Basicamente, será um bloco de comutação. Para os estojos coloridos, retornaremos apenas os mesmos nomes. Mas para os tipos especiais, devolveremos suas cores. Podemos voltar ao método get similar bowls e usar um novo utilitário aqui Vou apenas colocar uma quebra de linha para alinhar esse código. Agora podemos copiar e colar para o segundo blog. Acho que podemos testá-lo agora. O problema de escala pode ser resolvido atualizando o valor de pixel por unidade dos novos sprites Podemos ver que, para os sprites de cores normais, definimos 200 Vamos configurá-lo para esses dois. E aqui encontramos outro problema que não está relacionado à atualização deste vídeo, mas seria bom corrigi-lo. Primeiro, precisamos desativar o arremesso de bola por um período de tempo em que destruímos as bolas correspondentes. Então, isso nos salvará de interferir no processo de destruição Para implementá-lo, vamos até o script monótono e adicionaremos um valor aqui, que será falso por padrão Agora podemos definir isso como verdadeiro no início de nossa rotina. E aqui, no final, esperaremos até que todas as bolas na pista terminem de funcionar. Assim, podemos fazer com que o campo volte a cair. Finalmente, no roteiro do jogo de tiro, precisamos de uma referência ao quadro Aqui, onde lidamos com o clique de disparo, podemos usar o campo para garantir que seja falso. Podemos testar agora. Isso não fixou completamente a parte traseira , porque se você clicar duas vezes muito rápido, ainda poderá atirar nessa bola dentada Mas esse comportamento é aceitável por enquanto, então podemos corrigi-lo mais tarde e nos concentrar nas bolas especiais. Nos vemos no próximo vídeo. 16. S1L14: adicione bola do tipo bomba: Uma colisão quando explode destrói uma ou mais bolas civis. Antes de tudo, precisamos verificar se há um poste entre as bolas que vamos destruir Nós podemos fazer isso assim. Então precisamos descobrir quais bolas a bomba pode destruir. Então, primeiro, vou encontrar um índice de esfera de amplificadores na matriz global. Por enquanto, vamos destruir uma bola antes e outra depois da bomba. Podemos fazer um loop e mover o rádio de bomba para uma variável Índice de um slot após a saliência, vou apenas chamá-lo de índice esquerdo porque está no lado esquerdo da saliência se estiver olhando pela borda da tela E o índice do anterior à bomba será o índice correto. Para os índices, precisamos verificar se eles são válidos, para não sejam menores que zero ou maiores que o índice da lista de matrizes ordenadas Além disso, precisamos garantir que esse lote não esteja vazio e que ainda não o tenhamos em nossa lista de destruidores Se tudo estiver bem, então podemos adicionar essa bola à lista. E a lógica muito semelhante que teremos para o índice correto. Podemos mover a bomba para reduzir o valor das propriedades do jogo. Vamos adicionar uma referência a ela no script Bar. Agora podemos usá-lo aqui. Além disso, para tornar cada método mais curto e mais limpo, devemos mover a lógica para um método separado. Vamos testar. Ótimo. Também podemos ver um bug quando as bolas chegam ao final do caminho, mas não devemos nos preocupar com esse bug, porque mais tarde faremos o jogo parar quando a bola chegar a esse ponto. Então, veja no próximo vídeo, 17. S1L15: adicione bola do tipo reverso: Ok. Reverter, quando explode, faz com que a bola se mova para trás por alguns segundos Como no vídeo anterior, vamos começar verificando se há uma bola reversa na matriz de destruição. Desta vez, não se trata apenas de adicionar mais bolas ao conjunto de destruidores, mas de mudar o fluxo das bolas, precisaremos de uma rotina de carro Vou criar um chamado Start reverse Co. Vou ligar para cá para que não esqueçamos mais tarde. Só por segurança, garantiremos que nada específico aconteça quando iniciarmos essa carotina e que ela não atrapalhe Então, vamos esperar até que qualquer destruição de bola correspondente termine. E todos os espaços devem estar vazios ou as bolas não devem estar em vez de pousar e não em vez de trocar de espaço. Para esse fluxo, precisamos de outro campo, reverso. Nesse ponto, isso se tornará verdade. Deixe-me gerar esse campo ausente. Então, ele criou um campo aqui. Vamos movê-lo para cima, para um campo similar. Da mesma forma que fizemos as bolas se moverem para trás. No vídeo anterior, você pode inverter a direção dos slots introduzindo um campo de direção Ele será um por padrão. Precisamos adicioná-lo aqui também. Então, vamos voltar à nossa rotina. Podemos criar um loop e mudar a direção para menos um para cada espaço de bola Agora vamos esperar por 2 segundos. Agora vamos definir a direção das ranhuras e, finalmente, configurar I reverse para quedas. Vamos verificar. um problema aqui. Neste método, devemos verificar se há I traseiras e parar de produzir bolas Além disso, nos dois slots, onde alteramos as distâncias em algum momento, ele pode se tornar um valor negativo que, como vimos, move slots para a outra extremidade do caminho. Então, para corrigir isso, precisamos verificar aqui. Verificamos se a direção é negativa e a distância percorrida é menor que um. Então, está perto o suficiente do início da passagem e, finalmente, o slot não está vazio, então podemos começar o método de destruição aqui Mas primeiro, se a bola estiver realmente próxima do ponto zero, é possível que ela não desapareça rápido o suficiente até chegar a zero. Podemos verificar se a distância é menor que, por exemplo, 0,5, então podemos simplesmente destruir a bola manualmente. Caso contrário, podemos simplesmente iniciar a destruição da bola. E, em qualquer caso, eventualmente, precisamos limpar o slot. Outra coisa que precisamos fazer para cada slot é que, quando a distância percorrida atingir um valor negativo , vamos configurá-la para o comprimento anterior, que está no último ponto. Vamos verificar novamente. Está bom por enquanto. Vamos apenas mover essa duração inversa para as propriedades do jogo para manter o casaco limpo. É isso mesmo. No próximo vídeo. 18. S1L16: adicione bolas do tipo lento: tempo lento faz com que os slots se movam a 50% da velocidade por alguns segundos. Vou apenas copiar este bloco, mas mudo o tipo de bola para tempo lento. Além disso, ainda não o criamos, mas vamos chamar um cotin aqui com o nome time slow co. Agora, vamos realmente criar essa proteína Será muito parecido com o inverso, então vou copiar esses dois. Vou remover essas linhas aqui, precisamos ter certeza de que as orelhas são falsas. Aqui, alteraremos o valor da direção para 0,5 e, após o término do efeito de lentidão de tempo, redefiniremos para um. Vamos acessar as propriedades do jogo e criar um campo de duração lenta no tempo. Agora podemos usar esse campo. Além disso, podemos ver que há algo errado com o campo de direção aqui. Isso ocorre porque atualmente seu tipo é um número inteiro, vamos corrigir isso Mas antes disso, devemos renomear esse campo para multiplicador de velocidade pois ele ficará mais claro e alterará o tipo Agora, devemos atualizar esse nome de campo em todos os lugares em que o usamos. E, finalmente, podemos testar como funciona. O tempo lento funciona como queremos, mas às vezes podemos ver que uma lacuna após as bolas de esteróides não está sendo fechada Mas vamos nos concentrar nesse bug no próximo vídeo. Devo dizer que muitas vezes podemos descobrir algum bug do jogo que não previmos e isso nos faz decidir o que devemos fazer para corrigi-lo E, em alguns casos, a maneira mais fácil de evitar esse bug é introduzir uma nova regra de mecânica de jogo que não afetará drasticamente a experiência do usuário, mas resolverá o problema Dessa forma, podemos adicionar mais uma restrição que nos poupará muito tempo Vamos desativar o arremesso de bola quando um dos inversos for verdadeiro. Dessa forma, poderíamos evitar muitos casos complicados quando o pouso ocorre próximo ao início do caminho, e pronto neste vídeo. Na próxima. 19. S1L17: refatoração de final de seção e correção de erros: Vamos terminar a seção com algumas limpezas. Vamos fazer uma pequena limpeza primeiro. Em ambos os scripts, essa parte está se repetindo, então podemos movê-la para um método separado Vamos chamá-lo de place in slot transform. Então, podemos substituí-lo aqui também. Em um script destruidor em negrito, podemos inverter esses blocos I. Eu sempre adiciono colchetes aqui para tornar os operadores de retorno mais visíveis Em negrito, podemos reverter isso I. No script de atirador, podemos adicionar esses modificadores de acesso explícitos para iniciar Agora vamos corrigir isso. Podemos ver que, às vezes depois de destruirmos algumas bolas iguais, outras bolas não se movem para posições vazias. Isso acontece porque aqui, quando procuramos um primeiro índice vazio, às vezes ele retorna zero porque, em algum momento, o espaço zero está vazio e uma nova bola que será gerada em breve ainda não está atribuída a esse slot. Então, em vez de uma lacuna aqui, acabamos movendo todas as bolas um espaço para trás para cobrir a primeira. Podemos corrigi-lo apenas começando ou pesquisando, não do zero, mas de um. É isso para este vídeo. Bom trabalho. 20. S2L1: adicione novos sprites: Adicionando novos sprites para o plano de fundo, paredes e jogo de tiro. Eu anexei alguns sprites novos a esta lição. Vamos carregá-los e agora podemos importá-los para nossa pasta Sprite simplesmente arrastando-os para dentro dela. Agora, vamos começar nossa atualização do sprite cinza em segundo plano Em seguida, o atirador. Em seguida, podemos clicar na fábrica de bolas e substituir o Sprite lá Assim, podemos verificar o que temos. Primeiro, podemos ver que o sprite da bola é muito grande. Pode testar valores diferentes no pixel por unidade de entrada. Por exemplo, se você colocar 200, veremos que é muito pequeno e a maneira mais rápida de descobrir qual valor precisamos é trazer uma bola pré-fabricada para a cena, ampliar e alterar seu Assim, podemos ver seu tamanho comparado ao tamanho do colisor circular Então, dessa forma, encontraremos o valor. No nosso caso, será 135. Vou selecionar todos os novos sprites de bola e atualizar seus pixels por unidade para 135 Então, agora podemos remover esse objeto de bola da cena. Vamos correr novamente. Ótimo. Vamos continuar. Podemos ver que o atirador não está com boa aparência. Vamos movê-lo para o centro dessa plataforma em segundo plano. Além disso, gostaria que as bolas não aparecessem no centro do atirador , mas desta parte Podemos adicionar um objeto vazio quando filhos do atirador e podemos gerar bolas lá Ele pode ser chamado de ponto de filmagem. Para esse objeto, estou adicionando um novo campo no script do atirador e podemos usá-lo aqui Vou aumentar a ordem dos atiradores em camadas, para que fique sobre uma bola de tiro Vamos atribuir o campo do ponto de disparo e testar tudo. E precisamos mover esse ponto de disparo para cima. Vamos ver o que temos. A bola não está se movendo junto com o atirador, então precisamos torná-la filha do atirador Mas podemos ver que precisamos limpar o valor principal logo após o lançamento da bola. Entra novamente. Legal. Te vejo. 21. S2L2: sprites de bolas ativadas: Vamos melhorar a experiência do jogador substituindo o sprite normal do bowl por ativo Da mesma forma que para sprites regulares, precisamos de um conjunto de campos para sprites ativos Vou apenas copiá-los e renomeá-los. Além disso, precisamos de um método como esse. Mas vamos usá-lo de fora dessa classe, então devemos torná-lo público. Agora podemos acessar o script da bola e criar um método que mudará o sprite do parafuso. Para acessar o sprite da bola, precisamos de uma referência à renderização do sprite E no método, simplesmente configuramos o sprite para um novo. Vamos abrir o script do tabuleiro, destruir as bolas correspondentes e mover esse código para um método separado que terá o nome de destruir todas as bolas da lista. Aqui na primeira linha do loop, vamos chamar ou atualizar o método Sprite Para acessar o boll factory a partir desse método, o método não deve ser estático Usando a fábrica de bolas, podemos obter um novo sprite para a bola. Bom. Agora podemos mudar para o editor Unity. Vamos preencher novos campos de arborícolas. E estamos prontos para testar. Primeiro, seria melhor modificar ou destruir a animação para que possamos ver melhor o preço ativado. Podemos ir até a bola destruindo a caixa do interruptor. Aqui, em cada atualização, diminuímos ou reduzimos o contador em um pequeno valor Vamos chamar isso de substrhand, como podemos fazer a mão da bola fique mais longa por algum tempo e depois comece a desaparecer Podemos pegar o substrato e torná-lo ainda menor por algum Portanto, podemos ter outra variável que se o contador de downscale for maior que 0,5, será 0,1 e, caso contrário, será um E podemos multiplicar o subsah por esse valor. Como resultado, como o subsahand será dez vezes menor até que o contador de downscale alcance 0,9, o contador downscale diminuirá dez vezes mais lentamente Vamos ver como isso funciona. Podemos ver que o valor 0,1 resulta em uma velocidade muito lenta. Então, vamos mudar para 0,3. Além disso, vamos fazer com que a bola aterrissada tenha a mesma rotação das outras bolas na pista Verificando. Agradável. 22. S2L3: sprite ativo de tiro: Semelhante à lição anterior, substituiremos o sprite do atirador por um ativo Precisamos dividir o estado de desova em dois, desovando na pista e desovando para atirar E quando uma bola terminar de aparecer para atirar, ela estará pronta Isso nos ajudará a definir diferentes sprites de tiro com base no estado da bola de tiro Vamos corrigir o código depois de alterarmos o nome do estado de resposta Então, o primeiro joga com palavras. Você pode ver essas marcas vermelhas na barra de rolagem. Isso indica que uma linha tem um erro. Em seguida, em negrito. Desta vez, outros erros foram causados pelo primeiro. Agora podemos acessar o script do atirador e adicionar dois campos para sprites ativos e inativos Além disso, é melhor mudar a forma como atirador e o tabuleiro dependem um do outro Vou remover uma referência ao quadro. Atualmente, o atirador verifica se o tabuleiro está invertido ou se as bolas correspondentes são falsas ou Mas podemos simplificar isso fornecendo um novo campo no script de tiro O atirador está desativado do lado de fora? Eu adicionei da parte externa para sublinhar que definiremos esse campo somente de fora do script do atirador Então, agora podemos usar esse campo aqui. E precisamos de um método para aumentar o orgulho dos atiradores. Para alterar o sprite, precisamos de uma referência de renderização do sprite. Portanto, se não estiver desativado, será um sprite ativo, caso contrário, inativo Além disso, precisamos verificar se a próxima bola está pronta para ser lançada para que possamos adicionar uma função de seta aqui. E precisamos considerar isso no método Update Sprite. Agora podemos realmente chamar esse método Updates Pride em cada atualização. Também aqui, quando criamos outro disparo de parafuso, precisamos definir sua data para desovar e atirar Acho que esse é todo o roteiro do jogo de tiro. Vamos até o quadro. adicionar uma referência ao atirador Aqui, ao destruir o núcleo das taças correspondentes, desativaremos o atirador no início do crotin e o ativaremos novamente no final O mesmo acontece na cotina reversa. Agora, vamos ao roteiro da bola e adicionar alguns casos para os novos estados. Vou apenas copiar e colar o que desovando com uma diferença Ele mudará o estado para pronto para atirar depois de terminar a desova Além disso, estou gerando casos para outros estados. Não fazemos nenhuma ação específica sobre eles, mas é bom listá-los aqui, incluindo o padrão. Então, mais tarde, caso adicionemos um novo estado e esqueçamos de implementá-lo, ele verá um aviso do IDE. Bom. Agora podemos acessar o editor Unity. Vamos definir o campo de preço dos atiradores e podemos testar o Bom por enquanto. Nos vemos no próximo vídeo. 23. S2L4: adicione música e SFX: Vamos usar músicas e efeitos sonoros gratuitos da Unity Asset Store. Anexei todos os links da lição, para que possamos encontrar facilmente os recursos que vamos usar. Vamos adicioná-los um por um. O primeiro são os materiais terrestres. Usaremos apenas o arquivo de concreto de terra macia. O segundo é o RPG ou kestrl. Adicionaremos somente o arquivo de lente aquecida. O terceiro é o chefe épico. Ele tem apenas um arquivo. A próxima é a fantasia aqui. Vamos importar dois arquivos daqui. Então precisamos desse pacote épico de células Och. Importamos apenas um arquivo daqui. E por último, mas não menos importante, está este pacote de efeitos sonoros gratuito. Precisamos desses três arquivos dele. Como você pode ver, os arquivos importados estão localizados em pastas separadas. Isso não é muito conveniente, então vamos movê-los para alguma pasta comum. Estou criando uma pasta aqui em assets. Vamos chamá-lo de áudio. Agora podemos mover todos esses arquivos de áudio para a pasta de áudio. E pastas vazias podem ser excluídas. O áudio está ocupando muito espaço, então podemos compactá-lo para salvar Além disso, podemos alterar o tipo de lote para garantir que o jogo seja carregado rapidamente O tipo de lote é definido para a carga de compressão por padrão. Mas o problema é que isso tornará o carregamento do jogo mais lento, devemos configurá-lo para streaming Aqui, podemos ver que a compactação padrão desse arquivo é boa o suficiente. Vamos para o próximo arquivo. Estou alterando o formato de compressão para verbos e a qualidade para 80% Portanto, nas saídas, temos menos de 18% da luz original Vamos fazer o mesmo com os outros arquivos , exceto os pequenos. Agora podemos selecionar todos esses arquivos e simplesmente soltá-los na cena. Agora podemos selecionar todos esses arquivos e simplesmente soltá-los na cena. Embora todos estejam selecionados na cena, vamos garantir que todos tenham caixa de seleção Play on a salarial desmarcada Para organizar esse objeto, vamos criar um objeto de jogo vazio e dar a ele um nome de gerenciador de áudio. Podemos fazer com que esses objetos sejam filhos do gerenciador de áudio. É melhor garantir que o gerenciador de áudio e seus filhos estejam posicionados no ponto zero Vou criar um script para o gerenciador de áudio e atribuí-lo ao objeto. Esse script controlará o áudio do jogo. Então, precisamos listar os arquivos de áudio aqui. Uma última para efeitos sonoros e uma lista para música nivelada. Além disso, um campo separado para a música do menu. Vamos atribuir essas propriedades. Precisamos de alguns métodos para reproduzir o áudio. O primeiro reproduzirá efeitos sonoros. Como argumento, ele usa o índice dos efeitos sonoros na matriz. Alteraremos aleatoriamente o tom do áudio para que ele não seja muito repetível. Para o nível de música, tocaremos apenas uma faixa aleatória da lista. Para a música do menu, basta tocar uma faixa. Além disso, vamos voltar aqui e garantir que não toquemos o mesmo efeito sonoro duas vezes. Agora podemos acessar o editor Unity e, como vamos reutilizar esse objeto, vamos transformá-lo em um prefab Agora estamos prontos para usar o que criamos. Podemos acessar o script do shooter e adicionar uma referência ao gerenciador de áudio Então, aqui, quando lançamos uma bola, vamos tocar o efeito sonoro com o Índice dois. Vamos fazer o mesmo no script Br. Aqui, ao pousarmos uma bola, tocaremos um efeito sonoro com o Índice zero. E, finalmente, quando destruirmos bolas iguais, tocaremos um efeito sonoro com o Index one, e é hora de tocar alguma música. Vamos tocar a música de nível no método inicial do borscript Senhorita Duke. É o próximo. 24. S2L5: adicione sprites de caminho e spawner: Uma melhoria pequena, mas necessária. Vamos adicionar um caminho de bola e um sprite esponno. Primeiro, adicionarei esse sprite de nível à cena do jogo. Precisamos definir sua ordem no valor da camada para algo que defina o sprite entre o solo e outros sprites Três funcionarão para nós. Além disso, como está relacionado ao passe, vou colocá-lo abaixo do objeto criador do passe. Podemos ver que o passe não está alinhado com o sprite, então podemos corrigir um pouco o passe Agora vamos adicionar essa colher de bola ao sprite. É melhor renomeá-lo para que seja consistente no estilo de nomenclatura e seria bom colocá-lo sob o objeto de nível na hierarquia Mais importante, vamos movê-lo para o canto superior esquerdo assim. Então, finalmente, podemos testá-lo. Certo. Certo, certo. 25. S2L6: adicione animação de destruidor: Para melhorar a experiência do usuário, vamos criar uma animação para o ousado destruidor. Há um anexo para esta lição que inclui os sprites da animação que vamos adicionar Ele deve ser descompactado aqui na pasta sprite desta forma Vamos para a pasta de criação e direcionar esse arquivo bold destroyer 11 para a hierarquia de sintetizadores. Agora vamos abrir a guia de animação. A propósito, se essa guia não estiver visível, você poderá encontrá-la na animação Top Manu Windows Na guia Animação, eu clico em Criar. Em seguida, nesta janela do Explorer, vou até a pasta Assets e crio uma nova pasta chamada Animations Dentro dela, eu crio uma pasta chamada Bl Destroyer. E finalmente, dentro dele, eu salvo esse arquivo de animação como criação. Vamos agora selecionar todos os sprites nessa pasta e direcioná-los para a janela de animação Enquanto todos os marcadores estão selecionados, podemos simplesmente arrastar por essa barra e expandir o tempo da animação para 1 segundo Podemos verificar como funciona agora. Definindo a ordem na camada como oito. E podemos renomear esse objeto para boll destroyer. Agora vamos criar outro clipe para essa animação. O nome será Idle. Vá para a pasta chamada Idle e, como antes, selecione todos os arquivos e arraste-os para a animação, toque na linha do tempo e expanda-a em 1 segundo Ótimo. Temos dois clipes da animação, então vamos fazer com que ela mude da criação do clipe para o clipe Idle Isso pode ser feito na guia do animador. Só precisamos clicar com o botão direito do mouse em Fazer transição. E no gráfico aqui, precisamos organizá-lo dessa maneira. E mais algumas coisas. Vamos movê-lo aqui para o verdadeiro destruidor de bolas em cena Além disso, talvez seja melhor renomear isso para animação de destruidor de bolas porque o verdadeiro destruidor de bolas já tem Vamos colocar a animação logo abaixo da real. Testando sua aparência. Só estou me movendo um pouco. Fantástico. 26. S3L1: menu principal: Nesta lição, vamos criar uma cena do menu principal com apenas três botões. Existem sprites masculinos anexados às aulas, então você pode carregá-los e depois adicioná-los aqui à pasta Sprite Em seguida, vamos criar uma nova cena usando arquivo, nova cena, dois D básicos e, para criar, é melhor salvar a cena imediatamente. Ele deve ser salvo na pasta de pecados com o nome do menu principal. Agora vamos para a pasta Sprite e direcionar o sprite da masmorra Bground para a cena em que está arqueado Renomeando-o para Plano de fundo. Além disso, como fizemos no vídeo de configuração do Cursin, definiremos o tamanho da câmera principal para 9,5 Para tornar o plano de fundo um pouco diferente do cenário do jogo, vamos torná-lo mais escuro Agora vamos implementar uma tela de menu. Primeiro, precisamos adicionar uma tela vazia. Agora, vamos adicionar um botão p de malha de texto. Clique em Importar aqui. Precisamos de muitos botões seletores e tamanhos de fonte de 80 serão mais adequados Esse botão será o novo jogo. Eu gostaria de tornar o botão transparente com o texto branco, alterando a cor para completamente branco. Para os planos de fundo dos botões, estou limpando esse sprite padrão selecionando-o e pressionando Em seguida, alterando essa opacidade de cor para zero. Vamos voltar ao texto novamente, alterando o material por conjunto para contorno, deixando-o em negrito e aumentando a espessura do contorno O estilo do botão está pronto. Vamos fazer algumas cópias desse botão. A primeira cópia será um botão contínuo e a segunda será um botão de saída Eu deveria renomear esses botões de acordo com o texto. Podemos selecionar os três botões e movê-los juntos. Agora, vamos adicionar um espaço de imagem vazio e selecioná-lo. Precisamos direcionar o orgulho do logotipo para o campo da imagem de origem e clicar em Definir tamanho nativo. Vou movê-lo para o topo da tela e também seria bom renomear o objeto para logotipo Será muito conveniente ter esses objetos na mesma ordem em que são exibidos na cena. Vou mover isso para o topo aqui também. Você está quase terminando a parte da interface do usuário e , portanto, podemos criar um script com o nome menu principal. Anexando-o à tela. O primeiro método será para o botão contínuo. Aqui, só precisamos carregar a cena do jogo. O novo botão do jogo terá o mesmo por enquanto. E o botão de saída encerrará o aplicativo. Apenas um aviso de que o botão de saída não fará nada ao executar o jogo no editor, então não se preocupe ao perceber. Podemos ver esse destaque afirmando que precisamos adicionar a cena do jogo às configurações de construção. Então, vamos lá. Isso pode ser feito simplesmente arrastando e soltando o jogo e as cenas do menu principal aqui E agora podemos simplesmente fechar a janela. Temos botões na interface do usuário e temos um script que os atribui à tela. Agora vamos conectar tudo isso. Vou arrastar a tela até aqui e selecionar o método correspondente do manuscrito principal Semelhante nos próximos dois botões. Um bom menu principal deve ter sua música. Vamos voltar ao roteiro. Precisamos do gerenciador de áudio. Então, podemos simplesmente chamar esse método. Voltando ao editor Unity para adicionar o prefab do gerenciador de áudio a essa Finalmente, podemos testá-lo. 27. S3L2: menu de parada: Agora, adicionaremos uma funcionalidade de pausa e pausa ao nosso jogo Vou criar uma tela, adicionar um botão a ela. Esse botão terá um sprite específico para que possamos remover o texto aqui Vamos direcionar o sprite para a entrada de classificação de imagem desse botão Clique no tamanho nativo definido. Podemos colocar esse botão no canto superior direito, definindo o ponto de ancoragem para ele, e a posição deve ser igual aproximadamente metade da largura e altura do botão, mas com um sinal de menos Agora, vamos adicionar um painel que escurecerá a cena do jogo, para que fique claro que estamos em algum tipo de menu Vou renomeá-lo para o painel PoWs e o botão para o botão Powe Vamos duplicar esse botão, então teremos um botão separado para pausar Agora, vamos adicionar um botão para acessar o menu principal. Vamos ancorá-lo na parte inferior central e o resto será semelhante ao que fizemos no vídeo anterior Precisamos de um novo roteiro. Vamos chamá-lo de menu Pausa e atribuí-lo ao Canvas. No script, precisaremos de uma referência ao painel POS para desativá-lo quando pressionarmos Pausa Precisamos de um método para acessar o menu principal. E precisamos de dois métodos para pausar e pausar. Então, eles simplesmente desativam e ativam o painel de pausa, que deve ser desativado por padrão Além disso, precisamos de uma referência ao quadro para informar que a pausa está ativada Vamos criar um novo campo de touros para isso. Podemos configurá-lo em nossos métodos de pausa e pausa. Além disso, para interromper a contagem do tempo quando estamos no menu Pausa, vamos definir a escala de tempo dessa escala de tempo para zero aqui e voltar para um aqui Agora podemos acessar o editor do Unity e atribuir o campo do painel Pausa e também os botões Contestado. Há três problemas aqui. Primeiro, precisamos interromper a rotação do atirador quando a pausa estiver Então, estou adicionando uma referência ao quadro aqui e agrupando esses dois métodos com uma instrução if Em segundo lugar, quando fazemos uma pausa ou retomamos a pausa, o atirador pega isso como um clique e atira uma bola na direção do botão de retomar a Para evitar isso, podemos alterar o método de pressionar o botão do G Mouse aqui para ativar o botão do mouse. Ele acionará o nó quando clicarmos no botão do mouse, mas ao invés disso, quando soltarmos o botão. Isso nos dá algum tempo para definir o campo espouse como verdadeiro e podemos adicionar essa verificação aqui E quando saltamos, não devemos fazer com que o cônjuge caia Em vez disso, podemos esperar 1 segundo e soltá-lo. Vamos usar um código aqui. O terceiro problema é que, se pressionarmos a pausa, ela definirá a escala de tempo E se quisermos ir ao menu principal e clicar em Continuar, a escala de tempo ainda é zero porque não pressionamos a pausa e , portanto, não redefinimos a escala portanto, não redefinimos Para corrigir isso, podemos simplesmente configurá-lo aqui. Vamos testar novamente. Nós homens. Ótimo. 28. S3L3: adicione níveis: Vamos adicionar o sistema de níveis e salvar a última jogada no nível para que possamos continuar o jogo. Primeiro, vamos criar um painel de interface do jogo. Esse botão de pausa pode ser movido para cá agora. Também precisamos exibir o tempo do nível, adicionando uma nova malha de texto aqui. O texto ficará assim. O tamanho do telefone é 80. O ponto de ancoragem é o centro superior. E o alinhamento do texto é o centro, e ficará melhor se estiver em negrito Além disso, vamos duplicar isso para exibir o nível atual. Para programar isso, precisamos de um novo script. Vamos dar a ele o nome de game UI Canvas, e podemos atribuir o script à tela. No script, precisamos referências ao tempo do nível e ao número do nível. E precisamos de um método para atualizar o tempo do nível. Seu parâmetro levará alguns segundos desde o início do nível. Podemos fazer a parte das médias dividindo o valor por 60. E pegando uma parte inteira dela. A segunda parte, podemos obter de uma sobra dessa divisão e, novamente, pegamos uma parte inteira dela O tempo ficará assim. Minutos, dois pontos e segundos formatados em um número de dois dígitos Também precisamos de um método semelhante para atualizar o número do nível, mas será muito mais simples. Nós apenas prefixamos o número com uma palavra nivelada. Agora podemos acessar o script Br e chamar esses métodos. Vou apenas colocar esses valores para verificar se está funcionando corretamente. Sim. Parece bom. É hora de armazenar o valor do último nível da placa, então vamos continuar jogando a partir dele depois de fecharmos o jogo. Podemos implementar isso no script de propriedades do jogo. Vamos criar um novo campo, último nível. Vou torná-lo privado para que não seja acessível de fora do script, e vamos controlar estritamente o que fazemos com esse campo. Primeiro, deixaremos a leitura desse valor fornecendo essa função de seta. Em seguida, deixaremos o incremento desse valor usando esse método simples Agora vamos ao script do quadro e usaremos isso. Primeiro, precisamos rastrear um tempo de nível, então vou criar um novo campo aqui. Atualizaremos esse campo com o passar do tempo e atualizaremos o Gami com esse valor Se o tempo do nível atingir 60 segundos, incrementaremos o valor do último nível, atualizaremos o número do nível na interface e redefiniremos o contador do tempo do nível para zero Além disso, no estágio inicial aqui, precisamos obter o valor do último nível das propriedades do jogo e o tempo do nível será zero por padrão. Quanto à duração do nível, será bom tê-lo também nas propriedades do jogo. Vamos fazer isso. Vou configurá-lo para 10 segundos por enquanto, então será mais fácil testar. Podemos usar esse valor agora no método de atualização da placa. Vamos testar como funciona. Bom. Agora, vamos salvar o valor do último nível na memória de longa data De uma forma básica, podemos usar as preferências do jogador aqui. Usaremos essa chave personalizada para o último nível antes que o método de inicialização da placa seja chamado Podemos usar o método awake aqui para carregar o último valor do nível da memória Talvez seja melhor mover o K para algum campo. Vamos garantir que digamos um valor padrão para o último nível quando rodamos o jogo pela primeira vez. Quando estamos testando o jogo e precisamos redefinir todos os valores salvos, podemos editar limpar todas as preferências do jogador. Vamos rodar o jogo e testar o que temos. Certo. Começa no nível salvo. Como aumentamos a velocidade da bola em todos os níveis, precisamos garantir que efeitos como lentidão do tempo também levem em consideração essa velocidade. Então, vamos passar para um método separado. Esse método usará um parâmetro para o multiplicador de efeitos e passaremos esse valor aqui Além disso, não deve ser estático. O valor da velocidade será o multiplicador do efeito, multiplicado pela velocidade do nível Vamos supor que a velocidade do nível básico seja um mais o número do último nível multiplicado por 0,3 Na verdade, devemos mover esse método para as propriedades do jogo. Deve ser público aqui, e o 0.3 pode ser iniciado como um campo. Os slots aumentam a velocidade por nível. Deve ser flutuante em vez de inteiro. Vamos voltar às palavras e usar esse método. Você também deve definir a velocidade inicial ao inicializar os dois slots É assim que funciona. Podemos ver que essa bola não consegue atingir a velocidade das outras. Então, vamos adicionar esse multiplicador na aterrissagem e nos outros lados da bola Podemos começar do estado destruidor. A aterrissagem. Acho que os slots de troca são suficientes. Vamos testar. Por que, por que, por quê. Parece que esse multiplicador de nível de 0,3 é muito grande, então vamos tentar Também devemos nos certificar de alterá-lo aqui no editor do Unity, limpando as preferências do player e verificando novamente Legal. 29. S3L4: adicione cenário de jogo: Vamos definir e acionar um game overflow. Quando um jogador perde um jogo, a mensagem de fim de jogo não deve aparecer abruptamente, mas devemos deixar o jogador descobrir que algo está errado Precisamos de um corrupto aqui. Além disso, precisaremos de um campo para esse estado. Vamos para o cotin. Então, primeiro, desativamos o atirador e configuramos o campo de jogo como verdadeiro Em seguida, aguardaremos 2 segundos. E precisaremos mostrar a mensagem na interface do jogo. Vamos até lá e criemos um método vazio para isso primeiro. Pode ligar depois de 2 segundos aqui. Voltando ao jogo, não precisamos desse código, então vou removê-lo Precisamos de uma referência a um painel de game over, que precisamos criar posteriormente. Oh, sim, precisamos começar o Monte. Então, no início, desativamos o painel de fim de jogo, mas o habilitamos quando o jogo termina. Vamos até o editor do Unity e criaremos um novo painel na tela. Será o painel do game over. Deveria estar mais escuro. Precisamos adicionar uma mensagem de texto. O estilo será semelhante ao que fizemos antes. Mas o tamanho do telefone será maior. Além disso, precisamos de alguns botões, então podemos simplesmente ir ao painel Power, duplicar esse botão e movê-lo para o nosso painel Este botão voltará a ser reproduzido. Precisamos de outro botão para o menu principal. Vamos criar metais para esses padrões. O botão do jogo do jogador apenas recarregará a cena e o menu principal carregará a cena do menu Além disso, precisamos desativar o painel do jogo I quando mostramos o painel do fim do jogo, adicionando uma referência ao painel do jogo I e alterando sua posição aqui e aqui. Vá até o editor do Unity e atribua os painéis. E podemos atribuir nossos metais aos botões. Finalmente, podemos usar o roteiro real mais ousado e acionar o cenário de fim de jogo Precisamos de uma referência ao conselho. Quando o destruidor de bolas colide com a bola na pista, nós verificamos Se o jogo ainda não acabou, nós o começamos. Além disso, seria bom se acelerássemos todas as bolas quando o jogo terminasse. Vamos encontrar esse lugar no código. Na verdade, ele é duplicado em alguns lugares para que possamos movê-lo para um método separado. Acelere os slots. Ele deve usar o multiplicador de efeito como parâmetro. Agora podemos usá-lo no game over cotin aqui. Além disso, podemos colocá-lo em vez de duplicações, mas precisamos ter certeza de que passamos o valor correto do parâmetro Vamos testá-lo. Podemos ver que, enquanto olhávamos para a tela de fim de jogo, o nível de alguma forma saltou de 12 Para corrigir esse problema, basta colocar uma declaração I aqui, onde contamos o tempo do nível. Então, vai parar de contar quando o fim do jogo for verdade. Vamos testar novamente. Ótimo. E 30. S3L5: comece um novo jogo: H. Nesta lição, adicionaremos funcionalidade ao novo botão do jogo no menu principal. Se você já está cansado, deixe-me animá-lo porque esse vídeo será muito simples Então, vamos ao manuscrito principal e criemos dois mapas vazios. Confirme o novo jogo e cancele o novo jogo. Precisamos de uma referência às propriedades do jogo e ao campo público para o painel de confirmação, que criaremos posteriormente. Vou mover esta linha para o método de confirmação do novo jogo. Em vez disso, vou ativar o painel de confirmação. Vamos acessar o script de propriedades do jogo e criar um método para definir o último nível. Nesse método, definiremos o último nível como igual a um e salvaremos esse valor nas preferências do jogador. Vamos chamar esse método a partir do método de confirmação. No método de cancelamento, apenas ativaremos o painel de confirmação. Esqueci de inicializar as propriedades do jogo aqui, vamos fazer isso No editor Unity, vamos adicionar um novo painel à tela e chamá-lo de painel de confirmação. Estou escurecendo o suficiente para cobrir a maior parte do imposto em segundo plano, e precisamos de um texto aqui Tem certeza de que deseja começar do nível um? Vou torná-lo maior e centralizá-lo. R Agora, podemos duplicar o botão de saída e criar um botão sim a partir dele Mais uma vez, duplique o botão sim e crie um botão não Agora, podemos atribuir esses botões. E ficará mais limpo se movermos todos esses itens de menu para um painel separado e o desativarmos quando mostrarmos essa mensagem de confirmação. Então, vou adicionar esse painel do menu principal. E mais todos os itens relacionados abaixo dele. Agora podemos criar um campo para o painel do menu principal. Podemos atribuir esses painéis. E aqui fazemos assim. Ative a conformação, desative o principal. Desative a confirmação, ative o principal. Desative a confirmação por padrão. Menos teste. H. Temos um erro. É porque o objeto de propriedades do jogo não existe na cena do menu principal. Então, vamos salvar a cena, ir até a cena do jogo e transformar as propriedades do jogo um prefab arrastando-o para a Podemos salvar e voltar ao menu principal agora e adicionar esse novo prefab à cena aqui aqui. Vamos testar novamente. Ótimo. Mãe, hmm. 31. S3L6: corrija erros e otimize: U. Neste vídeo, corrigiremos a maioria dos bugs que pudemos notar antes Começaremos com esse bug. Ao reverter, às vezes, podemos ver pequenas bolas que se movem para trás além do ponto de desova Vamos acessar o script da bola e criar um maton que verificará se a bola está localizada perto do início do caminho, que é nosso ponto de desova das bolas na pista Podemos usar essa função para obter a distância na pista dessa bola. Digamos que, se essa distância for menor que 0,2 , essa bola estará próxima o suficiente. Quando destruímos uma bola, podemos verificar se o tabuleiro está invertido e se a bola está realmente perto do ponto de desova. Nesse caso, destruímos imediatamente a bola. Vamos testar algumas vezes. Parece que consertamos isso. O próximo bug é que podemos atirar uma sequência de bolinhas, apesar de isso poder ser um recurso, se você quiser. Precisaríamos fazer muitas mudanças para que tivesse uma boa aparência. Por enquanto, vamos supor que isso seja um bug e vamos corrigi-lo. Podemos acessar o script do atirador e, dentro do método de atirar na próxima bola, podemos adicionar um cheque Se não houver próxima bola ou esta bola não estiver pronta para ser lançada, retorne. Testando isso. que precisamos mover o defeito para dentro do método e depois da verificação que acabamos de adicionar Verificando novamente. Ótimo. A próxima coisa não é totalmente traseira, mas é bom ter um recurso. Se as bolas voltarem ao contrário, depois disso, as novas bolas serão completamente diferentes das anteriores. Mas podemos lembrar as bolas que destruímos contrário e gerá-las de volta depois delas. Para esse recurso, precisamos de uma pilha porque ela funciona usando o princípio da primeira perda Farei com que seja lido apenas porque o inicializaremos apenas uma vez e adicionaremos ou removeremos elementos da mesma instância Apenas removendo o código não utilizado. Quando geramos bolas na pista, podemos chamar esse método para obter um tipo de bola aleatório. Nesse método, verificaremos se há algum tipo nessa pilha Se sim, devolveremos o último item e, automaticamente, ele será removido da pilha Além disso, precisamos de um método que usaremos de fora, que adicionará um tipo à pilha Como a funcionalidade que destrói as paredes dos motoristas está localizada no script do slot de bola, vamos lá Precisaremos de uma referência ao fator bola aqui, então é isso. E vamos adicionar modificadores de acesso explícitos a esses métodos. Podemos ver que há uma lógica um pouco complicada aqui. Talvez possamos simplificá-lo primeiro, esse bloco verifica se a distância percorrida é maior que o comprimento do caminho. É semelhante ao bloco abaixo onde verificamos se a distância é menor que zero, então podemos colocar esses dois blocos juntos. Então, podemos mover a lógica dentro desse grande bloco para um método separado. Podemos chamá-la de destroy ball por causa do que ela realmente faz. Vamos lá e podemos ver que podemos adicionar um parâmetro a esse método para mover a lógica relacionada à distância percorrida. E aqui deveria estar 0,5, mas vou mover isso para método separado enquanto me lembro. A única coisa que esses dois blocos fazem é reduzir a distância percorrida para não ultrapassar a faixa do comprimento do caminho Assim, podemos chamá-la de distância de corte percorrida. Além disso, devemos colocar s aqui para torná-los mais claros de entender. Voltando aqui, podemos adicionar o tipo de parede que vamos destruir à pilha E não devemos esquecer de colocar 0,5 aqui. Finalmente, testando W. W. W. Parece muito bom. A outra coisa que podemos corrigir é que quando a bola reversa está localizada aqui, está claro se, se a destruirmos, as bolas se moverão para trás porque a seta na bola na verdade aponta em uma direção completamente diferente Vamos consertar isso. fazer algo aqui na atualização do slot da bola. Eventualmente, moveremos essa lógica para um método separado. Vamos fazer isso vice-versa e chamar um método aqui primeiro. Digamos que será examinado na direção do caminho. Agora podemos criar esse método. Para obter a direção certa, precisamos de dois pontos A e B. Se o ponto B é o ponto no caminho onde a bola está localizada, que é esse, então o ponto é algum outro ponto que é uma unidade de volta no caminho. Então, podemos obter o vetor de direção como este. A menos B, e podemos definir o ponto de transformação acima do slot no ponto nessa direção Portanto, esse eixo pode ser pulado, pois está no jogo. Além disso, na verdade é oposto em vez de torres. Agora vamos para o script da bola e fazer com que a bola transforme isso para cima, igual ao seu vetor de lotes ascendentes aqui e aqui. Testando, podemos ver que a bola está girando neste momento Provavelmente, podemos escolher um vetor menor porque se a distância percorrida for menor que um, o vetor de direção será assim Podemos definir 0,1 aqui. Tente novamente. Legal. O próximo dinheiro ocorre quando há algumas bolas do tipo bomba que serão destruídas, então apenas a primeira bomba realmente explode e o resto é contado como bolas simples Podemos facilitar a reprodução dessa capa acessando a fábrica de bolas e editando essa linha Agora vamos ver o que podemos fazer para corrigir isso. No script do tabuleiro, esse código procura apenas a primeira colisão e, em seguida, verificamos se essa colisão existe e, finalmente, adicionamos bolas irmãs à lista de destruição e podemos simplesmente fazer com que seja um loop Primeiro, filtramos todos os slots que têm uma bomba dentro. Em seguida, iteramos sobre cada um deles usando um para cada loop. Só precisamos ter certeza de que o nome da variável está correto e, em seguida, estaremos prontos para testá-la. Ótimo. Não se esqueça de reverter essa alteração O próximo bug é que, em algum nível, precisamos que a bola de tiro seja gerada mais rapidamente. Então, vamos corrigir esses dois. Basta ir até o slot da bola, copiar esta linha, passá-la aqui, e aqui, as que estão nela. Feito. O próximo problema acontece quando lançamos uma bola fora do tabuleiro. Podemos ver que eles não estão sendo destruídos. Em vez disso, são apenas mais e mais deles. Então, o que podemos fazer é criar algum objeto fora do tabuleiro que destruirá essas bolas. Vamos criar um objeto vazio e chamá-lo de bandeja de preenchimento de bolas. Em seguida, adicionamos um colisor de bordas a D a ele. Precisamos ter certeza de que sua posição está definida como zero em cada eixo. Agora podemos editar o colisor. Além disso, precisamos adicionar um corpo rígido a D e alterar o tipo de corpo para cinemático porque as bolas não têm corpo rígido em D e precisamos que pelo menos alguns dos objetos em colisão o Podemos colocar essa dor abaixo do contêiner da ranhura da bola na hierarquia Agora vamos até a pasta do script e criaremos um novo script. A bola preenche a dor. Vamos atribuí-lo ao objeto da dor. No script, podemos limpar isso. Precisaremos apenas do gatilho ativado para entrar no método. Então, estamos verificando se o objeto com o qual colidimos tem a tag ball Em seguida, destruímos seu objeto de jogo. E ainda não temos essa tag, então precisamos ir ao editor Unity, clicar nas camadas no canto superior direito e depois editar as camadas. Uma nova bola tecnológica. Em seguida, precisamos acessar os pré-fabricados, clicar duas vezes na bola pré-fabricada e atribuir essa Podemos voltar e estamos prontos para testá-lo. Ótimo. Em seguida, seria bom recompensar um jogador por terminar um nível destruindo todas as bolas que estão atualmente em andamento no momento em que o nível muda para o próximo Além disso, será consistente com o caso de você carregar um nível clicando em continuar no menu principal. Desta vez, será apenas uma mudança de linha. No script bar, o método de atualização, chamaremos o método destroy all balls in list. O valor do argumento será todos os espaços de ambos os slots por distância em que o campo de bola não esteja vazio. Nós podemos fazer isso. Manhã. Ótimo. E por último, mas não menos importante, vamos ajustar algumas propriedades do jogo. Então, vamos definir a duração do nível para 60 segundos e a velocidade baixa da bola para 1 segundo. Não se esqueça de trocá-los aqui também. E precisamos aplicar substituições para garantir que as alterações sejam salvas no prefab Estamos prontos para testar . Bom trabalho.