با استفاده از Unity's AR Foundation یک بازی AR ایجاد کنید

1. بررسی اجمالی

ARCore چارچوب گوگل برای ایجاد تجربیات واقعیت افزوده در گوشی های هوشمند است. شما می توانید از بنیاد AR Unity برای ساخت برنامه های کاربردی AR چند پلتفرمی استفاده کنید.

چیزی که خواهی ساخت

در این کد لبه، شما با استفاده از AR Foundation یک بازی ساده خواهید ساخت. هدف بازی جمع آوری بسته ها با استفاده از ماشینی است که با استفاده از دستگاه دستی خود کنترل می کنید.

با این حال، این اتفاق در یک دنیای کاملا مجازی نخواهد افتاد! شما اتم‌های فیزیکی و بیت‌های دیجیتال را با هم ترکیب می‌کنید تا با ایجاد یک بازی که محیط اطراف بازیکن را درک می‌کند، نوع جدیدی از تجربه بازیکن ایجاد کنید.

در پایان این نرم افزار کد، بازی شما قادر خواهد بود:

  • هواپیماهای دنیای واقعی را شناسایی کنید و زمین بازی را روی آن بکشید.
  • پرتوها را از دید دوربین پخش کنید و تقاطع ها را با هواپیما تشخیص دهید.
  • به شرایط نوری دنیای واقعی واکنش نشان دهید تا به بازی خود واقعی سازی بیشتری بدهید.

چیزی که یاد خواهید گرفت

  • نحوه راه اندازی پروژه ای که از بنیاد AR یونیتی استفاده می کند.
  • نحوه استفاده از ARPlaneManager برای اشتراک در هواپیماهای جدید
  • نحوه استفاده از Raycast برای یافتن تقاطع ها با هندسه مجازی
  • چگونه از ARLightEstimationData برای نورپردازی صحنه خود استفاده کنید.

آنچه شما نیاز دارید

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 پیدا کرد.

  1. با کلیک بر روی Window > Package Manager آن را باز کنید.

  1. در این پنجره، بسته هایی را که در این کد لبه استفاده می کنید نصب کنید. آخرین نسخه‌های این چارچوب‌ها را با گسترش ورودی آن با استفاده از نماد ​​مشاهده کنید. آخرین نسخه ها را برای هر یک از این فریمورک ها نصب کنید:
    • بنیاد AR
    • پلاگین ARCore XR

وقتی کارتان تمام شد، مدیر بسته شما باید چیزی شبیه به این باشد:

بسته استارت را نصب کنید

برای این کد لبه، ما یک بسته شروع ارائه کرده‌ایم که حاوی پیش ساخته‌ها و اسکریپت‌هایی است که برخی از بخش‌های نرم‌افزار کد را تسریع می‌کند تا بتوانید روی نحوه استفاده از AR Foundation تمرکز کنید.

  1. با باز کردن Assets > Import Package > Custom Package... و باز کردن starter-package.unitypackage بسته استارت را نصب کنید.
  2. در پنجره ای که ظاهر می شود، مطمئن شوید که همه چیز انتخاب شده است.
  3. روی Import کلیک کنید.

تنظیمات ساخت را تغییر دهید

از آنجایی که برنامه روی اندروید اجرا خواهد شد، پلتفرم ساخت را به اندروید تغییر دهید:

  1. File > Build Settings را باز کنید.
  2. در قسمت پلتفرم ، Android را انتخاب کنید.
  3. به صورت اختیاری، توسعه Build و اشکال‌زدایی اسکریپت را فعال کنید تا اطلاعات اشکال‌زدایی در حین اجرا شدن برنامه شما حفظ شود.
  4. روی Switch Platform کلیک کنید.

تنظیمات پروژه را تغییر دهید

