بهینه‌سازی بازیهای اندروید در یونیتی

نویسنده : سید ایوب کوکبی ۱۷ فروردین ۱۳۹۸

بهینه‌سازی بازیهای اندروید در یونیتی

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

از پروفایلر موجود در یونیتی استفاده کنید

در دنیای برنامه‌نویسی اصطلاحی وجود دارد تحت عنوان Profiling که به تکنیک‌های پیشرفته‌ای برای بهینه‌سازی برنامه گفته می‌شود که با استفاده از سنجش میزان مصرف حافظه، میزان پردازش، GPU و سرعت اجرای برنامه گلوگاه‌های برنامه را شناسایی و مشکل  را حل می‌کنند. به ابزارهایی که برای این کار استفاده می‌شود Profiler یا همان پروفایلر گفته می‌شود. در یونیتی چند نوع پروفایلر داریم که در ادامه هر یک را به صورت جداگانه توضیح می‌دهیم.

Unity Profiler

برای آنالیز پرفرمنس پروژه می‌توانید از منوی Window گزینۀ Profiler را انتخاب کنید. این ابزار روند اجرای بازی را به صورت گرافیکی نشان می‌دهد. اینکه چقدر طول می‌کشد تا کپچر کند، رندرینگ هر فریم چقدر طول می‌کشد و پرفرمنس برنامه کجاها با مشکل مواجه می‌شود همگی در اختیار شماست. کار با این ابزار آسان است. روی هر نقطه‌ای کلیک کنید جزئیات همان بخش را مشاهده خواهید کرد. یونیتی آن دسته از پراسس‌هایی که بیشترین زمان را به خود اختصاص داده‌اند به صورت متمایز به شما نشان می‌دهد که با جستجوی نام آنها در گوگل می‌توانید عملکردشان را بفهمید.ابزار پروفایلر در یونیتی

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

Remote Profiler

ریموت پروفایلر، پرفرمنس برنامه را به صورت واقعی بر روی دستگاه اندرویدی تست می‌کند و قطعاً اطلاعات دقیق‌تری در اختیار شما قرار می‌دهد. در صورتی که به درستی Android SDK & JDK را پیکربندی کرده باشید به این ابزار دسترسی خواهید داشت. برای انجام این کار کافی است از منوی File گزینه Build Settings را انتخاب کنید و گزینه Development Build و Autoconnect Profiler را تیک بزنید. حال از منوی Edit>Project Settings>Editor گزینۀ Device را بر روی Any Android Device بگذارید.

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

Editor Log

یکی دیگر از ابزارهای خوب برای جمع‌آوری اطلاعات دربارۀ Build پروژه Editor Log است. کافی است بعد از Build کردن بازی از منوی Window گزینۀ Console را انتخاب کنید و از گوشۀ راست بالا روی دکمه نمایش لاگ کلیک کرده و گزینۀ Open Editor Log را انتخاب کنید. با این کار داکیومنتی باز می‌شود که داخلش اطلاعات کاملی دربارۀ Build، سایز فایل‌ها و Assetهای پروژه و … ثبت شده است.

تست مرتب روی چندین دستگاه مختلف

تنوع دستگاه‌های اندرویدی شاید برای گوگل و مشتریان منافعی داشته باشد ولی برای توسعه‌دهندگان جهنم است. این تنوع باعث می‌شود تا سازگار کردن برنامه روی گوشی‌های مختلف کاری سخت و طاقت‌فرسا باشد. احتمالاً شما هم بارها با شرایطی مواجه شده‌اید که مشکل خاصی تنها روی دستۀ مشخصی از دستگاه‌ها بروز می‌کند و روی بقیه به درستی کار می‌کند. به همین دلیل ناچارید بازی یا برنامه را روی چندین دستگاه مختلف تست کنید تا از عملکرد درست آن اطمینان یابید.

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

اسکریپت‌ها

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

بخوانید  آموزش زبان کاتلین - مقدمه

هر چیزی را داخل متد ()Update قرار ندهید

