Owl-bt ist Editor für Verhaltensbäume. Es wurde von den Verhaltensbäumen der Unreal-Engine in einer Weise inspiriert, dass es spezielle Knotenelemente wie Dekoratoren und Dienste unterstützt. Dadurch werden Bäume kleiner und viel besser lesbar.
Owl-BT wurde erstellt, weil wir einen Verhaltensbaum-Editor für unser Spiel Tendril: Echo Received brauchten, bei dem wir uns auf das Verhalten von Live-NPCs konzentrieren.
Wir haben einige der vorhandenen Lösungen ausprobiert, aber sie haben unsere Anforderungen nicht erfüllt, wie zum Beispiel:
npm install owl-bt -g
owlbt -h
cd < project-dir >
owlbt i
owlbt c < tree-path >
owlbt o path
Owl-bt läuft standardmäßig als Dienst auf Port 8955
. Dies kann in der Konfigurationsdatei .owlbtrc
geändert werden, die im Home-Verzeichnis des Benutzers erstellt werden muss.
{
"port" : 1234
}
In Owl-BT gibt es drei Arten von Elementen:
ctrl+shift+p
Die Projektdatei ( owl-bt.json
) definiert alle Knoten und Knotenelementtypen, die in Bäumen verwendet werden können.
fa-
Präfix){{PropertyName}}
enthalten.fa-
Präfix){{PropertyName}}
enthalten.fa-
Präfix){{PropertyName}}
enthalten.Ermöglicht die Definition benutzerdefinierter Eigenschaftstypen
Beispiel:
{
"types" :{
"myString" : {
"type" : " string " ,
"pattern" : " v[0-9] "
}
},
"nodes" : [
{
"name" : " SetAlertLevel " ,
"icon" : " exclamation " ,
"description" : " Set alert level to " {{Level}} " " ,
"isComposite" : false ,
"properties" : [
{
"name" : " Level " ,
"default" : " None " ,
"type" : " enum " ,
"values" : [
" None " ,
" Investigate " ,
" HighAlert " ,
" Panic "
]
}
]
}
],
"decorators" : [
{
"name" : " HasZoneReportedEnemy " ,
"icon" : " phone " ,
"properties" : [
{
"name" : " MaxReportAge " ,
"default" : 1 ,
"type" : " number "
}
]
}
],
"services" : [
{
"name" : " ReadPlayerPos " ,
"icon" : " pencil " ,
"description" : " Store player pos to " {{BlackboardKey}} " " ,
"properties" : [
{
"name" : " BlackboardKey " ,
"default" : " Target " ,
"type" : " string "
}
]
}
]
}
{
"type" : " Selector " ,
"name" : " rootNode " ,
"childNodes" : [
{
"type" : " Sequence " ,
"services" : [
{
"type" : " Sample service "
}
],
"decorators" : [
{
"type" : " IsBlackboardValueSet " ,
"properties" : [
{
"name" : " Field " ,
"value" : " myValue "
}
],
"periodic" : true
}
]
}
]
}
Mithilfe base
ist es möglich, einen Knotenelementtyp von einem anderen Typ abzuleiten.
Es ist möglich, string
oder array of strings
für base
zu verwenden. Im Falle eines Arrays werden Basiselementtypen in einer bestimmten Reihenfolge angewendet. Das bedeutet, dass der spätere Artikeltyp den zuvor angegebenen Artikeltyp überschreibt.
Mit Gleichung können wir einen Basisknoten erstellen:
{
"name" : " MyBaseNode " ,
"icon" : " arrow-right " ,
"color" : " red " ,
"isAbstract" : true ,
"properties" : [
{
"name" : " prop-from-base1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"type" : " number "
}
]
},
Und abgeleiteter Knoten:
{
"name" : " MyDerivedNode " ,
"color" : " blue " ,
"base" : " MyBaseNode " ,
"properties" : [
{
"name" : " prop1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"default" : " abc " ,
"type" : " string "
}
]
},
Der resultierende Knoten nach der Anwendung der Vererbung sieht folgendermaßen aus:
{
"name" : " MyDerivedNode " ,
"icon" : " arrow-right " ,
"color" : " blue " ,
"base" : " MyBaseNode " ,
"properties" : [
{
"name" : " prop-from-base1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"default" : " abc " ,
"type" : " string "
},
{
"name" : " prop1 " ,
"type" : " string "
}
]
},
Die Datei owl-bt.js
im selben Verzeichnis wie die Projektdatei owl-bt.json
wird als Plugin betrachtet. Die Plugin-JS-Datei exportiert Objekte mit Plugin-Funktionen.
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
} ,
onTreeLoad : ( { tree , path , project , projectPath } ) => {
}
}
onTreeSave
– wird ausgeführt, bevor die Baum-JSON-Datei auf der Festplatte gespeichert wird. Es sind nur Änderungen am tree
zulässig.tree
– Baumobjekt (gemäß Baum-JSON-Datei)path
– Baumdateipfadproject
– Projektobjekt (gemäß der Datei owl-bt.json
“)projectPath
– Projektdateipfadreturn
– Wenn der Rückgabewert false
oder eine Zeichenfolge ist, wird das Speichern verhindert und ein Fehler an den Client zurückgegebenonTreeLoad
– wird ausgeführt, nachdem die Baum-JSON-Datei von der Festplatte geladen wurde. Es sind nur Änderungen am tree
zulässig.tree
– Baumobjekt (gemäß Baum-JSON-Datei)path
– Baumdateipfadproject
– Projektobjekt (gemäß der Datei owl-bt.json
“)projectPath
– Projektdateipfad Mit onTreeSave
und onTreeLoad
ist es beispielsweise möglich, benutzerdefinierte Baumdateiformate zu erstellen. Wenn wir den Projektpfad in der Baumdatei speichern möchten, könnten wir das folgende Plugin erstellen:
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
tree . projectPath = projectPath ;
}
}
base
und isAbstract
Eigenschaften in der Projektdefinitionctrl+shift+p
-> 'core:Set Node Type'
oder rmb
-> 'Set Node Type'
)