Výukový program pre čínsku verziu produktu Behavior Designer

Behavior Designer Chinese Version Tutorial



Behavior Designer is a behavior tree plugin! It is a visual editor for designers, programmers and artists to use conveniently!Behavior Designer provides a powerful API that allows you to easily create tasks. With plug-ins such as uScript and PlayMaker, you can create a powerful AI system without any effort, without writing a line of code! This guide will cover all Behavior Features of Designer! If you still don’t understand what a behavior tree is (behavior trees) please see'Overview of Behavior Tree'! Depend on Behavior Designer you don’t need to care about what a behavior tree is (behavior trees) But if you know some behavior trees! This will help you use Behavior Designer, including some commonly used components, such as: tasks (task), action (behavior), composite (composite), conditional (condition), decorator (modifier)! When you first open Behavior Designer, the following window will appear:
There are four parts here: The first part in the figure below is the main operating area, used to create your behavior tree! The second part is the panel properties area, where you can edit specific properties of a behavior tree, add new tasks, create new variables, or edit tasks (task) parameters. The third part is the toolbar, you can add/Delete the behavior tree, lock the current behavior tree, view all behavior trees, etc.! The fourth part is the debugging toolbar. You can start/Stop, debug step by step, pause, check for errors!

Prvá časť je hlavnou dizajnérskou pracovnou oblasťou! V tejto oblasti môžete vytvoriť nové úlohy a navrhnúť strom správania týchto úloh. Prvým krokom je vytvorenie stromu správania. Nový strom správania môžete vytvoriť kliknutím pravým tlačidlom myši a výberom možnosti „Pridať strom správania“ alebo môžete pridať nový strom správania pomocou znamienka plus vedľa položky Zamknúť na hornom paneli nástrojov. Strom správania!
Po vytvorení stromu správania môžete začať pridávať úlohy. Pridanie úlohy je možné vytvoriť kliknutím pravým tlačidlom myši do prázdnej oblasti alebo na kartu Úlohy v oblasti 2 vľavo! Po vytvorení úlohy uvidíte efekt podobný obrázku nižšie!



Úloha Vstup je tu pridaná predvolene ako koreňový uzol pre následné pridanie úlohy! Tu vidíte, že pridaný uzol sekvencie obsahuje chybu. Je to tak preto, lebo sekvencia musí mať nasledujúce podradené uzly. Pokiaľ sa pridá podradený uzol, chyba zmizne! Teraz, keď máme prvú úlohu, pridajme niekoľko ďalších:




Môžete vytvoriť sekvenčné uzly alebo selektorové uzly, všetko sú to úlohy. Kombináciou viacerých takýchto uzlov môžete vytvoriť hlbokú hierarchiu!
Ak ste počas procesu vytvárania omylom urobili chybu, vyberte uzol s chybou a vymažte ho!
Poradie spustenia nástroja Behavior Designer je zľava doprava a je najskôr hĺbkou. Postupnosť na vyššie uvedenom obrázku je nasledovná:
SequenceA, selektory, akcia SequenceB, akcia ActionB, SelectorB, akcia ActionD




Teraz, keď máme základný strom správania, zmeňme parametre a uvidíme! Vyberte uzol ActionC a potom zobrazte panel vlastností vľavo, vyberte pohľad Inšpektor! Tu môžete premenovať Úlohu (úlohu), nastaviť parametre alebo vložiť komentár do (Komentár).
V rozhraní vľavo sa nachádza inšpektor a ďalšie tri karty (Správanie, Úlohy, Premenné). Panel Premenné umožňuje vytvárať zdieľané premenné a meniť ich hodnoty! Konkrétne informácie o tomto paneli budú predstavené v nasledujúcich kapitolách! Na paneli Úlohy sú uvedené všetky dostupné úlohy (úlohy). Úlohy tu sú rovnaké ako úlohy v rozbaľovacej ponuke, na ktorú kliknete pravým tlačidlom myši v prázdnej oblasti! Tento zoznam je možné zadať pomocou vyhľadávacieho poľa vyššie a rýchlo tak nájsť úlohy, ktoré chcete vytvoriť, vrátane akcií (správanie), zložených (zložené), podmienených (podmienka), dekoratívnych prvkov (modifikátor)! Druhy! Posledný panel, panel správania, zobrazuje vlastnosti komponentu Strom správania v aktuálnom strome správania. Táto vlastnosť sa tiež zobrazí na paneli vlastností pribaleného Gameobjectu! Podrobné predstavenie jednotlivých panelov nájdete v úvode v nasledujúcich kapitolách!




