أنشِئ لعبة الواقع المعزّز باستخدام مؤسسة AR Foundation من Unity

أنشِئ لعبة الواقع المعزّز باستخدام AR Foundation من Unity

لمحة عن هذا الدرس التطبيقي حول الترميز

subjectتاريخ التعديل الأخير: يونيو 25, 2021
account_circleتأليف: Dereck Bridie

1. نظرة عامة

ARCore هو إطار عمل Google لإنشاء تجارب الواقع المعزّز على الهواتف الذكية. يمكنك استخدام AR Foundation من Unity لإنشاء تطبيقات الواقع المعزّز من عدّة منصات.

ما ستُنشئه

في هذا الدليل التعليمي حول البرمجة، ستُنشئ لعبة بسيطة باستخدام AR Foundation. هدف اللعبة هو جمع الطرود باستخدام سيارة تتحكّم فيها باستخدام جهازك الجوّال.

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

بنهاية هذا الدليل التعليمي حول الرموز البرمجية، ستتمكّن لعبتك من تنفيذ ما يلي:

  • يمكنك رصد الطائرات في العالم الحقيقي ورسم ملعب فوقها.
  • بث أشعة من زاوية رؤية الكاميرا ورصد التقاطعات مع المستويات
  • وبإمكانك التفاعل مع ظروف الإضاءة الفعلية لإضفاء المزيد من الواقعية على لعبتك.

المُعطيات

  • كيف يمكن إعداد مشروع يستخدم مؤسسة AR Foundation من Unity.
  • كيفية استخدام ARPlaneManager للاشتراك في طائرات جديدة
  • كيفية استخدام Raycast للعثور على التقاطعات باستخدام الهندسة الافتراضية
  • كيفية استخدام ARLightEstimationData لإضاءة المشهد

المتطلبات

2. إعداد بيئة التطوير

في هذه الخطوة، ستعمل على تجهيز بيئتك للتطوير باستخدام AR Foundation من Unity.

التأكّد من توافق جهازك مع ميزة "الواقع المعزّز"

تعتمد تجارب الواقع المعزّز على أجهزة Android على ARCore، وهي متاحة على الأجهزة المتوافقة مع ARCore. يجب التأكّد من توافق جهاز التطوير مع الواقع المعزّز. بدلاً من ذلك، يمكنك استخدام مثيل Android Emulator المتوافق مع الواقع المعزّز والذي تم إعداده بشكل صحيح.

إعداد تصحيح أخطاء USB على جهازك

يجب تفعيل خيارات المطوّرين على جهازك لتشغيل تطبيقات تصحيح الأخطاء. وإذا لم تكن قد فعلت ذلك بعد، راجِع وثائق Android عن تفعيل خيارات المطوّرين وتصحيح أخطاء الجهاز عبر USB.

تثبيت Unity (2020.3 LTS)

ثبِّت Unity 2020 LTS على محطة العمل. في هذا الدرس التطبيقي حول الترميز، يتم عرض لقطات شاشة لواجهة مستخدم Unity بإصدار 2020.3 (LTS). قد تنجح إصدارات أخرى من Unity، ولكن قد تتطلّب خطوات إضافية. وقد يبدو مختلفًا عن لقطات الشاشة المعروضة هنا.

إنشاء مشروع جديد

أنشئ مشروعًا جديدًا باستخدام نموذج مسار العرض العام. أدخِل اسمًا وصفيًا وموقعًا جغرافيًا مناسبًا، ثم اضغط على إنشاء.

تثبيت الأطر المطلوبة

يمكن العثور على AR Foundation من Unity في Unity Package Manager.

  1. افتح هذا التطبيق بالنقر على Window (نافذة) > Package Manager (مدير الحِزم).

  1. في هذه النافذة، ثبِّت الحِزم التي ستستخدمها في هذا الدرس التطبيقي حول الترميز. يمكنك عرض أحدث النُسخ من أُطر العمل هذه من خلال توسيع الإدخال الخاص بها باستخدام الرمز . ثبِّت أحدث إصدارات من كلٍّ من الإطارات التالية:
    • مؤسسة AR
    • مكوّن ARCore الإضافي للواقع الممتد

عند الانتهاء، من المفترض أن يظهر "مدير الحِزم" على النحو التالي:

تثبيت حزمة المبتدئين

