owl-bt — редактор деревьев поведения. Он был вдохновлен деревьями поведения движка Unreal и поддерживает специальные элементы узлов, такие как декораторы и сервисы. Это делает деревья меньше и более читабельными.
owl-bt был создан, потому что нам нужен был редактор дерева поведения для нашей игры Tendril: Echo Received, где мы фокусируемся на поведении живых NPC.
Мы опробовали некоторые из существующих решений, но они не соответствуют нашим требованиям, например:
npm install owl-bt -g
owlbt -h
cd < project-dir >
owlbt i
owlbt c < tree-path >
owlbt o path
owl-bt по умолчанию работает как служба на порту 8955
. Это можно изменить в файле конфигурации .owlbtrc
, который должен быть создан в домашнем каталоге пользователя.
{
"port" : 1234
}
В owl-bt есть три типа предметов:
ctrl+shift+p
Файл проекта ( owl-bt.json
) определяет все узлы и типы элементов узлов, которые можно использовать в деревьях.
fa-
){{PropertyName}}
fa-
){{PropertyName}}
fa-
){{PropertyName}}
Позволяет определять типы пользовательских свойств.
Пример:
{
"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
}
]
}
]
}
Можно получить тип элемента узла из другого типа, используя base
настройку.
Для base
настройки можно использовать string
или array of strings
. В случае массива типы базовых элементов применяются в указанном порядке. Это означает, что более поздний тип элемента переопределяет элемент, указанный перед ним.
Уравнение, мы можем создать базовый узел:
{
"name" : " MyBaseNode " ,
"icon" : " arrow-right " ,
"color" : " red " ,
"isAbstract" : true ,
"properties" : [
{
"name" : " prop-from-base1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"type" : " number "
}
]
},
И производный узел:
{
"name" : " MyDerivedNode " ,
"color" : " blue " ,
"base" : " MyBaseNode " ,
"properties" : [
{
"name" : " prop1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"default" : " abc " ,
"type" : " string "
}
]
},
Результирующий узел после применения наследования будет выглядеть так:
{
"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 "
}
]
},
Файл owl-bt.js
в том же каталоге, что и файл проекта owl-bt.json
считается плагином. Файл плагина js экспортирует объект с функциями плагина.
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
} ,
onTreeLoad : ( { tree , path , project , projectPath } ) => {
}
}
onTreeSave
— выполняется перед сохранением json-файла дерева на диск. Разрешены только модификации объекта tree
.tree
- объект дерева (согласно json-файлу дерева)path
- путь к файлу в деревеproject
— объект проекта (согласно файлу owl-bt.json
)projectPath
— путь к файлу проектаreturn
- когда возвращаемое значение равно false
или строке, сохранение предотвращается и клиенту возвращается ошибка.onTreeLoad
— выполняется после загрузки json-файла дерева с диска. Разрешены только модификации объекта tree
.tree
- объект дерева (согласно json-файлу дерева)path
- путь к файлу в деревеproject
— объект проекта (согласно файлу owl-bt.json
)projectPath
— путь к файлу проекта Например, можно создать собственные форматы файлов дерева, используя onTreeSave
и onTreeLoad
. Если бы мы хотели, чтобы путь к проекту хранился в файле дерева, мы могли бы создать следующий плагин:
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
tree . projectPath = projectPath ;
}
}
base
и isAbstract
в определении проекта.ctrl+shift+p
-> 'core:Set Node Type'
или rmb
-> 'Set Node Type'
)