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