في هذا الدليل التعليمي حول الرموز البرمجية، قدّمنا حزمة للمبتدئين تحتوي على ملفات Prefab والنصوص البرمجية التي ستسرّع بعض أجزاء الدليل التعليمي حتى تتمكّن من التركيز على كيفية استخدام AR Foundation.

  1. ثبِّت الحزمة الأساسية من خلال فتح مواد العرض > استيراد حزمة > حزمة مخصّصة... وفتح starter-package.unitypackage.
  2. في النافذة المنبثقة، تأكَّد من تحديد كل شيء.
  3. انقر على استيراد.

تغيير إعدادات الإصدار

بما أنّ التطبيق سيتم تشغيله على Android، عليك تغيير نظام التشغيل الأساسي للإنشاء إلى Android:

  1. افتح ملف > إعدادات الإنشاء.
  2. في لوحة النظام الأساسي، اختَر Android.
  3. يمكنك اختياريًا تفعيل الإصدار المخصّص للتطوير وتصحيح أخطاء النصوص البرمجية للاحتفاظ بمعلومات تصحيح الأخطاء أثناء تشغيل تطبيقك.
  4. انقر على تبديل المنصة.

تغيير إعدادات المشروع

يجب إعداد AR Foundation لإعداد أنظمة XR عند بدء التشغيل.

  1. افتح تعديل >. إعدادات المشروع... وانقر على قسم إدارة المكون الإضافي XR.
  2. في علامة التبويب Android، فعِّل ARCore.

  1. في يمين الصفحة، انقر على قسم المشغّل.
  2. في علامة التبويب Android، ضمن الإعدادات الأخرى، أزِل Vulkan من Graphics APIs.

  1. تتطلّب التطبيقات المطلوبة للواقع المعزّز التي تستخدم ARCore مستوى واجهة برمجة تطبيقات يبلغ 24 كحد أدنى. انتقِل للأسفل وابحث عن الحد الأدنى لمستوى واجهة برمجة التطبيقات. اضبط الحد الأدنى لمستوى واجهة برمجة التطبيقات على 24.

إضافة عناصر المشهد المطلوبة

يتضمّن نموذج مسار العرض العام بعض كائنات الألعاب التي لن تستخدمها في هذا البرنامج التعليمي.

  1. حذف جميع عناصر اللعبة في SampleScene

  1. أضِف عناصر AR Foundation. انقر بزر الماوس الأيمن في لوحة التسلسل الهرمي. استخدِم هذه القائمة لإضافة ما يلي:
  • XR > جلسة الواقع المعزّز: يتحكّم هذا الكائن في مراحل نشاط تجربة الواقع المعزّز.
  • XR > أصل جلسة الواقع المعزّز: يحوّل هذا الكائن إحداثيات الواقع المعزّز إلى إحداثيات عالم Unity.
  • خفيفة > إضاءة توجيهية: توفّر هذه الميزة مصدر إضاءة لإضاءة عناصر اللعبة.

يجب أن يبدو التسلسل الهرمي على النحو التالي:

  1. وسِّع مصدر جلسة الواقع المعزّز الذي أنشأته في التسلسل الهرمي، واختَر كائن كاميرا الواقع المعزّز. في أداة الفحص، غيِّر علامتها إلى MainCamera.

إعداد المعالجة

يحتاج "مسار العرض الشامل" في Unity إلى تغيير واحد لكي يكون متوافقًا مع AR Foundation.

  1. في لوحة المشروع، انتقِل إلى مواد العرض > الإعدادات للعثور على مادة عرض ForwardRenderer.

  1. اختَر ForwardRenderer.
  2. في لوحة "أداة الفحص"، استخدِم إضافة ميزة العارض لإضافة ميزة "عارض خلفية الواقع المعزّز". سيعرض هذا المكوِّن خلاصة الكاميرا في المشهد.

التحقّق من الإعداد

  1. تأكَّد من توصيل جهازك بالطاقة ومن تفعيل تصحيح أخطاء ADB.
  2. انقر على ملف > التصميم والتشغيل... سيؤدي هذا إلى تحميل التطبيق على جهازك وتشغيله عند تثبيته.
  3. من المفترض أن تظهر خلاصة الكاميرا على شاشة جهازك.

في الخطوة التالية، ستبدأ في إضافة وظائف إلى تطبيقك.

3. اكتشِف الطائرات على أرض الواقع

بعد إعداد مشهد أساسي، يمكنك البدء في تطوير اللعبة. في هذه الخطوة، سترصد الطائرات وترسمها في المشهد.

إضافة مكوّن ARPlaneManager

