Alberi comportamentali :: Azioni che richiedono più di un segno di spunta


19

Da quello che ho capito sugli alberi del comportamento, ogni comportamento dovrebbe essere una breve azione orientata agli obiettivi che potrebbe essere eseguita in poche iterazioni.

Ad esempio, di seguito è riportata un'immagine di un albero del comportamento:

inserisci qui la descrizione dell'immagine

Ora supponiamo che il comportamento di Drive To Enemy richieda più di alcune iterazioni nell'albero. Quindi ad ogni passaggio viene chiamato Drive To Enemy perché ora è in esecuzione .

Il problema è che voglio chiamare Evade Enemy se un nemico si trova nelle vicinanze. E considerando che Drive to Enemy viene sempre chiamato, non ho mai la possibilità di chiamare Evade Enemy ( probabilmente dovrebbe essere chiamato Evita Enemy ).

  • Devo attraversare il passaggio di OGNI albero, indipendentemente dall'azione in corso?
  • Sto andando nel modo giusto?
  • Qual è il modo corretto di gestire un simile comportamento?

Originariamente richiesto su StackOverflow. Pensato qui sarebbe un posto più appropriato per porre questa domanda.


1
La risposta fornita qui aiuta? gamedev.stackexchange.com/questions/51693/...
Tetrade

Questa è anche la mia domanda. Avevo intenzione di pubblicare questa domanda come commento, ma ho pensato che dovesse essere una domanda separata.
Lancer gratuito il

Risposte:


16

Vedi l'immagine che ho fornito nella mia risposta precedente :

inserisci qui la descrizione dell'immagine

Se immagini che il nodo 1 sia "Evade Enemy" e il nodo 2 sia "Chase Enemy", vedrai che anche se nella seconda iterazione (quando tutto è verde tranne "2" e "B" è quando la seconda iterazione inizia), 'Evade Enemy' viene ancora controllato per primo. Solo quando "Evade Enemy" fallisce, perché non ci sono nemici nelle vicinanze, "Chase Enemy" viene nuovamente attivato. Quando "Chase Enemy" viene nuovamente visitato, nota che si trova nello stato "in esecuzione" e passa direttamente a "B".

Ciò significa che ogni volta che l'albero viene controllato, attraverserà sempre da sinistra a destra. Anche quando un nodo è contrassegnato come in esecuzione, i nodi con priorità più alta vengono comunque controllati per primi.

Non sono sicuro che tu abbia intenzione di elaborare i tuoi nodi da destra a sinistra, ma è così che sembri averli disposti (cioè sotto il nemico eluso, individuare il nemico si trova sulla destra del drive nella direzione opposta). Se hai bisogno di ulteriori spiegazioni, dovresti chiedere in chat o in una delle tue domande esistenti sull'argomento.


2
Grazie per un'altra grande spiegazione. Stavo facendo fatica a capire la natura ricorsiva degli alberi comportamentali. Nel commento dell'ultima domanda ti avrei chiesto, ma non volevo trasformare i commenti in un lungo QA. Un'ultima domanda però, ora tutto ha un senso. C'è una differenza tra selettori e sequenze nella gestione degli stati di marcia? Sembra che il Selettore (Nodo 0) abbia prima verificato il Nodo 1, mentre la sequenza "Nodo 2" non ha verificato il Nodo A, nella seconda iterazione.
Lancer gratuito il

4
Bella domanda, penso che tu ci stia capendo. Il nodo 2 non ha verificato il nodo A perché il nodo A è stato completato. Quando il nodo 2 è contrassegnato come 'In esecuzione', nota che il nodo B è il nodo che è attualmente in esecuzione. Si può presumere che se un nodo è in esecuzione, significa che non è necessario ricontrollare i nodi precedenti.
MichaelHouse

Stai ripristinando il selettore di radice (0), su "READY" dopo che è stato impostato su "RUNNING" dopo la prima iterazione?
Lancer gratuito

Credo che solo il genitore del nodo in esecuzione sia impostato su in esecuzione. La radice deve essere impostata su pronta anziché in esecuzione perché è necessario analizzare nuovamente il nodo (1).
MichaelHouse

3
Questa è un'opzione. Puoi effettivamente aggiornarlo con la frequenza che preferisci. Ogni 300 ms, se lo si desidera, o ogni frame. Oppure puoi avere un aggiornamento fisso e un aggiornamento attivato per gestire qualsiasi evento. Gli alberi di comportamento, come con la maggior parte delle strutture come questa, non sono definiti in modo rigoroso. Dovrebbero essere usati nel miglior modo possibile per il tuo gioco. Se valutarlo ogni frame è troppo dispendioso, allora non farlo. Puoi anche limitare la quantità di tempo impiegato nella valutazione di un albero e riprenderlo nel frame successivo, se lo desideri. Ci sono molte opzioni.
MichaelHouse
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.