การเพิ่มประสิทธิภาพเกม Unity สำหรับหน้าจอขนาดใหญ่และอุปกรณ์แบบพับได้

1. บทนำ

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีเพิ่มประสิทธิภาพเกม Unity Android สำหรับอุปกรณ์หน้าจอขนาดใหญ่และอุปกรณ์แบบพับได้ คุณจะใช้โปรเจ็กต์ตัวอย่าง Lost Crypt เพื่อรองรับสัดส่วนภาพ ขยายการใช้เต็มหน้าจอ และตอบสนองต่อสถานะของอุปกรณ์พับได้

ข้อกำหนดเบื้องต้น

  • มีความเข้าใจพื้นฐานเกี่ยวกับการพัฒนา Unity และ Android
  • อุปกรณ์ Android ที่มีหน้าจอขนาดใหญ่ เช่น แท็บเล็ตหรือโทรศัพท์แบบพับได้

สิ่งที่คุณจะได้เรียนรู้

  • วิธีใช้การรองรับสัดส่วนภาพต่างๆ
  • วิธีใช้ Anchor ในการตั้งค่า UI และกล้องของเกมเพื่อปรับให้เข้ากับขนาดหน้าจอโดยอัตโนมัติ
  • วิธีใช้ Jetpack Window Manager ของ Android เพื่อตรวจหาท่าทางการพับของอุปกรณ์และปรับเลย์เอาต์

สิ่งที่ต้องมี

  • Unity Hub และ Editor: ติดตั้ง Unity 2020 LTS หรือ Unity 2022 พร้อมรองรับการสร้าง Android
  • ฮาร์ดแวร์: อุปกรณ์ Android หน้าจอขนาดใหญ่ เช่น แท็บเล็ตหรือโทรศัพท์แบบพับได้
  • แพลตฟอร์มการพัฒนาด้าน Agentic AI เช่น Google Antigravity หากคุณวางแผนที่จะใช้ทักษะ

2. ทักษะของตัวแทน

นอกจากนี้ ยังมีทักษะของเอเจนต์ให้ใช้ประเมินโปรเจ็กต์เกม Unity ด้วย ทักษะนี้ช่วยให้คุณเพิ่มการรองรับความสามารถในการปรับขนาด รวมถึงการรองรับอุปกรณ์ที่มีหน้าจอขนาดใหญ่และอุปกรณ์แบบพับได้ ดูข้อมูลเพิ่มเติมได้ที่ GitHub

วิธีใช้ทักษะนี้

  1. คัดลอกไฟล์ SKILL.md ไปยังไดเรกทอรีของเอเจนต์ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีเพิ่มทักษะได้ที่เริ่มต้นใช้งาน Google Antigravity
  2. ป้อนพรอมต์ให้เอเจนต์ใน IDE ที่มีเอเจนต์ เช่น Antigravity ด้วยคำถามเกี่ยวกับหน้าจอขนาดใหญ่ อุปกรณ์แบบพับได้ หรือความสามารถในการปรับขนาด
  3. ขอให้ตัวแทนเพิ่มการรองรับหน้าจอขนาดใหญ่และอุปกรณ์แบบพับได้

3. การรองรับสัดส่วนภาพ

หากต้องการให้เกมแสดงอย่างถูกต้องในหน้าจอขนาดต่างๆ ให้เริ่มด้วยการรองรับสัดส่วนภาพต่างๆ คุณอาจพิจารณาปรับสัดส่วนภาพของกล้องหรือ Canvas เพื่อให้พอดีกับหน้าจอต่างๆ มากขึ้น

  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. ใช้ Anchor ในการตั้งค่า UI และกล้องของเกม ซึ่งจะช่วยให้องค์ประกอบ UI ปรับตำแหน่งโดยอัตโนมัติเมื่อเทียบกับขนาดหน้าจอ
  2. เปิดฉากการยึดในโปรเจ็กต์ตัวอย่างเพื่อดูวิธีตั้งค่าการยึด Canvas ของ UI
  3. ในฉากการตรึง ระบบจะอัปเดต Canvas ให้รับรู้เฟรมที่ปลอดภัย และจะตรึงตัวควบคุมการเคลื่อนไหวไว้ที่มุมของหน้าจอ

หากต้องการรักษาสัดส่วนภาพของกล้องหลัก ให้ปรับ 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 Callback
  4. HingeSensor.cs จะอ่านมุมบานพับโดยใช้ปลั๊กอิน Java com.unity.lostcryptlargescreenexample.HingeAngleSensor

การใช้ ConfigurationManager

ConfigurationManager.cs สื่อสารกับกิจกรรม Android ที่กำหนดเองและแยกวิเคราะห์สตริง JSON ที่แสดงสถานะ โดยจะรอรับ Callback 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 ให้คลิกไฟล์ > การตั้งค่าการสร้าง
  2. เลือกสร้าง App Bundle ( 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. ตรวจสอบว่าได้เลือกสร้าง App Bundle (Google Play) หากต้องการอัปโหลดไปยัง Play Console หรือคลิกสร้างและเรียกใช้เพื่อติดตั้งใช้งานในอุปกรณ์ที่เชื่อมต่อโดยตรง
  4. ยืนยันอุปกรณ์แบบพับได้ คุณควรปรับเลย์เอาต์ของเกมตามท่าทางการพับของอุปกรณ์ (เช่น HALF_OPENED, FLAT) และขนาดหน้าจอได้ทันที

9. ขอแสดงความยินดี

คุณได้เรียนรู้หลักการปรับเกม Android ที่สร้างด้วย Unity ให้เหมาะกับหน้าจอขนาดใหญ่และอุปกรณ์แบบพับได้เรียบร้อยแล้ว

แบบสำรวจ

ความคิดเห็นของคุณเกี่ยวกับ Codelab นี้มีค่ามากสำหรับเรา โปรดสละเวลาสักครู่เพื่อตอบแบบสำรวจของเรา