بهینه‌سازی بازی‌های Unity برای صفحه‌نمایش‌های بزرگ و دستگاه‌های تاشو

۱. مقدمه

در این کدآزمایی، با نحوه بهینه‌سازی بازی Unity Android برای دستگاه‌های صفحه‌نمایش بزرگ و تاشو آشنا خواهید شد. از پروژه نمونه Lost Crypt برای پیاده‌سازی پشتیبانی نسبت ابعادی، گسترش استفاده از تمام‌صفحه، و پاسخ به حالت‌های تاشو استفاده خواهید کرد.

پیش‌نیازها

  • آشنایی اولیه با توسعه Unity و Android.
  • دستگاه‌های Android با صفحه‌نمایش بزرگ مثل رایانه‌های لوحی یا تلفن‌های تاشو.

آنچه یاد می‌گیرید

  • نحوه پیاده‌سازی پشتیبانی از نسبت‌های ابعادی مختلف.
  • نحوه استفاده از لنگرها در تنظیمات دوربین و میانای کاربر بازی برای تنظیم خودکار با اندازه صفحه‌نمایش.
  • نحوه استفاده از «مدیر پنجره Jetpack» در Android برای تشخیص وضعیت تاشو دستگاه و تنظیم چیدمان.

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

  • مرکز و ویرایشگر Unity: Unity 2020 LTS یا Unity 2022 نصب‌شده، با پشتیبانی ساخت Android.
  • سخت‌افزار: دستگاه‌های Android با صفحه‌نمایش بزرگ مثل رایانه‌های لوحی یا تلفن‌های تاشو.
  • پلاتفرم توسعه عامل‌گرا مثل Google Antigravity اگر قصد دارید از مهارت استفاده کنید.

۲. مهارت عامل

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

برای استفاده از این مهارت:

  1. فایل SKILL.md را در دایرکتوری نماینده‌تان کپی کنید. برای اطلاعات بیشتر درباره نحوه افزودن مهارت، به شروع به کار با Google Antigravity مراجعه کنید.
  2. از عامل خود در «محیط توسعه یکپارچه عامل» (IDE Agentic)، مثل Antigravity، درباره صفحه‌نمایش‌های بزرگ، دستگاه‌های تاشو، یا قابلیت تغییر اندازه سؤال بپرسید.
  3. از نماینده بخواهید از صفحه‌نمایش‌های بزرگ و تاشو پشتیبانی کند.

۳. پشتیبانی از نسبت ابعادی

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

  1. مطمئن شوید که برنامه شما از تنظیم تغییر اندازه تمام‌صفحه استفاده می‌کند.
  2. در AndroidManifest.xml شما (واقع در Assets/Plugins/Android/AndroidManifest.xml):
    1. ‫android:resizeableActivity="true" تنظیم شود.
    2. ‫android:screenOrientation="fullSensor" تنظیم شود.

برای مثال:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <activity android:name="com.unity.lostcryptlargescreenexample.LargeScreenPlayableActivity"
                  android:theme="@style/UnityThemeSelector"
                  android:screenOrientation="fullSensor"
                  android:launchMode="singleTask"
                  android:resizeableActivity="true"
                  android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
                  android:hardwareAccelerated="false">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
</manifest>
  1. تنظیمات ساخت را در Unity برای پیکربندی‌های پلاتفرم Android بررسی کنید.

توجه: پشتیبانی از نسبت‌های ابعادی مختلف اولین گام برای عالی به‌نظر رسیدن بازی شما در رایانه‌های لوحی و دستگاه‌های تاشو است.

۴. استفاده از تمام‌صفحه

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

برای استفاده از کل صفحه:

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

برای حفظ نسبت ابعادی دوربین اصلی، pixelRect دوربین را به‌صورت پویا تنظیم کنید. دستورگان CameraAspectLock.cs نشان می‌دهد که چگونه به تغییرات جهت‌گیری پاسخ دهید و نمای دوربین را به‌صورت نامه صندوقی کنید:

[SerializeField]
private float minAspectRatio = 4f / 3f;

