รองรับการปรับขนาดหน้าจอขนาดใหญ่

การขยายการให้บริการจากโทรศัพท์ไปยังอุปกรณ์รูปแบบต่างๆ ที่มีหน้าจอขนาดใหญ่จะทำให้เกิดข้อควรพิจารณาเกี่ยวกับวิธีที่เกมจัดการการจัดการหน้าต่าง ใน ChromeOS และ Google Play Games บน PC เกมจะทำงานในโหมดที่มีหน้าต่างบนอินเทอร์เฟซหลักของเดสก์ท็อปได้ ในแท็บเล็ต Android และอุปกรณ์แบบพับได้รุ่นใหม่ที่ใช้ Android 12L (API ระดับ 32) ขึ้นไปที่มีหน้าจอกว้างกว่า 600dp เกมจะทำงานควบคู่กันในโหมดแยกหน้าจอกับแอปพลิเคชันอื่นๆ ปรับขนาด และแม้แต่ย้ายไปมาระหว่างจอแสดงผลด้านในและด้านนอกในอุปกรณ์แบบพับได้ ซึ่งส่งผลให้มีการเปลี่ยนแปลงการกำหนดค่าสำหรับขนาดหน้าต่างและการวางแนวในอุปกรณ์บางรุ่น

การปรับขนาดได้กับเกม Unity

การกำหนดค่าหน้าจอขนาดใหญ่ขั้นพื้นฐาน

ประกาศว่าเกมของคุณรองรับการปรับขนาดได้หรือไม่ โดยทำดังนี้

<android:resizeableActivity="true" or "false" />

หากไม่สามารถรองรับการปรับขนาดได้ ให้ตรวจสอบว่าไฟล์ Manifest ของเกมกำหนดสัดส่วนภาพขั้นต่ำและสูงสุดที่รองรับไว้อย่างชัดเจน ดังนี้

<!-- Render full screen between 3:2 and 21:9 aspect ratio -->
<!-- Let the platform letterbox otherwise -->
<activity android:minAspectRatio="1.5">
<activity android:maxAspectRatio="2.33">

Google Play Games บน PC

สำหรับ Google Play Games บน PC แพลตฟอร์มจะจัดการการปรับขนาดหน้าต่างโดยคำนึงถึงสัดส่วนภาพที่ระบุ ระบบจะล็อกขนาดหน้าต่างเป็นขนาดที่เหมาะสมโดยอัตโนมัติ คุณต้องรองรับสัดส่วนภาพอย่างน้อย 16:9 หากการวางแนวหลักเป็นแนวนอน และสัดส่วนภาพ 9:16 หากเกมเป็นโหมดแนวตั้ง รองรับสัดส่วนภาพ 21:9, 16:10 และ 3:2 สำหรับเกมแนวนอนอย่างชัดเจนเพื่อให้ได้รับประสบการณ์การใช้งานที่ดีที่สุด ไม่จำเป็นต้องปรับขนาดหน้าต่างได้ แต่ก็ยังควรมีไว้เพื่อให้เข้ากันได้กับรูปแบบอื่นๆ

ดูข้อมูลเพิ่มเติมและแนวทางปฏิบัติแนะนำได้ที่กำหนดค่ากราฟิกสำหรับ Google Play Games บน PC

หน้าจอขนาดใหญ่ของ ChromeOS และ Android

หากต้องการเพิ่มพื้นที่ที่มองเห็นได้สูงสุดสำหรับเกมแบบเต็มหน้าจอใน ChromeOS และอุปกรณ์ Android หน้าจอขนาดใหญ่ ให้รองรับโหมดสมจริงแบบเต็มหน้าจอและซ่อนแถบระบบโดยตั้งค่า Flag ใน decorView, ระดับการมองเห็น UI ของระบบ หรือผ่าน WindowInsetsCompat API นอกจากนี้ คุณยังต้องจัดการเหตุการณ์การกำหนดค่าการหมุนและการปรับขนาดอย่างราบรื่น หรือป้องกันไม่ให้เหตุการณ์ดังกล่าวเกิดขึ้นในอุปกรณ์ ChromeOS ด้วย

โปรดทราบว่าในอุปกรณ์ Android หน้าจอขนาดใหญ่ เกมอาจทำงานในการกําหนดค่าที่คุณอาจยังไม่รองรับ หากเกมของคุณไม่รองรับการกำหนดค่าขนาดหน้าต่างและการวางแนวทั้งหมด แพลตฟอร์มจะใส่แถบดำด้านบนและด้านล่างของเกมในโหมดความเข้ากันได้ และแจ้งให้ผู้เล่นทราบก่อนเปลี่ยนเป็นการกำหนดค่าที่ไม่รองรับ (หากจำเป็น)

รูปที่ 1 กล่องโต้ตอบความเข้ากันได้ของการกำหนดค่า