يرصد ARPlaneManager ARPlane وينشئ عناصر اللعبة ويحدّثها ويزيلها عندما يتغيّر فهم الجهاز للبيئة.

  1. باستخدام لوحة التسلسل الهرمي، يمكنك إنشاء GameObject فارغة.
  2. أعِد تسميته إلى Driving Surface Manager. سيعرض هذا المكوّن الطائرات إلى أن يختار اللاعب طائرة.
  3. اختَر عنصر اللعبة الجديد. في لوحة "المدقق"، انقر على إضافة مكوّن لإضافة مدير سطح AR.

  1. اضبط ARPlaneManager من خلال ضبط الحقل Plane Prefab:
    1. انقر على الزر بجانب None لعرض نافذة اختيار GameObject.
    2. اختَر علامة التبويب مواد العرض وابحث عن مستوى سطح الطريق.

يوفر هذا الإعداد المسبق من حزمة المبتدئين زخرفة أرضية خشبية تُستخدم كزينة للطائرة.

  1. تغيير Detection Mode إلى Horizontal يؤدي ذلك إلى ضبط ARPlaneManager بحيث يتم توفير طائرات أفقية فقط، وهي مثالية للقيادة.

إضافة المكوِّن ARRaycastManager

تعرض ARRaycastManager وظيفة البث الشعاعي. في الخطوة التالية، سنستخدم هذا العنصر لتقديم عناصر التحكّم للمستخدم.

  1. تأكَّد من اختيار الكائن المسمى Driving Surface Manager في لوحة "التدرّج الهرمي".
  2. في "المدقق"، انقر على إضافة مكوّن لإضافة مكوّن ARRaycastManager إلى عنصر اللعبة.

ما مِن إعدادات إضافية مطلوبة لهذا المكوّن.

إضافة مكوّن DrivingSurfaceManager

DrivingSurfaceManager هو نص برمجي مساعد من حزمة المبتدئين يسمح باختيار ARPlane. بعد اختيار ARPlane، سيتم إخفاء جميع الطائرات الأخرى، وسيتم إيقاف الطائرات الجديدة.

  1. تأكَّد من اختيار الكائن المُسمى Driving Surface Manager في لوحة "التدرّج الهرمي".
  2. في "أداة الفحص"، انقر على إضافة مكوِّن لإضافة مكوِّن DrivingSurfaceManager إلى كائن لعبتك.

ليست هناك حاجة إلى مزيد من الضبط لهذا المكوِّن.

تشغيل التطبيق

  1. انقر على ملف > Build and Run... لاختبار التغييرات.
  2. وجِّه جهازك إلى سطح أفقي في العالم وحرِّك جهازك لتحسين فهم ARCore للعالم.

  1. عندما يرصد ARCore طائرة، من المفترض أن يظهر لك سطح ملوث يغطّي الأسطح في الواقع. تنشئ السمة ARPlaneManager مثيلاً للدالة Plane Prefab المحددة لكل طائرة تم اكتشافها. إنّ الإعداد المسبق Driving Surface Plane يتضمّن المكوِّن ARPlaneMeshVisualizer الذي ينشئ شبكة متداخلة لـ ARPlane محدّد.

في الخطوة التالية، ستستخدم طائرة تم رصدها كملعب.

4. إجراء اختبار إصابة للطائرات التي تم رصدها

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

إنشاء شبكة تصويب

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

ولـ "لصق" شبكة الاستهداف هذه بمستوى الواقع المعزّز، استخدِم اختبار الارتطام. اختبار النتائج هو تقنية تحسب التقاطعات عند صب شعاع في اتجاه معين. ستستخدم اختبارًا للنقاط المؤثرة لرصد تقاطع في اتجاه عرض الكاميرا.

إضافة الشبكة

  1. في لوحة المشروع بالقرب من أسفل الشاشة، انتقِل إلى مواد العرض > حزمة البدء.
  2. ضع الإعداد المسبق للشبكات في المشهد من خلال سحبه إلى جزء التسلسل الهرمي للمشروع.
  3. حدد الشبكة في التسلسل الهرمي.
  4. في "أداة الفحص"، انقر على إضافة مكوِّن. أضِف النص البرمجي ReticleBehaviour من حزمة Starter. يحتوي هذا النص على بعض النصوص النموذجية للتحكم في الشبكة.
  5. يعتمد نص ReticleBehaviour البرمجي على Driving Surface Manager الذي أنشأته من قبل، لذا أضِف الاعتماد بالنقر على أداة اختيار Driving Surface Manager. اختَر علامة التبويب المشهد وانقر على Driving Surface Manager.

تعديل ReticleBehaviour

