owl-bt es un editor de árboles de comportamiento. Se ha inspirado en los árboles de comportamiento del motor Unreal de tal manera que admite elementos de nodos especiales como decoradores y servicios. Esto hace que los árboles sean más pequeños y mucho más legibles.
owl-bt se creó porque necesitábamos un editor de árbol de comportamiento para nuestro juego Tendril: Echoceived, donde nos centramos en el comportamiento de los npc en vivo.
Hemos probado algunas de las soluciones existentes, pero no cumplen con nuestros requisitos, como:
npm install owl-bt -g
owlbt -h
cd < project-dir >
owlbt i
owlbt c < tree-path >
owlbt o path
owl-bt se ejecuta como servicio en el puerto 8955
de forma predeterminada. Esto se puede cambiar en el archivo de configuración .owlbtrc
, que debe crearse en el directorio de inicio del usuario.
{
"port" : 1234
}
En owl-bt, hay tres tipos de elementos:
ctrl+shift+p
El archivo de proyecto ( owl-bt.json
) define todos los nodos y tipos de elementos de nodos que se pueden usar en los árboles.
fa-
){{PropertyName}}
fa-
){{PropertyName}}
fa-
){{PropertyName}}
Permite definir tipos de propiedades personalizadas.
Ejemplo:
{
"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
}
]
}
]
}
Es posible derivar un tipo de elemento de nodo a partir de otro tipo utilizando la configuración base
.
Es posible utilizar string
o array of strings
para la configuración base
. En el caso de una matriz, los tipos de elementos básicos se aplican en un orden específico. Eso significa que el tipo de elemento posterior anula el elemento especificado antes.
Eq podemos crear un nodo base:
{
"name" : " MyBaseNode " ,
"icon" : " arrow-right " ,
"color" : " red " ,
"isAbstract" : true ,
"properties" : [
{
"name" : " prop-from-base1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"type" : " number "
}
]
},
Y nodo derivado:
{
"name" : " MyDerivedNode " ,
"color" : " blue " ,
"base" : " MyBaseNode " ,
"properties" : [
{
"name" : " prop1 " ,
"type" : " string "
},
{
"name" : " prop-from-base2 " ,
"default" : " abc " ,
"type" : " string "
}
]
},
El nodo resultante después de aplicar la herencia se verá así:
{
"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 "
}
]
},
El archivo owl-bt.js
en el mismo directorio que el archivo del proyecto owl-bt.json
se considera complemento. El archivo js del complemento exporta objetos con funciones de complemento.
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
} ,
onTreeLoad : ( { tree , path , project , projectPath } ) => {
}
}
onTreeSave
: se ejecuta antes de que el archivo json del árbol se guarde en el disco. Sólo se permiten modificaciones del objeto tree
.tree
- objeto de árbol (según el archivo json del árbol)path
- ruta del archivo de árbolproject
- objeto del proyecto (según el archivo owl-bt.json
)projectPath
: ruta del archivo del proyectoreturn
: cuando el valor de retorno es false
o una cadena, se evita guardar y se devuelve el error al clienteonTreeLoad
: ejecutado después de cargar el archivo json del árbol desde el disco. Sólo se permiten modificaciones del objeto tree
.tree
- objeto de árbol (según el archivo json del árbol)path
- ruta del archivo de árbolproject
- objeto del proyecto (según el archivo owl-bt.json
)projectPath
: ruta del archivo del proyecto Es posible, por ejemplo, crear formatos de archivo de árbol personalizados utilizando onTreeSave
y onTreeLoad
. Si quisiéramos tener la ruta del proyecto almacenada en el archivo del árbol, podríamos crear el siguiente complemento:
module . exports = {
onTreeSave : ( { tree , path , project , projectPath } ) => {
tree . projectPath = projectPath ;
}
}
base
e isAbstract
en la definición del proyectoctrl+shift+p
-> 'core:Set Node Type'
o rmb
-> 'Set Node Type'
)