[SerializeField]
private float maxAspectRatio = 21f / 9f;

public void MaintainAspectRatio() {
    int viewWidth = Display.main.systemWidth;
    int viewHeight = Display.main.systemHeight;

    // 1. Calculate screen aspect ratio
    float scaleScreen = viewWidth / (float)viewHeight;
    Rect rect = _camera.pixelRect;

    // 2. Scale to the fullest of the lower between width or height
    if (scaleScreen > maxAspectRatio) {
        // use height, lock width to max at aspect scale
        rect.width = viewHeight * maxAspectRatio;
        rect.height = viewHeight;
    } else if (scaleScreen < minAspectRatio) {
        // use width, lock height to min at aspect scale
        rect.width = viewWidth;
        rect.height = viewWidth / minAspectRatio;
    } else {
        // within allowed aspect ratio range, use full screen
        rect.width = viewWidth;
        rect.height = viewHeight;
    }

    // make sure to center the rect within the window
    rect.x = Mathf.Floor((viewWidth - rect.width) * 0.5f);
    rect.y = Mathf.Floor((viewHeight - rect.height) * 0.5f);

    Debug.Log("camera view width = " + rect.width +
        " height = " + rect.height +
        " x = " + rect.x +
        " y = " + rect.y);

    // 3. Commit the new size to the camera so that it takes effect
    _camera.pixelRect = rect;
}

۵. پشتیبانی از دستگاه‌های تاشو

در دستگاه‌های تاشو، باید چیدمان بازی‌تان را براساس وضعیت تاشو دستگاه (برای نمونه، HALF_OPENED،‏ FLAT) و اندازه صفحه‌نمایش در لحظه تنظیم کنید.

  1. از «مدیر پنجره Jetpack» در Android برای تشخیص وضعیت دستگاه استفاده کنید.
  2. در پروژه نمونه، صحنه HingeAware را باز کنید.
  3. این صحنه حاوی ConfigurationManager MonoBehaviour است که رویدادهای Jetpack WindowManager در Android را به Unity متصل می‌کند و ازطریق UnityEvent برگشت تماس به حالت‌های تاشو پاسخ می‌دهد.
  4. HingeSensor.cs زاویه لولا را بااستفاده از افزایه جاوا com.unity.lostcryptlargescreenexample.HingeAngleSensor می‌خواند.

استفاده از ConfigurationManager

ConfigurationManager.cs با فعالیت سفارشی Android ارتباط برقرار می‌کند و رشته‌های JSON را که نشان‌دهنده وضعیت است تجزیه می‌کند. این مجموعه به onConfigurationChanged و onFoldChanged پاسخ‌برگ از «فعالیت Android» گوش می‌دهد.

[System.Serializable]
public class FoldInfo {
	public string orientation;
	public string state;
	public int isSeparating;
	public int boundsLeft;
	public int boundsTop;
	public int boundsRight;
	public int boundsBottom;
}

public void onFoldChanged(string strFoldInfo) {
	FoldInfo info = JsonUtility.FromJson<FoldInfo>(strFoldInfo);

	// Always call the refresh from the main Unity thread
	StartCoroutine(ExecuteOnMainUnityThread(ActionOnFoldChange, info));
}

همچنین می‌توانید وضعیت را به‌صورت هم‌زمان بااستفاده از خصوصیت getFoldableState پُرسمان کنید:

public static string getFoldableState {
	get {
		if (Application.platform == RuntimePlatform.Android) {
			var foldingFeatureObject = foldablePlayerActivity.Call<AndroidJavaObject>("getFoldingFeature");
			if (foldingFeatureObject != null) {
				var state = foldingFeatureObject.Call<AndroidJavaObject>("getState");
				return state.Call<string>("toString");
			}
		}
		return "NONE";
	}
}

‫۶. از HingeSensor استفاده کنید

برخی‌از دستگاه‌های تاشو دارای حسگر لولای فیزیکی هستند که زاویه دقیق تا شدن (۰ تا ۳۶۰ درجه) را ارائه می‌دهد. می‌توانید از این برای هدایت مکانیک‌های بازی یا تنظیم دوربین استفاده کنید.