ในอุปกรณ์บางรุ่น เมื่อผู้เล่นเปลี่ยนไปใช้การกำหนดค่าที่ไม่รองรับ ระบบอาจแสดงตัวเลือกให้โหลดเกมซ้ำและสร้างกิจกรรมอีกครั้งเพื่อให้เหมาะกับเลย์เอาต์หน้าต่างใหม่มากที่สุด ซึ่งจะรบกวนประสบการณ์การเล่นเกม ทดสอบเกมในการกําหนดค่าโหมดหลายหน้าต่างแบบต่างๆ (ขนาดหน้าต่าง 2/3, 1/2, 1/3) และตรวจสอบว่าไม่มีองค์ประกอบเกมเพลย์หรือ UI ที่ถูกตัดออกหรือเข้าถึงไม่ได้ นอกจากนี้ ให้ทดสอบว่าเกมตอบสนองต่อความต่อเนื่องของหน้าจอแบบพับอย่างไรเมื่อเลื่อนไปมาระหว่างหน้าจอด้านในและด้านนอกในอุปกรณ์แบบพับ หากพบปัญหา ให้จัดการเหตุการณ์การกําหนดค่าเหล่านี้อย่างชัดเจนและเพิ่มการรองรับการปรับขนาดหน้าจอขนาดใหญ่ขั้นสูง

ความสามารถในการปรับขนาดหน้าจอขนาดใหญ่ขั้นสูง

รูปที่ 2 UI ที่ต่างกันบนเดสก์ท็อปและอุปกรณ์แบบพับได้ในลักษณะตั้งโต๊ะ

หากต้องการออกจากโหมดความเข้ากันได้และหลีกเลี่ยงการสร้างกิจกรรมอีกครั้ง ให้ทําดังนี้

  1. ประกาศว่ากิจกรรมหลักปรับขนาดได้

    <android:resizeableActivity="true" />
    
  2. ประกาศการรองรับ "orientation", "screenSize", "smallestScreenSize", "screenLayout" และ "density" อย่างชัดเจนในแอตทริบิวต์ android:configChanges ขององค์ประกอบ <activity> ในไฟล์ Manifest ของเกมเพื่อรับเหตุการณ์การกำหนดค่าหน้าจอขนาดใหญ่ทั้งหมด

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. ลบล้าง onConfigurationChanged() และจัดการเหตุการณ์การกําหนดค่า ซึ่งรวมถึงการวางแนวปัจจุบัน ขนาดหน้าต่าง ความกว้าง และความสูง

    Kotlin

    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()
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       val newScreenOrientation: Int = newConfig.orientation
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       val newScreenRotation: Int =
    windowManager.defaultDisplay.rotation
    }

    Java

    @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);
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       int newScreenOrientation = newConfig.orientation;
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       int newScreenRotation = getWindowManager().getDefaultDisplay()
               .getRotation();
    }

นอกจากนี้ คุณยังค้นหา WindowManager เพื่อตรวจสอบการหมุนของอุปกรณ์ปัจจุบันได้ด้วย ใช้ข้อมูลเมตานี้เพื่อตรวจสอบขนาดหน้าต่างใหม่และแสดงผลเป็นขนาดหน้าต่างเต็ม วิธีนี้อาจใช้ไม่ได้กับบางกรณีเนื่องจากสัดส่วนภาพที่แตกต่างกัน คุณจึงอาจต้องยึด UI ของเกมไว้กับขนาดหน้าต่างใหม่และใส่แถบดำด้านบนและด้านล่างในเนื้อหาเกมเพลย์หลัก หากมีข้อจำกัดทางเทคนิคหรือการออกแบบที่ทำให้ใช้แนวทางใดแนวทางหนึ่งไม่ได้ ให้ใช้การใส่แถบดำด้านบนและด้านล่างในเครื่องมือเพื่อรักษาสัดส่วนภาพ และปรับขนาดเป็นมิติข้อมูลที่ดีที่สุดขณะประกาศ resizeableActivity = false และหลีกเลี่ยงโหมดการกําหนดค่า

ไม่ว่าจะใช้แนวทางใดก็ตาม ให้ทดสอบเกมในการกำหนดค่าต่างๆ (การพับและการกางออก การเปลี่ยนแปลงการหมุนแบบต่างๆ โหมดแยกหน้าจอ) และตรวจสอบว่าไม่มีองค์ประกอบ UI ในเกมที่ถูกตัดออกหรือซ้อนทับกัน ปัญหาการเข้าถึงเป้าหมายการสัมผัส หรือปัญหาสัดส่วนภาพที่ทำให้เกมยืดออก บีบอัด หรือบิดเบี้ยว

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

โหมดหลายหน้าต่าง

โหมดหลายหน้าต่างช่วยให้แอปหลายแอปใช้หน้าจอเดียวกันได้พร้อมกัน โหมดหลายหน้าต่างจะไม่เปลี่ยนวงจรของกิจกรรม อย่างไรก็ตาม สถานะการกลับมาทำงานของแอปในหลายหน้าต่างจะแตกต่างกันไปตาม Android แต่ละเวอร์ชัน (ดูวงจรของกิจกรรมในโหมดหลายหน้าต่างในส่วนรองรับโหมดหลายหน้าต่าง)

