Nesta terceira parte do workshop, vamos criar peixes que podem detectar obstáculos em
seu ambiente e se afastar deles.
Agora, para começar, o que eu criei aqui é exatamente o mesmo programa que você teve antes do
anterior, mas eu adicionei em um plano de terra com alguma textura de areia e este pilar, que será nosso obstáculo .
Você pode adicionar qualquer coisa à cena como um obstáculo.
Esse pilar em particular que recebi da Asset Store aqui, é gratuito,
é chamado Stylize Sand Pillar, se você quiser usá-lo. A primeira coisa que você precisa fazer é adicionar um colisor ao seu objeto, então selecione-o
e vá até o Inspetor ... [Adicionar componente] ... Box Collider.
Então, vamos testar se o peixe está prestes a colidir com esses objetos.
É um pouco diferente dos testadores de caixa delimitadora que estávamos fazendo antes. Para testar isso minuciosamente, você também
precisará garantir que os peixes vão nadar através do seu objeto.
Então, para começar, iremos ao FlockManager e o FlockManager no meu caso,
aqui, está sentado acima deste pilar.
Vou movê-lo para baixo para que fique dentro desse pilar e os peixes precisem nadar através dele para
chegar à posição do FlockManager como sua posição de meta e para garantir que
isso não mude
enquanto estamos Nos testes, você precisará acessar o código do FlockManager
e, na parte aleatória desta atualização, vamos comentar a nossa configuração da localização aleatória da meta e usar
a localização definida para o FlockManager.
Portanto, se você salvar isso, volte e jogue para testar se os peixes realmente nadam através do
seu objeto, você pode vê-los agora, começando a nadar em direção à meta do FlockManager e atravessando o
colisor.
O que é realmente importante neste momento é porque colocamos um Box Collider em nosso pilar, não queremos um colisor
de física nos peixes, porque não faremos dessa maneira.
Portanto, verifique se o seu peixe não tem um colisor.
Se você precisar que seus objetos reunidos tenham um colisor, precisará usar
diferentes camadas de física para garantir que os peixes não colidam com seus objetos na cena.
Agora, a maneira como conseguiremos evitar obstáculos com um colisor de física é fazer um radiodifusão
física a partir da posição de cada peixe ao longo de seu vetor avançado.
Depois testamos se esse raio colidiu com alguma coisa e, se tiver, afastamos o peixe.
Integraremos essa funcionalidade ao script do Flock, portanto, abra seu script do Flock. Na atualização, onde determinamos se ainda
estamos dentro de nossa caixa delimitadora (que estava aqui), adicionaremos um segundo
teste que é o nosso raycast de física e será um 'OU' nessa declaração if .
Portanto, se estamos fora da caixa OU atingimos algo com nosso raycast. Para executar um raycast, precisamos criar
nosso item RaycastHit 'hit' e depois usamos a Física. Raycast, a posição em que o raio está começando
e a direção do raio (nesse caso, será a direção para a frente do
seu peixe, multiplicada por quanto tempo você deseja que esse raio).
Agora, se você fizer isso por muito tempo, o peixe pensará que está colidindo com algo quando estiver
muito longe dele.
Se você o fizer curto, o peixe chegará perto dele antes
de decidir que precisa virar.
Portanto, este aqui (o próprio vetor direto) terá apenas 1 comprimento.
Então já está normalizado e multiplicado por ... depende de você, é o quanto você deseja que o peixe reaja com
base no quão perto eles estão e então estamos agarrando o ponto de impacto do nosso raycast. Agora, há outra função raycast que você pode executar
que apenas informa que você atingiu alguma coisa e não retorna onde atingiu,
mas usaremos esse
ponto de vida um pouco mais tarde.
Agora essa é a nossa parte 'OU'
e depois vamos para
'virar = verdadeiro' se nosso raio de transmissão atingiu alguma coisa.
Agora, o que vou fazer aqui embaixo é colocado em uma pequena linha de depuração (e você também pode fazer isso) porque
quando você está tentando depurar A. EU. é uma dor de
cabeça absoluta se você estiver sentado olhando a tela e tentando descobrir o que seus
personagens estão fazendo e se estão fazendo a coisa certa. Nesse caso, queremos saber QUANDO o peixe está virando e queremos saber POR
QUE o peixe está virando.
Então, eu vou desenhar o raio real que o peixe está projetando quando está no modo de rotação e isso vai nos
ajudar muito.
Portanto, salve isso depois que você tiver feito e depois voltaremos ao Unity e pressione Play.
Está bem.
Agora você pode ver muitas linhas vermelhas acontecendo. Estes são seus
raios
de peixes quando eles estão girando; portanto, se eles estão voltados para o pilar, o raio deles quando atinge o
pilar, aparecerá vermelho e indicará que eles estão entrando no modo de rotação como bem.
Agora você pode ver, neste caso, eles estão circulando ao redor, entraram nesse tipo de ritmo em
que não estão se transformando aqui.
Poderíamos entrar no FlockManager e aumentar a velocidade de rotação, para que eles girassem.
Você pode ver lá. Agora todos estão se transformando nesse pilar, mas não parecem estar
se afastando do pilar.
A razão para isso é a maneira como codificamos para onde eles vão virar.
Se você
se lembrar (vamos voltar ao código) quando estivermos mudando, vamos nos voltar para o centro do FlockManager e
o centro do FlockManager também é o
objetivo, e atualmente o colocamos no meio do nosso pilar.
Portanto, isso não vai funcionar, neste caso, porque toda vez que nosso raio colide com algo, ele diz: "Ok, eu tenho que
me virar, mas preciso
me
virar para o centro do meu gerente" e, portanto, a coisa
estamos tentando nos afastar está em conflito com o lugar para onde vamos nos virar.
Então, temos que criar um local diferente e um objetivo diferente para o nosso peixe 'virar' e, para
isso, tiraremos um pouco de inspiração de um jogo de bilhar.
Quando o raio do peixe atinge o obstáculo, ele o faz em um ângulo específico.
Agora, se o peixe fosse uma bola, você poderia prever como ele ricochetearia na superfície do obstáculo, assim como
uma bola de bilhar salta do lado de uma mesa. Pela física, sabemos que o ângulo de incidência (a)
é igual ao ângulo de reflexão (b).
Portanto, podemos calcular uma nova localização da meta para nossos peixes usando o vetor que se afasta
do obstáculo.
Em outras palavras, queremos alinhar o vetor avançado do peixe com o vetor de reflexão. Para calcular o vetor
de reflexão, usamos o ponto de vida que o raycast gera
e o método 'reflect' disponível no Unity. O método de reflexão requer o vetor recebido e o normal da superfície
atingida e retorna o vetor enviado. Para colocar isso em nosso código, voltamos ao rebanho. script cs, no
método Update e o que vamos fazer é recalcular essa direção com base no que está acontecendo.
Portanto, se você atingiu o lado do contêiner (saiu da caixa delimitadora), queremos que a direção
volte ao centro dessa caixa.
Caso contrário, se você acertar alguma coisa, então você quer se virar de acordo com o vetor de reflexão.
Então, vamos começar por aqui. Após o RaycastHit, observe que
também acabei de adicionar este novo RaycastHit aqui, para que não receba um resultado indefinido quando for usá-lo
mais tarde.
Então, configuramos para pelo menos alguma coisa e inicializamos. Aqui embaixo, vou mover
essa "direção" de baixo para "girar". Vamos tirar isso
daqui e colocá-lo aqui.
Agora você não precisa defini-lo como nada aqui e pode defini-lo como 0, pois será
definido nas próximas duas instruções if.
Então, depois disso (deixe-me colocar um espaço para torná-lo mais claro), faremos 2 testes 'se'.
Não usaremos mais esse 'OU'.
Então, vamos nos livrar do 'OR', transformaremos isso em uma declaração if independente.
Portanto, se a posição estiver fora da caixa delimitadora, colocaremos 'virar = verdadeiro' e, nesse ponto, é onde
queremos que a direção seja igual a ISSO.
Agora já está definido para isso, então, se estiver definido para isso, você não precisará defini-lo novamente. Se você definir isso
como 0 lá em cima, poderá pegar ISTO, coloque-o
aqui e depois defina-o como Vector3. zero; Agora, a próxima instrução
if será um 'else if' no
raycast de física e, neste caso, se tiver atingido algo, então, novamente, é verdade, removeremos nossa linha de depuração porque não precisamos
mais disso e em vez disso 'direction = Vector3. Refletir'.
Este é o método Reflect no Unity que podemos usar e o Reflect acontece devido a um vetor recebido (que é o nosso vetor avançado em nossos
peixes) e o normal ao acerto (que será atingido). normal).
Portanto, o RaycastHit contém todo tipo de informação sobre a posição atingida, é normal
e várias outras coisas que você pode consultar no manual do Unity.
Agora, isso criará 'direção' para ser o nosso vetor de reflexão que será usado aqui
em baixo, se estivermos virando para que a direção ainda esteja aqui embaixo, não fizemos nenhuma alteração nessa.
Então salve isso e agora podemos ver o que temos.
Pressione Play e agora descobriremos que nossos peixes não nadam através do pilar.
Eles podem cortar a borda e podem ter partes deles que atravessam o pilar porque lembre-se de que estamos fazendo um raycast, então essa é uma
'única linha' para verificar se atingimos algo. Não estamos verificando se
o corpo inteiro atingiu alguma coisa.
Você pode colocar um colisor e fazer com que o peixe se vire quando ele atingir. Você precisaria tornar esse colisor um pouco
mais longo que o peixe, para que ele soubesse quando atingisse algo e depois começasse a virar, mas essa é uma
maneira muito barata (em termos de processador) de fazê-lo e você pode ver aqui, agora
que temos esses peixes (e se eu voltar ao meu gerente de rebanho e apenas
aumentar a velocidade de rotação deles para se aproximar um do outro),
eles estão evitando a coluna.
Vamos voltar ao código do FlockManager e colocar de volta nossos locais aleatórios para o nosso goalPos
na atualização que removemos antes. Vamos salvar isso e agora também podemos adicionar outro rebanho.
Então, o que vou fazer é pegar o FlockManager, vamos movê-lo para fora da coluna e, em seguida,
pressionar Ctrl-D para duplicá-lo e movê-lo para lá e para as
casas pré-fabricadas, neste caso, vou fazer o rosa peixe.
Portanto, o
peixe rosa que você já deveria ter incluído e terá o script Flock anexado a ele.
Ok, então vamos pressionar Play e agora temos 2 bandos de peixes separados
e você pode alterar o comportamento de cada rebanho apenas definindo sua velocidade de rotação, sua distância vizinha, sua velocidade
máxima ... a partir daqui,
as possibilidades são praticamente infinitas.
Você pode ter um aquário muito bom montado com esse
lote e também pode substituir o peixe por um pássaro se quiser algo no mar também.
Então, espero que você tenha gostado disso, porque flocagem é realmente o meu A. favorito EU. algoritmo e acho
absolutamente fascinante, os resultados obtidos com essas regras simples.