در HingeSensor.cs، افزایه Android برای خواندن حسگر سخت‌افزاری مقداردهی اولیه می‌شود. همچنین می‌توانید بررسی کنید که آیا لولا فعال است یا نه:

public class HingeSensor : IDisposable {
	AndroidJavaObject plugin;

	public static HingeSensor Start() {
		if (Application.platform == RuntimePlatform.Android) {
			return OnPlayer.Run(p => {
				var context = p.GetStatic<AndroidJavaObject>("currentActivity");
				var plugin = new AndroidJavaClass("com.unity.lostcryptlargescreenexample.HingeAngleSensor")
						.CallStatic<AndroidJavaObject>("getInstance", context);

				if (plugin != null) {
					plugin.Call("setupSensor");
					return new HingeSensor(plugin);
				}
				return null;
			});
		}
		return null;
	}

	public float GetHingeAngle() {
		return (Application.platform == RuntimePlatform.Android && plugin != null) ? plugin.Call<float>("getHingeAngle") : -1.0f;
	}

	public bool IsHingeEnabled() {
		return Application.platform == RuntimePlatform.Android && plugin != null && plugin.Call<int>("isHingeEnabled") > 0;
	}
}

توجه: برای جلوگیری از خالی شدن باتری، مطمئن شوید که وقتی برنامه شما متوقف می‌شود یا ازبین می‌رود، با Dispose() یا StopSensing() در نمونه HingeSensor خود تماس بگیرید.

‫۷. ایجاد فایل AAB

برای ایجاد فایل AAB در «ویرایشگر Unity»، این مراحل را دنبال کنید:

  1. در «ویرایشگر Unity»، روی File (فایل) > Build settings (تنظیمات ساخت) کلیک کنید.
  2. ساختن دسته برنامه ( Google Play) را انتخاب کنید.برای اطلاعات بیشتر، به مرجع تنظیمات ساخت Android مراجعه کنید.
  3. روی ساختن کلیک کنید.
  4. فایل AAB را از «ویرایشگر Unity» بارگیری کنید.

ایجاد نسخه پخش آزمایش داخلی

برای ایجاد نسخه پخش آزمایش داخلی و افزودن آزمونگران در «کنسول Play»، مراحل زیر را انجام دهید:

  1. در کنسول Google Play، بازی‌ای را انتخاب کنید.
  2. به صفحه آزمایش کردن و منتشر کردن (آزمایش> آزمایش داخلی) پیمایش کنید.
  3. روی بارگذاری کلیک کنید و فایل AAB را انتخاب کنید.
  4. در فیلد جزئیات نسخه پخش، نامی وارد کنید.
  5. روی بعدی کلیک کنید و جزئیات نسخه پخش را مرور کنید.
  6. روی ذخیره و منتشر کردن کلیک کنید.

‫۸. ساختن و اجرای پروژه

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

  1. مطمئن شوید که بازی باز باشد.
  2. در «کنسول Play»، به فایل > ساختن نمایه (یا تنظیمات ساخت) بروید.
  3. اگر می‌خواهید در «کنسول Play» بارگذاری کنید، مطمئن شوید ساختن دسته برنامه (Google Play) علامت زده شده باشد، یا روی ساختن و اجرا کردن کلیک کنید تا مستقیماً در دستگاه متصلتان مستقر شود.
  4. دستگاه‌های تاشو را تأیید کنید، باید چیدمان بازی‌تان را براساس وضعیت تاشو دستگاه (برای نمونه، نیمه‌باز، تخت) و اندازه صفحه‌نمایش در لحظه تنظیم کنید.

‫۹. تبریک می‌گوییم

اصول سازگار کردن بازی Android با Unity برای صفحه‌نمایش‌های بزرگ و دستگاه‌های تاشو را باموفقیت یاد گرفتید!

نظرسنجی

بازخورد شما درباره این codelab بسیار ارزشمند است. لطفاً چند دقیقه وقت بگذارید و نظرسنجی ما را تکمیل کنید.