Posledným je panel s nástrojmi, ktorý poskytuje nástroje na základné operácie so stromom správania, ako je napríklad pridanie alebo odstránenie! Šípka na pozícii 1 na vyššie uvedenom obrázku sa používa na náhľad rôznych stromov správania, ak je k rovnakému Gameobjectu pridaných viac stromov správania! Pozícia 2 sa používa na zobrazenie všetkých stromov správania a môžete zvoliť strom správania. Pozícia 3 je Gameobject, ktorý obsahuje strom správania v aktuálnej scéne. Môžete rozšíriť rozbaľovaciu ponuku a zobraziť a vybrať! Pozícia č. 4 sa tiež používa na výber rôznych stromov správania na aktuálnom Gameobjecte. Ak ich je viac, č. 5 vymaže aktuálny strom správania, č. 6 pridá strom správania a č. 7 uzamkne aktuálny strom správania, ale pretože kliknete na scénu, ďalšie zdroje spôsobujú prepínanie obsahu v strome správania. dizajnový panel! Č. 8 má uložiť aktuálny strom správania, č. 9 exportovať aktuálny strom správania ako skriptovateľný zdroj pre ďalšie stromy správania, ktoré sa majú volať, snímky obrazovky č. 10, predvoľby č. 11 vrátane niektorých základných nastavení!

Čo je strom správania?
Stromy správania sú veľmi populárne v hrách s umelou inteligenciou. Like 'Halo 2' je hra, ktorá využíva stromy správania a strieľa! Výhodou stromu správania je, že je ľahko pochopiteľný a vizuálne ho upravujete!


Let’s take a look at the behavior tree: there are four different types of tasks: including action(Behavior), composite (composite), conditional (condition), decorator (modifier)!action(Behavior) may be easy to understand because they change the state and outcome of the game to some extent. Conditional is used to determine whether certain game attributes are appropriate! For example: in the behavior tree in the figure above, there are two conditional nodes, two action(Behavior) The first two conditional (conditions) of the node are used to check whether there is an enemy and to ensure that there are enough bullets. If these conditions are true, the two tasks will be executed and the subsequent tasks will be executed. If any conditional (condition) is not met, the subsequent operations will not be executed and the upper layer will be returned directly. Sequence, And end the execution of this behavior tree! After that is a parallel queue, the following two action(Behavior) The first one is responsible for calculating the design damage, and the second one is responsible for playing the shooting animation. They happened to colleagues! Here you can completely put the latter two action(Behavior) as a single behavior tree! By analogy, edit the responsible, nested behavior tree! composite: As can be seen from the figure above,Sequence And parallel belong to the composite node. One is sequential execution, the other is parallel execution! decorator: This type of node can only have one child node. Its function is to modify the behavior of subtasks. In the above example, we did not use decorator (modifier), if you need a similar interrupt operation, you will use this decorator (modifier) ​​type! For example: a resource collection operation, it may have an interrupt node, this node judges whether it is attacked, if it is attacked, it will interrupt the resource collection operation! Another application of decorator (modifier) ​​is to repeat the subtask X times, or to perform the subtask until it is completed! Another important topic of the behavior tree is the return state! Sometimes a task requires multiple frames to complete. For example, most animations do not start and end in one frame. In addition, tasks with conditional (conditions) need a way to tell their parent task whether the conditions are correct, so that the parent node determines the execution order of the child nodes. Both questions can be used status(Status) to resolve. A task has three different states: running, successful or failed. In the first example, there is only one task for shooting animation status Status, and the condition to determine the enemy is returned in the Within Sight mission. If the return fails, that is, if you are not in the field of view, the following mission will not be executed!

Mali by sme používať stromy správania alebo konečné stavové automaty?
Stromy správania alebo konečné stavové stroje



