۱. مرور کلی
ARCore چارچوب گوگل برای ساخت تجربیات واقعیت افزوده در تلفنهای هوشمند است. میتوانید از بنیاد AR یونیتی برای ساخت برنامههای واقعیت افزوده چند پلتفرمی استفاده کنید.
آنچه خواهید ساخت
در این آزمایشگاه کد، شما یک بازی ساده با استفاده از AR Foundation خواهید ساخت. هدف بازی جمعآوری بستهها با استفاده از ماشینی است که با استفاده از دستگاه دستی خود کنترل میکنید.
با این حال، این اتفاق در یک دنیای کاملاً مجازی رخ نخواهد داد! شما اتمهای فیزیکی و بیتهای دیجیتال را با هم ترکیب خواهید کرد تا با خلق یک بازی که محیط اطراف بازیکن را درک میکند، نوع جدیدی از تجربه بازیکن را خلق کنید.
در پایان این آزمایشگاه کد، بازی شما قادر خواهد بود:
- هواپیماهای دنیای واقعی را تشخیص دهید و یک زمین بازی روی آن ترسیم کنید.
- پرتوهایی را از نمای دوربین پخش کنید و تقاطعها را با صفحات تشخیص دهید.
- به شرایط نوری دنیای واقعی واکنش نشان دهید تا به بازی خود واقعگرایی بیشتری ببخشید.

آنچه یاد خواهید گرفت
- نحوه راهاندازی پروژهای که از بنیاد واقعیت افزوده (AR Foundation) یونیتی استفاده میکند.
- نحوه استفاده از
ARPlaneManagerبرای اشتراک در هواپیماهای جدید. - نحوه استفاده از
Raycastبرای یافتن تقاطعها با هندسه مجازی - نحوه استفاده از
ARLightEstimationDataبرای نورپردازی صحنه
آنچه نیاز دارید
- یک دستگاه ARCore پشتیبانیشده که با استفاده از کابل USB به دستگاه توسعه شما متصل شده باشد.
- سرویسهای گوگل پلی برای واقعیت افزوده ۱.۲۳ یا بالاتر.
- نصب Unity Hub یا Unity 2020 LTS .
۲. محیط توسعه خود را تنظیم کنید
در این مرحله، محیط خود را برای توسعه با بنیاد واقعیت افزوده یونیتی آماده خواهید کرد.
مطمئن شوید که دستگاه شما با AR سازگار است
تجربیات واقعیت افزوده (AR) در دستگاههای اندروید توسط ARCore هدایت میشوند که در دستگاههای پشتیبانیشده با ARCore در دسترس است. اطمینان حاصل کنید که دستگاه توسعه شما با واقعیت افزوده (AR) سازگار است. همچنین میتوانید از یک نمونه شبیهساز اندروید سازگار با واقعیت افزوده (AR) که به درستی پیکربندی شده باشد، استفاده کنید.
اشکالزدایی USB را روی دستگاه خود راهاندازی کنید
برای اجرای برنامههای اشکالزدایی، باید گزینههای توسعهدهنده (Developer options) را در دستگاه خود فعال کنید. اگر هنوز این کار را انجام ندادهاید، به مستندات اندروید در مورد فعال کردن گزینههای توسعهدهنده و اشکالزدایی USB مراجعه کنید.
نصب یونیتی (نسخه ۲۰۲۰.۳ LTS)
روی سیستم کاری خود، Unity 2020 LTS را نصب کنید. در این آزمایشگاه کد، تصاویری از رابط کاربری Unity در نسخه 2020.3 (LTS) نشان داده شده است. نسخههای دیگر Unity ممکن است کار کنند، اما ممکن است به مراحل اضافی نیاز داشته باشند. ممکن است با تصاویری که در اینجا نشان داده شده است متفاوت باشد.
ایجاد یک پروژه جدید
با استفاده از الگوی Universal Render Pipeline یک پروژه جدید ایجاد کنید. یک نام توصیفی و یک مکان مناسب برای آن تعیین کنید و CREATE را فشار دهید.

نصب فریمورکهای مورد نیاز
بنیاد واقعیت افزودهی یونیتی را میتوان در مدیریت بستههای یونیتی یافت.
- با کلیک روی Window > Package Manager آن را باز کنید.

- در این پنجره، بستههایی را که در این آزمایشگاه کد استفاده خواهید کرد، نصب کنید. آخرین نسخههای این چارچوبها را با استفاده از نماد
►و با باز کردن ورودی آن مشاهده کنید. آخرین نسخهها را برای هر یک از این چارچوبها نصب کنید:- بنیاد AR
- افزونه ARCore XR
وقتی کارتان تمام شد، Package Manager شما باید چیزی شبیه به این باشد:

بستهی آغازین را نصب کنید
برای این آزمایشگاه کد، ما یک بستهی آغازین ارائه دادهایم که شامل پیشساختها و اسکریپتهایی است که برخی از بخشهای آزمایشگاه کد را تسریع میکنند تا بتوانید روی نحوهی استفاده از AR Foundation تمرکز کنید.
- بستهی آغازین را با باز کردن Assets > Import Package > Custom Package... و باز کردن
starter-package.unitypackageنصب کنید. - در پنجرهای که ظاهر میشود، مطمئن شوید که همه چیز انتخاب شده است.
- روی وارد کردن کلیک کنید.
تغییر تنظیمات ساخت
از آنجایی که برنامه روی اندروید اجرا خواهد شد، پلتفرم ساخت را به اندروید تغییر دهید:
- فایل > تنظیمات ساخت را باز کنید.
- در پنل پلتفرم ، اندروید را انتخاب کنید.
- به صورت اختیاری، Development Build و Script Debugging را فعال کنید تا اطلاعات اشکالزدایی در حین اجرای برنامه حفظ شود.
- روی «تغییر پلتفرم» کلیک کنید.

تغییر تنظیمات پروژه
بنیاد AR باید طوری پیکربندی شود که سیستمهای XR را در هنگام راهاندازی اولیه راهاندازی کند.
- مسیر Edit > Project Settings... را باز کنید و روی بخش XR Plug-in Management کلیک کنید.
- در تب اندروید ، ARCore را فعال کنید.

- در پنل سمت چپ، روی بخش پخشکننده (Player) کلیک کنید.
- در تب اندروید ، در قسمت سایر تنظیمات ، Vulkan را از Graphics APIs حذف کنید.

- برنامههای مورد نیاز AR که از ARCore استفاده میکنند، به حداقل سطح API 24 نیاز دارند. به پایین بروید و Minimum API Level را پیدا کنید. حداقل سطح API را روی 24 تنظیم کنید.

عناصر صحنه مورد نیاز را اضافه کنید
قالب Universal Render Pipeline با برخی از اشیاء بازی ارائه میشود که در این آموزش از آنها استفاده نخواهید کرد.
- تمام اشیاء بازی را در
SampleSceneحذف کنید.

- اشیاء AR Foundation را اضافه کنید. در قسمت Hierarchy کلیک راست کنید. از این منو برای اضافه کردن موارد زیر استفاده کنید:
- جلسه واقعیت افزوده (AR Session) : این شیء چرخه حیات یک تجربه واقعیت افزوده (AR) را کنترل میکند.
- XR > AR Session Origin : این شیء مختصات AR را به مختصات جهانی Unity تبدیل میکند.
- نور > نور جهتدار : این یک منبع نور برای روشن کردن اشیاء بازی فراهم میکند.
سلسله مراتب شما باید به این شکل باشد:

- AR Session Origin که در سلسله مراتب ایجاد کردهاید را باز کنید و شیء AR Camera را انتخاب کنید. در inspector، تگ آن را به MainCamera تغییر دهید.

تنظیم رندر
خط تولید رندر جهانی یونیتی برای سازگاری با AR Foundation به یک تغییر نیاز دارد.
- در پنل پروژه ، از طریق Assets > Settings به دنبال دارایی ForwardRenderer بگردید.

- ForwardRenderer را انتخاب کنید.
- در پنل Inspector، از گزینه Add Renderer Feature برای افزودن یک AR Background Renderer Feature استفاده کنید. این کامپوننت، فید دوربین را در صحنه شما رندر میکند.

تنظیمات را تأیید کنید
- مطمئن شوید که دستگاه شما به برق وصل است و اشکالزدایی ADB فعال است.
- روی فایل > ساخت و اجرا... کلیک کنید. این کار برنامه را روی دستگاه شما آپلود کرده و پس از نصب، آن را اجرا میکند.
- شما باید فید دوربین را روی صفحه دستگاه خود ببینید.
در مرحله بعد، شروع به اضافه کردن قابلیتها به برنامه خود خواهید کرد.
۳. تشخیص هواپیماها در دنیای واقعی
حالا که یک صحنه اولیه تنظیم شده است، میتوانید شروع به توسعه بازی کنید. در این مرحله، هواپیماها را شناسایی کرده و آنها را به صحنه میکشانید.
یک کامپوننت ARPlaneManager اضافه کنید
یک ARPlaneManager ARPlane ها را شناسایی میکند و هنگامی که درک دستگاه از محیط تغییر میکند، اشیاء بازی را ایجاد، بهروزرسانی و حذف میکند.
- با استفاده از پنل Hierarchy، یک
GameObjectخالی ایجاد کنید. - نام آن را به
Driving Surface Managerتغییر دهید. این کامپوننت تا زمانی که بازیکن یکی از صفحات را انتخاب کند، آنها را نمایش میدهد. - شیء بازی جدید را انتخاب کنید. در قسمت Inspector، روی Add Component کلیک کنید تا یک AR Plane Manager اضافه شود.

- با تنظیم فیلد
Plane PrefabARPlaneManagerرا پیکربندی کنید:- روی دکمهی کنار
Noneکلیک کنید تا پنجرهی Select GameObject ظاهر شود. - برگه «داراییها» را انتخاب کنید و عبارت «رانندگی سطح صفحه» را جستجو کنید.
- روی دکمهی کنار

این پیشساخته از بستهی اولیه، یک بافت کف زبر ایجاد میکند که به عنوان تزئین صفحه استفاده خواهد شد.
-
Detection ModeبهHorizontalتغییر دهید. این کارARPlaneManagerرا طوری پیکربندی میکند که فقط صفحات افقی را ارائه دهد، که برای رانندگی ایدهآل است.
یک کامپوننت ARRaycastManager اضافه کنید
یک ARRaycastManager قابلیت raycast را ارائه میدهد. در مرحله بعدی، از این شیء برای ارائه کنترلها به کاربر استفاده خواهیم کرد.
- مطمئن شوید که شیء با نام
Driving Surface Managerدر پنل Hierarchy انتخاب شده است. - در پنجرهی Inspector، روی Add Component کلیک کنید تا یک کامپوننت
ARRaycastManagerبه شیء بازی شما اضافه شود.
برای این کامپوننت نیازی به پیکربندی بیشتر نیست.
یک کامپوننت DrivingSurfaceManager اضافه کنید
DrivingSurfaceManager یک اسکریپت کمکی از بستهی آغازین است که امکان انتخاب یک ARPlane را فراهم میکند. پس از انتخاب یک ARPlane ، تمام صفحات دیگر پنهان میشوند و صفحات جدید غیرفعال میشوند.
- مطمئن شوید که شیء با نام
Driving Surface Managerدر پنل Hierarchy انتخاب شده است. - در پنجره Inspector، روی Add Component کلیک کنید تا یک کامپوننت
DrivingSurfaceManagerبه شیء بازی شما اضافه شود.
برای این کامپوننت نیازی به پیکربندی بیشتر نیست.
برنامه را اجرا کنید
- برای آزمایش تغییرات، روی File > Build And Run... کلیک کنید.
- دستگاه خود را به سمت یک سطح افقی در دنیای واقعی بگیرید و آن را حرکت دهید تا درک ARCore از جهان بهبود یابد.

- وقتی ARCore یک صفحه را شناسایی کرد، باید یک بافت خاکی را ببینید که سطوح دنیای واقعی را پوشانده است.
ARPlaneManagerبرای هر صفحه شناسایی شده، نمونه اولیهPlane Prefabداده شده را ایجاد میکند. پیشساختهDriving Surface Planeدارای یک کامپوننتARPlaneMeshVisualizerاست که برایARPlaneداده شده، یک مش ایجاد میکند.
در مرحله بعد، از یک هواپیمای شناسایی شده به عنوان زمین بازی استفاده خواهید کرد.
۴. تست ضربه را روی هواپیماهای شناسایی شده انجام دهید
در مرحله قبل، شما برنامهای نوشتید که بتواند هواپیماها را تشخیص دهد. این هواپیماها در صحنه بازی شما منعکس میشوند. اکنون، با ایجاد یک نشانهگیر و یک ماشین که روی سطح هواپیمای شناسایی شده حرکت میکند، تعامل با این هواپیماها را اضافه خواهید کرد.
یک نشانهگیری ایجاد کنید
طرح کنترل این برنامه شامل این است که بازیکن تلفن خود را به سمت یک سطح نشانه میگیرد. برای ارائه بازخورد بصری واضح برای مکان تعیین شده، از یک نشانگر نشانهگیری استفاده خواهید کرد.

برای «چسباندن» این رتیکل به یک صفحه AR، از تست ضربه استفاده کنید. تست ضربه تکنیکی است که هنگام پرتاب یک پرتو در یک جهت مشخص، نقاط تقاطع را محاسبه میکند. شما از تست ضربه برای تشخیص یک نقطه تقاطع در جهت دید دوربین استفاده خواهید کرد.

رتیکل را اضافه کنید
- در پنل پروژه (Project) نزدیک پایین صفحه، به مسیر Assets > Starter Package بروید.
- با کشیدن Reticle Prefab به داخل پنجره Hierarchy پروژه، آن را در صحنه قرار دهید.
- رتیکل را در سلسله مراتب انتخاب کنید.
- در پنجرهی Inspector، روی Add Component کلیک کنید. اسکریپت
ReticleBehaviourرا از بستهی Starter اضافه کنید. این اسکریپت شامل برخی کدهای آماده برای کنترل رتیکل است. - اسکریپت
ReticleBehaviourبهDriving Surface Managerکه قبلاً ایجاد کردهاید وابسته است، بنابراین با کلیک روی انتخابگرDriving Surface Manager، وابستگی را اضافه کنید. تب Scene را انتخاب کرده و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 شامل ARRaycastHit خواهد بود که نقاطی را روی trackables که توسط 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);
رتیکل را تست کنید
- برای آزمایش تغییرات، روی File > Build And Run... کلیک کنید.
- وقتی دستگاه خود را به سمت یک صفحه نشانه میگیرید، باید ببینید که رتیکل حرکات دوربین شما را دنبال میکند.

ایجاد یک ماشین
بازیکن یک ماشین اسباببازی را کنترل خواهد کرد که به سمت محل رتیکل حرکت خواهد کرد. مدل و رفتار این ماشین در بستهی شروع ارائه شده است.
یک CarManager به صحنه خود اضافه کنید
- در Hierarchy ، یک
GameObjectخالی جدید ایجاد کنید. - نام آن را به
Car Spawnerتغییر دهید. - شیء ایجاد شده را انتخاب کنید. در قسمت Hierarchy ، روی Add Component کلیک کنید تا کامپوننت
CarManagerاضافه شود. - وابستگیهای
CarManagerرا با کلیک روی انتخابگر هر فیلد تنظیم کنید:- پیشساخت خودرو : در بخش داراییها ، پیشساخت خودرو را انتخاب کنید.
- شبکهی دوربین : در صحنه ، گزینهی Reticle Prefab را انتخاب کنید.
- مدیریت سطح رانندگی : در صحنه ، مدیریت سطح رانندگی را انتخاب کنید.
این رفتار CarManager یک ماشین اسباببازی را در صفحهای که رتیکل روی آن قرار دارد، ظاهر میکند. در صورت تمایل، اسکریپت CarBehaviour را بررسی کنید تا نحوه برنامهریزی ماشین را بیاموزید.
رانندگی آزمایشی
- برای آزمایش تغییرات، روی File > Build And Run کلیک کنید.
- وقتی روی یک صفحه ضربه میزنید، باید یک ماشین کوچک در آن مکان ظاهر شود. این ماشین رتیکل را دنبال میکند.
عنصر بازی را اضافه کنید
حالا که بازیکن میتواند یک موجودیت را در صحنه کنترل کند، به او مقصدی برای رانندگی بدهید.
- یک
GameObjectخالی جدید در Hierarchy ایجاد کنید. - نام آن را به
Package Spawnerتغییر دهید. - شیء ایجاد شده را انتخاب کنید. در قسمت Hierarchy ، روی Add Component کلیک کنید تا کامپوننت
PackageSpawnerبه آن اضافه شود. - وابستگیهای
PackageSpawnerرا با کلیک روی انتخابگر هر فیلد تنظیم کنید:- پیشساخته بستهبندی : در بخش «داراییها» ، «پیشساخته بستهبندی» را انتخاب کنید.
- مدیریت سطح رانندگی (Driveing Surface Manager) در صحنه ، گزینه مدیریت سطح رانندگی (Driveing Surface Manager) را انتخاب کنید.
این رفتار PackageSpawner اگر از قبل بستهای وجود نداشته باشد، یک بسته جدید را در مکانی تصادفی روی ARPlane قفلشده ایجاد میکند.
بازی را تست کنید
- برای آزمایش تغییرات خود، روی File > Build And Run کلیک کنید. 2. پس از ایجاد ماشین، یک بسته باید ایجاد شود.
- ماشین خود را به سمت بسته هدایت کنید.
- یک مورد جدید در یک مکان تصادفی ظاهر میشود.

۵. تخمین روشنایی را تنظیم کنید
حالا که بازی اصلی تکمیل شده است، کمی واقعگرایی به صحنه واقعیت افزوده خود اضافه کنید. در این مرحله، از API تخمین نورپردازی ARCore برای تشخیص نور موجود در دنیای واقعی بر اساس فریمهای دوربین ورودی استفاده خواهید کرد. این اطلاعات برای تطبیق نور صحنه شما با نور دنیای واقعی استفاده خواهد شد.
فعال کردن تخمین روشنایی
- در Hierarchy ، AR Session Origin را باز کنید و شیء AR Camera را انتخاب کنید.
- در پنجرهی Inspector ، اسکریپت AR Camera Manager را باز کنید.
- فیلد Lighting Estimation را به Everything تغییر دهید.

نور جهت را اصلاح کنید
- در بخش سلسله مراتب ، شیء Directional Light را انتخاب کنید.
- کامپوننت
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;
}
تغییرات خود را آزمایش کنید
- برای آزمایش تغییرات، روی File > Build And Run کلیک کنید.
- هنگام نگاه کردن به اشیاء موجود در صحنه، ممکن است متوجه شوید که رنگ آنها بسته به نورپردازی محیط تغییر میکند.
- در صورت امکان، سعی کنید نورپردازی خود را تغییر دهید. برای مثال، سعی کنید چراغهای اتاقی را که در آن هستید خاموش کنید. باید ببینید که نورپردازی روی اشیاء با تغییر در نورپردازی دنیای واقعی سازگار میشود.

۶. جمعبندی
تبریک میگویم! شما به پایان این آزمایشگاه کدنویسی در Unity AR Foundation رسیدید.
آنچه شما پوشش دادهاید
- نحوه راهاندازی یک پروژه اولیه با استفاده از بنیاد واقعیت افزوده یونیتی و خط لوله رندر جهانی.
- نحوه استفاده از
ARPlaneManagerبرای اشتراک در هواپیماهای جدید. - نحوه استفاده از
Raycastبرای یافتن تقاطعها با هندسه مجازی. - نحوه استفاده از
ARLightEstimationDataبرای نورپردازی صحنه
مراحل بعدی
- نمونههای بنیاد واقعیت افزودهی یونیتی را بررسی کنید.
- مستندات بنیاد AR را مرور کنید.
- مستندات گوگل در مورد افزونههای ARCore برای بنیاد واقعیت افزودهی Unity را بررسی کنید.
تکالیف پاداش
اگر میخواهید بازیای که اینجا ساختهاید را گسترش دهید، در اینجا چند ایده وجود دارد که میتوانید دنبال کنید:
- با تغییر
TextMeshProوقتیPackageManagerیک بسته جدید تولید میکند، یک شمارنده امتیاز به بازی خود اضافه کنید. - با فعال کردن Performance Overlay، اطلاعات عملکرد بازی خود را هنگام اجرا بررسی کنید.
- ابتدا از Raycastهای پایدار برای قرار دادن اشیاء جدید در صحنه خود استفاده کنید. هنگامی که یک صفحه در آن منطقه شناسایی میشود، آن شیء برای اتصال به آن صفحه بهروزرسانی میشود.