بنیاد AR باید برای راه اندازی سیستم های XR در هنگام راه اندازی پیکربندی شود.

  1. Edit > Project Settings... را باز کرده و روی قسمت XR Plug-in Management کلیک کنید.
  2. در تب Android ، ARCore را فعال کنید.

  1. در قسمت سمت چپ، روی بخش Player کلیک کنید.
  2. در تب Android ، در قسمت تنظیمات دیگر ، Vulkan را از APIهای گرافیکی حذف کنید.

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

عناصر صحنه مورد نیاز را اضافه کنید

قالب Universal Render Pipeline همراه با برخی از اشیاء بازی است که در این آموزش از آنها استفاده نخواهید کرد.

  1. تمام اشیاء بازی را در SampleScene حذف کنید.

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

سلسله مراتب شما باید به شکل زیر باشد:

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

تنظیم رندر

خط لوله رندر جهانی Unity برای سازگاری با بنیاد AR به یک تغییر نیاز دارد.

  1. در بخش Project ، از طریق Assets > Settings پیمایش کنید تا دارایی ForwardRenderer را پیدا کنید.

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

تنظیمات را تأیید کنید

  1. مطمئن شوید که دستگاه شما به برق وصل است و اشکال زدایی ADB روشن است.
  2. روی File > Build And Run کلیک کنید... با این کار برنامه در دستگاه شما آپلود می شود و پس از نصب آن را شروع می کند.
  3. باید فید دوربین را روی صفحه نمایش دستگاه خود ببینید.

در مرحله بعد، شروع به افزودن قابلیت به برنامه خود خواهید کرد.

3. هواپیماها را در دنیای واقعی تشخیص دهید

اکنون که یک صحنه اصلی تنظیم شده است، می توانید شروع به توسعه بازی کنید. در این مرحله هواپیماها را شناسایی کرده و به صحنه می کشانید.

یک جزء ARPlaneManager اضافه کنید

یک ARPlaneManager ARPlane ها را شناسایی می کند و هنگامی که درک دستگاه از محیط تغییر می کند، اشیاء بازی را ایجاد، به روز رسانی و حذف می کند.

  1. با استفاده از پنل Hierarchy، یک GameObject خالی ایجاد کنید.
  2. نام آن را به Driving Surface Manager تغییر دهید. این مؤلفه هواپیماها را تا زمانی که بازیکن انتخاب کند نمایش می دهد.
  3. شی بازی جدید را انتخاب کنید. در پنجره Inspector، روی Add Component کلیک کنید تا یک AR Plane Manager اضافه شود.

  1. با تنظیم فیلد Plane Prefab ، ARPlaneManager را پیکربندی کنید:
    1. روی دکمه کنار None کلیک کنید تا پنجره Select GameObject ظاهر شود.
    2. برگه Assets را انتخاب کرده و Driving Surface Plane را جستجو کنید.

این پیش ساخته از پکیج استارتر، بافت زمینی شن و ماسه ای را فراهم می کند که به عنوان دکوراسیون هواپیما استفاده می شود.

  1. Detection Mode به Horizontal تغییر دهید. این ARPlaneManager را به گونه ای پیکربندی می کند که فقط صفحات افقی را ارائه دهد، ایده آل برای رانندگی.

یک جزء ARRaycastManager اضافه کنید

یک ARRaycastManager عملکرد raycast را آشکار می کند. در مرحله بعد، از این شی برای ارائه کنترل ها برای کاربر استفاده می کنیم.

  1. اطمینان حاصل کنید که شی به نام Driving Surface Manager در قسمت Hierarchy انتخاب شده است.
  2. در Inspector، روی Add Component کلیک کنید تا یک جزء ARRaycastManager به شی بازی خود اضافه کنید.

برای این کامپوننت نیازی به پیکربندی بیشتر نیست.

یک جزء DrivingSurfaceManager اضافه کنید

DrivingSurfaceManager یک اسکریپت کمکی از بسته Starter است که امکان انتخاب یک ARPlane را فراهم می کند. پس از انتخاب یک ARPlane ، همه هواپیماهای دیگر پنهان می شوند و هواپیماهای جدید غیرفعال می شوند.

  1. اطمینان حاصل کنید که شی به نام Driving Surface Manager در قسمت Hierarchy انتخاب شده است.
  2. در Inspector، روی Add Component کلیک کنید تا یک جزء DrivingSurfaceManager به شی بازی خود اضافه کنید.

