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

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. يمكنك فتحه بالنقر على نافذة >. مدير الحزم:

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

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

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

لقد قدّمنا في هذا الدرس التطبيقي حول الترميز حزمة تطبيقات للمبتدئين تحتوي على برامج تمهيدية ونصوص برمجية تؤدّي إلى تسريع بعض أجزاء هذا الدرس التطبيقي كي يتسنّى لك التركيز على طريقة استخدام 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 من واجهات برمجة تطبيقات الرسومات.

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

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

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

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

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

يجب أن يبدو التسلسل الهرمي الخاص بك كما يلي:

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

إعداد العرض

يحتاج Universal Render Pipeline التابع لـ Unity إلى تغيير واحد ليتوافق مع مؤسسة AR Foundation.

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

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

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

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

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

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

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

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

ترصد ARPlaneManager أجهزة ARPlane وتُنشئ عناصر اللعبة وتعدِّلها وتزيلها في حال تغيُّر إدراك الجهاز للبيئة.

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

  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. انقر على ملف > Build and Run... لاختبار التغييرات.
  2. عند توجيه جهازك إلى طائرة، من المفترض أن ترى الشبكة تتّبع تحركات الكاميرا.

إنشاء سيارة

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

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

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

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

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

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

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

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

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

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

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

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

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

الآن بعد أن اكتملت اللعبة الأساسية، أضِف لمسة واقعية إلى مشهد الواقع المعزّز. في هذه الخطوة، عليك استخدام واجهة برمجة تطبيقات Lighting Estimation من 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 لوضع عناصر جديدة في المشهد أولاً. فعند رصد طائرة في تلك المنطقة، سيتم تحديث هذا الجسم لمحاذاة هذه الطائرة.