Bienvenido de nuevo a la segunda parte sobre Flocado. Lo que puedes ver en la pantalla es el programa
que dejamos la última vez.
Entonces, nuestros peces se están reuniendo y se están reuniendo de acuerdo con algunas configuraciones que tenemos en nuestro FlockManager.
Las velocidades mínimas y máximas
son las velocidades iniciales de los peces y sí influyen, pero no puede cambiarlos una vez que se
está ejecutando y trabajaremos en eso un poco más
tarde, pero en lo que respecta a la distancia vecina, puede modificar eso en tiempo de ejecución.
Entonces, si reduzco la Distancia de Vecino, deberíamos ver que nuestra bandada comenzará a separarse porque ya no hay
necesidad de volver a subir,
sino que la volveremos a subir.
No reúne necesariamente a todos los peces, solo los que están cerca
uno del otro y puedes ver en este ejemplo aquí que inicialmente todos estaban en la misma parvada, pero los liberé para
que se mudaran a su manera y luego Los traje de vuelta y dije "Oh no, en realidad
estás en una bandada, quieres estar a una distancia de 10" y porque se habían
alejado unos de otros, encontraron los peces que estaban a una distancia de 10 y ahora
has terminado con 2 pequeñas bandadas dentro de eso.
Ahora la velocidad de rotación también lo afectará.
En realidad, acabas de ver
un buen comportamiento emergente allí, donde las dos bandadas se unieron porque no están solo en una
posición estacionaria y si miras aquí la vista del juego desde mi cámara principal, esta bandada se mueve lentamente por
la pantalla porque tienen un encabezado particular, incluso si realmente no lo parecen aquí.
Si reducimos la velocidad de rotación, podríamos tener una mejor idea de la forma en que intentan viajar.
Así que recuerde que están tratando de ir en una dirección particular con todo el rebaño, pero también están
tratando de permanecer juntos, por lo que van a estar rodeándose mientras se mueven.
Ahora este no es el producto final.
Esto es solo para jugar por ahora y realmente te muestra los efectos de la acumulación
de ese pequeño y diminuto código que escribimos con esos 3 vectores promediados diferentes.
Bien, ahora que tenemos esto, regresemos y mejorémoslo. En FlockManager, agregaremos una 'posición de objetivo'.
Entonces, en la parte superior del FlockManager, agreguemos
un 'vectorPostalPos público'; luego, para obtener ese objetivo, solo para estar en un lugar para
comenzar, en el Inicio, lo colocaremos donde está el FlockManager.
Entonces, en este
caso será: 'goalPos = this. transformar. posición;'. Correcto, entonces eso está creando una posición de meta para que
nuestro pez se dirija hacia.
Salva eso. Ahora necesitamos modificar el comportamiento de ApplyRules para incluir esa posición de objetivo.
Así que regrese a su código Flock y quiera encontrar dónde está trabajando dónde está el
centro, dentro de este 'if (groupSize' ...
así que esto está dentro de ApplyRules y vamos a modificar este vector hacia el centro del grupo. Vamos a hacer que ese centro se mueva hacia el goalPos también.
Entonces, al final del cálculo del promedio de la posición, agregaremos un vector a los postes del objetivo,
entonces el Vector2, nuestro objetivo es la posición del objetivo menos la posición actual del pez.
Guarde eso y regresemos a Unity, echemos un vistazo a lo que tenemos. Ahora, cuando presionamos Reproducir, nuestros peces tienen una posición de
objetivo, pero no van a ir a esa posición si no pueden darse la vuelta, por lo
que la Velocidad de rotación en el FlockManager debe aumentarse y querrá establecer el Distancia de vecinos también porque recuerde
que si no son parte de un grupo, entonces no van a ir a ninguna parte, excepto en línea recta.
Ahora puedes ver que hemos perdido algunos peces en la distancia aquí porque no los capturamos
dentro de la Distancia Vecina en el tiempo, por lo que ni siquiera se
consideran vecinos y simplemente están lejos. y eso está bien porque ese es el tipo de
comportamiento emergente que estás buscando y puedes ver que tengo el FlockManager seleccionado y puedes ver su posición si haces
doble clic en él y en la escena, su posición se muestra justo allí y puedes verlos reuniéndose alrededor de esa posición real.
Ahora lo que queremos hacer es hacer que se congreguen a su alrededor mientras se mueve.
Ahora si lo muevo en este momento, todavía van a reunirse alrededor de
goalPos.
No estamos actualizando goalPos para que se actualice con el centro de FlockManager,
por lo tanto, deberá actualizar ese goalPos en la Actualización de FlockManager.
Así que hagamos eso rápidamente.
Abra el código de FlockManager y podemos tomar este código que establece el
objetivo, copiarlo y pegarlo en la Actualización. Simplemente guarde eso y regrese a Unity y presione Reproducir y
asegúrese (realmente necesito configurar estas rotaciones y distancias a algo que no sea 0 de inmediato).
Bien, aquí está nuestra bandada y se están moviendo alrededor de esa
posición central y si la agarro y la muevo aquí, comienzan a moverse hacia su meta y si
la muevo aquí, volverán a moverse de nuevo .
Guay.
Okay.
Entonces (antes que nada, voy a configurar mi Distancia de Vecino y mi Velocidad de Rotación, para no tener
que cambiar eso cada
vez que presione play) y hagamos algunas modificaciones más.
En primer lugar, vayamos al
FlockManager y lo que quiero hacer (en lugar de establecer este objetivo) en la posición del FlockManager,
que
puede hacer) Quería elegir al azar una nueva ubicación del objetivo que esté dentro de este rango que nosotros
Nos hemos preparado para nuestros límites de natación aquí. Por lo tanto, podemos hacer lo mismo con goalPos que con 'pos'.
Así que tomemos este código, cópielo y configúrelo aquí para nuestro objetivo.
Ahora, esto va a actualizar GoalPos cada actualización, que probablemente no sea lo que desea (deshacerse de ese punto y coma al final) para que podamos
hacer
algo como esto para que suceda al azar ... 'if (Aleatorio. El rango (0, 100) es <10 nos
da un 10% de posibilidades
de que la siguiente línea se ejecute y actualice nuestra posición de objetivo.
Así que guárdelo y regresemos a Unity y presione Reproducir.
Ahora podremos ver cómo cambian los objetivos y los peces que se mueven hacia nosotros.
Ahí vas y puedes ver eso allí. También podemos hacer algo similar en el script Flock, donde no estamos
aplicando las reglas todo el tiempo y también estamos en momentos aleatorios restableciendo la velocidad. En rebaño. cs, en la
Actualización, agregue estas 2 líneas aquí y puede jugar con
el porcentaje de probabilidad de Aleatorio. Las líneas de rango se ejecutan y puede establecer la velocidad aquí, utilizando
la misma configuración que tiene en Inicio para que pueda restablecer la velocidad del pez y luego solo puede aplicar las reglas de vez en cuando.
Entonces esto es como cada 20% (o aplicando las reglas 20 de cada 100 veces).
Lo que esto también hace es quitar gran parte de la carga calculando constantemente las reglas una y otra vez, para
cada pez porque a medida que sus manadas
se hacen mucho más grandes, será
demasiado procesarlas para que se hagan. las reglas y no necesitan verificar todo el tiempo, así
que esto
lo hace al azar.
Por supuesto, podría tener un método de tipo InvokeRepeating que incluya aquí, que podría aplicar las
reglas cada 1 segundo o 2 segundos. Me gusta el azar porque te da resultados inesperados.
Ok, entonces si agrega eso (arriba del Traductor) y lo guarda, regrese a Unity y presione Reproducir.
Encontrarás que con el FlockManager, ahora puedes aumentar la velocidad máxima y acelerar
el pescado.
Es posible que también necesite aumentar su Distancia de vecinos porque podrían desaparecer.
Vamos a frenarlos.
La otra cosa que los mantendrá juntos en un buen grupo muy
unido es la Velocidad de rotación. Cuanto
más rápido puedan girar, más compacta será la bandada, como pueden ver allí y luego si querían que
perdieran interés. uno en el otro, entonces podría bajar la Distancia del vecino para que luego comiencen a
formar pequeñas bandadas pequeñas dentro de la bandada más grande, pero todas van en la misma dirección
y pudimos ver antes, hay algunas. Hay un pez por allí que se aleja
en la distancia, por lo que ha caído fuera de nuestra lógica ...
y hay otro por allá que también está apagado y perderás miembros de tu rebaño porque en algún momento
las reglas simplemente no se aplicarán a ellos.
Si terminas con objetos del juego que nadan en la distancia, tendrás que tener alguna
forma de eliminarlos una vez que se hayan ido. Por lo tanto, es posible que tenga un OnBecameInvisible en el
modelo en sí mismo para que
se destruya automáticamente, de lo contrario, puede controlarlos manteniéndolos dentro de una determinada región.
Ahora, ya hemos creado una región en nuestra bandada porque tenemos esa estructura para los límites de natación.
Entonces, este vector aquí en la parte superior es donde estamos creando nuestros peces, pero también podríamos usarlo para
contenerlos y eso significa que los peces deben abandonar la lógica
de las reglas y tener un poco de lógica separada que los convertirá alrededor si han
ido demasiado lejos.
Así que de vuelta en Flock. cs, en primer lugar, en la parte superior crearemos un valor booleano y lo llamaremos
'girando' y lo configuraremos como 'falso'.
Ahora convertiremos esto en "verdadero"
cuando el pez alcance los límites de nado. Antes de comenzar a modificar la velocidad del
pez o aplicar las reglas y moverlo, dentro del método de actualización vamos a dar la vuelta
al pez si ha alcanzado ese límite, así que, como lo primero dentro de la actualización, vamos a agregue este código aquí.
Vamos a crear un nuevo 'Límites'. Entonces, un 'Límite' es como un prisma rectangular que usted especifica alrededor de
cierto punto central.
En este caso, es la posición de transformación myManager y
para un tamaño determinado. Entonces es 'myManager. swimLimits * 2 'porque nuestros swimLimits son esencialmente
como un tipo de radio (un valor de medio tamaño) que hemos puesto allí. Esto creará una gran caja grande (aunque no crea una caja grande,
solo toma una estructura que tiene el tamaño de una caja que estaría alrededor del administrador) y luego podemos
usarla aquí en esta declaración if , podemos probar si nuestro pez (que es transformar. posición en este caso) si la posición de nuestro
pez
está dentro de los límites. Este es un método realmente bueno, este 'Límites. contiene 'y si NO
está contenido allí, entonces comienza a girar, de lo contrario,
no estamos girando.
Entonces no estamos en modo de giro y podemos regresar y hacer nuestras reglas. Luego probaremos (antes de hacer cualquier otra
cosa) si estamos girando o no. Si ESTAMOS girando, vamos a calcular una nueva dirección para girar.
Entonces, en lugar de ApplyRules (que le da a nuestros peces otra dirección) crearemos otra
y, en este caso, solo vamos a pasar de nuestra posición actual al centro del cubo, por lo que estamos
trabajando en la dirección para llegar desde donde estamos (que está 'fuera de los límites') de regreso al centro
y luego estamos usando esa dirección en otro slerp.
Así que de nuevo estamos avanzando a través de nuestra rotación para mirar en esa dirección en particular, usando nuestra velocidad
de rotación.
Ahora, si NO estamos girando, entonces queremos hacer estas otras cosas sobre la aplicación de
las reglas, así
que simplemente pondremos un 'más' aquí y lo abriremos. Ponga estas cosas sobre la velocidad y la aplicación
de las reglas allí, para que solo ocurran cuando no estamos girando.
Bien,
así que guárdelo y regresemos y ejecútelo.
Todo bien.
Así que voy a ir a mi FlockManager y voy a rechazar la Distancia del vecino, para que
el pez vaya y haga lo suyo.
Veamos si podemos hacer que den la vuelta ... Okay.
Entonces puedes verlos allí.
Están llegando a los límites exteriores por aquí y se están dando la vuelta y lo harán cada vez que lleguen a
cualquiera de los límites exteriores ... ese pez lo hizo y ese pez lo hizo.
Por lo tanto, se quedan dentro
de lo que es
como una pecera y puedes hacer eso tan grande como quieras, sabiendo que tus peces se quedarán
quietos y no perderás ninguno.
Dentro de ese entorno, también puede tener pequeñas bandadas pequeñas, así que aumentemos nuestra Distancia Vecina y nuestra Velocidad de Rotación y
nuestra Velocidad Máxima, así que aquí hay un poco de bandada, pero hay otros peces que han
nadado por aquí y ellos ' Golpearé el borde del tanque y luego me daré la
vuelta y volveré al centro. Mientras regresan al centro del
FlockManager, pueden encontrarse con
otros peces dentro de la Distancia Vecina correcta y comenzarán a reunirse automáticamente
con ellos.
Ahora, esto funciona muy bien hasta que coloques obstáculos dentro de tu tanque, así que
en la próxima conferencia, veremos cómo lidiar con eso.