یکی از بزرگترین مشکلات کاربران مبتدی یونیتی، وابستگی بیش از حد به متد ()Update است. از آنجایی که یک متد دمِ دستی است و هر چیزی ار هر جایی می‌توان داخل آن قرار داد، خیلی‌ها همین کارِ اشتباه را تکرار می‌کنند. برای یک بازی کوچک شاید مسئلۀ بزرگی نباشد ولی در یک بازی پیچیده که هر GameObject متد آپدیت خودش را دارد می‌تواند تأثیر زیادی روی پرفرمنس برنامه بگذارد. بنابراین قبل از اینکه چیز جدیدی داخل این متد قرار دهید به این فکر کنید که آیا واقعاً نیازی به به وجود آن در هر فریم از بازی هست؟

از Coroutines استفاده کنید

در صورتی که امکان انجام چنین کاری میسر نبود، انتخاب‌های متعددی پیش رویتان هست. یکی از روش‌ها، استفاده از مفهوم Coroutines برای فرخوانی متدهاست. در واقع coroutine به متدهایی گفته می‌شود که می‌توانند برای زمان مشخصی در اجرایشان تأخیر داشته باشند. مثلاً انجام یک کار بعد از چند ثانیه. در یونیتی تعدادی از توابع مثل ()Start به صورت خودکار این مفهوم را پیاده‌سازی کرده‌اند و نیازی به انجام هیچ کاری نیست. به هر حال برای اینکه تابعی قابلیت ایجاد تأخیر زمانی داشته باشد به جای Void باید از IEnummerable استفاده کنید و برای فراخوانی ان از متد ()StartCoroutine استفاده نمایید. مثال پایین کدی را نشان می‌دهد که هر ثانیه عمل خاصی را انجام می‌دهد؛ مثلاً رفرش کردن تعدادی از عناصر صفحه.

به جای خط آخر می‌توانید از WaitForEndOfFrame استفاده کنید تا به جای هر فریم در هر دو فریم عمل خواسته شده را انجام دهد.

از رویدادها، اکشن‌ها و React Programming استفاده کنید

چیزی که می‌تواند اجرای یک متد را خیلی کارآمدتر کند این است که تنها زمانی فرخوانی‌اش کنیم که به آن نیاز داریم. برای مثال وقتی فلان متغیر مقدارش تغییر کرد، فلان متد را فرخوانی کن. یا وقتی آن رویداد اتفاق افتاد آن پیغام پاپ‌آپ را به کاربر نمایش بده. این اساس برنامه‌نویسی واکنش‌گرا (React Programming) است. برای پیاده‌سازی آن در سی‌شارپ معمولاً از Delegate بخصوص Action Delegate ها استفاده می‌شود. این ساختارهای برنامه‌نویسی به شما اجازه می‎دهد تا رویدادهایی تعریف کنید که به محض اینکه اتفاق افتادند فرخوانی شوند و رویدادها به نوبۀ خود، آن متدهایی که در رویداد subscribe کرده‌اند را اجرا کنند.

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

برای شناسایی گیم آبجکت‌های touchable از Raycast استفاده کنید

در یوینیتی به جزء UI هیچ روش ساده‌ای برای شناسایی لمس کاربر روی اشیاء بازی وجود ندارد. می‌توانید از ()OnMouseDown استفاده کنید ولی یونیتی اجازه نمی‌دهد روی گوشی از آن استفاده کنید. تنها راه مقابله با این مشکل استفاده از Raycast است. از دوربین شروع کنید و به جایی که کاربر انگشت خود را روی صفحه می‌گذارد بروید. اینجا می‌توانید برای اشیاء بخصوصی در صورت لمس شدن، یک متد را فرخوانی کنید. در مثال پایین یک کلاس Touchable داریم که با تاچ شدن صفحه از آن استفاده می‌کنیم:

این متد، تاچ شدن روی گیم آبجکت را تشخیص داده و اگر چین اتفاق افتاد متد ()OnTouchDown روی آن فرخوانی می‌شود.

فیزیک بازی

بعد از اینکه خیالتان از بابت اسکریپت‌ها راحت شد نوبت مدیریت فیزیکی بازی است. بهتر است در بازی‌های موبایلی از فیزیک استفاده نکنید ولی در صورتی که چاره‌ای نداشتید لااقل میزان استفاده از  کامپوننت داینامیک Rigibodies را به حداقل برسانید چرا که به محاسبات زیادی نیاز دارد و به صورت عجیبی روی مصرف باتری تاثیر نامطلوب دارند. به جای مش کولیدرها از پریمیتیو کولیدرهای ساده که پیچیدگی کمتری دارند استفاده کنید.  سعی کنید حالت Collision Detection Mode را همیشه روی Discrete حفظ دارید؛ حالت Dynamic به پرفرمنس بالاتری نیاز دارد.

