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.