القائمة الرئيسية

الصفحات

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding

التنقل باستخدام NavMesh  على Unity Game Engine 
في هذا المقال التعليمي سوف نتعرف على Navmesh في Unity ،
 وكيفية إنشائه واستخدامه في لعبتك كجزء من التنقل.

 استخدام Navigation و Pathfinding 

الملاحة واكتشاف المسارات
هل سبق لك أن تساءلت عن كيفية تحرك مختلف الشخصيات غير القابلة للعب 
(شخصيات غير قابلة للعب) في لعبة ما في جميع أنحاء عالم اللعبة ، 
وتجنب الأشياء وحتى في بعض الأحيان تتجنبك ، فقط لتخرج من خلفك لتمنحك ذعرًا سريعًا.
 كيف يتم ذلك بشكل واقعي؟ كيف تحدد ما يسمى بالروبوتات
 المسارات التي يجب أن تسلكها وأيها يجب تجنبها؟
في Unity ، يتم تحقيق هذه المعجزة (ليس كثيرًا بمجرد أن تعرف كيف تعمل)
 باستخدام NavMeshes .
تعد شبكات NavMeshes أو Navigational Meshes جزءًا من نظام البحث
 عن المسار والملاحة في Unity.



 يتيح لك نظام Navigational إنشاء شخصيات يمكنها التحرك بذكاء في جميع أنحاء عالم اللعبة ، 
باستخدام شبكات التنقل التي يتم إنشاؤها تلقائيًا من هندسة المشهد الخاصة بك .
 تسمح لك العوائق الديناميكية بتغيير تنقل الشخصيات في وقت التشغيل ،
 بينما تتيح لك الروابط غير الشبكية إنشاء إجراءات محددة مثل فتح الأبواب أو القفز من حافة.

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding
 

مكونات مختلفة من NavMesh

يتكون نظام Unity NavMesh من الأجزاء التالية:

1- NavMesh 
(اختصار لـ Navigation Mesh) عبارة عن بنية بيانات تصف الأسطح القابلة
 للمشي في عالم اللعبة وتسمح بالعثور على مسار من موقع يمكن المشي فيه إلى موقع آخر في عالم اللعبة.
 يتم إنشاء بنية البيانات ، أو خبزها ، تلقائيًا من هندسة المستوى.

2- NavMesh Agent
يساعدك مكون NavMesh Agent في إنشاء شخصيات تتجنب 
بعضها البعض أثناء التحرك نحو هدفهم. 
يتعامل الوكلاء مع عالم اللعبة باستخدام NavMesh 
ويعرفون كيفية تجنب بعضهم البعض وكذلك تحريك العقبات.



3- Off-Mesh Link
يسمح لك مكون Off-Mesh Link بدمج اختصارات التنقل التي
 لا يمكن تمثيلها باستخدام سطح قابل للمشي.
 على سبيل المثال ، يمكن وصف القفز فوق خندق أو سياج ، 
أو فتح باب قبل السير فيه ، على أنه روابط خارج الشبكة.

4- NavMesh Obstacle
يتيح لك مكون NavMesh Obstacle وصف العوائق المتحركة التي يجب 
على الوكلاء تجنبها أثناء التنقل في العالم. يعتبر البرميل أو الصندوق الذي
 يتحكم فيه نظام الفيزياء مثالًا جيدًا على وجود عقبة. 
أثناء تحرك العائق ، يبذل العملاء قصارى جهدهم لتجنب ذلك ، ولكن بمجرد 
أن يصبح العائق ثابتًا ، فإنه سيحدث ثقبًا في شبكة التنقل حتى يتمكن العملاء 
من تغيير مساراتهم للتوجيه حوله ، أو إذا كان العائق الثابت يعيق المسار بالطريقة ،
 يمكن للوكلاء العثور على طريق مختلف وثائق Untiy NavMesh .
حسنًا ، كل هذا جيد ولكن هذا كله مجرد نظرية. 
هذا يخبرنا فقط عن كل الأدوات الموجودة. لمعرفة كيفية استخدامها ، 
فهذه لعبة كرة مختلفة تمامًا. لمعرفة كيفية تنفيذ هذه الأدوات ، ما هو أفضل من مثال؟



حان الوقت للحصول على مثال!

ما نهدف إلى القيام به هنا ، هو أننا نرغب في
 إنشاء نوع من مشهد المتاهة ، حيث نضع لاعبنا. 
سنقوم بتنفيذ NavMesh بطريقة أنه عند النقر فوق نقطة معينة في المتاهة ، 
سيبدأ كائن اللاعب تلقائيًا في التحرك ويصل إلى النقطة المحددة
 (التي تم النقر عليها) في المتاهة. سهل؟ حسنًا ، إلى حد كبير.

