تحسين ألعاب Unity للشاشات الكبيرة والأجهزة القابلة للطي

1. مقدمة

في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية تحسين لعبة Android على Unity لتتوافق مع الأجهزة ذات الشاشات الكبيرة والقابلة للطي. ستستخدم مشروع Lost Crypt النموذجي لتنفيذ ميزة التوافق مع نسبة العرض إلى الارتفاع، وتوسيع نطاق استخدام وضع ملء الشاشة، والاستجابة لحالات الأجهزة القابلة للطي.

المتطلبات الأساسية

  • فهم أساسي لتطوير Unity وAndroid
  • أجهزة Android ذات الشاشات الكبيرة، مثل الأجهزة اللوحية أو الهواتف القابلة للطي

ما ستتعلمه

  • كيفية توفير إمكانية استخدام نِسب عرض إلى ارتفاع مختلفة
  • كيفية استخدام نقاط الارتكاز في واجهة المستخدم وإعدادات الكاميرا في لعبتك لضبطها تلقائيًا بما يتناسب مع حجم الشاشة
  • كيفية استخدام Jetpack Window Manager من Android لرصد وضعية الطي للجهاز وتعديل التصميم

ما تحتاج إليه

  • Unity Hub وUnity Editor: يجب تثبيت Unity 2020 LTS أو Unity 2022 مع إتاحة إنشاء إصدار Android.
  • الأجهزة: أجهزة Android ذات الشاشات الكبيرة، مثل الأجهزة اللوحية أو الهواتف القابلة للطي
  • منصة تطوير قائمة على وكلاء الذكاء الاصطناعي، مثل Google Antigravity، إذا كنت تخطط لاستخدام المهارة.

2. مهارة الوكيل

يتوفّر بشكل اختياري مهارة وكيل لتقييم مشروع لعبة Unity. تساعدك هذه المهارة في إضافة إمكانية تغيير الحجم والتوافق مع الأجهزة ذات الشاشات الكبيرة والأجهزة القابلة للطي. لمزيد من المعلومات، يُرجى الاطّلاع على: GitHub

لاستخدام هذه المهارة، اتّبِع الخطوات التالية:

  1. انسخ ملف SKILL.md إلى دليل الوكيل. لمزيد من المعلومات حول كيفية إضافة مهارة، يُرجى الاطّلاع على بدء استخدام Google Antigravity.
  2. اطلب من الذكاء الاصطناعي الوكيل في بيئة التطوير المتكاملة (IDE) التي تستخدم الذكاء الاصطناعي الوكيل، مثل Antigravity، طرح أسئلة حول الشاشات الكبيرة أو الأجهزة القابلة للطي أو إمكانية تغيير الحجم.
  3. اطلب من الوكيل إضافة دعم للشاشات الكبيرة والأجهزة القابلة للطي.

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 الأساسي.

ملاحظة: إنّ توفير إمكانية استخدام نسب عرض إلى ارتفاع مختلفة هو الخطوة الأولى لجعل لعبتك تبدو رائعة على الأجهزة اللوحية والأجهزة القابلة للطي.

4. استخدام وضع ملء الشاشة

بعد التكيّف مع نِسب العرض إلى الارتفاع المختلفة، تأكَّد من أنّ لعبتك تستخدم الشاشة بأكملها لجعل تجربة اللعب أكثر جاذبية.

لاستخدام الشاشة بأكملها، اتّبِع الخطوات التالية:

  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;
}

5- التوافق مع الأجهزة القابلة للطي

في الأجهزة القابلة للطي، عليك تعديل تصميم لعبتك استنادًا إلى وضعية الجهاز عند طيّه (على سبيل المثال، HALF_OPENED أو FLAT) وحجم الشاشة أثناء اللعب.

  1. استخدِم Jetpack Window Manager من Android لرصد حالة الجهاز.
  2. في مشروع المثال، افتح المشهد HingeAware.
  3. يحتوي هذا المشهد على ConfigurationManager MonoBehaviour الذي يربط أحداث Jetpack WindowManager في Android بتطبيق Unity ويستجيب لحالات الطي من خلال عمليات رد الاتصال UnityEvent.
  4. يقرأ HingeSensor.cs زاوية المفصلة باستخدام المكوّن الإضافي com.unity.lostcryptlargescreenexample.HingeAngleSensor Java.

استخدام 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";
	}
}

6. استخدام HingeSensor

تحتوي بعض الأجهزة القابلة للطي على أداة استشعار مادية للمفصلة توفّر زاوية الطي الدقيقة (من 0 إلى 360 درجة). يمكنك استخدام هذا الإجراء لتنفيذ آليات اللعب أو ضبط الكاميرا.

في 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 عند إيقاف تطبيقك مؤقتًا أو إتلافه لمنع استنزاف البطارية.

7. إنشاء ملف AAB

لإنشاء ملف AAB في Unity Editor، اتّبِع الخطوات التالية:

  1. في Unity Editor، انقر على ملف (File) > إعدادات الإنشاء (Build settings).
  2. انقر على إنشاء حزمة تطبيق ( Google Play).لمزيد من المعلومات، اطّلِع على مرجع إعدادات إنشاء Android.
  3. انقر على إنشاء.
  4. نزِّل ملف AAB من Unity Editor.

إنشاء إصدار للاختبار الداخلي

لإنشاء إصدار اختبار داخلي وإضافة مختبِرين في Play Console، اتّبِع الخطوات التالية:

  1. اختَر لعبة في Google Play Console.
  2. انتقِل إلى صفحة الاختبار والإصدار (الاختبار > الاختبار الداخلي).
  3. انقر على تحميل واختَر ملف AAB.
  4. في حقل تفاصيل الإصدار، أدخِل اسمًا.
  5. انقر على التالي وراجِع تفاصيل الإصدار.
  6. انقر على حفظ ونشر.

8. إنشاء المشروع وتشغيله

أنت الآن جاهز لإنشاء المشروع واختباره على جهازك.

  1. تأكَّد من فتح اللعبة.
  2. في Play Console، انتقِل إلى ملف > إنشاء ملف تعريف (أو إعدادات الإنشاء).
  3. تأكَّد من وضع علامة في المربّع بجانب إنشاء حِزمة تطبيق (Google Play) إذا أردت التحميل إلى Play Console، أو انقر على إنشاء وتشغيل لنشر التطبيق مباشرةً على جهازك المتصل.
  4. تحقَّق من الأجهزة القابلة للطي، وعليك تعديل تصميم لعبتك استنادًا إلى وضعية الجهاز القابل للطي (على سبيل المثال، HALF_OPENED أو FLAT) وحجم الشاشة أثناء التنقل.

9. تهانينا

لقد تعلّمت بنجاح مبادئ تكييف لعبة Android على Unity لتتوافق مع الشاشات الكبيرة والأجهزة القابلة للطي.

استطلاع

نقدّر ملاحظاتك حول هذا الدرس التطبيقي حول الترميز. يُرجى تخصيص بضع دقائق لإكمال الاستطلاع.