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
วิธีใช้ทักษะนี้
- คัดลอกไฟล์ SKILL.md ไปยังไดเรกทอรีของเอเจนต์ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีเพิ่มทักษะได้ที่เริ่มต้นใช้งาน Google Antigravity
- ป้อนพรอมต์ให้เอเจนต์ใน IDE ที่มีเอเจนต์ เช่น Antigravity ด้วยคำถามเกี่ยวกับหน้าจอขนาดใหญ่ อุปกรณ์แบบพับได้ หรือความสามารถในการปรับขนาด
- ขอให้ตัวแทนเพิ่มการรองรับหน้าจอขนาดใหญ่และอุปกรณ์แบบพับได้
3. การรองรับสัดส่วนภาพ
หากต้องการให้เกมแสดงอย่างถูกต้องในหน้าจอขนาดต่างๆ ให้เริ่มด้วยการรองรับสัดส่วนภาพต่างๆ คุณอาจพิจารณาปรับสัดส่วนภาพของกล้องหรือ Canvas เพื่อให้พอดีกับหน้าจอต่างๆ มากขึ้น
- ตรวจสอบว่าแอปพลิเคชันใช้การตั้งค่าที่ปรับขนาดได้แบบเต็มหน้าจอ
- ใน
AndroidManifest.xml(ตั้งอยู่ที่Assets/Plugins/Android/AndroidManifest.xml):- ตั้งค่า
android:resizeableActivity="true" - ตั้งค่า
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>
- ตรวจสอบการตั้งค่าบิลด์ใน Unity สำหรับการกำหนดค่าแพลตฟอร์ม Android
หมายเหตุ: การรองรับสัดส่วนภาพต่างๆ เป็นขั้นตอนแรกในการทำให้เกมดูดีบนแท็บเล็ตและอุปกรณ์แบบพับได้
4. การใช้ประโยชน์จากโหมดเต็มหน้าจอ
หลังจากปรับให้เข้ากับสัดส่วนภาพต่างๆ แล้ว ให้ตรวจสอบว่าเกมใช้ทั้งหน้าจอเพื่อให้การเล่นเกมสมจริงยิ่งขึ้น
วิธีใช้ทั้งหน้าจอ
- ใช้ Anchor ในการตั้งค่า UI และกล้องของเกม ซึ่งจะช่วยให้องค์ประกอบ UI ปรับตำแหน่งโดยอัตโนมัติเมื่อเทียบกับขนาดหน้าจอ
- เปิดฉากการยึดในโปรเจ็กต์ตัวอย่างเพื่อดูวิธีตั้งค่าการยึด Canvas ของ UI
- ในฉากการตรึง ระบบจะอัปเดต 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) และขนาดหน้าจอในทันที
- ใช้ Jetpack Window Manager ของ Android เพื่อตรวจหาสถานะของอุปกรณ์
- ในโปรเจ็กต์ตัวอย่าง ให้เปิดฉาก HingeAware
- ฉากนี้มี
ConfigurationManagerMonoBehaviour ซึ่งเชื่อมต่อเหตุการณ์ Jetpack WindowManager ของ Android กับ Unity และตอบสนองต่อสถานะการพับผ่านUnityEventCallback HingeSensor.csจะอ่านมุมบานพับโดยใช้ปลั๊กอิน Javacom.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 ให้ทำตามขั้นตอนต่อไปนี้
- ใน Unity Editor ให้คลิกไฟล์ > การตั้งค่าการสร้าง
- เลือกสร้าง App Bundle ( Google Play) ดูข้อมูลเพิ่มเติมได้ที่ข้อมูลอ้างอิงการตั้งค่าการสร้าง Android
- คลิกสร้าง
- ดาวน์โหลดไฟล์ AAB จาก Unity Editor
สร้างรุ่นสำหรับการทดสอบภายใน
หากต้องการสร้างรุ่นการทดสอบภายในและเพิ่มผู้ทดสอบใน Play Console ให้ทำตามขั้นตอนต่อไปนี้
- เลือกเกมใน Google Play Console
- ไปที่หน้าทดสอบและเผยแพร่ (การทดสอบ> การทดสอบภายใน)
- คลิกอัปโหลด แล้วเลือกไฟล์ AAB
- ป้อนชื่อในช่องรายละเอียดผลงาน
- คลิกถัดไป แล้วตรวจสอบรายละเอียดผลงาน
- คลิกบันทึกและเผยแพร่
8. สร้างและเรียกใช้โปรเจ็กต์
ตอนนี้คุณก็พร้อมที่จะสร้างโปรเจ็กต์และทดสอบในอุปกรณ์แล้ว
- ตรวจสอบว่าคุณเปิดเกมอยู่
- ใน Play Console ให้ไปที่ไฟล์ > สร้างโปรไฟล์ (หรือการตั้งค่าการสร้าง)
- ตรวจสอบว่าได้เลือกสร้าง App Bundle (Google Play) หากต้องการอัปโหลดไปยัง Play Console หรือคลิกสร้างและเรียกใช้เพื่อติดตั้งใช้งานในอุปกรณ์ที่เชื่อมต่อโดยตรง
- ยืนยันอุปกรณ์แบบพับได้ คุณควรปรับเลย์เอาต์ของเกมตามท่าทางการพับของอุปกรณ์ (เช่น HALF_OPENED, FLAT) และขนาดหน้าจอได้ทันที
9. ขอแสดงความยินดี
คุณได้เรียนรู้หลักการปรับเกม Android ที่สร้างด้วย Unity ให้เหมาะกับหน้าจอขนาดใหญ่และอุปกรณ์แบบพับได้เรียบร้อยแล้ว
แบบสำรวจ
ความคิดเห็นของคุณเกี่ยวกับ Codelab นี้มีค่ามากสำหรับเรา โปรดสละเวลาสักครู่เพื่อตอบแบบสำรวจของเรา