برای این کامپوننت نیازی به پیکربندی بیشتر نیست.

برنامه را اجرا کنید

  1. روی File > Build And Run... کلیک کنید تا تغییرات خود را آزمایش کنید.
  2. دستگاه خود را روی یک سطح افقی دنیای واقعی بگیرید و دستگاه خود را به اطراف حرکت دهید تا درک ARCore از جهان بهبود یابد.

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

در مرحله بعد از هواپیمای شناسایی شده به عنوان زمین بازی استفاده خواهید کرد.

4. آزمایش ضربه را در برابر هواپیماهای شناسایی شده انجام دهید

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

یک شبکه هدف ایجاد کنید

طرح کنترلی برای این برنامه شامل این است که پخش کننده تلفن خود را به سمت یک سطح نشان دهد. به منظور ارائه بازخورد بصری واضح برای مکان تعیین شده، از یک شبکه هدف استفاده خواهید کرد.

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

مشبک را اضافه کنید

  1. در قسمت Project نزدیک به پایین صفحه، به Assets > Starter Package بروید.
  2. Reticle Prefab را با کشیدن آن به قسمت Hierarchy پروژه در صحنه قرار دهید.
  3. شبکه را در سلسله مراتب انتخاب کنید.
  4. در بازرس، روی Add Component کلیک کنید. اسکریپت ReticleBehaviour را از Starter Package اضافه کنید. این اسکریپت حاوی مقداری دیگ بخار برای کنترل شبکه است.
  5. اسکریپت ReticleBehaviour وابسته به Driving Surface Manager است که قبلا ایجاد کردید، بنابراین با کلیک بر روی انتخابگر Driving Surface Manager وابستگی را اضافه کنید. تب Scene را انتخاب کنید و Driving Surface Manager را انتخاب کنید.

ReticleBehaviour را ویرایش کنید

اسکریپت ReticleBehavior شبکه را در صفحه ای که در مرکز نمای دستگاه قرار دارد قرار می دهد.

  1. با دوبار کلیک کردن روی قسمت Script ، اسکریپت ReticleBehaviour.cs را باز کنید.
  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 هستند که نقاطی را در Trackable ها که با 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. روی File > Build And Run... کلیک کنید تا تغییرات خود را آزمایش کنید.
  2. هنگامی که دستگاه خود را به سمت هواپیما می گیرید، باید ببینید که مشبک حرکات دوربین شما را دنبال می کند.

یک ماشین ایجاد کنید

بازیکن یک ماشین اسباب بازی را کنترل می کند که به سمت محل مشبک حرکت می کند. مدل و رفتاری برای این خودرو در پکیج استارت ارائه شده است.

یک CarManager به صحنه خود اضافه کنید

  1. در Hierarchy ، یک GameObject خالی جدید ایجاد کنید.
  2. نام آن را به Car Spawner تغییر دهید.
  3. شیئی که ایجاد کرده اید را انتخاب کنید. در قسمت Hierarchy ، روی Add Component کلیک کنید تا کامپوننت CarManager اضافه کنید.
  4. با کلیک بر روی انتخابگر هر فیلد، وابستگی های CarManager را تنظیم کنید:
    • Car Prefab : در Assets ، Car Prefab را انتخاب کنید.
    • Reticle : در Scene ، Reticle Prefab را انتخاب کنید.
    • Driving Surface Manager : در Scene ، Driving Surface Manager را انتخاب کنید.

این رفتار CarManager باعث ایجاد یک ماشین اسباب‌بازی در هواپیما می‌شود که مشبک در آن قرار دارد. اگر می خواهید، اسکریپت CarBehaviour را بررسی کنید تا نحوه برنامه ریزی ماشین را بیاموزید.