Under what circumstances would it be necessary to use BehaviorTree instead of FiniteStateMachines such as PlayMaker plug-ins? From a more advanced logic level, behavior trees are often used for complex artificial intelligence, while finite state machines (FSMs) are used for general visualization. Of course, you can also use finite state machines (FSMs) to write AI, or use behavior trees (BehaviorTree) for visual programming. The use of tools varies from person to person! Alex J. Champandard, author of 'Artificial Intelligence Development' and 'AI Game Development' in 2007 year 12 month 28 It was mentioned in a blog on Japan: The era of finite state machines (FSMs) is over 10 Big reason! Original address: http://aigamedev.com/open/article/fsm-age-is-over/. (Translator: Of course, there are no absolutes. Finite state machines are still useful! It varies from person to person, and from game to game!) Although the behavior tree does not reach this point, it is certain that the behavior tree is on the AI It has an absolute advantage over the state machine!
The behavior tree has several advantages over the finite state: the behavior tree provides powerful flexibility, is very powerful, and it is easy to change the behavior tree structure! Let us first look at the first advantage: flexibility! When using the state machine FSM, how do you execute two states at the same time? You can only create two state machines (FSM)! But if you use the behavior tree, you only need to add a parallel node (Parallel), all child nodes will be executed in parallel! Using Behavior Designer, these child nodes can be PlayMaker's FSM, and these FSMs will be triggered in parallel! Another example of flexibility is guard task(Monitoring task). For example, you have two different task(Task) One to play sounds and one to play special effects. These two tasks are two different branches in the behavior tree, so they do not know each other's status. It is possible that these two tasks are executed at the same time! You may not want this to happen. In this case, you can add a semaphore task(Called in Behavior Designer Task Guard monitoring task) In this way, it can be guaranteed in the behavior tree that either sound effects or special effects are currently being played! Only when the first one is finished, will the second one be played! Another advantage of the behavior tree: the structure of the behavior tree is very robust and clear! This is not to say that the FSM structure is not robust or clear enough, but they are implemented differently! In my opinion, behavior trees make AI implementation more convenient than restricted state machines! Behavior trees can better express and implement complex AI, but it will be very complicated if FSM is used to implement it! In order to achieve the same effect, the FSM cable may eventually turn up like noodles! The last advantage of the behavior tree: easy to modify! One of the reasons why the behavior tree side is so popular is that it is easy to create a visual editor! If you want to change the execution sequence in FSM, you must switch between states and change various connections! You don’t have to be so troublesome in the behavior tree! It is also very convenient to add and delete nodes!

Z tohto dôvodu sa stromy správania a FSM nevyhnutne navzájom nevylučujú! Môžu spolupracovať na dosiahnutí lepších výsledkov!

Komponent stromu správania
Komponent stromu správania
Ako je uvedené nižšie:


Táto súčasť zaznamenáva štruktúru vášho stromu správania a niektoré informácie o konfigurácii aplikácie BehaviorDesigner! Nasledujúce API sa používa na spustenie a zastavenie vášho stromu správania!
public void EnableBehavior ()
public void DisableBehavior (bool pause = false)
Príbuzné uzly nájdete v strome správania podľa úlohy úlohy Nasledujúce metódy
TaskType FindTask ()
Zoznam úloh vyhľadávania ()
Úloha FindTaskWithName (reťazec taskName)
Zoznam FindTasksWithName (reťazec taskName)
Aktuálny stav vykonávania stromu správania možno získať takto:
behaviorTree.ExecutionStatus
Po spustení stromu správania sa vráti stav. Vráteným rozhraním môže byť Úspech alebo Zlyhanie. Táto štruktúra závisí od každého zo stromov správania.
Návratová hodnota podradeného uzla Úloha!
V strome správania môžete sledovať nasledujúce udalosti:
OnBehaviorStart
OnBehaviorRestart
OnBehaviorEnd
Komponent stromu správania obsahuje nasledujúce vlastnosti:
Meno správania
Názov stromu správania
Popis správania
Popisné informácie o strome správania
Vonkajšie správanie
Odkaz na zdroj externého stromu správania, ktorý je možné exportovať do externého súboru na serializáciu (súbor ScriptableObject) pre samostatné úložisko, na ktorý môžu odkazovať iné stromy správania, alebo
Použiť ako úlohu podradeného uzla! Uľahčite zdieľanie stromov správania!
Skupina
Skupinové číslo stromu správania, ktoré sa používa na zoskupenie stromu správania! Môže byť použitý na ľahké vyhľadanie konkrétneho stromu správania!
Spustiť, keď je povolené
Ak je nastavená hodnota true, potom keď je povolená súčasť stromu správania, bude vykonaný strom správania!
Pozastaviť, keď je deaktivovaná
Ak je nastavená hodnota true, potom keď bude komponent stromu správania zakázaný, bude strom správania pozastavený!
Po dokončení reštartujte
Ak je nastavená hodnota true, potom po ukončení vykonávania súčasti stromu správania bude strom správania vykonaný znova!
Resetovať hodnoty pri reštarte
Ak je nastavená hodnota true, potom sa pri resetovaní súčasti stromu správania strom správania znova vykoná!
Zaznamenávať zmeny úloh
Ak je nastavená hodnota true, pokiaľ sa proces úlohy zmení v tomto strome správania, na konzole sa vytlačí protokol!

Vytvorte strom správania pomocou skriptu
V niektorých prípadoch možno budete chcieť vytvoriť strom správania za behu programu pomocou skriptu, namiesto priameho použitia operácií drag and drop alebo panelov na jeho vytvorenie! Napríklad: ak ste exportovali externý strom správania a chcete ho vytvoriť pomocou skriptu, môžete postupovať takto:


V tomto príklade obsahuje verejná premenná behaviorTree externý strom správania, na ktorý odkazujete. Novovytvorený strom správania pri načítaní automaticky načíta všetky úlohy podradených uzlov. Nastavte startWhenEnabled na hodnotu false, aby ste zabránili vykonaniu stromu správania okamžite po vytvorení! Strom správania je možné zapnúť pomocou bt.enabledBehavior ()!

Správca správania
Správca správania


Pri spustení stromu správania sa na scéne automaticky vytvorí GameObject s názvom BehaviorManager a pridá sa BehaviorManage.cs!
Tento skript sa používa na správu stromu správania vo všetkých scenároch!
Môžete ovládať typ aktualizácie stromu správania, čas aktualizácie atď.! „Every Frame“ znamená aktualizovať strom správania sa všetkých snímok! 'Zadajte sekundy' definuje čas intervalu aktualizácie! „Ručné“ znamená manuálne vyvolanie aktualizácie. Po výbere tejto možnosti budete musieť zavolať aktualizáciu stromu správania pomocou skriptu, napríklad takto:
BehaviorManager.instance.Tick ()
Okrem toho, ak chcete, aby rôzne stromy správania mali svoje vlastné nezávislé intervaly aktualizácií, môžete to urobiť:
BehaviorManager.instance.Tick (BehaviorTree)
Typ vykonania úlohy (typ vykonania úlohy) vám umožňuje určiť počet spustení stromu správania, predvolená hodnota je „Žiadne duplikáty“ (neduplikované, neopakované) ako táto operácia cyklu na obrázku nižšie
Dá sa to dosiahnuť jednoduchým nastavením počtu popráv tohto typu!


Úloha Repeater (uzol opakovanej úlohy) je nastavená na 5-krát. Ak je Typ vykonania úlohy nastavený na možnosť „Žiadne duplikáty“, spustí sa prehrať zvukovú úlohu raz pre každú snímku. Ak je Typ vykonania úlohy nastavený na 5, potom sa úloha Prehrať zvuk vykoná 5-krát za snímku!

Úlohy
Uzol na najvyššej úrovni celého stromu úloh sa nazýva Úloha. Tieto úlohy majú rozhranie podobné implementácii a rozšíreniu MonoBehavior, a to nasledovne:

// OnAwake is called once when the behavior tree is enabled. Think of it as a constructor public virtual void OnAwake() // OnStart is called immediately before execution. It is used to setup any variables that need to be reset from the previous run public virtual void OnStart() // OnUpdate runs the actual task public virtual TaskStatus OnUpdate() // OnEnd is called after execution on a success or failure. public virtual void OnEnd() // OnPause is called when the behavior is paused and resumed public virtual void OnPause(bool paused) // The priority select will need to know this tasks priority of running public virtual float GetPriority() // OnBehaviorComplete is called after the behavior tree finishes executing public virtual void OnBehaviorComplete() // OnReset is called by the inspector to reset the public properties public virtual void OnReset() // Allow OnDrawGizmos to be called from the tasks public virtual void OnDrawGizmos() // Keep a reference to the behavior that owns this task public Behavior Owner

Úloha úlohy má tri základné verejné atribúty: meno, komentár, okamžitý (názov, úvod, okamžite). Okamžik je tu okamžite, nie je ľahké ho pochopiť! Keď v strome správania vráti úloha úspech alebo neúspech, strom správania sa okamžite presunie na ďalšiu úlohu v rovnakom rámci. Ak nevyberiete okamžitú možnosť, potom po vykonaní aktuálnej úlohy zostane v aktuálnom uzle a nebude sa pohybovať na ďalšiu úlohu, kým nedostane ďalšie začiarknutie!
Nasleduje vývojový diagram postupnosti vykonávania:


Nadradené úlohy
Strom správania Úloha nadradenej úlohy v strome správania obsahuje: zložený (zložený), dekorátor (modifikátor)! Aj keď Monobehaviour nemá podobné API, nie je ťažké pochopiť tieto funkcie:

// The maximum number of children a parent task can have. Will usually be 1 or int.MaxValue public virtual int MaxChildren() // Boolean value to determine if the current task is a parallel task public virtual bool CanRunParallelChildren() // The index of the currently active child public virtual int CurrentChildIndex() // Boolean value to determine if the current task can execute public virtual bool CanExecute() // Apply a decorator to the executed status public virtual TaskStatus Decorate(TaskStatus status) // Notifies the parent task that the child has been executed and has a status of childStatus public virtual void OnChildExecuted(TaskStatus childStatus) // Notifies the parent task that the child at index childIndex has been executed and has a status of childStatus public virtual void OnChildExecuted(int childIndex, TaskStatus childStatus) // Notifies the task that the child has started to run public virtual void OnChildStarted() // Notifies the parallel task that the child at index childIndex has started to run public virtual void OnChildStarted(int childIndex) // Some parent tasks need to be able to override the status, such as parallel tasks public virtual TaskStatus OverrideStatus(TaskStatus status) // The interrupt node will override the status if it has been interrupted. public virtual TaskStatus OverrideStatus() // Notifies the composite task that an conditional abort has been triggered and the child index should reset public virtual void OnConditionalAbort(int childIndex)

