Hola a tod@s, estoy usando navegación navmesh y la verdad me funciona todo bien salvo un detalle importante... resulta que si tengo varios jugadores navegando por el mapa y un jugadorA se interpone en el camino de otro jugadorB (JugadorB esta recorriendo una ruta) este comienza a empujar al jugadorA.
Necesito que no empuje sino que lo esquive, entonces me pregunto debo de alguna manera anular el empuje al rigiboddy (si es así como? ya que mass no puede ser 0 :S)? o debo agregar un navmeshobstacle? (si es así que propiedades debo poner ya que lo he probado y me vuelve loco los personajes moviendolos solos y de un punto a otro punto como teletransportandolos :S) las propiedades que he usado para esto son : carve=T, Move Threshold = 0.1, Time to Stactonary=0, CarveOnlyStation=false
He estado intrigando mas del tema y según unity es incompatible usar navmeshagent junto con navmeshobstacle lo cual sólo debo usar navmesagent, a parte de esto he probado a quitar mi componente de colisión (charactercontroller) y el rigibody y el resultado es el mismo, mi jugador que esta recorriendo una ruta empuja al jugador que esta en medio de su ruta :S, no sé como hacer que no empuje si se supone que esto lo controla rigibody y lo tengo quitado.
puedes lanzar un raycast (corto) hacia delante del personaje, y si detecta a otro personaje delante haces que lo esquibe... (igual tienes que "parar" el navMesh y luego continuar... no se muy bien como va el navMesh...)
...tambien igual lo puedes hacer con "triggers" aunque creo que es mejor con raycast...
si todos los personajes tienen rigidBody puedes ponerle una masa mas alta a los personajes cuando esten quietos, y mas baja cuando se mueven... de esta manera los personajes con menos masa (los que se mueven) no empujaran a los que estan quietos... sino que el rigidBody le hara "rodear" el obtaculo(personaje quieto) "rozando" contra el...
Si entiendes el siguiente tutorial, entenderás cómo aplicar los Obstacle a los personajes, para que se aparten cuando te cruces con ellos:
eature=oembed" width="480">
Buenas, gracias por las respuestas de antemano, Pioj he visto el tutorial pero según entiendo eso sólo funciona para obstaculos (no tienen navmeshagent) y mi caso es cuando 2 jugadores se cruzan o cuando un jugador se mueve por una ruta donde hay un jugador parado.
Una forma que he visto por ahí sería en un triger de colisión desactivar el navmeshagent en uno de los dos jugadores y activar el navmeshobstacle y en el otro jugador mantener activado el navmeshagent y desactivado el navmeshobstacle y cuando salga de la colisión volver a activar el navmesh del otro jugador y desactivar el navmeshobstacle, pero creo que esto no es la mejor opción ya que tengo que controlar varios factores y me da que no va a funcionar muy bien...
Por lo que he leido y comprobado no puedo tener los dos componentes activados ya que se detecta a si mismo y no para de moverse el objeto jugador de un lado a otro.
¿Y no puedes añadir un gameobject/esfera/cilindro/cosa vacía, con el Obstacle, y mediante script colocarlo siempre en la posición que tenga un navmeshagent?
He visto tutoriales malos, pero este se lleva la palma!!!, menudo monton de mierdas para contarle a la gente que luego dira "mi juego no funciona muy bien", seguro que no lo hace si sigues estas indicaciones.....
pioj tu antes molabas!! xD
Cita de: Eskema date=1535384537He visto tutoriales malos, pero este se lleva la palma!!!, menudo monton de mierdas para contarle a la gente que luego dira "mi juego no funciona muy bien", seguro que no lo hace si sigues estas indicaciones.....
pioj tu antes molabas!! xD
¡Gran observación!
Se nota claramente que el tipo no entiende lo que esta haciendo, mezclando conceptos como poner el obstacle, o quitar el rigidbody a un collider que luego mueves, forzando al sistema de fisicas a recalcularse y a perder mucho rendimiento.
Gran tutorial sin duda alguna!!! xDDD
Cita de: Eskema date=1535384975Se nota claramente que el tipo no entiende lo que esta haciendo, mezclando conceptos como poner el obstacle, o quitar el rigidbody a un collider que luego mueves, forzando al sistema de fisicas a recalcularse y a perder mucho rendimiento.
Gran tutorial sin duda alguna!!! xDDD
Pero, se fue por las ramas explicando algo que no tiene explicación.... LA DOCUMENTACIÓN de UNITY tiene todo explicado a lujo y detalle... no entiendo por que la gente busca en los lugares incorrectos..
Bueno.. Pero eso da más ventaja a los que estamos desarrollando...
Cita de: francoe1 date=1535385280Pero, se fue por las ramas explicando algo que no tiene explicación.... LA DOCUMENTACIÓN de UNITY tiene todo explicado a lujo y detalle... no entiendo por que la gente busca en los lugares incorrectos..
Bueno.. Pero eso da más ventaja a los que estamos desarrollando...
Llevo varias semanas dandome con el tema de la IA + navegacion + local avoidance y he flipado en colores con el video. Y como dices, la documentacion aunque simplona (como siempre en unity) te da buenas pistas. Luego cuando lo dominas pasas del navmesh de unity y te pillas un plugin y vives mas feliz XD
Cita de: Eskema date=1535385439Llevo varias semanas dandome con el tema de la IA + navegacion + local avoidance y he flipado en colores con el video. Y como dices, la documentacion aunque simplona (como siempre en unity) te da buenas pistas. Luego cuando lo dominas pasas del navmesh de unity y te pillas un plugin y vives mas feliz XD
Hace 4 días no duermo intentando sacar el demonio que tiene mi vehiculo con WheelColliders, estoy armando un sistema de físicas de vehículos haciendo uso de WheelCollider, y como todo lo que te da UNITY es de MALO para ABAJO, siempre me pregunte por que no mejoran o directamente lo sacan -
Hace varios años no toco NavMesh, pero me toco hacer un trabajo y la verdad es que es ¡HORRIBLE! -
Se va un poco del TOPIC pero no gasten tiempo con NAVMESH utilicen A* o mejor aún si se trata de un juego simple puedes programar tu propio algoritmo basada en la teoría de grafos ...
El punto que mas me molesto de NavMesh es la optimización, cuando tienes múltiples agentes, no se puede trabajar en hilos independientes, juegos como AoE hacían una cola para que el sistema resuelva una ruta a la vez, y esto era mas optimo, a esto se le aplicaba una resolución progresiva, es decir, resolvía de a diez pasos entonces al tenes muchas unidades no se veía afectado..
Cita de: francoe1 date=1535385889Hace 4 días no duermo intentando sacar el demonio que tiene mi vehiculo con WheelColliders, estoy armando un sistema de físicas de vehículos haciendo uso de WheelCollider, y como todo lo que te da UNITY es de MALO para ABAJO, siempre me pregunte por que no mejoran o directamente lo sacan -
Hace varios años no toco NavMesh, pero me toco hacer un trabajo y la verdad es que es ¡HORRIBLE! -
Se va un poco del TOPIC pero no gasten tiempo con NAVMESH utilicen A* o mejor aún si se trata de un juego simple puedes programar tu propio algoritmo basada en la teoría de grafos ...
El punto que mas me molesto de NavMesh es la optimización, cuando tienes múltiples agentes, no se puede trabajar en hilos independientes, juegos como AoE hacían una cola para que el sistema resuelva una ruta a la vez, y esto era mas optimo, a esto se le aplicaba una resolución progresiva, es decir, resolvía de a diez pasos entonces al tenes muchas unidades no se veía afectado..
Yo me he pasado al A* pathfinding de aaron granberg y es un buen plugin para el tema navegacion/pathfinding, luego sobre eso ya construyes tu IA y tirando millas.
Los wheelcolliders yo los descarte e hice directamente un script de "rueda" con el tipico raycast al suelo para checkear las normales y con eso ya darle friccion a la rueda, distancia de amortiguador, etc, etc, la verdad es que me costo 1 mes el maldito script, pero menudo mundo en cuanto a velocidad de uso y de consumo de recursos. Para mi que los wheelcollider son para tener varios PCs de la NASA trabajando con multiples CPUs en cluster porque chupan rendimiento como si te regalaran las CPUs xD
Cita de: Eskema date=1535386221Yo me he pasado al A* pathfinding de aaron granberg y es un buen plugin para el tema navegacion/pathfinding, luego sobre eso ya construyes tu IA y tirando millas.
Los wheelcolliders yo los descarte e hice directamente un script de "rueda" con el tipico raycast al suelo para checkear las normales y con eso ya darle friccion a la rueda, distancia de amortiguador, etc, etc, la verdad es que me costo 1 mes el maldito script, pero menudo mundo en cuanto a velocidad de uso y de consumo de recursos. Para mi que los wheelcollider son para tener varios PCs de la NASA trabajando con multiples CPUs en cluster porque chupan rendimiento como si te regalaran las CPUs xD
Si, actualmente estoy trabajando en un sistema de WheelColliders propio, estoy un poco perdido con el deslizamiento horizontal, aun no estoy logrando algo decente, pero calculo que un tiempo voy a lograr algo mejor que Unity para el objetivo que quiero lograr.
Si tienes por algo sobre el tema que explique pasame por MP :) jajaja, si no es molestia.
Cita de: francoe1 date=1535386596Si, actualmente estoy trabajando en un sistema de WheelColliders propio, estoy un poco perdido con el deslizamiento horizontal, aun no estoy logrando algo decente, pero calculo que un tiempo voy a lograr algo mejor que Unity para el objetivo que quiero lograr.
Si tienes por algo sobre el tema que explique pasame por MP :) jajaja, si no es molestia.
Dale un vistazo al MP a ver
Cita de: francoe1 date=1535385889y como todo lo que te da UNITY es de MALO para ABAJO
Cita de: Eskema date=1535385439Luego cuando lo dominas pasas del navmesh de unity y te pillas un plugin y vives mas feliz XD
... Haters gonna hate
Respecto a la duda inicial del post, tienes que cambiar el Quality en el Obstacle Avoidance del NavMeshAgent, respecto a poner un objeto vacio con un NavMeshObstacle, no creo que funcione ya que cuando un NavMeshAgent esta demasiado cerca a un NavMeshObstacle (en este caso totalmente en el centro), el desireVelocity del NavMeshAgent te empieza a dar valores extraños lo cual te daña la navegación, lo que yo hago personalmente es cambiar el Quality a un valor diferente a None, y añado un NavMesAgent y un NavMeshObstacle en el mismo GameObject, pero ambos no pueden estar activos al mismo tiempo es decir, si tu AI se detiene por pequeños momentos, que seria lo mas normal, desactivas el NavMeshAgent y activas el NavMeshObstacle, luego cuando vayas a navegar, justo antes de navegar, activas el NavMeshAgent y desactivas el NavMeshObstacle, todo esto debería bastar para que se vea decente.
Cita de: lightbug date=1535388285
... Haters gonna hate
Te queremos igual y lo sabes!!! Hahaha
Cita de: James Roman date=1535388796Respecto a la duda inicial del post, tienes que cambiar el Quality en el Obstacle Avoidance del NavMeshAgent, respecto a poner un objeto vacio con un NavMeshObstacle, no creo que funcione ya que cuando un NavMeshAgent esta demasiado cerca a un NavMeshObstacle (en este caso totalmente en el centro), el desireVelocity del NavMeshAgent te empieza a dar valores extraños lo cual te daña la navegación, lo que yo hago personalmente es cambiar el Quality a un valor diferente a None, y añado un NavMesAgent y un NavMeshObstacle en el mismo GameObject, pero ambos no pueden estar activos al mismo tiempo es decir, si tu AI se detiene por pequeños momentos, que seria lo mas normal, desactivas el NavMeshAgent y activas el NavMeshObstacle, luego cuando vayas a navegar, justo antes de navegar, activas el NavMeshAgent y desactivas el NavMeshObstacle, todo esto debería bastar para que se vea decente.
Hice esto que comentas y funciona todo bien salvo un pequeño detalle, a la hora de desactivar el obstacle y activar el agente pega como un pequeño saltito y he comprobado que se debe a que a la hora de desactivar el obstacle no le da tiempo a quitar el agujero tallado y calcula la nueva ruta con este tallado.
La prueba que hice para averiguarlo fué desactivar obstacle y luego activar agent en diferentes pasos y de este modo funciona perfecto pero si lo hago todo en una misma iteración me da el problema del salto.
Cita de: ecko date=1535626996Hice esto que comentas y funciona todo bien salvo un pequeño detalle, a la hora de desactivar el obstacle y activar el agente pega como un pequeño saltito y he comprobado que se debe a que a la hora de desactivar el obstacle no le da tiempo a quitar el agujero tallado y calcula la nueva ruta con este tallado.
La prueba que hice para averiguarlo fué desactivar obstacle y luego activar agent en diferentes pasos y de este modo funciona perfecto pero si lo hago todo en una misma iteración me da el problema del salto.
yo lo hago dentro de una coroutina, te comparte el código que uso para estos casos , ademas hago un montón de comprobaciones en caso de que el camino se genere erróneamente, espero te sirva
PathGenerator.cs
Hola James, gracias por la aportación :), se me ocurrió lo mismo que acabas de decir de hacer una corrutina y parece que funciona perfectamente de este modo, el script que mandastes está vacío jjejee y bueno la corrutina que hice fué simplemente esto:
GetComponent<NavMeshObstacle>().enabled = false;
yield return new WaitForSeconds(.1f);
GetComponent<NavMeshAgent>().enabled = true;
no sé si hay alguna otra forma mas eficiente como hacer una especie de yield hasta que detecte que se ha desactivado por completo :S
Pues tienes razón ha quedado vació el script, te lo dejo por aca https://pastebin.com/pBQz9din (https://pastebin.com/pBQz9din) , respecto a yield con que esperes un frame es suficiente, es decir Time.deltaTime en lugar d .1f, saludos!
Cita de: James Roman date=1535631821Pues tienes razón ha quedado vació el script, te lo dejo por aca https://pastebin.com/pBQz9din (https://pastebin.com/pBQz9din) , respecto a yield con que esperes un frame es suficiente, es decir Time.deltaTime en lugar d .1f, saludos!
Solo para mencionarlo, si retornas "null" (del yield) tiene el efecto de esperar al siguiente frame, como el final de un Update :)
Se me ocurre un script loco en el que cuando dos agentes chocan se decida (Al azar, o dando prioridad a un tipo o aun Id, o al que esté mas en una coordenada, que se yo) cual de ellos para, avanza en la direccion contraria a la que estaba x cantidad, espera, digamos un segundo (para que el otro siga moviéndose como debe) y luego arranca de nuevo.
Ahora ya escribir el código, aún se me escapa.
Saludos!
https://www.alucinoconfeisbuk.com/2017/10/pase-usted-primero_25.html (https://www.alucinoconfeisbuk.com/2017/10/pase-usted-primero_25.html)