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

۱. مرور کلی

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

آنچه خواهید ساخت

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

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

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

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

آنچه یاد خواهید گرفت

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

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

۲. محیط توسعه خود را تنظیم کنید

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

مطمئن شوید که دستگاه شما با AR سازگار است

تجربیات واقعیت افزوده (AR) در دستگاه‌های اندروید توسط ARCore هدایت می‌شوند که در دستگاه‌های پشتیبانی‌شده با ARCore در دسترس است. اطمینان حاصل کنید که دستگاه توسعه شما با واقعیت افزوده (AR) سازگار است. همچنین می‌توانید از یک نمونه شبیه‌ساز اندروید سازگار با واقعیت افزوده (AR) که به درستی پیکربندی شده باشد، استفاده کنید.

اشکال‌زدایی USB را روی دستگاه خود راه‌اندازی کنید

برای اجرای برنامه‌های اشکال‌زدایی، باید گزینه‌های توسعه‌دهنده (Developer options) را در دستگاه خود فعال کنید. اگر هنوز این کار را انجام نداده‌اید، به مستندات اندروید در مورد فعال کردن گزینه‌های توسعه‌دهنده و اشکال‌زدایی USB مراجعه کنید.

نصب یونیتی (نسخه ۲۰۲۰.۳ LTS)

روی سیستم کاری خود، Unity 2020 LTS را نصب کنید. در این آزمایشگاه کد، تصاویری از رابط کاربری Unity در نسخه 2020.3 (LTS) نشان داده شده است. نسخه‌های دیگر Unity ممکن است کار کنند، اما ممکن است به مراحل اضافی نیاز داشته باشند. ممکن است با تصاویری که در اینجا نشان داده شده است متفاوت باشد.

ایجاد یک پروژه جدید

با استفاده از الگوی Universal Render Pipeline یک پروژه جدید ایجاد کنید. یک نام توصیفی و یک مکان مناسب برای آن تعیین کنید و CREATE را فشار دهید.

نصب فریم‌ورک‌های مورد نیاز

بنیاد واقعیت افزوده‌ی یونیتی را می‌توان در مدیریت بسته‌های یونیتی یافت.

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

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

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

بسته‌ی آغازین را نصب کنید

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

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

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

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

  1. فایل > تنظیمات ساخت را باز کنید.
  2. در پنل پلتفرم ، اندروید را انتخاب کنید.
  3. به صورت اختیاری، Development Build و Script Debugging را فعال کنید تا اطلاعات اشکال‌زدایی در حین اجرای برنامه حفظ شود.
  4. روی «تغییر پلتفرم» کلیک کنید.

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

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

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

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

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

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

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

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

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

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

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

تنظیم رندر

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

  1. در پنل پروژه ، از طریق Assets > Settings به دنبال دارایی ForwardRenderer بگردید.

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

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

  1. مطمئن شوید که دستگاه شما به برق وصل است و اشکال‌زدایی ADB فعال است.
  2. روی فایل > ساخت و اجرا... کلیک کنید. این کار برنامه را روی دستگاه شما آپلود کرده و پس از نصب، آن را اجرا می‌کند.
  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. برگه «دارایی‌ها» را انتخاب کنید و عبارت «رانندگی سطح صفحه» را جستجو کنید.

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

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

یک کامپوننت ARRaycastManager اضافه کنید

یک ARRaycastManager قابلیت raycast را ارائه می‌دهد. در مرحله بعدی، از این شیء برای ارائه کنترل‌ها به کاربر استفاده خواهیم کرد.

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

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

یک کامپوننت DrivingSurfaceManager اضافه کنید

DrivingSurfaceManager یک اسکریپت کمکی از بسته‌ی آغازین است که امکان انتخاب یک 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 داده شده، یک مش ایجاد می‌کند.

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

۴. تست ضربه را روی هواپیماهای شناسایی شده انجام دهید

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

یک نشانه‌گیری ایجاد کنید

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

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

رتیکل را اضافه کنید

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

ویرایش ReticleBehaviour

اسکریپت ReticleBehavior رتیکل را در صفحه‌ای که در مرکز نمای دستگاه قرار دارد، قرار می‌دهد.

  1. اسکریپت ReticleBehaviour.cs را با دوبار کلیک کردن روی فیلد Script باز کنید.
  2. مرکز صفحه را با استفاده از ViewToScreenPoint دوربین تعیین کنید. متد Update() را ویرایش کنید تا موارد زیر را اضافه کنید:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
  1. از این نقطه برای اجرای raycast استفاده کنید. موارد زیر را اضافه کنید:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);

متغیر hits شامل ARRaycastHit خواهد بود که نقاطی را روی trackables که توسط 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 را با کلیک روی انتخابگر هر فیلد تنظیم کنید:
    • پیش‌ساخت خودرو : در بخش دارایی‌ها ، پیش‌ساخت خودرو را انتخاب کنید.
    • شبکه‌ی دوربین : در صحنه ، گزینه‌ی Reticle Prefab را انتخاب کنید.
    • مدیریت سطح رانندگی : در صحنه ، مدیریت سطح رانندگی را انتخاب کنید.

این رفتار CarManager یک ماشین اسباب‌بازی را در صفحه‌ای که رتیکل روی آن قرار دارد، ظاهر می‌کند. در صورت تمایل، اسکریپت CarBehaviour را بررسی کنید تا نحوه برنامه‌ریزی ماشین را بیاموزید.

رانندگی آزمایشی

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

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

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

  1. یک GameObject خالی جدید در Hierarchy ایجاد کنید.
  2. نام آن را به Package Spawner تغییر دهید.
  3. شیء ایجاد شده را انتخاب کنید. در قسمت Hierarchy ، روی Add Component کلیک کنید تا کامپوننت PackageSpawner به آن اضافه شود.
  4. وابستگی‌های PackageSpawner را با کلیک روی انتخابگر هر فیلد تنظیم کنید:
    • پیش‌ساخته بسته‌بندی : در بخش «دارایی‌ها» ، «پیش‌ساخته بسته‌بندی» را انتخاب کنید.
    • مدیریت سطح رانندگی (Driveing ​​Surface Manager) در صحنه ، گزینه مدیریت سطح رانندگی (Driveing ​​Surface Manager) را انتخاب کنید.

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

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

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

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

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

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

  1. در Hierarchy ، AR Session Origin را باز کنید و شیء AR Camera را انتخاب کنید.
  2. در پنجره‌ی Inspector ، اسکریپت AR Camera Manager را باز کنید.
  3. فیلد Lighting Estimation را به Everything تغییر دهید.

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

  1. در بخش سلسله مراتب ، شیء 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. در صورت امکان، سعی کنید نورپردازی خود را تغییر دهید. برای مثال، سعی کنید چراغ‌های اتاقی را که در آن هستید خاموش کنید. باید ببینید که نورپردازی روی اشیاء با تغییر در نورپردازی دنیای واقعی سازگار می‌شود.

۶. جمع‌بندی

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

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

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

مراحل بعدی

تکالیف پاداش

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

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