1. نظرة عامة
ARCore هو إطار عمل من Google لإنشاء تجارب الواقع المعزّز على الهواتف الذكية. يمكنك استخدام AR Foundation من Unity لإنشاء تطبيقات واقع معزّز من عدّة منصات.
ما ستنشئه
في هذا الدرس التطبيقي حول الترميز، ستنشئ لعبة بسيطة باستخدام AR Foundation. والهدف من اللعبة هو جمع الطرود باستخدام سيارة تتحكّم فيها من خلال جهازك المحمول.
ومع ذلك، لن يحدث ذلك في عالم افتراضي بالكامل. ستجمع بين الذرات المادية والوحدات الرقمية لإنشاء نوع جديد من تجربة اللاعبين من خلال تصميم لعبة تفهم البيئة المحيطة باللاعب.
في نهاية هذا الدرس التطبيقي حول الترميز، ستتمكّن لعبتك من تنفيذ ما يلي:
- رصد الطائرات في العالم الحقيقي ورسم ملعب فوقها
- إطلاق أشعة من زاوية رؤية الكاميرا ورصد التقاطعات مع المستويات
- التفاعل مع ظروف الإضاءة في العالم الحقيقي لمنح لعبتك المزيد من الواقعية

أهداف الدورة التعليمية
- كيفية إعداد مشروع يستخدم AR Foundation من Unity
- كيفية استخدام
ARPlaneManagerللاشتراك في طائرات جديدة - كيفية استخدام
Raycastللعثور على نقاط التقاطع مع الأشكال الهندسية الافتراضية - كيفية استخدام
ARLightEstimationDataلإضاءة المشهد
المتطلبات
- جهاز متوافق مع ARCore، تم توصيله بجهاز التطوير باستخدام كابل USB
- الإصدار 1.23 أو الإصدارات الأحدث من خدمات Google Play للواقع المعزّز
- تثبيت Unity Hub أو Unity 2020 LTS
2. إعداد بيئة التطوير
في هذه الخطوة، ستجهّز بيئتك للتطوير باستخدام AR Foundation من Unity.
التأكّد من توافق جهازك مع الواقع المعزّز
تستند تجارب الواقع المعزّز على أجهزة Android إلى ARCore، وهي متاحة على الأجهزة المتوافقة مع ARCore. تأكَّد من أنّ جهاز التطوير متوافق مع الواقع المعزّز. بدلاً من ذلك، يمكنك استخدام مثيل مُعدّ بشكل صحيح من "محاكي Android" المتوافق مع الواقع المعزّز.
إعداد تصحيح أخطاء الجهاز عبر USB على جهازك
يجب تفعيل خيارات المطوّرين على جهازك لتشغيل تطبيقات تصحيح الأخطاء. إذا لم يسبق لك إجراء ذلك، يُرجى الرجوع إلى مستندات Android حول تفعيل خيارات المطوّرين وتصحيح أخطاء الجهاز عبر USB.
تثبيت Unity (الإصدار 2020.3 LTS)
على محطة العمل، ثبِّت Unity 2020 LTS. في هذا الدرس العملي، يتم عرض لقطات شاشة لواجهة مستخدم Unity في الإصدار 2020.3 (LTS). قد تعمل إصدارات أخرى من Unity، ولكن قد تتطلّب خطوات إضافية. وقد يختلف عن لقطات الشاشة المعروضة هنا.
إنشاء مشروع جديد
أنشئ مشروعًا جديدًا باستخدام نموذج Universal Render Pipeline. أدخِل اسمًا وصفيًا وموقعًا جغرافيًا مناسبًا، ثم انقر على إنشاء.

تثبيت الأُطر المطلوبة
يمكن العثور على AR Foundation من Unity في Unity Package Manager.
- افتحها بالنقر على Window > Package Manager.

- في هذه النافذة، ثبِّت الحِزم التي ستستخدمها في هذا الدرس التطبيقي. يمكنك الاطّلاع على أحدث إصدارات هذه الأُطر من خلال توسيع الإدخال باستخدام الرمز
►. ثبِّت أحدث إصدارات كل من أُطر العمل التالية:- AR Foundation
- ARCore XR Plugin
عند الانتهاء، من المفترض أن يظهر "مدير الحِزم" على النحو التالي:

