owl-bt هو محرر لأشجار السلوك. لقد تم استلهامه من أشجار سلوك المحرك غير الواقعي بطريقة ما، حيث يدعم عناصر العقدة الخاصة مثل الديكورات والخدمات. وهذا يجعل الأشجار أصغر حجمًا وأكثر قابلية للقراءة.
تم إنشاء owl-bt لأننا كنا بحاجة إلى محرر شجرة السلوك للعبتنا Tendril: Echo Receed، حيث نركز على السلوك الحي للشخصية غير القابلة للعب.
لقد جربنا بعض الحلول الحالية، لكنها لم تلبي متطلباتنا مثل:
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
.
من الممكن استخدام string
أو array of strings
للإعداد base
. في حالة المصفوفة، يتم تطبيق أنواع العناصر الأساسية بترتيب محدد. وهذا يعني أن نوع العنصر الأحدث يتجاوز العنصر المحدد قبله.
مكافئ يمكننا إنشاء عقدة أساسية:
{
"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
مكونًا إضافيًا. يقوم ملف Plugin 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'
)