Behavior Trees :: Acciones que toman más de una marca

19

Por lo que entiendo en los árboles de comportamiento, cada comportamiento debe ser una acción orientada a objetivos cortos que se pueda realizar en unas pocas iteraciones.

Entonces, por ejemplo, a continuación se muestra una imagen de un Árbol de comportamiento:

ingrese la descripción de la imagen aquí

Ahora supongamos que el comportamiento Drive To Enemy requiere más de unas pocas iteraciones en el árbol. Entonces, en cada pase, se llama Drive To Enemy porque ahora está en estado de ejecución .

El problema es que quiero llamar a Evade Enemy si hay un Enemy cerca. Y teniendo en cuenta que Drive To Enemy siempre se llama, nunca tengo la oportunidad de llamar a Evade Enemy ( probablemente debería llamarse Evitar enemigo ).

  • ¿Debo atravesar el árbol CADA pase sin importar qué acción se esté ejecutando actualmente?
  • ¿Voy por esto de la manera correcta?
  • ¿Cuál es la forma correcta de manejar tal comportamiento?

Originalmente preguntado en Stackoverflow. Pensé que aquí sería un lugar más apropiado para hacer esta pregunta.

Lancer gratis
fuente
1
¿Ayuda la respuesta proporcionada aquí? gamedev.stackexchange.com/questions/51693/…
Tetrad
Esa también es mi pregunta. Iba a publicar esta pregunta como un comentario, pero pensé que debería ser una pregunta separada.
Gratis Lancer

Respuestas:

16

Vea la imagen que proporcioné en mi respuesta anterior :

ingrese la descripción de la imagen aquí

Si imagina que el nodo 1 es 'Evadir enemigo' y el nodo 2 es 'Chase Enemy', verá que aunque en la segunda iteración (cuando todo es verde excepto '2' y 'B' es cuando la segunda iteración comienza), 'Evade al enemigo' todavía se verifica primero. Solo cuando 'Evadir enemigo' falla, porque no hay enemigos cerca, se vuelve a activar 'Chase Enemy'. Cuando se vuelve a visitar 'Chase Enemy', se da cuenta de que está en el estado 'en ejecución' y pasa directamente a 'B'.

Esto significa que cada vez que se marca el árbol, siempre se desplazará de izquierda a derecha. Incluso cuando un nodo está marcado como en ejecución, los nodos de mayor prioridad aún se verifican primero.

No estoy seguro de si tiene la intención de procesar sus nodos de derecha a izquierda, pero así es como parece tenerlos organizados (es decir, bajo evadir enemigo, ubicar al enemigo está a la derecha de la unidad en dirección opuesta). Si necesita más explicaciones, debe preguntar en el chat o en una de sus preguntas existentes sobre el tema.

MichaelHouse
fuente
2
Gracias por otra gran explicación. Me estaba costando entender la naturaleza recursiva de Behavior Trees. Te iba a preguntar en el comentario de la última pregunta, pero no quería convertir los comentarios en un control de calidad largo. Sin embargo, una última pregunta, todo esto tiene sentido ahora. ¿Hay alguna diferencia entre los selectores y las secuencias en el manejo de los estados en ejecución? Parece que el Selector (Nodo 0) verificó el Nodo 1 primero, mientras que la secuencia "Nodo 2" no verificó el Nodo A, en la segunda iteración.
Gratis Lancer
44
Buena pregunta, creo que lo estás entendiendo. El nodo 2 no verificó el nodo A porque se completó. Cuando el nodo 2 está marcado como 'En ejecución', observa que el nodo B es el nodo que se está ejecutando actualmente. Puede suponer que si un nodo se está ejecutando, significa que no es necesario volver a comprobar los nodos anteriores.
MichaelHouse
¿Está restableciendo el selector de raíz (0) a "LISTO" después de que se configuró en "EN EJECUCIÓN" después de la primera iteración?
Lancer gratis el
Creo que solo el padre del nodo en ejecución está configurado para ejecutarse. La raíz debe configurarse como lista en lugar de ejecutarse porque necesitamos analizar el nodo (1) nuevamente.
MichaelHouse
3
Esa es una opción. En realidad, puede actualizarlo con la frecuencia o la frecuencia que desee. Cada 300 ms si lo desea, o cada cuadro. O puede tener una actualización fija, así como una actualización activada para tratar cualquier evento. Los árboles de comportamiento, como con la mayoría de las estructuras como esta, no están estrictamente definidos. Deben usarse de la mejor manera posible para su juego. Si evaluarlo cada marco es demasiado derrochador, entonces no lo hagas. También puede limitar la cantidad de tiempo dedicado a evaluar un árbol y retomar el siguiente cuadro si lo desea. Hay muchas opciones
MichaelHouse