árbol-de-comportamiento-Godot
Una implementación de GDScript de un árbol de comportamiento para la IA de juegos, basada en nodos nativos de Godot y que utiliza el editor de árbol de escenas integrado.
VERSIÓN C# -> https://github.com/MadFlyFish/godot-behavior-tree-csharp
INSTALACIÓN
- Copie la carpeta 'complementos' en el directorio principal de su proyecto.
- Habilite el complemento desde la configuración del proyecto, LUEGO REINICIA Godot; de lo contrario, no reconocerá las nuevas clases (eso es un error del motor).
- Opcionalmente, también puedes arrastrar la carpeta bt_example al directorio principal de tu proyecto.
- Para ver el ejemplo funcionando, ejecute la escena agent.tscn. La escena ex_behavior_tree.tscn es un ejemplo de cómo se construye el árbol.
INSTRUCCIONES:
- Haga clic en el icono de creación de nodos. Deberías ver nuevos nodos disponibles (si no los ves, reinicia Godot). Debe utilizar un BehaviourTree como nodo raíz, que debe tener un solo hijo. Este hijo puede ser cualquiera de los nodos de la categoría BTNode, todos los cuales heredan de la clase BTNode.
- Después de crear un árbol de comportamiento, debes especificar quién es el propietario de la IA (el Agente) y qué Blackboard se está utilizando. Las pizarras se pueden colocar en cualquier lugar (siempre que esté fuera del árbol) e incluso compartir entre diferentes árboles. El sistema es lo suficientemente flexible como para permitirle decidir cómo y cuándo actualizar los datos de su pizarra. Por ejemplo, puede crear un Nodo simple con un script que maneje la actualización de la pizarra, por ejemplo. con devoluciones de llamada de señal o incluso en proceso(). O puedes hacerlo desde cualquier otro lugar, incluso desde el interior del árbol, sólo asegúrate de diseñar las cosas de una manera que puedas mantener y realizar un seguimiento.
- Un árbol de comportamiento fluye ejecutando a cada uno de sus hijos, que devuelven algún tipo de estado de éxito o fracaso. Sólo se ejecutarán aquellas ramas que sigan a un nodo exitoso. Un BTNode debe devolver éxito o fracaso, y puede suspender la ejecución solo con una llamada a rendimiento(), después de lo cual permanecerá en estado de ejecución hasta que se complete la ejecución. Cuando un BTNode está en estado de ejecución, el árbol suspenderá progresivamente la ejecución (con la única excepción de BTParallel) hasta que todos los elementos secundarios completen la ejecución. Esto es con fines de optimización.
- El flujo del árbol está definido por los llamados nodos compuestos: BTSequence, BTSelector, BTRandomSelector, BTRandomSequence, BTParallel, todos los cuales heredan de BTComposite. Una secuencia es exitosa si todos los niños tienen éxito, mientras que falla si uno de los niños falla. El selector es lo opuesto lógico: tiene éxito si uno de los hijos tiene éxito y falla si todos los hijos fallan. Un paralelo ejecutará todos los elementos secundarios y siempre tendrá éxito independientemente, SIN esperar a que los elementos secundarios completen la ejecución. El nodo compuesto base ejecuta todos los hijos y siempre tiene éxito, pero también espera a que se complete la ejecución.
- Las acciones de su comportamiento de IA se llevan a cabo en nodos BTLeaf. Agregue un BTLeaf, luego haga 'extender script'. Ahora puedes definir tu propio comportamiento en este script anulando el método _ tick() . Tus acciones irán aquí. Asegúrese de leer los comentarios en el script base para conocer las mejores prácticas. Recuerde también que BTLeaf no debería tener hijos.
- BTDecorator se utiliza para personalizar la ejecución de un nodo secundario. Sólo pueden tener UN hijo.
- BTConditional es el tipo de decorador más común. Agregue un BTConditional y extienda el script, luego anule el método _ pre_tick() para definir las condiciones bajo las cuales se ejecutará el hijo. Asegúrate de leer el comentario porque hay un ejemplo útil allí.
- Los BTGuard son decoradores que se pueden utilizar para bloquear sucursales temporalmente. Opcionalmente, puede asignar un desbloqueo, que anulará el tiempo de bloqueo especificado. También existe la opción de asignar una taquilla. BTGuards puede hacer que su comportamiento sea muy rico y reactivo, además de optimizado, ya que evitan ramificaciones y repeticiones innecesarias.
- Otros decoradores le permiten realizar un bucle de ejecución, invertir el resultado del tick, etc. Hay muchas cosas que puedes hacer personalizando la ejecución a través de decoradores.
- Una buena práctica es utilizar los nodos proporcionados y seguir el patrón de diseño del árbol de comportamiento. Pero como se trata de una implementación puramente basada en código sin ningún editor visual, tienes mucho control sobre el diseño y, por tanto, un margen de error. Estos son sólo scripts útiles que siguen algunas "buenas prácticas" pero no están sujetos a ellas, si no fuera por un par de reglas básicas. Depende de usted decidir cómo diseñar su árbol de comportamiento, pero tenga en cuenta que si lo usa mal no se beneficiará del poder del patrón del árbol de comportamiento. (por ejemplo, incluso podrías usar el BTNode base para todo y simplemente extenderlo cada vez, aunque sería un desastre)
- Podrías tener un árbol de comportamiento enorme, pero la mejor práctica es seguir la filosofía de componentes de Godot y crear varios árboles de comportamiento más pequeños para cada componente de tu escena. Por ejemplo, un árbol para su controlador de movimiento, un árbol para su controlador de armas, un árbol para su componente Pathfinder, etc. Un árbol de comportamiento solo puede tener una pizarra, pero la misma pizarra puede ser utilizada por muchos árboles, por lo que esto es particularmente útil si quieres tener varios árboles sin hacer también varias pizarras. Personalmente, la razón por la que tengo la pizarra como un componente desacoplado es porque quería formar escuadrones de enemigos que compartieran los mismos datos pero se comportaran de forma independiente, por lo que este es un caso de uso para esto. Además, normalmente tengo varios componentes en mis actores y quiero usar la misma base de datos para diferentes árboles.