نهایتاً به منوی Edit>Project Settings>Time بروید و در پنجرۀ TimeManager مقدار Fixed Timestep را تنظیم کنید. این عدد فاصلۀ فراخوانی متد ()FixedUpdate را مشخص می‌کند. بنابراین هرچه قدر عدد کوچکتری انتخاب کنید، محاسبات فیزیکی بازی زودتر بروزرسانی می‌شود و البته شبیه‌سازی دقیق‌تری هم خواهید داشت ولی میزان مصرف منابع به شدت بالا می‌رود. و هر چه مقدار آن را بیشتر انتخاب کنید، دقت شبیه‌سازی پایین‌تر آمده و البته مصرف منابع کاهش خواهد یافت.

نورپردازی

شاید یکی از مهم‌ترین مسائل در بهینه‌سازی بازی‌های یونیتی یا هر گیم‌انجین دیگری بحث نورهاست. در صورت امکان از نورهای داینامیک استفاده نکنید و بیشتر از تکسچرهای unlit استفاده کنید. محاسبات مربوط به نور توان زیادی از سیستم می‌کشد بخصوص وقتی تعداد اشیاء موجود در صحنه زیاد باشد و بخصوص وقتی بازی روی گوشی که منابع محدودی دارد اجرا شود.

بخوانید  ساخت اپلیکیشن با بودجه محدود

بیک لایتینگ یا Backed Lighting

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

Light Probes

برای حل مشکل قبلی می‌توانید از این شیوۀ نوردهی استفاده کنید. در این روش نیز اطلاعات نوری بیک لایتینگ ذخیره می‌شود البته نه روی تکسچر بلکه روی فضای خالی.

shadow projector

کار دیگری که می‌توانید انجام دهید استفاده از سایه‌های تقبلی است. به جای سایهۀ واقعی، یک دایرۀ مشکی زیر کاراکتر قرار دهید به عنوان سایه. در اغلب بازی‌های موبایلی می‌توانید از این تکتنیک استفاده کنید و چیز زیادی هم از دست نداده‌اید. همچنین برای ساخت سایۀ جعلی می‌توانید از shadow projector استفاده کنید. این سایه اگرچه واقعی نیست ولی کارراه‌انداز بوده و صرفه‌جویی خوبی هم در منابع به عمل می‌آورد.

سایه‌ها

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

تنظیمات نورپردازی مستقیم

برای کل بازی، فقط از یک Directional Light استفاده کنید. با تنظیمات shadow resolution بازی کنید تا به یک تنظیم رضابت‌بخش برسید. البته رزولوشن پایین‌تر مصرف منابع کمتری دارد ولی این را بدانید که چیزی که در ادیتور می‌بینید دقیقاً همان چیزی نیست که در محیط بازی روی گوشی خواهید دید. مثلاً رزولوشن پایین برای سایه ممکن است روی کامپیوتر به شکل پیکسلی و نامناسب نمایش داده شود ولی روی گوشی به اندازۀ کافی خوب به نظر برسد. پس لازم است تنظیمات را روی گوشی تست کنید.

تنظیمات کیفیت

به منوی Edit>Project Settings>Quality بروید و در پنجرۀ Project Settings تنظیمات مورد نظر را انتخاب کنید. این تنظیمات واقعاً روی پرفرمنس بازی تأثیرگذار است پس لازم ست معنی آن‌ها را بدانید.

Pixel Count: در صورتی که هیچ منبع نوری در بازی وجود ندارد، برای کاهش محاسبات نوری، مقدار این گزینه را به ۱ یا ۰ تغییر دهید.

Antialiasing: در صورت امکان این گزینه را غیرفعال کنید چون روی موبایل، منابع زیادی مصرف می‌کند.

Soft particles: در صورتی که از Soft particle استفاده نکرده‌اید این گزینه را هم غیرفعال کنید.

