هنگام توسعه بازی برای Android، مهم است که تنوع تجربههای احتمالی بازیکن را پیشبینی کنید و با نیازهای تعامل همزمان بازیکن سازگار بمانید. با پشتیبانی از تجربههای مختلف بازیکن، انعطافپذیری شیوه بازی را افزایش میدهید و این به شما کمک میکند دامنه دسترسی بازیتان را گسترش دهید.
تفاوتهای خاص در تجربه بازیکن شامل موارد زیر است:
- ضریبهای شکل دستگاه: اگرچه تلفنها تجربه سنتی دستگاه Android را ارائه میدهند، اما امکان تعامل با بازیها در ضریبهای شکل دیگر نیز وجود دارد. دستگاههای ChromeOS میتوانند محفظه Android را که بازی شما را نمایش میدهد اجرا کنند. رایانههای لوحی که میتوانند Android را اجرا کنند از چندین سطح مختلف وفاداری پشتیبانی میکنند. دستگاههای Android TV از تجربههای غوطهورکنندهتر و با جزئیات بیشتر پشتیبانی میکنند. بازیکنان میتوانند بااستفاده از ابزار افزونه نمایشگر، محیط چندپنجرهای را شبیهسازی کنند. و هنگام استفاده از دستگاههای تاشو، بازیکنان میتوانند اندازه صفحهنمایش را درطول جلسه بازی تغییر دهند.
- روشهای تعامل: بازیکنان میتوانند با لمس کردن صفحهنمایش دستگاه ورودی ارائه دهند، اما میتوانند بهجای آن از موشواره، صفحه لمسی، صفحهکلید، یا کنترلکننده نیز استفاده کنند. علاوهبراین، دردسترس بودن ابزارهای گسترش نمایشگر و دستگاههای تاشو به بازیکنان امکان میدهد بازی شما را در صفحهنمایش بزرگتری تجربه کنند، که این امر باعث میشود جلسههای بازی طولانیتر و میاناهای پیچیدهتر امکانپذیرتر شوند.
- پشتیبانی سختافزاری: برخیاز دستگاههای مجهز به Android سختافزاری ندارند که در دستگاههای دستی رایجتر است، مثل دوربین پشت، GPS، و اتصال شبکه. بازی شما باید با سختافزار دردسترس سازگار شود و شرایطی را که برخیاز ویژگیها دردسترس نیستند بهخوبی مدیریت کند.
این راهنما روالهای مطلوب مربوط به توسعه بازی برای انواع مختلف صفحهنمایش و تعاملات کاربر را ارائه میدهد. این راهنما همچنین پیشنهادهایی درباره طراحی بازی و توسعه استراتژی آزمایش مؤثر ارائه میدهد.
روالهای مطلوب طراحی بازی
هنگام برنامهریزی طراحی و معماری بازیتان، روالهای مطلوب شرحدادهشده در بخشهای زیر را دنبال کنید.
پاسخ دادن به تغییرات پیکربندی بهصورت دستی
وقتی سیستم Android تغییر پیکربندی را شناسایی میکند، مثلاً تغییر در
اندازه صفحهنمایش، جهت صفحهنمایش، یا روش ورودی، سیستم بهطور پیشفرض
فعالیت فعلی را بازراهاندازی میکند. برای حفظ وضعیت در برنامه یا بازی، فعالیت بهطور پیشفرض
onSaveInstanceState()
را قبلاز بازراهاندازی و
onRestoreInstanceState()
را بعداز بازراهاندازی فراخوانی میکند. اما این فرایند مستلزم آن است که فعالیت همه سرویسها و منابع مرتبط را مجدداً بار کند. برای کسب اطلاعات بیشتر درباره این رفتار پیشفرض،
راهنمای رسیدگی به تغییرات پیکربندی را ببینید.
یک جلسه بازی معمولی چندین تغییر پیکربندی را تجربه میکند. اگر بازی شما به سیستم اجازه دهد هر تغییر پیکربندی را مدیریت کند، صحنه بازی شما بارها و بارها ازبین میرود و دوباره راهاندازی میشود، که این امر عملکرد بازی شما را کاهش میدهد. به همین دلیل، اکیداً توصیه میکنیم که خودتان این تغییرات پیکربندی را در بازیتان مدیریت کنید.
برای آشنایی با نحوه افزودن این منطق تغییر پیکربندی به بازیتان، بخش مربوط به نحوه ایجاد گردانندههای تغییر پیکربندی سفارشی را ببینید.
ایجاد معماری انعطافپذیر
برای افزودن پشتیبانی از بازیتان در بیشترین تعداد دستگاه ممکن، این روالهای مطلوب را دنبال کنید:
- بهجای فایلهای APK جداگانه، «بستههای برنامه Android» را مستقر کنید. بستههای ترکیبی برنامه Android به شما امکان میدهند مصنوعات با وضوحهای مختلف و مدلهای معماری مختلف، مانند x86 و ARM، را در یک مصنوع واحد بستهبندی کنید. بهتر از آن، Android App Bundle از محدودیتهای اندازه بالاتر برای بازی شما پشتیبانی میکند؛ هر APK پایه میتواند تا ۱۵۰ مگابایت باشد و خود بسته میتواند چندین گیگابایت اندازه داشته باشد.
- پشتیبانی از معماریهای x86 را اضافه کنید. این مرحله عملکرد بازیتان را در دستگاههایی که از ARM پشتیبانی نمیکنند بهبود میبخشد، زیرا این دستگاهها اکنون میتوانند دستورالعملها را بدون نیاز به ترجمه اولیه اجرا کنند.
افزودن پشتیبانی از Vulkan
با پشتیبانی از Vulkan، بازی شما میتواند به عملکرد گرافیکی بالاتری دست یابد. اکثر دستگاهها از این میانای برنامهسازی کاربردی گرافیک پشتیبانی میکنند.
ایجاد گردانندههای تغییر پیکربندی سفارشی
برای اعلام انواع تغییرات پیکربندی که بازیتان خودش مدیریت میکند،
مشخصه android:configChanges را به هر عنصر <activity> در مانیفست خود که نشاندهنده صفحه
یا میانای پیچیده است اضافه کنید.
تکهکد زیر نشان میدهد که چگونه اعلام کنید که بازی شما تغییرات اندازه صفحهنمایش، جهت صفحهنمایش، و روش ورودی را مدیریت میکند:
<activity ... android:configChanges="screenSize|orientation|keyboard|keyboardHidden"> </activity>
وقتی تغییرات پیکربندی اعلامشده رخ میدهد، سیستم اکنون روش متفاوتی را فراخوانی میکند،
onConfigurationChanged().
در این روش، منطقی را برای بهروزرسانی واسط کاربر بازیتان اضافه کنید:
- ضریب مقیاس و جهت صفحه را بهروز کنید. بهخاطر داشته باشید که برای بهبود عملکرد، گاهی بهتر است رابط کاربری بازیتان را فقط در یک بُعد مقیاسبندی کنید.
- روش ورودی بهینه را برای استفاده بازیکن شناسایی کنید.
مدیریت تغییرات پیکربندی صفحه
هرگاه مقادیر screenSize و orientation را بهترتیب در مشخصه android:configChanges قرار دهید، بازی شما تغییرات اندازه صفحهنمایش و جهت صفحهنمایش را بهصورت دستی مدیریت میکند. میتوانید از این مقادیر جدید برای بهروزرسانی محتوای صحنه و
نواحی ورودی بازیکن استفاده کنید. برای راهنمایی درباره نحوه طراحی چیدمان بازیتان بهمنظور آسانتر کردن بهروزرسانی آن، راهنمای پشتیبانی از اندازههای مختلف صفحهنمایش را ببینید.
در پیادهسازی onConfigurationChanged() در بازیتان، از شیء
Configuration ارسالشده و شیء
Display مدیر پنجره برای
تعیین مقادیر بهروزشده برای اندازه صفحهنمایش و جهت صفحهنمایش،
بهترتیب، استفاده کنید.
تکهکد زیر نحوه دریافت اندازه و جهت بهروزشده صفحهنمایش بازی را نشان میدهد:
کاتلین
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val density: Float = resources.displayMetrics.density val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt() val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt() // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or // Configuration.ORIENTATION_LANDSCAPE. val newScreenOrientation: Int = newConfig.orientation // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180, // or ROTATION_270. val newScreenRotation: Int = windowManager.defaultDisplay.rotation }
جاوا
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); float density = getResources().getDisplayMetrics().density; int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density); int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density); // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or // Configuration.ORIENTATION_LANDSCAPE. int newScreenOrientation = newConfig.orientation; // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180, // or ROTATION_270. int newScreenRotation = getWindowManager().getDefaultDisplay() .getRotation(); }
توجه داشته باشید که تغییر دادن حالت دستگاه تاشو پیکربندی را تغییر میدهد، حتی اگر برنامهتان در حالت تمامصفحه اجرا شود. درنتیجه، اگر کاربر درحین اجرای بازی شما دستگاه را تا کند یا باز کند، ممکن است برنامهتان مجبور شود تغییرات اندازه صفحهنمایش یا تراکم پیکسل را مدیریت کند.
کیفیتهای صفحهنمایش مختص بازی
بخشهای زیر نحوه تنظیم واکنش بازی به تغییرات اندازه صفحهنمایش یا جهت صفحهنمایش را بسته به ویژگیهای بازی شما شرح میدهند:
حالت تمامصفحه
در برخیاز پلاتفرمها، مانند ChromeOS، برنامهها و بازیهای Android میتوانند بهطور پیشفرض پنجرهای و
قابلتغییر اندازه باشند. اگر بازی شما باید همیشه در حالت تمامصفحه اجرا شود، میتوانید
ویژگی
android:resizeableActivity
را در یکی از عناصر <activity> روی false تنظیم کنید، همانطور که در
تکهکد زیر نشان داده شده است:
<activity ... android:resizeableActivity="false"> </activity>
همچنین میتوانید مشخصه android:resizeableActivity را روی false تنظیم کنید تا از
ایجاد تغییرات پیکربندی مبتنی بر اندازه جلوگیری شود. بااینحال، مگراینکه بازی شما همیشه در حالت تمامصفحه اجرا شود، باید این مشخصه را فقط بهعنوان راهحل موقت
برای اهداف آزمایشی اضافه کنید.
جهت صفحهنمایش
اگر بازی شما به حسگرهای دستگاهی با جهت خاصی وابسته است،
مقداری برای
android:screenOrientation در
فعالیت بازیتان مشخص کنید، همانطور که در تکهکد زیر نشان داده شده است. این تنظیم کمک میکند
از وارونه شدن غیرمنتظره صحنه در بازی جلوگیری شود.
<activity ... android:screenOrientation="landscape"> </activity>
کیفیتهای صفحهنمایش مختص دستگاه
بخشهای زیر نحوه مدیریت تغییرات پیکربندی مبتنی بر صفحهنمایش را با توجه به ویژگیهای خاصی که برخی دستگاهها دارند شرح میدهد.
نسبت ابعادی
برخیاز دستگاهها از نسبتهای ابعادی مختلفی پشتیبانی میکنند. برای مثال، دستگاههای تاشو طوری طراحی شدهاند که در حالت تاشده از نسبت ابعادی ۲۱:۹ پشتیبانی کنند. برای مدیریت این تنوع احتمالی در نسبت ابعادی، حداقل یکی از کارهای زیر را انجام دهید:
- Android 8.0 (سطح میانای برنامهسازی کاربردی ۲۶) یا بالاتر را هدف قرار دهید.
- صحنه و میانای بازیتان را قابلتغییر اندازه کنید. در دستگاههای دارای Android نسخه ۷.۰ (سطح API ۲۴) و بالاتر،
android:resizeableActivityرا رویtrueتنظیم کنید. حداکثر نسبت ابعادی پشتیبانیشده را اعلام کنید. در یک مشخصه
<meta-data>مرتبط با بازیتان،android.max_aspectرا روی2.4تنظیم کنید، همانطور که در تکهکد زیر نشان داده شده است. اما بهخاطر داشته باشید که نسبتهای ابعادی بزرگتر از آنچه مشخص کردهاید باعث میشود بازی بهصورت جعبهای در نمایشگر ظاهر شود.<application> <meta-data android:name="android.max_aspect" android:value="2.4" /> </application>
چندین فعالیت بهطور همزمان قابلمشاهده است
بسیاری از دستگاههای مدرن از انواع چیدمانهای صفحهنمایش، ازجمله صفحه دونیمه، تصویردرتصویر، و نواحی نمایش بزرگ پشتیبانی میکنند. هنگام استفاده از یکی از این چیدمانها، سیستم میتواند چندین فعالیت را بهطور همزمان نمایان کند.
در دستگاههایی که Android 9 (سطح میانای برنامهسازی کاربردی ۲۸) یا بالاتر را اجرا میکنند، ممکن است همه فعالیتهای نمایان بالا بهطور همزمان ازسر گرفته شوند. بااینحال، برای اینکه این رفتار کار کند، هم بازی شما و هم سازنده اصلی دستگاه باید این عملکرد را انتخاب کنند. میتوانید با تنظیم کردن
android.allow_multiple_resumed_activities روی true در مانیفست بازیتان،
پشتیبانی را به بازیتان اضافه کنید، همانطور که در قطعه کد زیر نشان داده شده است:
<application> <meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" /> </application>
سپس میتوانید بازیتان را در دستگاههای مختلف آزمایش کنید تا ببینید کدامیک از آنها پشتیبانی سازنده اصلی محصول لازم برای عملکرد صحیح ازسرگیری چندگانه را ارائه میدهند.
برای اطلاعات بیشتر درباره پیکربندی بازیتان برای نمایش بهعنوان بخشی از نمایشگر چندپنجرهای، راهنمای نحوه افزودن پشتیبانی چندپنجرهای را ببینید.
مدیریت انواع مختلف مدلهای تعامل
هرگاه مقادیر keyboard و keyboardHidden را بهترتیب در مشخصه android:configChanges قرار دهید، بازی شما حضور صفحهکلید و دردسترس بودن صفحهکلید را بهصورت دستی مدیریت میکند. میتوانید از این مقادیر جدید برای بهروزرسانی روش ورودی اصلی بازیتان استفاده کنید.
هنگام پیکربندی بازی برای پشتیبانی از انواع مختلف ورودی کاربر، موارد زیر را درنظر داشته باشید:
- روشهای ورودی را بهجای دستگاههای مجزا شناسایی کنید. این طرز فکر باعث میشود بهبود تجربه بازیکن آسانتر شود بدون اینکه تمرکز زیادی روی دستگاه خاصی که بازیکن ممکن است داشته باشد گذاشته شود.
- مشخصه
keyboardHiddenرا در فهرست تغییرات پیکربندی که بهصورت دستی مدیریت میشوند اضافه کنید. بهاینترتیب، بازی شما میتواند زمانهایی را که صفحهکلید بهطور فیزیکی به دستگاه متصل است اما قابلاستفاده نیست ردیابی کند. روشهای ورودی را که درحالحاضر دردسترس هستند تعیین کنید. برای انجام این کار،
getInputDeviceIds()را در راهاندازی بازی و پساز هر تغییر پیکربندی فراخوانی کنید.اغلب میتوانید براساس دستگاه ورودی ترجیحی بازیکن تعیین کنید که او چگونه قصد دارد با بازی شما تعامل داشته باشد:
- بازیکنان معمولاً از صفحهکلید یا کنترل بازی برای انجام سریع توالی دکمهها استفاده میکنند.
- بازیکنان معمولاً از صفحه لمسی یا پد لمسی برای انجام اشارههای پیچیدهتر استفاده میکنند.
- بازیکنان معمولاً از موشواره برای ورودی با دقت بالاتر استفاده میکنند.
بخشهای زیر روالهای مطلوب را برای انواع خاصی از دستگاههای ورودی ارائه میدهند.
صفحهکلید
هنگام ایجاد چیدمان صفحهکلید برای بازیتان، نحوه پیمایش بازیکن در صحنه موردنظر و همچنین نحوه تعامل او با تنظیمات بازیتان را درنظر بگیرید.
کلیدهای WASD یا کلیدهای جهتنما معمولاً بهترین گزینه برای کنترل حرکت شخصیت هستند. همچنین بهتر است برای هر کنش یا مهارت مهمی که شخصیت قابلکنترل میتواند در بازی شما انجام دهد، کلید خاصی اختصاص دهید. برای بهحداکثر رساندن تجربه بازیکن، پشتیبانی از اتصال کلید سفارشی را به بازیتان اضافه کنید.
بازیکنان باید بتوانند منوهای بازی شما را باز کنند و بااستفاده از صفحهکلید در آنها پیمایش کنند. کلید Esc نگاشت رایجی برای توقف موقت صحنه و
نمایش منو بازی است.
برای اطلاعات بیشتر درباره پشتیبانی از ورودی صفحهکلید در بازی، راهنمای نحوه پشتیبانی از پیمایش با صفحهکلید و همچنین راهنمای نحوه مدیریت کنشهای صفحهکلید را ببینید.
کنترل بازی
برای اطلاعات بیشتر درباره مدیریت ورودی کنترلکننده در بازی، راهنمای نحوه پشتیبانی از کنترلکنندههای بازی را ببینید.
موشواره یا صفحه لمسی
اگر بازی شما از ورودی بازیکن ازطریق موشواره یا صفحه لمسی پشتیبانی میکند، بهخاطر داشته باشید که بازیکنان به روشهایی غیراز بازی کردن با دستگاه تعامل برقرار میکنند. باید بدانید که با درخواست ضبط اشارهگر، همه ورودیهای موشواره به بازی شما هدایت میشود. بنابراین، پساز اینکه بازی اطلاعات موردنیازش را دریافت کرد، ضبط اشارهگر را رها کنید تا بازیکنان دوباره کنترل استاندارد موشواره را در دستگاهشان بهدست آورند.
در دستگاههایی که Android 8.0 (سطح میانای برنامهسازی کاربردی ۲۶) و بالاتر دارند، میتوانید از Mouse
Capture API برای کمک به فرایند ضبط اشارهگر استفاده کنید. در بازیهایی که به ورودی با دقت بالا واکنش نشان میدهند، میتوانید با فراخوانی روشهای getX() و getY()، مختصات فعلی اشارهگر را دریافت کنید.
برای اطلاعات بیشتر درباره افزودن پشتیبانی از ورودی موشواره و ورودی صفحه لمسی در بازی، به راهنمای نحوه ردیابی حرکات لمس و اشارهگر و همچنین راهنمای نحوه مدیریت اشارههای چندلمسی مراجعه کنید.
آزمایش کردن بازی
قبلاز راهاندازی بازی، با تکمیل مراحل شرحدادهشده در بخشهای زیر، نحوه پاسخدهی آن به تغییرات پیکربندی را آزمایش کنید.
بهروزرسانی طرح آزمایشی
هنگام اعتبارسنجی عملکرد بازیتان، چارچوبهای تست زیر را لحاظ کنید:
- پنجره حاوی بازی را کوچک و بزرگ کنید. (اگر بازیتان همیشه در حالت تمامصفحه است، این مورد اعمال نمیشود.)
- اندازه صفحهنمایش را تغییر دهید.
- جهت صفحهنمایش را تغییر دهید. (اگر بازیتان جهت ثابتی داشته باشد، اعمال نمیشود.)
- دستگاههای ورودی، مانند صفحهکلید و موشواره، را متصل و قطع کنید.
- اگر بازیتان از ازسرگیری چندگانه پشتیبانی میکند، آن را انجام دهید.
همچنین، سیستم کنترل کیفیت بازیتان را بهروز کنید تا بتوانید برای طیف گستردهتری از تجربههای بازیکن بهینهسازی کنید.
برای روالهای مطلوب مربوط به آزمایش بازی، به راهنمای اصول آزمایش مراجعه کنید.
استفاده از ابزارهای آزمایش و اشکالزدایی
میتوانید بااستفاده از ابزارهای مختلفی که پلاتفرم پشتیبانی میکند آزمایش انجام دهید:
شبیهسازها، ازجمله شبیهساز Android و Firebase Test Lab.
ChromeOS Performance Analyzer، که هنگام اجرای ChromeOS M75 یا بالاتر دردسترس است.