owl-bt é um editor para árvores de comportamento. Ele foi inspirado nas árvores de comportamento do motor Unreal de uma forma que suporta itens de nós especiais, como decoradores e serviços. Isso torna as árvores menores e muito mais legíveis.
Owl-bt foi criado porque precisávamos de um editor de árvore de comportamento para nosso jogo Tendril: Echo Received, onde estamos nos concentrando no comportamento de NPCs ao vivo.
Tentamos algumas das soluções existentes, mas elas não atenderam aos nossos requisitos, como:
npm install owl-bt -g
owlbt -h
cd < project-dir >
owlbt i
owlbt c < tree-path >
owlbt o path
owl-bt é executado como um serviço na porta 8955
por padrão. Isso pode ser alterado no arquivo de configuração .owlbtrc
, que deve ser criado no diretório home do usuário.
{
"port" : 1234
}
No owl-bt, existem três tipos de itens:
ctrl+shift+p
O arquivo de projeto ( owl-bt.json
) define todos os nós e tipos de itens de nó que podem ser usados em árvores.
fa-
){{PropertyName}}
fa-
){{PropertyName}}
fa-
){{PropertyName}}
Permite definir tipos de propriedades personalizadas
Exemplo:
{
"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
}
]
}
]
}
É possível derivar um tipo de item de nó de outro tipo usando configuração base
.
É possível usar string
ou array of strings
para configuração base
. No caso de array, os tipos de itens base são aplicados em uma ordem especificada. Isso significa que o tipo de item posterior substitui o item especificado antes dele.
Eq podemos criar um nó base:
{
"name" : " MyBaseNode " ,
"icon" : " arrow-right " ,
"color" : " red " ,
"isAbstract" : true ,
"properties" : [
{
"name" : " prop-from-base1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"type" : " number "
}
]
},
E nó derivado:
{
"name" : " MyDerivedNode " ,
"color" : " blue " ,
"base" : " MyBaseNode " ,
"properties" : [
{
"name" : " prop1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"default" : " abc " ,
"type" : " string "
}
]
},
O nó resultante após a aplicação da herança será semelhante a:
{
"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 "
}
]
},
O arquivo owl-bt.js
no mesmo diretório do arquivo do projeto owl-bt.json
é considerado plugin. O arquivo js do plug-in exporta objeto com funções de plug-in.
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
} ,
onTreeLoad : ( { tree , path , project , projectPath } ) => {
}
}
onTreeSave
- executado antes que o arquivo json da árvore seja salvo no disco. Somente modificações do objeto tree
são permitidas.tree
- objeto tree (de acordo com o arquivo json tree)path
- caminho do arquivo em árvoreproject
- objeto do projeto (de acordo com o arquivo owl-bt.json
)projectPath
- caminho do arquivo do projetoreturn
- quando o valor de retorno é false
ou uma string, o salvamento é evitado e o erro é retornado ao clienteonTreeLoad
- executado após carregar o arquivo json da árvore do disco. Somente modificações do objeto tree
são permitidas.tree
- objeto tree (de acordo com o arquivo json tree)path
- caminho do arquivo em árvoreproject
- objeto do projeto (de acordo com o arquivo owl-bt.json
)projectPath
- caminho do arquivo do projeto É possível, por exemplo, criar formatos de arquivo de árvore personalizados usando onTreeSave
e onTreeLoad
. Se quiséssemos ter o caminho do projeto armazenado no arquivo em árvore, poderíamos criar o seguinte plugin:
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
tree . projectPath = projectPath ;
}
}
base
e isAbstract
na definição do projetoctrl+shift+p
-> 'core:Set Node Type'
ou rmb
-> 'Set Node Type'
)