เมื่อผู้เล่นเปิดแอปหรือเกมในโหมดหลายหน้าต่าง ระบบจะแจ้งกิจกรรมของการเปลี่ยนแปลงการกำหนดค่าตามที่ระบุไว้ในส่วนความสามารถในการปรับขนาดหน้าจอขนาดใหญ่ขั้นสูง การเปลี่ยนแปลงการกำหนดค่าจะเกิดขึ้นเมื่อผู้เล่นปรับขนาดเกมหรือเปลี่ยนเกมกลับไปเป็นโหมดเต็มหน้าจอด้วย

เราไม่รับประกันว่าแอปพลิเคชันจะได้รับโฟกัสอีกครั้งเมื่ออยู่ในโหมดหลายหน้าต่าง ดังนั้น หากคุณใช้เหตุการณ์สถานะแอปเพื่อหยุดเกมชั่วคราว อย่าใช้เหตุการณ์รับโฟกัส (onWindowFocusChanged() ที่มีค่าโฟกัสเป็น "จริง") เพื่อกลับมาเล่นต่อ แต่ให้ใช้ตัวแฮนเดิลเหตุการณ์หรือตัวแฮนเดิลการเปลี่ยนแปลงสถานะอื่นๆ เช่น onConfigurationChanged() หรือ onResume() โปรดทราบว่าคุณใช้เมธอด isInMultiWindowMode() ได้ทุกเมื่อเพื่อตรวจจับว่ากิจกรรมปัจจุบันทํางานในโหมดหลายหน้าต่างหรือไม่

เมื่อใช้โหมดหลายหน้าต่างใน ChromeOS ขนาดหน้าต่างเริ่มต้นจะกลายเป็นสิ่งสําคัญที่ต้องพิจารณา เกมไม่จำเป็นต้องแสดงแบบเต็มหน้าจอ และคุณจะต้องประกาศขนาดของหน้าต่างสำหรับกรณีดังกล่าว เราขอแนะนํา 2 วิธีในการดำเนินการนี้

ตัวเลือกแรกจะทํางานโดยใช้แอตทริบิวต์ที่เฉพาะเจาะจงในแท็ก <layout> ในไฟล์ Manifest ของ Android แอตทริบิวต์ defaultHeight และ defaultWidth จะควบคุมมิติข้อมูลเริ่มต้น นอกจากนี้ โปรดคำนึงถึงแอตทริบิวต์ minHeight และ minWidth ด้วยเพื่อป้องกันไม่ให้ผู้เล่นปรับขนาดหน้าต่างเกมเป็นขนาดที่คุณไม่รองรับ สุดท้ายคือแอตทริบิวต์ gravity ซึ่งกำหนดตําแหน่งบนหน้าจอที่หน้าต่างจะปรากฏขึ้นเมื่อเปิด ตัวอย่างแท็กเลย์เอาต์ที่ใช้แอตทริบิวต์เหล่านี้มีดังนี้

<layout android:defaultHeight="500dp"
        android:defaultWidth="600dp"
        android:gravity="top|end"
        android:minHeight="450dp"
        android:minWidth="300dp" />

ตัวเลือกที่ 2 สำหรับการตั้งค่าขนาดหน้าต่างจะทํางานโดยใช้ขอบเขตการเริ่มแบบไดนามิก เมื่อใช้ setLaunchBounds(Rect)⁠⁠ คุณจะกําหนดมิติข้อมูลกรอบเวลาเริ่มต้นได้ หากระบุสี่เหลี่ยมผืนผ้าว่างเปล่า ระบบจะเริ่มกิจกรรมในสถานะขยายสูงสุด

นอกจากนี้ หากคุณใช้เครื่องมือสร้างเกม Unity หรือ Unreal โปรดตรวจสอบว่าคุณใช้เวอร์ชันล่าสุด (Unity 2019.4.40 และ Unreal 5.3 ขึ้นไป) ที่รองรับโหมดหลายหน้าต่างได้ดี

รองรับท่าทางแบบพับได้

ใช้ไลบรารีเลย์เอาต์ WindowManager ของ Jetpack เพื่อรองรับลักษณะการใช้งานแบบพับได้ เช่น ตั้งโต๊ะ เพื่อเพิ่มความสมจริงและการมีส่วนร่วมของผู้เล่น

รูปที่ 3 เกมในลักษณะตั้งโต๊ะโดยมุมมองหลักแสดงในส่วนแนวตั้งของจอแสดงผล ส่วนการควบคุมแสดงในส่วนแนวนอน

Kotlin

fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean {
    contract { returns(true) implies (foldFeature != null) }
    return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
            foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
}

Java

boolean isTableTopPosture(FoldingFeature foldFeature) {
    return (foldFeature != null) &&
           (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) &&
           (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL);
}