Owl-bt est un éditeur d'arbres comportementaux. Il a été inspiré par les arbres de comportement du moteur Unreal d'une manière qui prend en charge des éléments de nœuds spéciaux tels que des décorateurs et des services. Cela rend les arbres plus petits et beaucoup plus lisibles.
Owl-bt a été créé parce que nous avions besoin d'un éditeur d'arbre de comportement pour notre jeu Tendril : Écho reçu, dans lequel nous nous concentrons sur le comportement des PNJ en direct.
Nous avons essayé certaines des solutions existantes, mais elles ne répondent pas à nos exigences comme :
npm install owl-bt -g
owlbt -h
cd < project-dir >
owlbt i
owlbt c < tree-path >
owlbt o path
Owl-bt s'exécute en tant que service sur le port 8955
par défaut. Cela peut être modifié dans le fichier de configuration .owlbtrc
, qui doit être créé dans le répertoire personnel de l'utilisateur.
{
"port" : 1234
}
Dans Owl-Bt, il existe trois types d'éléments :
ctrl+shift+p
Le fichier projet ( owl-bt.json
) définit tous les nœuds et types d'éléments de nœud qui peuvent être utilisés dans les arborescences.
fa-
){{PropertyName}}
fa-
){{PropertyName}}
fa-
){{PropertyName}}
Permet de définir des types de propriétés personnalisées
Exemple:
{
"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
}
]
}
]
}
Il est possible de dériver un type d'élément de nœud à partir d'un autre type en utilisant le paramètre base
.
Il est possible d'utiliser string
ou array of strings
pour le réglage base
. Dans le cas d'un tableau, les types d'éléments de base sont appliqués dans un ordre spécifié. Cela signifie que le type d'élément le plus récent remplace l'élément spécifié avant lui.
Eq, nous pouvons créer un nœud de base :
{
"name" : " MyBaseNode " ,
"icon" : " arrow-right " ,
"color" : " red " ,
"isAbstract" : true ,
"properties" : [
{
"name" : " prop-from-base1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"type" : " number "
}
]
},
Et nœud dérivé :
{
"name" : " MyDerivedNode " ,
"color" : " blue " ,
"base" : " MyBaseNode " ,
"properties" : [
{
"name" : " prop1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"default" : " abc " ,
"type" : " string "
}
]
},
Le nœud résultant après application de l'héritage ressemblera à :
{
"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 "
}
]
},
Le fichier owl-bt.js
dans le même répertoire que le fichier du projet owl-bt.json
est considéré comme un plugin. Le fichier Plugin js exporte un objet avec des fonctions de plugin.
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
} ,
onTreeLoad : ( { tree , path , project , projectPath } ) => {
}
}
onTreeSave
- exécuté avant que le fichier json de l'arborescence ne soit enregistré sur le disque. Seules les modifications d'objet tree
sont autorisées.tree
- objet tree (selon le fichier tree json)path
- chemin du fichier de l'arborescenceproject
- objet de projet (selon le fichier owl-bt.json
)projectPath
- chemin du fichier du projetreturn
- lorsque la valeur de retour est false
ou une chaîne, la sauvegarde est empêchée et l'erreur est renvoyée au clientonTreeLoad
- exécuté après le chargement du fichier tree json à partir du disque. Seules les modifications d'objet tree
sont autorisées.tree
- objet tree (selon le fichier tree json)path
- chemin du fichier de l'arborescenceproject
- objet de projet (selon le fichier owl-bt.json
)projectPath
- chemin du fichier du projet Il est possible par exemple de créer une arborescence personnalisée aux formats de fichiers en utilisant onTreeSave
et onTreeLoad
. Si nous voulions que le chemin du projet soit stocké dans le fichier arborescent, nous pourrions créer le plugin suivant :
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
tree . projectPath = projectPath ;
}
}
base
et isAbstract
dans la définition du projetctrl+shift+p
-> 'core:Set Node Type'
ou rmb
-> 'Set Node Type'
)