Napíšte uzol úlohy vlastnej podmienky
Písanie novej podmienenej úlohy

Táto téma obsahuje dve časti. Prvá časť predstavuje spôsob zápisu nového uzla podmienenej úlohy a druhá časť predstavuje spôsob zápisu úlohy správania. Podmienená úloha akčnej úlohy (uzol podmienenej úlohy) sa používa na posúdenie určitých premenných a podmienok a akčná úloha (uzol úlohy úlohy) je zodpovedná za vykonanie Niektoré špecifické logické operácie! Nasledujúcim príkladom je napísanie uzla podmienenej úlohy (WithinSight), ktorý posúdi, či sa nachádza v zornom poli vzdialenosti (WithinSight), a akčnej úlohy, ktorá sa pohybuje smerom k cieľu (Prekladač: Konkrétne kroky sú vynechané a konečný úplný kód priamo)



Napíšte vlastné uzly úloh správania
Písanie novej úlohy úlohy


Po pripojení v editore to vyzerá takto!


ladenie


Po spustení stromu správania sa zobrazí efekt podobný vyššie uvedenému obrázku. Zelená časť je časť, ktorá sa v skutočnosti vykonáva, a šedá časť sa nevykonáva ani nevykonáva! Pravý dolný roh niektorých uzlov,


alebo


Označuje, či návratová hodnota tohto uzla je úspech alebo neúspech! Aj keď je misia spustená, stále môžete zmeniť hodnotu prostredníctvom panela vlastností a po zmene hodnoty môžete zobraziť výkon hry!


By right-clicking on a task node, you can add a break to this node, so that it will be interrupted when it runs to this node, you can check the status and properties of the node, etc.! As shown above

Keď vyberiete uzol úlohy, môžete si prezerať konkrétne premenné prostredníctvom panela Inšpektor vľavo a konkrétne hodnoty premenných v návrhovej oblasti pomocou tlačidiel na strane so zmenšenými prstami! Ako je uvedené vyššie!


Niekedy chcete namiesto všetkých vykonať iba časť stromu správania, potom môžete zakázať niektoré uzly a ich deti, stačí vybrať uzol a zvoliť X v ľavom hornom rohu!


Okrem toho môžete tiež vytlačiť poradie vykonania stromu správania otvorením LogTaskchanges of Behavior, podobne ako v nasledujúcom výstupe

GameObject - Behavior: Push task Sequence (index 0) at stack index 0 GameObject - Behavior: Push task Wait (index 1) at stack index 0 GameObject - Behavior: Pop task Wait (index 1) at stack index 0 with status Success GameObject - Behavior: Push task Wait (index 2) at stack index 0 GameObject - Behavior: Pop task Wait (index 2) at stack index 0 with status Success GameObject - Behavior: Pop task Sequence (index 0) at stack index 0 with status Success Disabling GameObject – Behavior

Tieto správy možno rozdeliť do nasledujúcich častí:

{game object name } – {behavior name}: {task change} {task type} (index {task index}) at stack index {stack index} {optional status}

Podmienené prerušenie tehotenstva
Podmienené prerušenia (podmienené ukončenie) umožňujú dynamicky meniť váš strom správania bez použitia mnohých úloh, ako je Prerušiť / Vykonať prerušenie. Táto vlastnosť je podobná pozastaveniu pozorovateľa v hre Unreal 4. Väčšina ostatných nástrojov stromu správania musí pri riešení podobných problémov znova prechádzať stromom správania. A tu sa Podmienené spojenia (ukončenie podmienky) môžu vyhnúť tejto situácii opätovného prechodu! Nasledujúci obrázok je príkladom na ilustráciu jeho použitia:


Keď je tento strom správania spustený, najskôr vykonajte podmienené posúdenie, ak je návrat správny, potom počkajte na uzle Wait, kde uzol Wait čaká 10 sekúnd! Za predpokladu, že sa podmienka posúdenia podmieneného uzla zmení počas čakacieho procesu, vráti zlyhanie. Ak je povolené podmienené prerušenie (prerušenie), podmienený uzol spustí operáciu prerušenia a zastaví úlohu uzla Wait! Úloha podmieneného uzla sa prehodnotí podľa predchádzajúcej logiky a vráti sa, či je úspešná! K prerušeniam podmieneného uzla je možné pristupovať z ktoréhokoľvek zloženého uzla (uzol Sekvencie na obrázku vyššie). Ako je znázornené na obrázku nižšie: Ak nie je splnená podmienka rozsudku prvého Int, vykoná sa znova Sekvencia