Shadows: تنظیم درست سایه‌ها بیشترین تاثیر را بر روی پرفرمنس خواهد داشت. از آنجایی که Soft shadow یا سایه‌های نرم منابع بیشتری مصرف می‌کند می‌توانید گزینۀ Hard Shadows only را انتخاب کنید. اما انتخاب این گزینه باعث می‌شود سایه‌ها در رزولوشن پایین واقعاً پیکسلی ظاهر شوند. برای حل این مشکل گزینه Shadow Projection را از Stable Fit به Close Fit تغییر دهید تا میزان پیکسلی شدن کاهش یابد. نگران گرافیک وحشتناک بازی روی سیستم نباشید. نتیجۀ نهایی را حتماً روی گوشی تست کنید. اکنون گزینۀ Shadow Cascades را روی No Cascades تنظیم کنید.

نهایتاً با تنظیم مقدار Shadow Distance خواهید دید که سایه‌های دور از نظر پنهان می‌شوند. در واقع این گزینه میزان فاصله‌ای که تا آنجا سایه‌ها پردازش شوند را مشخص می‌کند. سایه‌های خارج از این فاصله پرادزش نخواهند شد. مقدار این گزینه را تا حد مطلوب کاهش دهید. بعد از انجام تنظیمات فوق، پنجره Quality Settings باید شبیه تصویر زیر شده باشد:

بافت (Texture)

با مشاهدۀ Editor Log احتمالاً متوجه این موضوع شده‌اید که بخش عمدۀ مصرف حافظه مربوط به تکسچر یا بافت آن بوده است. بنابراین قبل از توپیدن روی سر گرافیست‌ها و طراحان، تنظیمات Import Settings را بررسی کنید. در پنجرۀ Project روی بافت مورد نظر کلیک کنید سپس:

  • روی پیکان Advanced کلیک کنید و گزینۀ Generate Mip Maps را تیک بزنید. یونیتی توصیه می‌کند با انتخاب این گزینه، سرعت لودینگ و رندرینگ بازی را افزایش دهیم؛
  • حالا می‌توانید با تنیمات Max Size بازی کنید که تکسچرها را فشرده‌سازی می‌کند تا مصرف حافظه کاهش یابد. این مقدار را تا جایی که به ظاهر بازی لطمۀ جدی وارد نمی‌کند پایین آورید؛
بخوانید  آشنایی با تزریق وابستگی یا Dependency Injection

  • نهایتاً برای کاهش draw call می‌توانید از textures atlases استفاده کنید. atlase به تکسچرها بزرگی گفته می‌شود که حاوی چندین تکسچر دیگر است. این موضوع می‌تواند تاثیر خیلی خوبی روی پرفرمنس بازی بگذارد.

واسط گرافیکی

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

Spirite

در صورت استفاده از اسپایریت در واسط گرافیکی بازی، اطمینان یابید که مناطق شفاف یا transparent کمی داشته باشند. هر چقدر این مناطق بیشتر باشند، میزان overdraw اشیاء گرافیکی افزایش یافته و تاثیر نامطلوبی روی پرفرمنس بازی خواهد گذاشت. همانند تکسچرها، اسپایریت‌ها را هم می‌توانید در داخل یک Atlas قرار داده و مقدار Max Size را به حداقل قابل قبول کاهش دهید. همچنین تیک زدن گزینۀ Generate Mip Maps نه‌تنها باعث کاهش زمان رندر شده بلکه واسط گرافیکی برنامه را نرم‌تر نیز نمایش می‌دهد.

Canvas

در یونیتی، برای UI از Canvas استفاده می‌شود. سعی کنید تعداد Canvasها را به حداقل ممکن کاهش دهید چون افزایش آن‌ها باعث ازدیاد فرایند رندرینگ خواهد شد. شاید Canvasهایی داشته باشید که فقط جنبۀ نمایشی دارند و هیچ تعاملی با کاربر ندارند. در این حالت می‌توانید کامپوننت Graphic Raycaster آن را حذف کنید. همچنین با غیرفعال کردن گزینه Pixel Perfect می‌توانید نتایج مطلوبی در پرفرمنس بازی شاهد باشید.

متن و تصاویر

کامپوننت Text در یونیتی روی موبایل مصرف منابع زیادی دارد. شما می‌توانید گزینۀ Rich Text را غیرفعال کنید تا حجم بار مصرفی کاهش یابد. همچنین با توجه به اینکه کاربران، تعاملی با  متون و تصاویر ندارند می‌توانید Raycast Target را برای آن‌ها غیرفعال کنید. این کار باعث می‌شود تا تمامی متون و تصاویر از هر نوع محاسبات RayCast معاف شوند. یونیتی توصیه می‌کند از گزینۀ Best Fit روی هر متنی استفاده نکنید.