سيضع النص البرمجي ReticleBehavior الشبكة على المستوى السطحي في وسط إطار عرض الجهاز.

  1. افتح النص البرمجي ReticleBehaviour.cs من خلال النقر مرّتين على الحقل Script.
  2. حدِّد منتصف الشاشة باستخدام كاميرا ViewToScreenPoint. عدِّل طريقة Update() لإضافة ما يلي:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
  1. استخدِم هذه النقطة لإجراء بث شعاعي. أضِف ما يلي:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);

سيحتوي المتغيّر hits على عناصر ARRaycastHit التي تصف النقاط على العناصر القابلة للتتبّع التي تتقاطع مع ray.

  1. حدِّد نقطة التقاطع ذات الصلة من خلال طلب البحث في قائمة hits. امنح الأولوية للطائرة المُقفَلة المضمّنة في DrivingSurfaceManager، وفي حال عدم توفّرها، استخدِم اصطدام الطائرة الأولى. أضِف ما يلي إلى نهاية Update():
CurrentPlane = null;
ARRaycastHit? hit = null;
if (hits.Length > 0)
{
    // If you don't have a locked plane already...
    var lockedPlane = DrivingSurfaceManager.LockedPlane;
    hit = lockedPlane == null
        // ... use the first hit in `hits`.
        ? hits[0]
        // Otherwise use the locked plane, if it's there.
        : hits.SingleOrDefault(x => x.trackableId == lockedPlane.trackableId);
}
  1. إذا كان hit يحتوي على نتيجة، انقل تحويل GameObject هذا إلى موضع النتيجة.
if (hit.HasValue)
{
    CurrentPlane = DrivingSurfaceManager.PlaneManager.GetPlane(hit.Value.trackableId);
    // Move this reticle to the location of the hit.
    transform.position = hit.Value.pose.position;
}
Child.SetActive(CurrentPlane != null);

اختبار الشبكة

  1. انقر على ملف > إنشاء وتشغيل... لاختبار التغييرات.
  2. عند توجيه جهازك نحو طائرة، من المفترض أن ترى شبكة الاستهداف تتّبع حركات الكاميرا.

إنشاء سيارة

سيتحكّم اللاعب في سيارة لعبة ستتّجه نحو موقع شبكة الاستهداف. يتم توفير طراز وسلوك لهذه السيارة في "حزمة المبتدئين".

إضافة CarManager إلى المشهد

  1. في التسلسل الهرمي، أنشئ GameObject جديدًا فارغًا.
  2. إعادة تسميته إلى Car Spawner
  3. اختَر العنصر الذي أنشأته. في لوحة التسلسل الهرمي، انقر على إضافة مكوّن لإضافة المكوّن CarManager.
  4. يمكنك إعداد العناصر التي تعتمد عليها CarManager من خلال النقر على أداة الاختيار لكل حقل:
    • نموذج سيارة مُعدّ مسبقًا: في مواد العرض، اختَر نموذج سيارة مُعدّ مسبقًا.
    • شبكة الاستهداف: في المشهد، اختَر شبكة الاستهداف المُعدّة مسبقًا.
    • منصة إدارة مساحة القيادة: في المشهد، اختَر منصة إدارة مساحة القيادة.

يؤدي سلوك CarManager هذا إلى ظهور سيارة لعبة على الطائرة التي ترتكز عليها الشبكة الشبكية. يمكنك الاطّلاع على النص البرمجي لـ "CarBehaviour" لمعرفة كيفية برمجة السيارة إذا كنت تريد ذلك.

اختبار القيادة

  1. انقر على ملف > يمكنك "الإنشاء والتشغيل" لاختبار التغييرات.
  2. عند النقر على طائرة، يجب أن ترى سيارة صغيرة تظهر في ذلك الموقع. ستتبع هذه السيارة شبكة الاستهداف.

إضافة عنصر اللعبة

بما أنّه يمكن للاعب التحكّم في عنصر في المشهد، يمكنك منح اللاعب وجهة للقيادة إليها.

  1. أنشئ GameObject فارغًا جديدًا في التسلسل الهرمي.
  2. إعادة تسميته إلى Package Spawner
  3. اختَر الجسم الذي أنشأته. في لوحة التدرّج الهرمي، انقر على إضافة مكوِّن لإضافة المكوِّن PackageSpawner إليه.
  4. يمكنك إعداد العناصر التي تعتمد عليها PackageSpawner من خلال النقر على أداة الاختيار لكل حقل:
    • الإعداد المسبق للحزمة: في مواد العرض، اختَر الإعداد المسبق للحزمة.
    • منصة إدارة مساحة القيادة في المشهد، اختَر مدير سطح القيادة.

