شجرة سلوك جودو
تنفيذ GDScript لشجرة السلوك الخاصة بالذكاء الاصطناعي للعبة، استنادًا إلى عقد Godot الأصلية واستخدام محرر شجرة المشهد المدمج.
إصدار C# -> https://github.com/MadFlyFish/godot-behavior-tree-csharp
تثبيت
- انسخ مجلد "الوظائف الإضافية" إلى الدليل الرئيسي لمشروعك.
- قم بتمكين المكون الإضافي من إعدادات المشروع، ثم أعد تشغيل Godot، وإلا فلن يتعرف على الفئات الجديدة (وهذا خطأ في المحرك).
- اختياريًا، يمكنك أيضًا سحب المجلد bt_example إلى الدليل الرئيسي لمشروعك.
- لرؤية المثال يعمل، قم بتشغيل مشهد agent.tscn. يعد المشهد ex_behavior_tree.tscn مثالاً لكيفية بناء الشجرة.
تعليمات:
- انقر على أيقونة إنشاء العقدة. يجب أن ترى العقد الجديدة المتاحة (إذا لم تفعل ذلك، أعد تشغيل Godot). يجب عليك استخدام BehaviourTree كعقدة جذر، والتي يجب أن تحتوي على فرع واحد فقط. يمكن أن يكون هذا الطفل أيًا من العقد ضمن فئة BTNode، والتي ترث جميعها من فئة BTNode.
- بعد إنشاء شجرة السلوك، يجب عليك تحديد مالك الذكاء الاصطناعي (الوكيل) وما هو Blackboard الذي سيتم استخدامه. يمكن وضع السبورات في أي مكان (بشرط أن تكون خارج الشجرة)، وحتى مشاركتها بين الأشجار المختلفة. يتسم النظام بالمرونة الكافية للسماح لك بتحديد كيفية وتوقيت تحديث بيانات السبورة الخاصة بك. على سبيل المثال، يمكنك إنشاء عقدة عادية باستخدام برنامج نصي يتعامل مع تحديث السبورة، على سبيل المثال. مع عمليات رد الاتصال للإشارة أو حتى قيد المعالجة (). أو يمكنك القيام بذلك من أي مكان آخر، حتى من داخل الشجرة، فقط تأكد من تصميم الأشياء بطريقة يمكنك صيانتها وتتبعها.
- تتدفق شجرة السلوك لتنفيذ كل من أبنائها، مما يعيد نوعًا من حالة النجاح أو الفشل. سيتم تنفيذ الفروع التي تتبع العقدة الناجحة فقط. يجب أن يُرجع BTNode إما النجاح أو الفشل، ولا يمكنه تعليق التنفيذ إلا من خلال استدعاء العائد ()، وبعد ذلك سيظل في حالة تشغيل حتى اكتمال التنفيذ. عندما يكون BTNode في حالة التشغيل، ستعلق الشجرة التنفيذ تدريجيًا (مع الاستثناء الوحيد وهو BTPallel ) حتى يكمل جميع الأطفال التنفيذ. هذا لأغراض التحسين.
- يتم تعريف تدفق الشجرة من خلال ما يسمى بالعقد المركبة: BTSequence، BTSelector، BTRandomSelector، BTRandomSequence، BTPallel والتي ترث جميعها من BTComposite. يكون التسلسل ناجحًا إذا نجح جميع الأطفال، بينما يفشل إذا فشل أحد الأطفال. المحدد هو العكس المنطقي، فهو ينجح إذا نجح أحد الأطفال، ويفشل إذا فشل جميع الأطفال. سيتم تشغيل الموازي لجميع الأطفال وسينجح دائمًا بغض النظر، دون انتظار الأطفال لإكمال التنفيذ. تقوم العقدة المركبة الأساسية بتشغيل جميع العناصر الفرعية وتنجح دائمًا، ولكنها تنتظر أيضًا اكتمال التنفيذ.
- يتم تنفيذ إجراءات سلوك الذكاء الاصطناعي الخاص بك في عقد BLeaf. أضف BLeaf، ثم قم بـ "توسيع البرنامج النصي". يمكنك الآن تحديد سلوكك الخاص في هذا البرنامج النصي عن طريق تجاوز طريقة _tick() . أفعالك سوف تذهب هنا. تأكد من قراءة التعليقات الموجودة في البرنامج النصي الأساسي لمعرفة أفضل الممارسات. تذكر أيضًا أن BLeaf لا ينبغي أن يكون لديه أطفال.
- يتم استخدام BTDecorator لتخصيص تنفيذ العقدة الفرعية. يمكن أن يكون لديهم طفل واحد فقط.
- BTConditional هو النوع الأكثر شيوعًا من الديكورات. أضف BTConditional وقم بتوسيع البرنامج النصي، ثم قم بتجاوز طريقة _ pre_tick() لتحديد الشروط التي سيتم بموجبها تنفيذ الطفل. تأكد من قراءة التعليق لأنه يوجد مثال مفيد هناك.
- BTGuards عبارة عن أدوات تزيين يمكن استخدامها لقفل الفروع مؤقتًا. اختياريًا، يمكنك تعيين أداة إلغاء القفل، والتي ستتجاوز وقت القفل المحدد. هناك أيضًا خيار تخصيص خزانة. يمكن لـ BTGuards أن تجعل سلوكك غنيًا جدًا وتفاعليًا، بالإضافة إلى تحسينه، حيث أنها تتجنب التفرع والتكرار غير الضروريين.
- تسمح لك أدوات الديكور الأخرى بتكرار التنفيذ وعكس نتيجة علامة التجزئة وما إلى ذلك. هناك الكثير الذي يمكنك القيام به من خلال تخصيص التنفيذ من خلال مصممي الديكور.
- الممارسة الجيدة هي استخدام العقد المتوفرة واتباع نمط تصميم شجرة السلوك. ولكن نظرًا لأن هذا تطبيق يعتمد على التعليمات البرمجية تمامًا دون أي محرر مرئي، فلديك قدر كبير من التحكم في التصميم وبالتالي هامش من الخطأ. هذه مجرد نصوص مفيدة تتبع بعض "الممارسات الجيدة" ولكنها ليست ملزمة بها، إن لم يكن لبعض القواعد الأساسية. الأمر متروك لك لتقرر كيفية تصميم شجرة السلوك الخاصة بك، ولكن ضع في اعتبارك أنك إذا أسأت استخدامها فلن تستفيد من قوة نمط شجرة السلوك. (على سبيل المثال، يمكنك حتى استخدام BTNode الأساسي لكل شيء وتوسيعه في كل مرة، على الرغم من أن ذلك سيكون فوضى)
- يمكن أن يكون لديك شجرة سلوك ضخمة، ولكن أفضل ممارسة هي اتباع فلسفة المكونات الخاصة بـ Godot وإنشاء عدة أشجار سلوك أصغر لكل مكون من مكونات مشهدك. على سبيل المثال، شجرة لوحدة التحكم في الحركة، وشجرة لوحدة التحكم في الأسلحة، وشجرة لمكون مستكشف المسار، وما إلى ذلك. يمكن أن تحتوي شجرة السلوك على سبورة واحدة فقط، ولكن يمكن استخدام نفس السبورة بواسطة العديد من الأشجار، لذا فهذه مفيد بشكل خاص إذا كنت تريد الحصول على عدة أشجار دون إنشاء سبورات متعددة. شخصيًا، السبب وراء استخدامي للسبورة كمكون منفصل، هو أنني أردت إنشاء فرق من الأعداء يتشاركون نفس البيانات ولكن يتصرفون بشكل مستقل، لذا فهذه حالة استخدام لهذا الغرض. علاوة على ذلك، عادةً ما يكون لدي عدة مكونات في الممثلين، وأريد استخدام نفس قاعدة البيانات لشجرة مختلفة.