فونت

معمولاً در بازی از فونت‌های سفارشی استفاده می‌شود. مشکلی نیست ولی توجه کنید همۀ فونت‌ها بهینه طراحی نشده‌اند. هر فونتی که در اینترنت گیر آوردید داخل بازی استفاده نکنید. تعداد فونت‌ها را کاهش داده و در صورتی که پرفرمنس برایتان مهم است حتماً به توصیه یونیتی گوش دهید و گزینۀ Best Fit را برای تمام کامپوننت‌های متنی  غیرفعال کنید.

UI Material

تجربه نشان می‌دهد وقتی گزینۀ Material را در کامپوننت Image و Text خالی رها می‌کنید پرفرمنس کاهش می‌یابد. کاری که می‌توانید انجام دهید این است که در پروژه متریال جدیدی بسازید و Shader را بر روی UI/Default قرار دهید و این متریال را روی تمام تصاویر و متون اعمال کنید.

Rect Mask 2D

این کامپوننت چیزی شبیه کامپوننت Mask است اما با این تفاوت که می‌تواند المان‌های خارج از ناحیه ماسک را غیرفعال کرده و رندر نکند. این موضوع می‌تواند تاثیر بسیار خوبی روی پرفرمنس بازی داشته باشد.

Scroll Rect

کامپوننت به درد بخور دیگر در بحث پرفرمنس Scroll Rect است که برای نمایش حجم زیادی از محتوا به کار می‌رود. در کل کامپوننت جالبی است ولی در استفاده از آن زیاده‌روی نکنید چون خیلی برای موبایل بهینه نیست. همچنین برای بهبود عملکرد این کامپوننت می‌توانید از کامپوننت قبلی یعنی Rect Mask 2D استفاده کنید.

Canvas Group و Menu Animation

در هنگام انیمیشن‌سازی عناصر منو، طبیعتاً گزینه‌ها را بسته به اینکه در صفحه قرار دارند یا نه فعال و غیرفعال می‌کنید. ولی این روش بهینه‌ای نیست. در واقع این فعال و غیرفعال‌کردن‌ها ممکن است تعدادی از پراسس‌ها را در برخی از گیم‌آبجکت‌ها ریست کند. مثلاً کامپوننت Scroll Rect به هنگام فعال شدن، محتوای داخلی‌اش مجددا بارگذاری می‌شود که تاثیر بدی روی کارایی خواهد داشت. انتخاب دیگری هم وجود دارد؛ اینکه GameObjectها را به حالت فعال رها کنید ولی از Canvas Groupها استفاده نمایید.

شما می‌توانید المان‌های مختلفی را در یک گروه قرار دهید و رفتارشان را به صورت دسته‌جمعی تغییر دهید. مثلاً Opacity گروه را به آلفا تغییر دهید و اینترکش آن را با گزینه‌های Interactable و Block Raycast غیرفعال کنید. بنابراین از این گزینه استفاده کنید تا مطمئن شوید آن قسمت‌هایی از منو که در معرض دید قرار ندارند از حالت تعامل خارج شوند.

در مورد سایه‌ها باز هم تاکید می‌کنیم که اگرچه جذاب هستند ولی در موبایل می‌توانند فاجعه‌آفرین باشند. در مورد سایه‌ها فقط همینقدر می‌توانیم بگوییم که مراقب باشید. در استفاده از سایه‌ها جانب اعتدال را رعایت کنید و تنها در صورتی که حرفه‌ای هستید روی آن‌ها مانور دهید. یونیتی توانایی خوبی در پردازش سایه‌ها دارد ولی تا حد امکان سعی کنید برای بازی‌های موبایلی به سمت استفاده از سایه‌های پیچیده نروید. نیازی نیست همه چیز واقعی به نظر برسد. در موبایل جزئیات بازی مثل کامپیوتر دیده نمی‌شود لذا تمرکز و حساسیت زیاد روی این بحث نتیجۀ خوبی ندارد. شاید کاربران جزئیات بازی را نبینند ولی قطعاً افت شارژ باتری را سریعاً احساس می‌کنند.

سید ایوب کوکبی

نویسنده و مترجم...

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *