1. بررسی اجمالی
ARCore چارچوب گوگل برای ایجاد تجربیات واقعیت افزوده در گوشی های هوشمند است. شما می توانید از بنیاد AR Unity برای ساخت برنامه های کاربردی AR چند پلتفرمی استفاده کنید.
چیزی که خواهی ساخت
در این کد لبه، شما با استفاده از AR Foundation یک بازی ساده خواهید ساخت. هدف بازی جمع آوری بسته ها با استفاده از ماشینی است که با استفاده از دستگاه دستی خود کنترل می کنید.
با این حال، این اتفاق در یک دنیای کاملا مجازی نخواهد افتاد! شما اتمهای فیزیکی و بیتهای دیجیتال را با هم ترکیب میکنید تا با ایجاد یک بازی که محیط اطراف بازیکن را درک میکند، نوع جدیدی از تجربه بازیکن ایجاد کنید.
در پایان این نرم افزار کد، بازی شما قادر خواهد بود:
- هواپیماهای دنیای واقعی را شناسایی کنید و زمین بازی را روی آن بکشید.
- پرتوها را از دید دوربین پخش کنید و تقاطع ها را با هواپیما تشخیص دهید.
- به شرایط نوری دنیای واقعی واکنش نشان دهید تا به بازی خود واقعی سازی بیشتری بدهید.
چیزی که یاد خواهید گرفت
- نحوه راه اندازی پروژه ای که از بنیاد AR یونیتی استفاده می کند.
- نحوه استفاده از
ARPlaneManager
برای اشتراک در هواپیماهای جدید - نحوه استفاده از
Raycast
برای یافتن تقاطع ها با هندسه مجازی - چگونه از
ARLightEstimationData
برای نورپردازی صحنه خود استفاده کنید.
آنچه شما نیاز دارید
- یک دستگاه ARCore پشتیبانی شده که با استفاده از کابل USB به دستگاه توسعه شما متصل شده است.
- خدمات Google Play برای AR 1.23 یا جدیدتر.
- نصب Unity Hub یا Unity 2020 LTS .
2. محیط توسعه خود را تنظیم کنید
در این مرحله محیط خود را با AR Foundation یونیتی آماده توسعه خواهید کرد.
مطمئن شوید که دستگاه شما با AR سازگار است
تجربههای AR در دستگاههای Android توسط ARCore هدایت میشوند که در دستگاههای پشتیبانیشده ARCore در دسترس است. مطمئن شوید که دستگاه توسعه شما با واقعیت افزوده سازگار است. همچنین، میتوانید از یک نمونه شبیهساز Android سازگار با واقعیت افزوده با پیکربندی صحیح استفاده کنید.
اشکال زدایی USB را در دستگاه خود راه اندازی کنید
برای اجرای برنامه های اشکال زدایی باید گزینه های Developer را در دستگاه خود فعال کنید. اگر هنوز این کار را انجام ندادهاید، به مستندات Android در Enable developer options and USB debugging مراجعه کنید.
Unity (2020.3 LTS) را نصب کنید
در ایستگاه کاری خود، Unity 2020 LTS را نصب کنید. در این کد، اسکرین شات هایی از رابط کاربری Unity در نسخه 2020.3 (LTS) نشان داده می شود. نسخه های دیگر Unity ممکن است کار کنند، اما ممکن است به مراحل اضافی نیاز داشته باشند. ممکن است متفاوت از اسکرین شات های نشان داده شده در اینجا به نظر برسد.
یک پروژه جدید ایجاد کنید
با استفاده از قالب Universal Render Pipeline یک پروژه جدید ایجاد کنید. یک نام توصیفی و یک مکان مناسب به آن بدهید و CREATE را فشار دهید.
فریمورک های مورد نیاز را نصب کنید
بنیاد AR Unity را می توان در Unity Package Manager پیدا کرد.
- با کلیک بر روی Window > Package Manager آن را باز کنید.
- در این پنجره، بسته هایی را که در این کد لبه استفاده می کنید نصب کنید. آخرین نسخههای این چارچوبها را با گسترش ورودی آن با استفاده از نماد
►
مشاهده کنید. آخرین نسخه ها را برای هر یک از این فریمورک ها نصب کنید:- بنیاد AR
- پلاگین ARCore XR
وقتی کارتان تمام شد، مدیر بسته شما باید چیزی شبیه به این باشد:
بسته استارت را نصب کنید
برای این کد لبه، ما یک بسته شروع ارائه کردهایم که حاوی پیش ساختهها و اسکریپتهایی است که برخی از بخشهای نرمافزار کد را تسریع میکند تا بتوانید روی نحوه استفاده از AR Foundation تمرکز کنید.
- با باز کردن Assets > Import Package > Custom Package... و باز کردن
starter-package.unitypackage
بسته استارت را نصب کنید. - در پنجره ای که ظاهر می شود، مطمئن شوید که همه چیز انتخاب شده است.
- روی Import کلیک کنید.
تنظیمات ساخت را تغییر دهید
از آنجایی که برنامه روی اندروید اجرا خواهد شد، پلتفرم ساخت را به اندروید تغییر دهید:
- File > Build Settings را باز کنید.
- در قسمت پلتفرم ، Android را انتخاب کنید.
- به صورت اختیاری، توسعه Build و اشکالزدایی اسکریپت را فعال کنید تا اطلاعات اشکالزدایی در حین اجرا شدن برنامه شما حفظ شود.
- روی Switch Platform کلیک کنید.
تنظیمات پروژه را تغییر دهید
بنیاد AR باید برای راه اندازی سیستم های XR در هنگام راه اندازی پیکربندی شود.
- Edit > Project Settings... را باز کرده و روی قسمت XR Plug-in Management کلیک کنید.
- در تب Android ، ARCore را فعال کنید.
- در قسمت سمت چپ، روی بخش Player کلیک کنید.
- در تب Android ، در قسمت تنظیمات دیگر ، Vulkan را از APIهای گرافیکی حذف کنید.
- برنامههای AR مورد نیاز با استفاده از ARCore به حداقل سطح API 24 نیاز دارند. به پایین بروید و حداقل سطح API را پیدا کنید. حداقل سطح API را روی 24 تنظیم کنید.
عناصر صحنه مورد نیاز را اضافه کنید
قالب Universal Render Pipeline همراه با برخی از اشیاء بازی است که در این آموزش از آنها استفاده نخواهید کرد.
- تمام اشیاء بازی را در
SampleScene
حذف کنید.
- اشیاء بنیاد AR را اضافه کنید. در قسمت Hierarchy کلیک راست کنید. از این منو برای اضافه کردن استفاده کنید:
- XR > AR Session : این شیء چرخه حیات یک تجربه AR را کنترل می کند.
- XR > AR Session Origin : این شی مختصات AR را به مختصات جهانی Unity تبدیل می کند.
- نور > نور جهت دار : این یک منبع نور برای روشن کردن اشیاء بازی فراهم می کند.
سلسله مراتب شما باید به شکل زیر باشد:
- مبدا AR Session Origin را که در سلسله مراتب ایجاد کرده اید گسترش دهید و شی دوربین AR را انتخاب کنید. در بازرس، تگ آن را به MainCamera تغییر دهید.
تنظیم رندر
خط لوله رندر جهانی Unity برای سازگاری با بنیاد AR به یک تغییر نیاز دارد.
- در بخش Project ، از طریق Assets > Settings پیمایش کنید تا دارایی ForwardRenderer را پیدا کنید.
- ForwardRenderer را انتخاب کنید.
- در پنجره Inspector، از Add Renderer Feature برای افزودن ویژگی AR Background Renderer استفاده کنید. این کامپوننت فید دوربین را در صحنه شما نمایش می دهد.
تنظیمات را تأیید کنید
- مطمئن شوید که دستگاه شما به برق وصل است و اشکال زدایی ADB روشن است.
- روی File > Build And Run کلیک کنید... با این کار برنامه در دستگاه شما آپلود می شود و پس از نصب آن را شروع می کند.
- باید فید دوربین را روی صفحه نمایش دستگاه خود ببینید.
در مرحله بعد، شروع به افزودن قابلیت به برنامه خود خواهید کرد.
3. هواپیماها را در دنیای واقعی تشخیص دهید
اکنون که یک صحنه اصلی تنظیم شده است، می توانید شروع به توسعه بازی کنید. در این مرحله هواپیماها را شناسایی کرده و به صحنه می کشانید.
یک جزء ARPlaneManager
اضافه کنید
یک ARPlaneManager
ARPlane
ها را شناسایی می کند و هنگامی که درک دستگاه از محیط تغییر می کند، اشیاء بازی را ایجاد، به روز رسانی و حذف می کند.
- با استفاده از پنل Hierarchy، یک
GameObject
خالی ایجاد کنید. - نام آن را به
Driving Surface Manager
تغییر دهید. این مؤلفه هواپیماها را تا زمانی که بازیکن انتخاب کند نمایش می دهد. - شی بازی جدید را انتخاب کنید. در پنجره Inspector، روی Add Component کلیک کنید تا یک AR Plane Manager اضافه شود.
- با تنظیم فیلد
Plane Prefab
،ARPlaneManager
را پیکربندی کنید:- روی دکمه کنار
None
کلیک کنید تا پنجره Select GameObject ظاهر شود. - برگه Assets را انتخاب کرده و Driving Surface Plane را جستجو کنید.
- روی دکمه کنار
این پیش ساخته از پکیج استارتر، بافت زمینی شن و ماسه ای را فراهم می کند که به عنوان دکوراسیون هواپیما استفاده می شود.
-
Detection Mode
بهHorizontal
تغییر دهید. اینARPlaneManager
را به گونه ای پیکربندی می کند که فقط صفحات افقی را ارائه دهد، ایده آل برای رانندگی.
یک جزء ARRaycastManager
اضافه کنید
یک ARRaycastManager
عملکرد raycast را آشکار می کند. در مرحله بعد، از این شی برای ارائه کنترل ها برای کاربر استفاده می کنیم.
- اطمینان حاصل کنید که شی به نام
Driving Surface Manager
در قسمت Hierarchy انتخاب شده است. - در Inspector، روی Add Component کلیک کنید تا یک جزء
ARRaycastManager
به شی بازی خود اضافه کنید.
برای این کامپوننت نیازی به پیکربندی بیشتر نیست.
یک جزء DrivingSurfaceManager
اضافه کنید
DrivingSurfaceManager
یک اسکریپت کمکی از بسته Starter است که امکان انتخاب یک ARPlane
را فراهم می کند. پس از انتخاب یک ARPlane
، همه هواپیماهای دیگر پنهان می شوند و هواپیماهای جدید غیرفعال می شوند.
- اطمینان حاصل کنید که شی به نام
Driving Surface Manager
در قسمت Hierarchy انتخاب شده است. - در Inspector، روی Add Component کلیک کنید تا یک جزء
DrivingSurfaceManager
به شی بازی خود اضافه کنید.
برای این کامپوننت نیازی به پیکربندی بیشتر نیست.
برنامه را اجرا کنید
- روی File > Build And Run... کلیک کنید تا تغییرات خود را آزمایش کنید.
- دستگاه خود را روی یک سطح افقی دنیای واقعی بگیرید و دستگاه خود را به اطراف حرکت دهید تا درک ARCore از جهان بهبود یابد.
- هنگامی که ARCore یک هواپیما را شناسایی کرد، باید یک بافت خاکی سطوح دنیای واقعی را بپوشانید.
ARPlaneManager
Plane Prefab
داده شده را برای هر هواپیمای شناسایی شده نمونه سازی می کند. پیش ساختهDriving Surface Plane
دارای یک جزءARPlaneMeshVisualizer
است که یک شبکه برای یکARPlane
معین ایجاد می کند.
در مرحله بعد از هواپیمای شناسایی شده به عنوان زمین بازی استفاده خواهید کرد.
4. آزمایش ضربه را در برابر هواپیماهای شناسایی شده انجام دهید
در مرحله قبل اپلیکیشنی را برنامه ریزی کردید که بتواند هواپیماها را شناسایی کند. این هواپیماها در صحنه بازی شما منعکس می شوند. اکنون، با ایجاد یک شبکه هدف گیری و خودرویی که روی سطح هواپیمای شناسایی شده حرکت می کند، تعامل را با این هواپیماها اضافه می کنید.
یک شبکه هدف ایجاد کنید
طرح کنترلی برای این برنامه شامل این است که پخش کننده تلفن خود را به سمت یک سطح نشان دهد. به منظور ارائه بازخورد بصری واضح برای مکان تعیین شده، از یک شبکه هدف استفاده خواهید کرد.
برای "چسباندن" این شبکه به یک هواپیمای AR، از تست ضربه استفاده کنید. تست ضربه تکنیکی است که هنگام پرتاب پرتو در یک جهت معین، تقاطع ها را محاسبه می کند. از تست ضربه برای تشخیص تقاطع در جهت دید دوربین استفاده خواهید کرد.
مشبک را اضافه کنید
- در قسمت Project نزدیک به پایین صفحه، به Assets > Starter Package بروید.
- Reticle Prefab را با کشیدن آن به قسمت Hierarchy پروژه در صحنه قرار دهید.
- شبکه را در سلسله مراتب انتخاب کنید.
- در بازرس، روی Add Component کلیک کنید. اسکریپت
ReticleBehaviour
را از Starter Package اضافه کنید. این اسکریپت حاوی مقداری دیگ بخار برای کنترل شبکه است. - اسکریپت
ReticleBehaviour
وابسته بهDriving Surface Manager
است که قبلا ایجاد کردید، بنابراین با کلیک بر روی انتخابگرDriving Surface Manager
وابستگی را اضافه کنید. تب Scene را انتخاب کنید وDriving Surface Manager
را انتخاب کنید.
ReticleBehaviour
را ویرایش کنید
اسکریپت ReticleBehavior
شبکه را در صفحه ای که در مرکز نمای دستگاه قرار دارد قرار می دهد.
- با دوبار کلیک کردن روی قسمت
Script
، اسکریپتReticleBehaviour.cs
را باز کنید. - با استفاده از
ViewToScreenPoint
دوربین، مرکز صفحه را تعیین کنید. متدUpdate()
را برای اضافه کردن موارد زیر ویرایش کنید:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
- از این نقطه برای هدایت پرتوی استفاده کنید. موارد زیر را اضافه کنید:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);
hits
متغیر حاوی ARRaycastHit
هستند که نقاطی را در Trackable ها که با 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
را تنظیم کنید:- Car Prefab : در Assets ، Car Prefab را انتخاب کنید.
- Reticle : در Scene ، Reticle Prefab را انتخاب کنید.
- Driving Surface Manager : در Scene ، Driving Surface Manager را انتخاب کنید.
این رفتار CarManager
باعث ایجاد یک ماشین اسباببازی در هواپیما میشود که مشبک در آن قرار دارد. اگر می خواهید، اسکریپت CarBehaviour
را بررسی کنید تا نحوه برنامه ریزی ماشین را بیاموزید.
تست رانندگی
- برای آزمایش تغییرات خود روی File > Build And Run کلیک کنید.
- وقتی روی هواپیما ضربه می زنید، باید ببینید که یک ماشین کوچک در آن مکان ظاهر می شود. این خودرو از مشبک پیروی خواهد کرد.
عنصر بازی را اضافه کنید
اکنون که بازیکن می تواند موجودی را در صحنه کنترل کند، به بازیکن مقصدی بدهید تا به سمت آن حرکت کند.
- یک
GameObject
خالی جدید در Hierarchy ایجاد کنید. - نام آن را به
Package Spawner
تغییر دهید. - شیئی که ایجاد کرده اید را انتخاب کنید. در قسمت Hierarchy ، روی Add Component کلیک کنید تا کامپوننت
PackageSpawner
به آن اضافه شود. - با کلیک بر روی انتخابگر هر فیلد، وابستگیهای
PackageSpawner
را تنظیم کنید:- Package Prefab : در Assets ، Package Prefab را انتخاب کنید.
- Driving Surface Manager در صحنه ، Driving Surface Manager را انتخاب کنید.
این رفتار PackageSpawner
یک بسته جدید را در یک مکان تصادفی در یک ARPlane
قفل شده ایجاد می کند اگر قبلاً بسته ای وجود نداشته باشد.
بازی را تست کنید
- برای آزمایش تغییرات خود روی File > Build And Run کلیک کنید. 2، پس از ایجاد یک ماشین، یک بسته باید تخم ریزی شود.
- ماشین خود را به سمت بسته هدایت کنید.
- یک مورد جدید در یک مکان تصادفی ظاهر می شود.
5. تخمین روشنایی را تنظیم کنید
اکنون که بازی اصلی تکمیل شده است، کمی از واقع گرایی را به صحنه AR خود اضافه کنید. در این مرحله، شما از ARCore's Lighting Estimation API برای تشخیص نور موجود در دنیای واقعی بر اساس فریم های دوربین ورودی استفاده خواهید کرد. از این اطلاعات برای تطبیق نور صحنه شما برای مطابقت با نور دنیای واقعی استفاده می شود.
تخمین روشنایی را فعال کنید
- در Hierarchy ، مبدا جلسه AR را گسترش دهید و شی دوربین AR را انتخاب کنید.
- در Inspector ، اسکریپت مدیر دوربین AR را گسترش دهید.
- قسمت Lighting Estimation را به Everything تغییر دهید.
نور جهت را اصلاح کنید
- در Hierarchy ، شی 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 کلیک کنید.
- هنگام نگاه کردن به اشیاء در صحنه، ممکن است متوجه شوید که بسته به نور محیط، رنگی هستند.
- در صورت امکان، سعی کنید نورپردازی خود را تغییر دهید. برای مثال، سعی کنید چراغهای اتاقی را که در آن هستید خاموش کنید. باید ببینید که نور اجسام با تغییر در نور دنیای واقعی سازگار است.
6. بسته بندی کنید
تبریک می گویم! شما به انتهای این کد در Unity AR Foundation رسیده اید.
آنچه شما پوشش داده اید
- نحوه راه اندازی یک پروژه اساسی با استفاده از بنیاد AR یونیتی و خط لوله رندر جهانی.
- نحوه استفاده از
ARPlaneManager
برای اشتراک در هواپیماهای جدید - نحوه استفاده از
Raycast
برای یافتن تقاطع ها با هندسه مجازی. - چگونه از
ARLightEstimationData
برای نورپردازی صحنه خود استفاده کنید.
مراحل بعدی
- نمونه های بنیاد AR Unity را بررسی کنید.
- اسناد بنیاد AR را مرور کنید.
- مستندات Google در مورد برنامه های افزودنی ARCore برای بنیاد AR Unity را بررسی کنید.
تکالیف پاداش
اگر میخواهید بازیای را که در اینجا ایجاد کردهاید گسترش دهید، در اینجا ایدههایی وجود دارد که میتوانید دنبال کنید:
- هنگامی که
PackageManager
بسته جدیدی ایجاد می کند، با تغییرTextMeshPro
، یک شمارنده امتیاز به بازی خود اضافه کنید. - با فعال کردن Performance Overlay ، اطلاعات عملکرد را در زمان اجرای بازی خود بررسی کنید.
- از Persistent Raycasts برای قرار دادن اشیاء جدید در صحنه خود ابتدا استفاده کنید. هنگامی که هواپیما در آن منطقه شناسایی می شود، آن جسم به روز می شود تا به آن هواپیما بچسبد.