يؤدي سلوك PackageSpawner هذا إلى إنشاء حزمة جديدة في موقع جغرافي عشوائي على ARPlane مُقفَل في حال عدم توفّر طرد حاليًا.

اختبار اللعبة

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

5. إعداد ميزة تقدير الإضاءة

بعد اكتمال اللعبة الأساسية، أضِف لمسة من الواقعية إلى مشهد الواقع المعزّز. في هذه الخطوة، ستستخدم واجهة برمجة التطبيقات Lighting Estimation API من ARCore لرصد الإضاءة المتوفّرة في العالم الواقعي استنادًا إلى لقطات الكاميرا الواردة. سيتم استخدام هذه المعلومات لتعديل الإضاءة في المشهد لتتلاءم مع الإضاءة في الواقع.

تفعيل ميزة تقدير الإضاءة

  1. في التسلسل الهرمي، وسِّع مصدر جلسة الواقع المعزّز واختَر عنصر كاميرا الواقع المعزّز.
  2. في أداة الفحص، وسِّع النص البرمجي لمدير كاميرا الواقع المعزّز.
  3. غيِّر الحقل تقدير الإضاءة إلى كل شيء.

تعديل الإضاءة الاتجاهية

  1. في التسلسل الهرمي، اختَر عنصر الإضاءة الاتجاهية.
  2. أضِف المكوِّن LightEstimation إليه. يوفّر هذا المكوّن من "الحزمة المبتدئة" بعض النماذج الأساسية للاشتراك في تغييرات الإضاءة.
  3. في الدالة FrameReceived()، أضِف:
ARLightEstimationData lightEstimation = args.lightEstimation;

if (lightEstimation.averageBrightness.HasValue)
    Light.intensity = lightEstimation.averageBrightness.Value;

if (lightEstimation.averageColorTemperature.HasValue)
    Light.colorTemperature = lightEstimation.averageColorTemperature.Value;

if (lightEstimation.colorCorrection.HasValue)
    Light.color = lightEstimation.colorCorrection.Value;

if (lightEstimation.mainLightDirection.HasValue)
    Light.transform.rotation = Quaternion.LookRotation(lightEstimation.mainLightDirection.Value);

if (lightEstimation.mainLightColor.HasValue)
    Light.color = lightEstimation.mainLightColor.Value;

if (lightEstimation.mainLightIntensityLumens.HasValue)
    Light.intensity = lightEstimation.averageMainLightBrightness.Value;

if (lightEstimation.ambientSphericalHarmonics.HasValue)
{
    RenderSettings.ambientMode = AmbientMode.Skybox;
    RenderSettings.ambientProbe = lightEstimation.ambientSphericalHarmonics.Value;
}

اختبار التغييرات

  1. انقر على ملف > إنشاء وتشغيل لاختبار التغييرات.
  2. عند النظر إلى الأجسام في المشهد، قد تلاحظ أنّها ملونة استنادًا إلى الإضاءة في البيئة.
  3. جرِّب تعديل الإضاءة، إن أمكن. على سبيل المثال، جرِّب إطفاء المصابيح في الغرفة التي أنت فيها. من المفترض أن تلاحظ تغيُّر الإضاءة على الأجسام وفقًا للتغيير في الإضاءة في العالم الواقعي.

6. الخاتمة

تهانينا! لقد وصلت إلى نهاية هذا الدليل التعليمي حول Unity AR Foundation.

المحتوى الذي سبق لك تغطيته

  • كيفية إعداد مشروع أساسي باستخدام مؤسسة الواقع المعزّز التابعة لـ Unity وUniversal Rendering Pipeline (مسار العرض العالمي).
  • كيفية استخدام ARPlaneManager للاشتراك في خطط جديدة
  • كيفية استخدام Raycast للعثور على تقاطعات باستخدام الهندسة الافتراضية.
  • كيفية استخدام ARLightEstimationData لإضاءة المشهد

الخطوات التالية

المهام الإضافية

إذا كنت تريد توسيع نطاق اللعبة التي أنشأتها هنا، إليك بعض الأفكار التي يمكنك تجربتها:

  • يمكنك إضافة عدّاد نتائج إلى لعبتك من خلال تعديل TextMeshPro عندما تنتج عن PackageManager حزمة جديدة.
  • يمكنك الاطّلاع على معلومات الأداء أثناء تشغيل لعبتك من خلال تفعيل "تراكب الأداء".
  • استخدِم ميزة Persistent Raycasts لوضع عناصر جديدة في المشهد أولاً. فعند رصد طائرة في تلك المنطقة، سيتم تحديث هذا الجسم لمحاذاة هذه الطائرة.