الإعداد والتنزيلات
لا يتم تضمين المكونات التي سنستخدمها في التثبيت القياسي.
تنزيل المستودع من روابط التنزيل أدناه ،
 على Unity Technologies GitHub بالنقر فوق الزر.
 بعد ذلك ، افتح مشروع مكونات NavMesh باستخدام Unity  ،
 أو بدلاً من ذلك انسخ محتويات ملف
مجلد Assets / NavMeshComponents إلى مشروع 
موجود (تحقق من إصدار Unity قبل التنزيل)
Unity 5.6 NavMesh  - تحميل برنامج Unity 2017 NavMesh

المشهد
المشهد الذي سنستخدمه سيبدو مثل هذا.
 الكبسولة الخضراء هي لاعبنا الذي سنحاول نقله. الأشياء البرتقالية هي
 الجدران التي سنتجنبها والشيء الأسود هو الأرضية التي سنمشي عليها.
 يمكنك محاولة إنشاء هذا المشهد بنفسك (جرب). 
إذا لم يكن كذلك ، فانقر فوق الارتباط لتنزيل المشهد.





Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding


الخبز في NavMesh
الخبز؟ هل Nav Mesh نوعًا من الكعك؟ حسنًا .... بطريقة ، نعم.
 انظر ، يتم حساب شبكات التنقل وإنشاءها بواسطة محرك Unity .
 يشار إلى عملية الحساب هذه وتوليد شبكة Nav باسم الخبز.
لذا ما علينا فعله الآن هو خبز NavMesh الخاص بنا .
للقيام بذلك ، قم بإنشاء كائن فارغ في علامة تبويب التسلسل الهرمي ، 
وقم بتسميته "NavMesh" ، وأعد تعيين التحويل الخاص به (قم بذلك بنفسك).
حدد كائن "NavMesh" هذا في التسلسل الهرمي وانقر فوق
 المكونات> التنقل> NavMeshSurface.

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding


الآن فقط لرؤية جمال NavMesh ، اضغط على Bake.

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding



عند الضغط على  الخبز ، نحصل على الصورة أعلاه.
 تُظهر المنطقة الزرقاء السطح الذي يمكن المشي فيه.
 الخبز الحالي لـ NavMesh ليس ما نريده.
 ما نريده هو أن الجزء المسطح من الأرضية هو الذي تم تمييزه باللون الأزرق. 
لتحقيق ذلك ، سنقوم بتغيير خصائص الوكيل لتتناسب مع لاعبنا.
 لذلك ، حدد نوع العامل المنسدل وانقر على فتح إعدادات الوكيل.

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding


الآن في علامة التبويب التنقل ، انقر فوق الرمز + لإنشاء نوع وكيل جديد و
إدخال المعلمات كما هو موضح في الصورة.

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding


الآن النقر فوق Bake سيكون له التأثير المطلوب. هذا هو الطريق الذي سنحتاجه.


Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding

ستلاحظ الآن أن المسار يتعامل مع لاعبنا باعتباره عقبة وبالتالي لا يوجد مسار تحت اللاعب. 
لتصحيح هذا ، نحتاج إلى وضع لاعبنا في طبقة أخرى وإلغاء تحديد الطبقة من إعداد طبقة التضمين. 
للقيام بذلك ، انقر فوق القائمة المنسدلة Layer وحدد خيار Add Layer ....



Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding


الآن في طريقة العرض Layer ، اكتب "Player Layer" في
 مساحة طبقة حرة واضغط على Enter.

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding

بعد ذلك ، حدد كائن NavMesh من التسلسل الهرمي وفي المراقب ،
 انقر فوق القائمة المنسدلة تضمين الطبقات وقم بإلغاء تحديد طبقة المشغل.

الآن حدد كائن المشغل في التسلسل الهرمي ، وحدد الطبقات المنسدلة وانقر
 على "طبقة المشغل". 
وبالتالي قمنا بتغيير الطبقة التي يوجد بها كائن Player.

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding





انقر الآن على bake مرة أخرى للحصول على NavMeshWalkable Surface.

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding

الآن على الرغم من أنه يبدو أن الجدران محظورة ، إلا أننا لم نضمن ذلك.
 لضمان ذلك علينا أن نجعل الجدران على وجه التحديد "غير قابلة للمشي".
 للقيام بذلك ، حدد أولاً جميع كائنات الحائط من الجدار (0) إلى الجدار (9)
 في التسلسل الهرمي ، ثم حدد القائمة المنسدلة إضافة مكونات. 
من هذه القائمة المنسدلة ، حدد التنقل> NavMeshModifier.
 الآن جميع كائنات الحائط لديها هذا المكون.