Existujú štyri typy typov prerušenia: Žiadne, Vlastné, Nízka priorita a Oba.
Žiadne


Toto je predvolený typ prerušenia!
Ja


Toto je samostatný typ prerušenia. To znamená, že bude detekovať všetky uzly podmieneného rozsudku pod týmto uzlom, dokonca aj uzly, ktoré boli vykonané. Ak podmienka rozsudku nie je splnená, súčasná postupnosť vykonávania sa preruší a uzol rozsudku sa znova posúdi a výsledok rozsudku sa vráti!
Nižšia priorita


Ak je pri spustení do nasledujúceho uzla efektívny úsudok tohto uzla, súčasná postupnosť vykonávania sa preruší a vykonávanie sa vráti do tohto uzla!

Oboje


Obsahuje vyššie uvedené dva typy!

Nasledujúci príklad použije typ prerušenia s nižšou prioritou:


V tomto príklade je typom prerušenia Sekvencie vľavo nižšia priorita. Za predpokladu, že ľavá vetva vráti chybu, strom správania preskočí na pravú vetvu! Keď je spustená pravá vetva, stav úsudku prvého uzla sa stáva úspešným. V tejto chvíli, pretože sa zmení výsledok rozsudku a je nastavená nižšia priorita, bude momentálne prebiehajúca akcia prerušená a vráti sa späť k vykonaniu prvej akcie. Prekladač: Ak chcete sami vyskúšať účinok vyššie uvedeného obrázka, odporúča sa nahradiť Akciu uzlom čakania. Výsledok protokolu, ktorý som použil v teste, je príliš rýchly. Po dlhom testovaní tohto LowerPriority som na to neprišiel. Ukazuje sa, že moja akcia je príliš rýchla. Spôsobte koniec stromu správania), ako je uvedené nižšie


When the condition is detected, there will be an icon to mark it, indicating that the judgment node is currently being detected. When the state changes, the current execution order of the behavior tree will be interrupted according to the interruption type! In the lower left corner of the picture above Int Comparison (integer value judgment) node, if the judgment returns false, it will be interrupted waitAnd jump to the next Sequence Queue, if it is judged that it has become a valid value at this time, it will jump back to execute the first Wait. This is because the first Sequence The interrupt type of Both is selected! In addition, the interrupted conditional nodes can be nested. For example, the picture below!

Ak stlačíte Fire1 (Buttondown monitoruje Fire1), preskočí sa späť na Wait pod Sequence vľavo


Udalosť
Systém udalostí Event v aplikácii Behavior Designer vám uľahčí používanie! Udalosť môžete spustiť pomocou kódu alebo cez uzly stromu správania!
Tieto udalosti je možné spúšťať a monitorovať cez uzol SendEvent a uzol HasRecivedEvent stromu správania! Ak sa má odoslať udalosť, použite uzol SendeEvnet. Uzol HasRecivedEvent je podmienený uzol a úspech sa vráti, keď sa zaregistrovaná udalosť prijme. Udalosť môžete spustiť a sledovať prostredníctvom definície názvu udalosti!

Okrem spúšťania udalostí prostredníctvom uzlov stromu správania môžete udalosti spúšťať aj prostredníctvom kódu! Používa sa na to funkcia BehaviorTree.SendEvent:

var behaviorTree = GetComponent<BehaviorTree >() behaviorTree.SendEvent<object >('MyEvent', Vector3.zero)

Vyššie uvedený príklad používa kód na odoslanie udalosti „MyEvent“ do stromu správania s parametrom (Vector3.zero). Ak je v strome správania poslucháč, jeho pozícia vráti úspech!

Odkazy na úlohy, odkazy medzi uzlami úloh!
Pri písaní uzla Task task bude možno potrebné pristupovať k inej úlohe Task. Napríklad TaskA chce získať prístup k určitej hodnote atribútu TaskB! Napríklad nasledujúca TaskA a TaskB

using UnityEngine using BehaviorDesigner.Runtime.Tasks public class TaskA : Action { public TaskB referencedTask public void OnAwake() { Debug.Log(referencedTask.SomeFloat) } } TaskB then looks like: using UnityEngine using BehaviorDesigner.Runtime.Tasks public class TaskB : Action { public float SomeFloat }

Pridajte tieto dve úlohy do editora stromu správania:


