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

การขยายจากโทรศัพท์ไปยังอุปกรณ์หน้าจอขนาดใหญ่รูปแบบต่างๆ ทำให้ต้องพิจารณาถึงวิธีที่เกมของคุณจัดการการจัดการหน้าต่าง ใน Googlebook, 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

หน้าจอขนาดใหญ่

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

โปรดทราบว่าในอุปกรณ์ 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() เพื่อตรวจหาว่ากิจกรรมปัจจุบันทำงานในโหมดหลายหน้าต่างหรือไม่

เมื่อใช้หน้าต่างเดสก์ท็อปบน Googlebook, 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);
}