مع استمرار تحديد جميع كائنات الحائط ، تحقق في المراقب 
من سمة Override Area في Nav Mesh Modifier. 
حدد الآن نوع المنطقة المنسدلة وحدد "غير قابل للمشي".



Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding

الآن أخيرًا انقر فوق Bake مرة أخرى واستمتع بجمال NavMesh الذي قمت بإنشائه.

إعداد المشغل
يعد إعداد المشغل أمرًا سهلاً للغاية.
 علينا فقط إضافة مكون "NavMeshAgent" إلى كائن المشغل.

لفعل هذا:

حدد كائن Player في التسلسل الهرمي .
في المراقب ، انقر على القائمة المنسدلة إضافة مكونات .
من القائمة المنسدلة ، حدد التنقل> NavMeshAgent .

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding




نحصل على هذا المكون متصل بالمشغل . ا
لآن يمكن للاعبنا الوصول إلى NavMeshSurface . 
يمكنك محاولة للعب مع حولها التوجيهية و تجنب العوائق 
الإعدادات كما أنها تتعامل مع الحركة الفعلية لللدينا لاعب .

جعل لاعبنا يتحرك
لجعل لاعبنا يتحرك ، سنرفق نصًا به ، مما سيجعل NavMesh ينقل لاعبنا 
إلى النقطة الموجودة على الأرض التي نضغط عليها.
للقيام بذلك ، قم بإرفاق برنامج نصي #C جديد ، يسمى "Controller" ، بكائن Player .


using UnityEngine;
using UnityEngine.AI;

public class Controller : MonoBehaviour 
{
    public NavMeshAgent playerAgent;

    void Update () 
    {
        if (Input.GetMouseButtonDown (0))
        {
            Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);

            RaycastHit hit;

            if (Physics.Raycast (camRay, out hit))
            {
                playerAgent.SetDestination (hit.point);
            }
        }    
    }
}

دعونا الآن نفهم المنطق وراء الكود.
 هنا ما نرغب في القيام به هو الحصول على الموضع الذي تم فيه النقر على
 زر الفأرة الأيسر ، وإخراج شعاع من الكاميرا إلى تلك النقطة. 
تحتوي الكاميرا على وظيفة تسمى ScreemPointToRay (الموضع) ، 
والتي تطلق شعاعًا من الكاميرا إلى النقطة المعطاة كمدخل.
 باستخدام الأشعة ، يمكننا معرفة الخصائص والمكونات و
السمات وما إلى ذلك من الكائن في نهاية الشعاع.




بمجرد أن يصطدم الشعاع بالأرض ، سنحصل على قيمة حقيقية في عبارة if و
 سنقوم بتحريك اللاعب نحو نقطة الوجهة. 
يتم ذلك باستخدام وظيفة SetDestination (Vector3) لفئة 
NavMeshAgent. 
هذه الوظيفة تنقل العامل إلى النقطة المعطاة كمعامل.

الآن بعد كتابة هذا الرمز ، في Unity ، حدد كائن Player من التسلسل الهرمي ، 
وفي المراقب ، قم بسحب وإسقاط كائن Player في متغير playerAgent في البرنامج النصي للتحكم.

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding


الآن نحن على ما يرام! المضي قدما اضغط تشغيل! شاهد السحر يحدث!

Unity Game Engine: مميزات واستخدامات Navigation-Pathfinding


هذه مجرد متاهة بسيطة. يمكنك اللعب بهذا. قم بإنشاء المستويات الخاصة بك ،
 واخبز NavMesh وشاهد لاعبنا وهو يتنقل في المتاهة. 
أخيرًا والأهم ، استمتع أثناء صنع لعبتك!


قوة NavMeshes

ما رأيناه كان مجرد الأساس المطلق لاستخدام NavMeshes.
 يمكن أيضًا استخدام NavMeshes أثناء وقت التشغيل.

على سبيل المثال ، خذ أرضية بجدران متحركة. يتغير NavMeshSurface
 لهذه البيئة باستمرار. وبالتالي يتم حساب وقت تشغيل NavMeshes 
(على الرغم من أنه مكلف للغاية على الموارد ؛ تجنب).

يمكن أيضًا استخدام NavMeshes للمستويات التي تم إنشاؤها إجرائيًا أيضًا. 
ما يتعين علينا القيام به هو مجرد خبز NavMesh عند البدء. 
للقيام بذلك ، نستخدم وظيفة ()BuildNavMesh لفئة NavMeshSurface.

وبالتالي لدينا الآن أداة قوية بقدر سهولة استخدامها.
 لكن تذكر أن الخبز عملية ثقيلة للمعالجة ، لذا استخدمها بحكمة.
ويمكنك ايضا اضافة الصوت الى لعبتك في Unity Game Engine .
جدول المحتويات