تثبيت حزمة التطبيق الأولي
في هذا الدرس التطبيقي حول الترميز، وفّرنا حزمة بدء تحتوي على عناصر جاهزة للاستخدام ونصوص برمجية ستسرّع بعض أجزاء الدرس التطبيقي حول الترميز حتى تتمكّن من التركيز على كيفية استخدام AR Foundation.
- ثبِّت حزمة البداية من خلال فتح مواد العرض (Assets) > استيراد حزمة (Import Package) > حزمة مخصّصة (Custom Package)... وفتح
starter-package.unitypackage. - في النافذة المنبثقة، تأكَّد من اختيار كل شيء.
- انقر على استيراد.
تغيير إعدادات الإصدار
بما أنّ التطبيق سيعمل على Android، غيِّر نظام الإنشاء الأساسي إلى Android:
- افتح ملف > إعدادات الإنشاء.
- في لوحة النظام الأساسي، اختَر Android.
- يمكنك اختياريًا تفعيل إصدار التطوير وتصحيح الأخطاء في النصوص البرمجية من أجل الاحتفاظ بمعلومات تصحيح الأخطاء أثناء تشغيل تطبيقك.
- انقر على تبديل المنصة.

تغيير إعدادات المشروع
يجب إعداد AR Foundation لتهيئة أنظمة XR عند بدء التشغيل.
- افتح تعديل > إعدادات المشروع... (Edit > Project Settings...) وانقر على قسم إدارة المكوّنات الإضافية لتقنيات الواقع الممتد (XR Plug-in Management).
- في علامة التبويب Android، فعِّل ARCore.

- في اللوحة اليمنى، انقر على قسم المشغّل.
- في علامة التبويب Android، ضِمن الإعدادات الأخرى، أزِل Vulkan من واجهات برمجة تطبيقات الرسومات.

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

إضافة عناصر المشهد المطلوبة
يتضمّن نموذج Universal Render Pipeline بعض عناصر اللعبة التي لن تستخدمها في هذا البرنامج التعليمي.
- احذف جميع عناصر اللعبة في
SampleScene.

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

- وسِّع AR Session Origin الذي أنشأته في التسلسل الهرمي، واختَر عنصر AR Camera. في "أداة الفحص"، غيِّر العلامة إلى MainCamera.

إعداد العرض
يجب إجراء تغيير واحد على Universal Render Pipeline في Unity ليكون متوافقًا مع AR Foundation.
- في لوحة المشروع، انتقِل إلى مواد العرض > الإعدادات للعثور على مادة عرض ForwardRenderer.

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

التحقّق من الإعداد
- تأكَّد من توصيل جهازك وتفعيل خيار تصحيح أخطاء ADB.
- انقر على ملف > إنشاء وتشغيل... (File > Build And Run...) سيؤدي ذلك إلى تحميل التطبيق على جهازك وتشغيله بعد تثبيته.
- من المفترض أن تظهر لك خلاصة الكاميرا على شاشة جهازك.
في الخطوة التالية، ستبدأ في إضافة وظائف إلى تطبيقك.
3- رصد الطائرات في العالم الحقيقي
بعد إعداد مشهد أساسي، يمكنك البدء في تطوير اللعبة. في هذه الخطوة، ستكتشف الطائرات وترسمها في المشهد.
إضافة مكوّن ARPlaneManager
يرصد ARPlaneManager ARPlanes وينشئ كائنات اللعبة ويعدّلها ويزيلها عند تغيُّر فهم الجهاز للبيئة.
- باستخدام لوحة "التسلسل الهرمي"، أنشئ
GameObjectفارغًا. - أعِد تسميته إلى
Driving Surface Manager. سيعرض هذا المكوّن طائرات إلى أن يختار اللاعب إحداها. - اختَر عنصر اللعبة الجديد. في لوحة "الفحص" (Inspector)، انقر على إضافة مكوّن (Add Component) لإضافة مدير مستوى الواقع المعزّز (AR Plane Manager).

- اضبط
ARPlaneManagerمن خلال ضبط الحقلPlane Prefab:- انقر على الزرّ بجانب
Noneلفتح نافذة Select GameObject. - انقر على علامة التبويب مواد العرض وابحث عن Driving Surface Plane.
- انقر على الزرّ بجانب

يوفر هذا العنصر الجاهز من حزمة البدء نسيجًا خشنًا للأرضية سيتم استخدامه كزخرفة للطائرة.
- غيِّر
Detection ModeإلىHorizontal. يؤدي ذلك إلى ضبطARPlaneManagerلعرض مستويات أفقية فقط، ما يجعله مثاليًا للقيادة.
إضافة مكوّن ARRaycastManager
يعرض ARRaycastManager وظيفة raycast. في الخطوة التالية، سنستخدم هذا العنصر لتوفير عناصر التحكّم للمستخدم.
- تأكَّد من اختيار العنصر المسمّى
Driving Surface Managerفي لوحة "التسلسل الهرمي". - في "نافذة الفحص" (Inspector)، انقر على إضافة مكوّن (Add Component) لإضافة مكوّن
ARRaycastManagerإلى عنصر اللعبة.
لا يلزم إجراء أي إعدادات إضافية لهذا المكوّن.
إضافة مكوّن DrivingSurfaceManager
DrivingSurfaceManager هو نص برمجي مساعد من حزمة Starter Package يتيح اختيار ARPlane. بعد اختيار ARPlane، سيتم إخفاء جميع الطائرات الأخرى وإيقاف الطائرات الجديدة.
- تأكَّد من اختيار العنصر المسمّى
Driving Surface Managerفي لوحة "التسلسل الهرمي". - في "نافذة الفحص" (Inspector)، انقر على إضافة مكوّن (Add Component) لإضافة مكوّن
DrivingSurfaceManagerإلى عنصر اللعبة.
لا يلزم إجراء أي إعدادات إضافية لهذا المكوّن.
تشغيل التطبيق
- انقر على ملف > الإنشاء والتشغيل... لاختبار التغييرات.
- وجِّه جهازك نحو سطح أفقي في العالم الحقيقي وحرِّكه لتحسين فهم ARCore للعالم.

- عندما يرصد ARCore مستوىً، من المفترض أن ترى ملمسًا ترابيًا يغطي الأسطح في العالم الحقيقي. ينشئ
ARPlaneManagerنسخة منPlane Prefabالمحدّد لكل مستوى تم رصده. يحتوي العنصر الجاهزDriving Surface Planeعلى المكوّنARPlaneMeshVisualizerالذي ينشئ شبكة لـARPlaneمعيّن.
في الخطوة التالية، ستستخدم طائرة تم رصدها كملعب.
4. إجراء اختبار مؤشر الماوس على الطائرات التي تم رصدها
في الخطوة السابقة، برمجت تطبيقًا يمكنه رصد الطائرات. تظهر هذه المستويات في مشهد لعبتك. الآن، ستضيف تفاعلاً مع هذه المستويات من خلال إنشاء شبكة تصويب وسيارة ستسير على سطح المستوى الذي تم رصده.
إنشاء شبكة تصويب
يتضمّن نظام التحكّم في هذا التطبيق توجيه اللاعب لهاتفه نحو سطح معيّن. لتقديم ملاحظات مرئية واضحة حول الموقع الجغرافي المحدّد، عليك استخدام شبكة تصويب.

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

إضافة شبكة التصويب
- في لوحة المشروع بالقرب من أسفل الشاشة، انتقِل إلى الأصول > حزمة التطبيق التجريبي.
- ضَع Reticle Prefab في المشهد عن طريق سحبه إلى لوحة التدرّج الهرمي في المشروع.
- اختَر شبكة التصويب في التسلسل الهرمي.
- في "نافذة الفحص"، انقر على إضافة مكوّن (Add Component). أضِف النص البرمجي
ReticleBehaviourمن "حزمة المبتدئين". يحتوي هذا النص البرمجي على بعض الرموز النموذجية للتحكّم في شبكة التصويب. - يعتمد النص البرمجي
ReticleBehaviourعلىDriving Surface Managerالذي أنشأته من قبل، لذا أضِف التبعية بالنقر على أداة اختيارDriving Surface Manager. انقر على علامة التبويب المشهد واختَرDriving Surface Manager.

تعديل ReticleBehaviour
سيضع النص البرمجي ReticleBehavior الشبكة في المستوى الذي يقع في وسط إطار عرض الجهاز.
- افتح نص
ReticleBehaviour.csالبرمجة من خلال النقر مرّتين على الحقلScript. - حدِّد مركز الشاشة باستخدام
ViewToScreenPointفي الكاميرا. عدِّل الطريقةUpdate()لإضافة ما يلي:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
- استخدِم هذه النقطة لإجراء عملية raycast. أضِف ما يلي:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);
سيتضمّن المتغيّر hits ARRaycastHits التي تصف النقاط على العناصر القابلة للتتبّع التي يتقاطع معها ray.
- حدِّد نقطة التقاطع الخاصة بالموقع الجغرافي من خلال طلب البحث في قائمة
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);
}
- إذا كان
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);
اختبار الشبكة
- انقر على ملف > الإنشاء والتشغيل... لاختبار التغييرات.
- عند توجيه جهازك إلى مستوى، من المفترض أن ترى الشعيرة تتبع حركات الكاميرا.

إنشاء سيارة
سيتحكّم اللاعب بسيارة لعبة ستتّجه نحو موقع علامة التصويب. يتم توفير نموذج وسلوك لهذه السيارة في "حزمة المبتدئين".
إضافة CarManager إلى المشهد
- في التسلسل الهرمي، أنشئ
GameObjectفارغًا جديدًا. - أعِد تسميته إلى
Car Spawner. - اختَر العنصر الذي أنشأته. في لوحة التسلسل الهرمي، انقر على إضافة مكوّن لإضافة المكوّن
CarManager. - اضبط تبعيات
CarManagerمن خلال النقر على أداة الاختيار لكل حقل:- Car Prefab: في مواد العرض، اختَر Car Prefab.
- الشبكة: في المشهد، اختَر Reticle Prefab.
- أداة إدارة سطح القيادة: في المشهد، اختَر أداة إدارة سطح القيادة.
يؤدي سلوك CarManager هذا إلى إنشاء سيارة لعبة على المستوى الذي تظهر عليه شبكة التصويب. إذا أردت، يمكنك الاطّلاع على النص البرمجي CarBehaviour لمعرفة كيفية برمجة السيارة.
اختبار القيادة
- انقر على ملف > إنشاء وتشغيل لاختبار التغييرات.
- عند النقر على طائرة، من المفترض أن تظهر سيارة صغيرة في ذلك الموقع الجغرافي. ستتّبع هذه السيارة شبكة التصويب.
إضافة عنصر اللعبة
بعد أن أصبح بإمكان اللاعب التحكّم في عنصر في المشهد، امنحه وجهة يقود نحوها.
- أنشئوا
GameObjectفارغًا جديدًا في "التسلسل الهرمي". - أعِد تسميته إلى
Package Spawner. - اختَر العنصر الذي أنشأته. في لوحة التسلسل الهرمي، انقر على إضافة مكوّن لإضافة المكوّن
PackageSpawnerإليه. - اضبط تبعيات
PackageSpawnerمن خلال النقر على أداة الاختيار لكل حقل:- حزمة Prefab: في مواد العرض، اختَر حزمة Prefab.
- أداة إدارة سطح القيادة في المشهد، انقر على أداة إدارة سطح القيادة.
يؤدي سلوك PackageSpawner هذا إلى إنشاء حزمة جديدة في موقع عشوائي على ARPlane مقفل إذا لم تكن هناك حزمة من قبل.
اختبار اللعبة
- انقر على ملف > إنشاء وتشغيل لاختبار التغييرات. 2- بعد إنشاء سيارة، يجب أن تظهر حزمة.
- قُد سيارتك إلى مكان استلام الحزمة.
- سيظهر رمز جديد في مكان عشوائي.

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

تعديل الضوء الاتجاهي
- في التسلسل الهرمي، اختَر عنصر الضوء الاتجاهي.
- أضِف المكوّن
LightEstimationإليه. يوفّر هذا المكوّن من "حزمة المبتدئين" بعض الرموز النموذجية للاشتراك في تغييرات الإضاءة. - في الدالة
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;
}
اختبار التغييرات
- انقر على ملف > إنشاء وتشغيل لاختبار التغييرات.
- عند النظر إلى العناصر في المشهد، قد تلاحظ أنّها ملوّنة حسب إضاءة البيئة المحيطة.
- يُرجى محاولة تعديل الإضاءة، إذا أمكن. على سبيل المثال، جرِّب إطفاء المصابيح في الغرفة التي تتواجد فيها. من المفترض أن ترى الإضاءة على العناصر تتكيّف مع التغيير في الإضاءة في العالم الحقيقي.

6. الخاتمة
تهانينا! لقد وصلت إلى نهاية هذا الدرس التطبيقي حول الترميز حول Unity AR Foundation.
المواضيع التي تناولناها
- كيفية إعداد مشروع أساسي باستخدام AR Foundation وUniversal Rendering Pipeline في Unity
- كيفية استخدام
ARPlaneManagerللاشتراك في طائرات جديدة - كيفية استخدام
Raycastللعثور على نقاط التقاطع مع الأشكال الهندسية الافتراضية - كيفية استخدام
ARLightEstimationDataلإضاءة المشهد
الخطوات التالية
- يمكنك الاطّلاع على أمثلة AR Foundation من Unity.
- تصفُّح مستندات AR Foundation
- اطّلِع على مستندات Google حول "إضافات ARCore" في AR Foundation من Unity.
مهام إضافية
إذا أردت توسيع نطاق اللعبة التي أنشأتها هنا، إليك بعض الأفكار التي يمكنك تنفيذها:
- أضِف عدّادًا للنتيجة إلى لعبتك من خلال تعديل
TextMeshProعندما ينشئPackageManagerحزمة جديدة. - يمكنك الاطّلاع على معلومات الأداء أثناء تشغيل لعبتك من خلال تفعيل نافذة الأداء.
- استخدِم عمليات البحث عن الأشعة الثابتة لوضع عناصر جديدة في المشهد أولاً. عند رصد سطح مستوٍ في تلك المنطقة، سيتم تعديل العنصر ليتم محاذاته مع ذلك السطح.