Vyberte úlohuA a na paneli inšpektora uvidíte premennú referencedTask. Je to typ úlohy. Momentálne ho môžete vybrať kliknutím na tlačidlo Vybrať a nakoniec to vyzerá ako na nasledujúcom obrázku.


Referenčný vzťah môžete zrušiť kliknutím na znamienko „X“! Po tejto konfigurácii sa vlastnosti TaskB zobrazia pri spustení TaskA, ako je to znázornené na obrázku nižšie


Odkazy na úlohy môžu byť aj odkazy na pole, napríklad nasledujúce!

public class TaskA : Action { public TaskB[] referencedTasks }

Variabilný synchronizátor


Zaveste skript na GameObject a nastavte zdroj synchronizácie a cieľ synchronizácie. Šípka v strede označuje smer synchronizácie, pravá znamená, že horná premenná je synchronizovaná s dolnou, a ľavá znamená, že dolná premenná je synchronizovaná s hornou!

Dostupné vlastnosti úlohy

HelpURL: web connection [HelpURL('http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=27')] public class Parallel : Composite { ////////////////////////////////////////////////////////////////////////////// TaskIcon: the icon of the task [TaskIcon('Assets/Path/To/{SkinColor}Icon.png')] public class MyTask : Action { ////////////////////////////////////////////////////////////////////////////// TaskCategory: the display position of the task (the display position in the Task task panel) [TaskCategory('Common')] public class Seek : Action { [TaskCategory('RTS/Harvester')] public class HarvestGold : Action { ////////////////////////////////////////////////////////////////////////////// TaskDescription: The text content of the function description, displayed in the lower left corner of the editor layout area [TaskDescription('The sequence task is similar to an 'and' operation. ...'] public class Sequence : Composite { ////////////////////////////////////////////////////////////////////////////// LinkedTask: Apply other Task tasks [LinkedTask] public TaskGuard[] linkedTaskGuards = null ////////////////////////////////////////////////////////////////////////////// InheritedField: inherited properties [InheritedField] public float moveSpeed

Kompozitný uzol
Sekvenčný uzol


This node is a'with'The relationship, that is, the execution order of the child nodes below him is one after another! If one of them returns false. Then the subsequent child nodes will not be executed, this sequence node returns false. Only when all child nodes are completed and success is returned, this Sequence(Sequence) node will return success

Uzol selektora


This node is'or'The relationship, that is, the execution order of the child nodes below him is one or the other! Only all child nodes are returned false Will return false. As long as one child node returns success, then this Selector node will return success, and subsequent nodes will not be executed!

Paralelný (paralelný) uzol


This node is similar to Sequence(Sequence) node. the difference is,Parallel(Parallel) The node will execute all child nodes at the same time instead of one by one!

Ak niektorý z podriadených uzlov vráti hodnotu false, zastavte všetky podradené uzly a vráťte hodnotu false. Iba keď všetky podradené uzly vrátia úspech, úspech sa vráti.

Uzol paralelného výberu


Similar to Selector(Selection) node, as long as one child node of ParallelSelector node returns success, then it will return success! Different from SelectorOne point is that the ParalleSelector node will execute all the child nodes below at the same time. If one node returns success, it will stop all other child nodes and return success. Only if all child nodes false Will return when false

Uzol výberu priority


Similar to Selector (select) node, PrioritySelector (parallel selection) node as long as there is a child node to return success, then he will return success! The difference is that the execution order of child nodes is not from left to right, but the order of execution is determined by priority! The child nodes with higher priority will be executed first! (Translator: Where is the priority set? I haven't figured it out. The current test results are the same Selector Node, later I still used the solution found by my big Google search! Baidu is a garbage station) You need to override the function in the Task class to set different Priority, original address:

http://forum.unity3d.com/threads/behavior-designer-behavior-trees-for-everyone.227497/page-4
// Vybraná priorita bude musieť poznať prioritu spustenia tejto úlohy
verejný virtuálny plavák GetPriority ()

Uzol Random Selector (náhodný výber)


The characteristic of this node is: randomly execute child nodes, as long as one child node returns success, it will return success, and no subsequent nodes will be executed. If all child nodes return false Then it also returns false! In the properties panel of this node:seed(Random seed) settings, use by yourself!

Uzol náhodnej sekvencie


Similar to the Sequence node, except that its execution order is random! As long as a child node is encountered, return false, RandomSequence (random sequence) returns an error, and it will not return success until all child nodes return success! In the properties panel of this node:seed(Random seed) settings, use by yourself!

Uzol Hodnotiteľ selektora (opakovaný výber úsudku)


This node will re-evaluate the execution status of the child nodes and select each frame. It will execute the child node with the lowest priority among the child nodes! Do this every frame! If a high-priority node is currently running and the child node to be executed in the next frame has a lower priority, then it will interrupt the high-priority node and execute the lower-priority child node! Selector The Evaluator (repeated judgment and selection) node will traverse all child nodes from low to high until it encounters one that returns success! If all child nodes return false, Then it returns false! Otherwise, as long as one returns success, it will return success! This node simulates the conditional interrupt function, if the child node does not have a conditional node!

Uzol podmienečných podmienok
Úlohou uzla podmienky je určiť niektoré atribúty hry, napríklad či je hráč nažive a či je príšera vo vizuálnom rozmedzí!

Uzol Random Probability (náhodná pravdepodobnosť)


Set the successProbability property to control the probability of returning success (default 0.5, Which is 50%probability)! There are also seed random seed settings, etc.!

Uzol Porovnať hodnotu poľa


Compare the field value of the specified value. Return success if the values ​​are the same.

Dostal udalosť (či je udalosť prijatá)


(Prekladač: Stále existuje veľa uzlov podmienok, ktoré sú tu ignorované!)

Uzol dekoratérov


The function of this node is to wrap another node! (There can be only one child node). Decorators will change the behavior of the node! For example: the decorated node can control the child node until it returns to a certain state (success or is false). The latter is to reverse the return result of the child node (ie: success return falsefalse, Return success) let’s introduce several Decorators (decorator nodes) that BehaviorDesigner comes with by default.

Podmienený hodnotiteľ (hodnotenie podmieneného uzla) dekoračný uzol


nastavenie parametrov:
1: prehodnotiť: Je potrebné znovu vyhodnotiť stavový uzol každého rámca
2: conditionalTask: uzol podmienky, ktorý sa má vyhodnotiť, poznámka: tento uzol samotný je uzlom podmienky!
Vyhodnoťte uzol nastavenej podmienky. Ak uzol podmienky vráti úspech, spustite podradený uzol a vráťte priebežný výsledok podradeného uzla! Ak uzol podmienky nevráti úspech, potom sa podradený uzol nespustí a okamžite vráti zlyhanie! Uzol stavu bude na začiatku behu vyhodnotený iba raz!

Prerušiť (prerušiť) dekoračný uzol


Ak sa spustí uzol prerušenia, vykonanie všetkých úloh poduzlu uvedených nižšie sa preruší! Príkaz prerušenia môže byť iniciovaný uzlom Vykonať prerušenie! Uzol prerušenia nepreruší stav vykonania podradených uzlov pod ním pred prijatím príkazu prerušenia! Ak vykonanie podriadeného uzla nedostalo príkaz prerušenia, vráti sa priamo k výsledku vykonania podriadeného uzla! Napríklad nasledujúci obrázok:


Invertorový (obrátený) dekoračný uzol


Po dokončení úlohy podradeného uzla bude návratová hodnota v tomto uzle invertovaná a odovzdaná do vyššej úrovne!

Repeater (repeat / loop) dekoračný uzol


K dispozícii sú tri nastavenia vlastností: počet vykonaní, či už sa opakoval, a spustenie, kým sa nevráti chyba!


Uzol zdobený zlyhaním návratu


Pokiaľ aktuálny stav podriadeného uzla nie je spustený, to znamená, či je výsledkom vykonania podriadeného uzla úspech alebo zlyhanie, vráti zlyhanie! Ak je stav podradeného uzla v prevádzke, potom sa vráťte do behu!

Uzol dekorácie Vrátiť úspech


Pokiaľ aktuálny stav podriadeného uzla nebeží, to znamená, či je výsledkom vykonania podriadeného uzla úspech alebo neúspech, úspech sa vráti! Ak je stav podradeného uzla v prevádzke, potom sa vráťte do behu!

Task Guard (strážca úloh) dekoračný uzol


Podobne ako značka Lock použitá v operáciách mutex s viacerými vláknami, aby sa zabránilo niekoľkým citáciám verejných údajov! Na nasledujúcom obrázku je ako príklad demonštrovaný strom externého správania! Tu sa paralelne spúšťajú dva vonkajšie stromy správania. Ak TaskGuard nie je pridaný, potom obe strany vykonajú externý strom správania paralelne. Teraz po pridaní nástroja TaskGuard možno vykonať iba jeden súčasne a druhý je možné vykonať až po dokončení vykonávania.


Konfigurácia TaskGard na vyššie uvedenom obrázku je nasledovná:


Do zlyhania zdobený uzol


Kým podradený uzol vráti zlyhanie, podradený uzol sa vykoná v slučke, ako je znázornené na nasledujúcom obrázku:


Uzol dekorácie Kým úspech (do úspechu)

Kým podriadený uzol vráti úspech, inak sa podriadené uzly vykonajú v slučke!


Transfer od: http://www.jianshu.com/p/64b5fe01fb1c