تست رانندگی

  1. برای آزمایش تغییرات خود روی File > Build And Run کلیک کنید.
  2. وقتی روی هواپیما ضربه می زنید، باید ببینید که یک ماشین کوچک در آن مکان ظاهر می شود. این خودرو از مشبک پیروی خواهد کرد.

عنصر بازی را اضافه کنید

اکنون که بازیکن می تواند موجودی را در صحنه کنترل کند، به بازیکن مقصدی بدهید تا به سمت آن حرکت کند.

  1. یک GameObject خالی جدید در Hierarchy ایجاد کنید.
  2. نام آن را به Package Spawner تغییر دهید.
  3. شیئی که ایجاد کرده اید را انتخاب کنید. در قسمت Hierarchy ، روی Add Component کلیک کنید تا کامپوننت PackageSpawner به آن اضافه شود.
  4. با کلیک بر روی انتخابگر هر فیلد، وابستگی‌های PackageSpawner را تنظیم کنید:
    • Package Prefab : در Assets ، Package Prefab را انتخاب کنید.
    • Driving Surface Manager در صحنه ، Driving Surface Manager را انتخاب کنید.

این رفتار PackageSpawner یک بسته جدید را در یک مکان تصادفی در یک ARPlane قفل شده ایجاد می کند اگر قبلاً بسته ای وجود نداشته باشد.

بازی را تست کنید

  1. برای آزمایش تغییرات خود روی File > Build And Run کلیک کنید. 2، پس از ایجاد یک ماشین، یک بسته باید تخم ریزی شود.
  2. ماشین خود را به سمت بسته هدایت کنید.
  3. یک مورد جدید در یک مکان تصادفی ظاهر می شود.

5. تخمین روشنایی را تنظیم کنید

اکنون که بازی اصلی تکمیل شده است، کمی از واقع گرایی را به صحنه AR خود اضافه کنید. در این مرحله، شما از ARCore's Lighting Estimation API برای تشخیص نور موجود در دنیای واقعی بر اساس فریم های دوربین ورودی استفاده خواهید کرد. از این اطلاعات برای تطبیق نور صحنه شما برای مطابقت با نور دنیای واقعی استفاده می شود.

تخمین روشنایی را فعال کنید

  1. در Hierarchy ، مبدا جلسه AR را گسترش دهید و شی دوربین AR را انتخاب کنید.
  2. در Inspector ، اسکریپت مدیر دوربین AR را گسترش دهید.
  3. قسمت Lighting Estimation را به Everything تغییر دهید.

نور جهت را اصلاح کنید

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

6. بسته بندی کنید

تبریک می گویم! شما به انتهای این کد در Unity AR Foundation رسیده اید.

آنچه شما پوشش داده اید

  • نحوه راه اندازی یک پروژه اساسی با استفاده از بنیاد AR یونیتی و خط لوله رندر جهانی.
  • نحوه استفاده از ARPlaneManager برای اشتراک در هواپیماهای جدید
  • نحوه استفاده از Raycast برای یافتن تقاطع ها با هندسه مجازی.
  • چگونه از ARLightEstimationData برای نورپردازی صحنه خود استفاده کنید.

مراحل بعدی

تکالیف پاداش

اگر می‌خواهید بازی‌ای را که در اینجا ایجاد کرده‌اید گسترش دهید، در اینجا ایده‌هایی وجود دارد که می‌توانید دنبال کنید:

  • هنگامی که PackageManager بسته جدیدی ایجاد می کند، با تغییر TextMeshPro ، یک شمارنده امتیاز به بازی خود اضافه کنید.
  • با فعال کردن Performance Overlay ، اطلاعات عملکرد را در زمان اجرای بازی خود بررسی کنید.
  • از Persistent Raycasts برای قرار دادن اشیاء جدید در صحنه خود ابتدا استفاده کنید. هنگامی که هواپیما در آن منطقه شناسایی می شود، آن جسم به روز می شود تا به آن هواپیما بچسبد.