Bem-vindo de volta à segunda parte do Flocking. O que você pode ver na tela é o programa
que paramos com a última vez.
Portanto, nossos peixes estão reunidos e estão reunidos de acordo com algumas configurações que temos em nosso FlockManager.
As velocidades mínimas e máximas
são as velocidades iniciais dos peixes e elas influenciam, mas você não pode alterá-las quando estiver em
funcionamento e trabalharemos nisso um pouco mais tarde, mas
no que diz respeito à Distância do vizinho, você pode modificar isso em tempo de execução.
Portanto, se eu diminuir a Distância do vizinho, devemos ver que nosso rebanho começará a se separar porque
não há mais necessidade
de rebanho, mas aumente novamente.
Ele não une todos os peixes necessariamente juntos, apenas os que estão
distantes um do outro, e você pode ver neste exemplo aqui que inicialmente todos estavam no mesmo rebanho, mas eu
os soltei para sair à sua maneira e depois Eu os trouxe de volta e disse: "Ah,
não, você está em um rebanho, você quer ter uma distância de 10" e,
como eles se afastaram, encontraram os peixes que estavam a uma distância de 10 e
agora você acabou com dois pequenos bandos dentro disso.
Agora a velocidade de rotação também a afetará.
Na verdade, você acabou de
ver um bom comportamento emergente lá, onde os dois bandos se uniram porque não estão apenas em
posição estacionária e se você olhar aqui na minha visão principal da câmera do jogo, esse rebanho está se movendo
lentamente pela tela porque eles têm um cabeçalho específico, mesmo que não pareçam aqui.
Se diminuirmos a velocidade de rotação, poderemos ter uma idéia melhor de como eles estão tentando viajar.
Então lembre-se de que eles estão tentando seguir uma direção específica com todo o rebanho, mas também estão
tentando ficar juntos, para que circulem entre si enquanto estão se movendo.
Agora, este não é o produto final.
Isso é apenas para brincar por enquanto e realmente mostra os efeitos de reunir-se com
aquele pedacinho de código que escrevemos com esses três vetores médios diferentes.
Certo, agora que temos isso, vamos voltar e melhorá-lo. No FlockManager, adicionaremos uma 'posição do objetivo'.
Portanto, na parte superior do FlockManager, vamos adicionar
um 'public Vector3 goalPos;' então, para obter esse goalPos apenas para ser um lugar
para começar, no Start, colocaremos onde está o FlockManager.
Portanto, neste caso,
será: 'goalPos = this. transformar. posição;'. Certo, isso está criando uma posição de meta para o
nosso peixe seguir em direção.
Salve isso. Agora, precisamos modificar o comportamento do ApplyRules para incluir essa posição do objetivo.
Então, volte ao seu código do Flock e você deseja descobrir onde está trabalhando onde está
o centro, dentro deste 'if (groupSize' ...
então isso está dentro das ApplyRules e vamos modificar esse vetor em direção ao centro do grupo. Também vamos fazer com que esse centro se mova em direção à goalPos.
Portanto, ao final do cálculo da média da posição, adicionaremos um vetor aos postes da meta. Assim,
o Vector2, nosso objetivo é a posição do objetivo menos a posição atual do peixe.
Salve isso e vamos voltar para o Unity, executar e dar uma olhada no que temos. Agora, quando pressionamos Play, nossos peixes têm uma posição
de objetivo, mas eles não irão para essa posição se não puderem se virar; portanto, a
velocidade de rotação no FlockManager precisa ser aumentada e você deseja definir o Distância do vizinho também, porque lembre-se,
se eles não fazem parte de um grupo, eles não irão a lugar algum, exceto para a frente.
Agora você pode ver que perdemos alguns peixes à distância aqui, porque não os capturamos
a distância do vizinho a tempo e, portanto, eles nem se consideram vizinhos e
estão apenas a distância e tudo bem, porque esse é o tipo de comportamento emergente que
você procura e pode ver que eu tenho o FlockManager selecionado e você pode ver a sua posição se
clicar duas vezes nele e na cena, sua posição é mostrada ali e você pode vê-los reunidos em torno dessa posição real.
Agora, o que queremos fazer é fazê-los se aglomerarem em torno dele enquanto se move.
Agora, se eu movê-lo no momento, eles ainda vão se reunir com o
goalPos.
Não estamos atualizando o goalPos para ser atualizado com o centro do
FlockManager; portanto, você precisará atualizar esse goalPos na atualização no FlockManager.
Então, vamos fazer isso rapidamente.
Abra o código do FlockManager e podemos pegar esse código que define
o goalPos, copiá-lo e colá-lo na atualização. Apenas salve isso e volte para o Unity, pressione Play e
certifique-se (eu realmente preciso definir essas rotações e distâncias para algo diferente de 0 imediatamente).
Ok, então aqui está o nosso rebanho e eles estão se movendo em torno dessa
posição central e se eu o agarro e o movo para cá, eles começam a passar para o objetivo deles e se eu
o mover de volta para cá, eles voltarão novamente .
Legal.
Está bem.
Então, vamos (antes de tudo, vou definir minha Distância do vizinho e minha Velocidade de rotação, para não ter que
mudar isso toda vez
que pressiono play) e vamos fazer mais algumas modificações.
Antes de tudo, vamos para
o FlockManager e o que eu quero fazer (em vez de definir esse objetivoPos aqui para a
posição do
FlockManager, o que você pode fazer) Eu queria escolher aleatoriamente um novo local de objetivo que esteja dentro desse
intervalo que já configuramos nossos limites de natação aqui. Assim, podemos fazer o mesmo com goalPos que fazemos com 'pos'.
Então, vamos pegar esse pedaço de código, copiá-lo e colocá-lo aqui em nosso goalPos.
Agora, isso atualizará o goalPos a cada atualização, o que provavelmente não é o que você deseja (livrar-se desse ponto-e-vírgula no final) para que
possamos
fazer algo assim para que isso aconteça aleatoriamente ... 'if (Aleatório. O intervalo (0, 100) é <10 nos
dá 10% de chance
de a próxima linha ser executada e atualizar nossa posição de objetivo.
Então salve isso e vamos voltar para o Unity e pressione Play.
Agora poderemos ver a posição do objetivo mudando e o peixe se movendo para nós.
Lá vai você e você pode ver isso lá. Também podemos fazer uma coisa semelhante no script Flock, onde não aplicamos
as regras o tempo todo e também estamos em momentos aleatórios redefinindo a velocidade. No rebanho. cs, na atualização,
adicione estas duas linhas aqui e você poderá brincar
com a chance percentual do aleatório. Marque as linhas em execução e você pode definir a velocidade
aqui, usando as mesmas configurações criadas em Iniciar, para poder redefinir a velocidade do peixe e aplicar as regras de vez em quando.
Portanto, isso é como a cada 20% (ou a aplicação das regras 20 em 100 vezes).
O que isso também faz é tirar grande parte da carga do cálculo constante das regras uma e outra vez,
para cada peixe porque, à medida que
seus rebanhos ficam muito maiores, será
processado demais para que eles o façam as regras e eles não precisam verificar o tempo
todo,
então isso acontece aleatoriamente.
Obviamente, você poderia ter um método do tipo InvokeRepeating incluído aqui, para aplicar as regras
a cada 1 segundo ou 2 segundos. Gosto aleatoriamente porque fornece resultados inesperados.
Ok, então se você adicionar isso (acima do Translate) e salvar, volte para o Unity e pressione Play.
Você descobrirá que, com o FlockManager, agora você pode aumentar a velocidade máxima e acelerar
o peixe.
Você também pode aumentar sua Distância de vizinho, pois eles podem simplesmente desaparecer.
Vamos desacelerá-los.
A outra coisa que os manterá unidos em um grupo bem unido é
a velocidade de rotação. Quanto mais rápido
eles puderem girar, mais compacto será o rebanho, como você pode ver lá e então se você quer
que eles percam o interesse um no outro, então você pode diminuir a Distância do vizinho para que
eles comecem a formar pequenos rebanhos dentro do rebanho maior, mas todos estão indo na mesma direção
e já vimos antes, há alguns. Há um peixe ali que está
se afastando, então ele ficou fora da nossa lógica ...
e há outro por lá também, e você perderá membros do seu rebanho, porque em algum momento as
regras simplesmente não se aplicarão a eles.
Se você acabar com objetos do jogo que nadam para longe, precisará ter
alguma maneira de excluí-los depois que eles forem embora. Portanto, você pode ter um OnBecameInvisible no modelo real
para que ele se destrua
automaticamente; caso contrário, você pode controlá-los mantendo-os em uma determinada região.
Agora, já criamos uma região em nosso rebanho, porque temos essa estrutura para os limites da natação.
Portanto, esse vetor aqui no topo é onde estamos criando nossos peixes, mas também podemos usá-los para contê-los, o
que significa que os peixes precisam deixar a lógica das
regras e ter um pouco de lógica separada que os transformará. por aí se eles
foram longe demais.
Então, de volta ao Flock. cs, em primeiro lugar, no topo, criaremos um valor booleano e o chamaremos de
'virar' e o definiremos como 'falso'.
Agora, transformaremos isso em 'verdadeiro'
quando o peixe atingir os limites de natação. Antes de começarmos a modificar a velocidade
do peixe ou aplicar as regras e movê-lo, dentro do método Update, mudaremos o
peixe se ele atingir esse limite, assim como a primeira coisa dentro do Update, adicione este código aqui.
Vamos criar um novo 'limite'. Portanto, um 'limite' é como um prisma retangular que você especifica em torno de um
certo ponto central.
Nesse caso, é a posição de transformação do myManager e
para um determinado tamanho. Então é 'myManager. swimLimits * 2 'porque nossos swimLimits são
essencialmente como um tipo de raio (um valor de meio tamanho) que inserimos nele. Isso criará uma grande caixa grande (embora não crie uma grande caixa,
apenas é necessária uma estrutura que comporta o tamanho de uma caixa que estaria ao redor do gerente) e
podemos usá-la aqui nesta declaração if , podemos testar se nossos peixes (que são transformados. posição neste caso) se a posição do
nosso
peixe estiver dentro dos limites. Este é um método muito bom, esse 'Limites. contém 'e, se NÃO
estiver contido nele, comece a girar, caso contrário, não
estamos girando.
Portanto, não estamos no modo de mudança e podemos voltar e fazer nossas regras. Em seguida, testaremos (antes de fazer qualquer outra
coisa) se estamos virando ou não. Se estamos voltando, vamos calcular uma nova direção para a qual voltar.
Então, em vez das ApplyRules (que dão aos nossos peixes outra direção), criaremos
outra e, neste caso, apenas mudaremos de nossa posição atual para o centro do cubo, então estamos trabalhando
na direção para chegar de onde estamos (que está fora dos limites) de volta ao centro e
depois estamos usando essa direção em outro slerp.
Então, novamente, estamos percorrendo nossa rotação para olhar nessa direção específica, usando nossa velocidade de
rotação.
Agora, se NÃO estamos nos voltando, queremos fazer essas outras coisas sobre a aplicação
das regras, então
vamos colocar um 'outro' aqui e abrir isso. Coloque essas coisas sobre velocidade e aplique as
regras lá dentro, para que elas ocorram apenas quando não estivermos girando.
Certo, então
salve isso e vamos voltar e executá-lo.
Tudo certo.
Então, eu vou ao meu FlockManager e diminuo a Distância do vizinho, para que
os peixes façam suas próprias coisas.
Vamos ver se conseguimos fazê-los dar a volta ... Está bem.
Então você pode vê-los lá.
Eles estão alcançando os limites externos por aqui e estão se virando e o fazem sempre que atingem qualquer
um dos limites externos ... esse peixe fez e esse peixe fez.
Então eles ficam dentro do que
é como um
aquário e você pode fazer o tamanho que quiser, sabendo que seu peixe vai ficar parado e
você não vai perder nenhum.
Nesse ambiente, você também pode ter pequenos bandos minúsculos, então vamos aumentar nossa Distância de vizinhança, nossa Velocidade de
rotação e nossa Velocidade máxima. Então, aqui está um bando acontecendo, mas há outros
peixes que nadaram aqui e eles ' Atingirei a borda do tanque, virei
e voltei ao centro. Enquanto estão voltando para o
centro do FlockManager, eles podem
encontrar outros peixes na Distância do Vizinho correta e, assim, começarão a se reunir
automaticamente com eles.
Agora, isso funciona muito bem até você colocar obstáculos dentro do seu tanque. Portanto,
na próxima palestra, veremos como lidar com isso.