En esta tercera parte del taller de flocado, crearemos peces que pueden detectar obstáculos en
su entorno y alejarse de ellos.
Ahora, para comenzar, lo que he creado aquí es exactamente el mismo programa que ha tenido antes del
anterior, pero he agregado un plano de tierra con algo de textura de arena y este pilar, que será nuestro obstáculo .
Puedes agregar cualquier cosa a la escena como un obstáculo.
Este pilar en particular que obtuve de la tienda de activos aquí, es
gratuito, se llama Stylize Sand Pillar, si quieres usarlo. Lo primero que tendrá que hacer es agregar un colisionador a su objeto, así que seleccione su
objeto y vaya al Inspector ... [Agregar componente] ... Box Collider.
Así que vamos a probar si el pez está a punto de chocar con estos objetos.
Es un poco diferente a los probadores de cajas delimitadoras que estábamos haciendo antes. Para probar esto a fondo, también
deberá asegurarse de que los peces naden a través de su objeto.
Entonces, para empezar, iremos al FlockManager y el FlockManager en mi caso
aquí está sentado sobre este pilar.
Voy a moverlo hacia abajo para que esté dentro de ese pilar y los peces deben intentar nadar a través de
él para llegar a la posición del FlockManager como su posición de meta y asegurarme de
que eso no cambie
mientras estamos prueba, deberá ir a su código de FlockManager y, en la
parte aleatoria de esta actualización, simplemente comentemos nuestra configuración de la ubicación de objetivo aleatorio y simplemente use la ubicación
de objetivo que está configurada en FlockManager.
Entonces, si solo guarda eso, regrese y juegue para probar que los peces realmente nadan a través de
su objeto, puede verlos ahora, comenzando a nadar hacia la meta del FlockManager y pasando directamente por el
colisionador.
Lo que es realmente importante en este momento es porque colocamos un Box Collider en nuestro pilar, no queremos un colisionador de física en
el pez porque no lo vamos a hacer de esa manera.
Así que asegúrate de que tu pez no tenga un colisionador.
Si necesita que sus objetos de flocado tengan un colisionador sobre ellos, deberá usar
diferentes capas físicas para asegurarse de que los peces no choquen con sus objetos en la escena.
Ahora, la forma en que vamos a evitar los obstáculos con un colisionador de física sobre ellos es haciendo
un rayo de física desde la posición de cada pez a lo largo de su vector hacia adelante.
Luego probamos si este rayo ha chocado con algo y si es así, rechazamos el pescado.
Integraremos esta funcionalidad en el script Flock, así que abra su script Flock. En la Actualización, donde estamos determinando si
todavía estamos dentro de nuestro cuadro delimitador (que estaba aquí), agregaremos una segunda prueba
que es nuestra emisión de rayos de física y será un 'OR' en esta declaración if .
Entonces, si estamos fuera de la caja O hemos golpeado algo con nuestro Raycast. Para realizar un raycast, necesitamos crear
nuestro elemento 'hit' de RaycastHit y luego usar Física. Raycast, la posición desde donde comienza el rayo y
luego la dirección del rayo (en este caso, será la dirección hacia adelante de
su pez, multiplicado por cuánto tiempo desea que sea ese rayo).
Ahora, si haces esto bastante largo, el pez pensará que está chocando con algo cuando está muy
lejos de él.
Si lo cortas, entonces el pez se acercará a él antes
de que decida que necesita girar.
Entonces este de aquí (el vector directo en sí) solo tendrá una longitud de 1.
Entonces ya está normalizado y luego lo multiplica por ... depende de usted, cuánto desea que reaccionen los peces en función de lo
cerca que estén y luego nos estamos aferrando al punto de golpe de nuestra emisión de rayos. Ahora hay otra función de Raycast que puede ejecutar
que simplemente le dice que ha golpeado algo y no regresa a donde
golpeó, pero usaremos
este punto de golpe un poco más tarde.
Ahora esa es nuestra parte 'OR'
y luego vamos a
'turn = true' si nuestra emisión de rayos ha golpeado algo.
Ahora, lo que voy a hacer aquí es poner una pequeña línea de depuración (y es posible que también quieras hacer esto)
porque cuando intentas depurar A. YO. Es un dolor de
cabeza absoluto si estás sentado allí mirando la pantalla y tratando de descubrir qué están
haciendo tus personajes y si están haciendo lo correcto. En este caso, queremos saber CUANDO está girando el pez y queremos saber POR
QUÉ está girando el pez.
Así que voy a dibujar el rayo real que proyecta el pez cuando está en modo de giro y eso nos va a
ayudar mucho.
Así que solo guárdalo una vez que lo hayas hecho y luego volveremos a Unity y presionaremos Reproducir.
Okay.
Ahora puedes ver muchas líneas rojas pasando. Estos son sus rayos
de
peces cuando están girando, por lo que si están mirando hacia el pilar, entonces su rayo cuando golpea el pilar,
se mostrará en rojo e indicará que están entrando en modo de giro como bien.
Ahora puedes ver, en este caso, están dando vueltas alrededor, se han metido en este tipo de ritmo
donde no se están convirtiendo aquí.
Podríamos ir al FlockManager y hacer que su velocidad de rotación sea más fuerte, para que giren.
Puedes ver allí. Ahora todos se están convirtiendo en ese pilar, pero no parecen
estar alejándose del pilar.
La razón de esto es la forma en que hemos codificado dónde van a recurrir.
Si recuerdas
(volvamos al código) cuando estamos girando, vamos a girar hacia el centro del FlockManager y el centro del
FlockManager también es el objetivo y actualmente
lo tenemos justo en el En medio de nuestro pilar.
Entonces esto no va a funcionar, en este caso porque cada vez que nuestro rayo choca con algo, va a decir "Ok, tengo que
dar la vuelta pero tengo
que
dar la vuelta hacia el centro de mi gerente" y, por
lo tanto, la cosa estamos tratando de alejarnos es conflictivo con hacia dónde vamos a recurrir.
Por lo tanto, tenemos que encontrar una ubicación diferente y un objetivo diferente para nuestro pez 'al girar' y
para eso, nos inspiraremos un poco en un juego de billar.
Cuando el rayo del pez golpea el obstáculo, lo hace en un ángulo particular.
Ahora, si el pez fuera una bola, se podría predecir cómo rebotaría en la superficie del obstáculo al igual que
una bola de billar rebota en el costado de una mesa. Por física, sabemos que el ángulo de incidencia (a)
es igual al ángulo de reflexión (b).
Por lo tanto, podemos calcular una nueva ubicación de objetivo para nuestros peces utilizando el vector que se
aleja del obstáculo.
En otras palabras, queremos alinear el vector de avance del pez con el vector de reflexión. Para calcular el vector
de reflexión, utilizamos el punto de impacto que genera el raycast y
el método de 'reflexión' disponible en Unity. El método de reflexión requiere el vector entrante y la normalidad de la superficie que
fue golpeada y devuelve el vector saliente. Para poner esto en nuestro código, volvemos al Flock. cs script, en el
método Update y lo que vamos a hacer es volver a calcular esta dirección en función de lo que está sucediendo.
Entonces, si ha golpeado el costado del contenedor (ha salido del cuadro delimitador), entonces queremos que la dirección
regrese al centro de ese cuadro.
De lo contrario, si ha golpeado algo, entonces desea darse la vuelta de acuerdo con el vector de reflexión.
Entonces comencemos aquí. Después de RaycastHit, tenga en
cuenta que también acabo de agregar este nuevo RaycastHit aquí, para que no obtenga un golpe indefinido cuando lo
use más adelante.
Así que lo configuramos al menos en algo y lo inicializamos. Debajo de aquí, voy a
mover esta 'dirección' desde abajo en 'girar'. Vamos a sacar eso
de allí y ponerlo aquí.
Ahora no tiene que establecerlo aquí y podría establecerlo en 0 porque se definirá
en las siguientes dos declaraciones if.
Entonces, después de eso (déjame poner un espacio para aclararlo) haremos 2 pruebas 'si'.
Ya no usaremos este 'O'.
Así que nos desharemos de la 'OR', haremos que sea una declaración if independiente.
Entonces, si la posición está fuera del cuadro delimitador, entonces vamos a poner 'turn = true' y en este punto
es donde queremos que la dirección sea igual a ESO.
Ahora ya está configurado para eso, así que si está configurado para eso, no necesita configurarlo de nuevo. Si configura eso a
0 allí, entonces podría tomar ESTO, ponerlo aquí
y luego configurarlo en Vector3. cero; Ahora, la siguiente instrucción
if será un 'else if' en el
rayo de física y, en este caso, si ha golpeado algo, entonces volver a girar es cierto, eliminaremos nuestra línea de depuración porque
ya no la necesitamos y en cambio 'direction = Vector3. Reflejar'.
Este es el método Reflect en Unity que podemos usar y el Reflect se produce dado un vector entrante (que es nuestro vector de avance en nuestro
pez) y el normal al golpe (que será golpeado. normal).
Por lo tanto, RaycastHit contiene todo tipo de información sobre la posición que se golpeó, es
normal y muchas otras cosas que puede consultar en el manual de Unity.
Esto ahora creará 'dirección' para que sea nuestro vector de reflexión que se usará aquí abajo
SI estamos girando de modo que la dirección aún esté aquí abajo, no hemos hecho ningún cambio en absoluto.
Así que guarde eso y ahora podemos ir y ver lo que tenemos.
Presione Reproducir y ahora descubriremos que nuestros peces no nadan a través del pilar.
Pueden cortar el borde y pueden tener partes de ellos que atraviesan el pilar porque recuerden que estamos haciendo una emisión de rayos, por lo que es una
'línea única' para verificar si hemos golpeado algo. No estamos comprobando que
todo su cuerpo haya golpeado algo.
Puedes ponerle un colisionador y hacer que el pez se dé vuelta cuando golpee. Tendría que hacer que ese colisionador sea
un poco más largo que el pez, por lo que sabía cuándo golpeó algo y luego comenzó a girar, pero
esta es una forma muy barata (en cuanto al procesador) de hacerlo y puede ver
aquí, ahora que tenemos estos peces (y si vuelvo a mi gerente de bandada y
solo aumento su velocidad de rotación para que se acerquen entre
sí) están evitando la columna.
Volvamos al código FlockManager y volvamos a ubicar nuestras ubicaciones aleatorias para nuestro goalPos en la
actualización que sacamos antes. Guardemos eso y ahora también podemos agregar otra bandada.
Entonces, lo que haré es tomar ese FlockManager, lo moveremos fuera de la columna y luego haremos
un Ctrl-D para duplicarlo y podría simplemente moverlo allí y
los prefabricados, en este caso, haré el rosa pez.
Entonces, el
pez rosa que ya debería haber incluido y tendrá el script Flock adjunto.
Ok, entonces presionemos Reproducir y ahora tenemos 2 bandadas de peces separadas y
usted puede cambiar el comportamiento de cada bandada simplemente configurando su Velocidad de rotación, su Distancia vecina, su Velocidad
máxima ... A partir de
aquí, las posibilidades son prácticamente infinitas.
Puede tener un acuario realmente agradable configurado con esta bandada
y también podría reemplazar los peces con pájaros si también quisiera algo en el mar.
Así que espero que lo hayas disfrutado porque el flocado es realmente mi A. favorita YO. algoritmo y me
parece absolutamente fascinante, los resultados que obtienes de reglas tan simples.