Büyük ekranda yeniden boyutlandırılabilirliği destekleme

Telefonlardan farklı büyük ekran form faktörlerini kullanıma sunmak, oyununuzda pencere yönetimini nasıl ele alacağınızla ilgili dikkat edilmesi gereken noktaları beraberinde getiriyor. Oyununuz, ChromeOS ve PC Üzerinde Google Play Games'de ana masaüstü arayüzü üzerinden pencereli modda çalışabilir. Ekran genişliği > 600 dp'den büyük olan Android 12L (API düzeyi 32) veya sonraki sürümleri çalıştıran yeni Android tabletlerde ve katlanabilir cihazlarda oyununuz diğer uygulamalarla bölünmüş ekran modunda yan yana çalışabilir, yeniden boyutlandırılabilir, hatta katlanabilir cihazlarda iç ve dış ekran arasında hareket ettirilebilir. Bu durumda pencere boyutu ve bazı cihazlarda yön yapılandırması değişir.

Unity oyunlarında yeniden boyutlandırılabilirlik

Temel büyük ekran yapılandırması

Oyununuzun yeniden boyutlandırılabilirliği işleyip desteklemediğini belirtin:

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

Yeniden boyutlandırılabilirliği destekleyemiyorsanız oyun manifestinde, desteklenen minimum ve maksimum en boy oranlarının açıkça tanımlandığından emin olun:

<!-- 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">

PC Üzerinde Google Play Games

PC Üzerinde Google Play Games'de platform, belirtilen en boy oranına uyarak pencerelerin yeniden boyutlandırılmasını sağlar. Pencere boyutu, optimum boyutlara otomatik olarak kilitlenir. Birincil yönünüz yatay ise en az 16:9 en boy oranını, oyununuz dikey moddaysa 9:16 en boy oranını desteklemeniz gerekir. En iyi deneyim için yatay oyunlarda 21:9, 16:10 ve 3:2 en boy oranlarını açıkça destekleyin. Burada pencerenin yeniden boyutlandırılabilirliği gerekli değildir, ancak diğer form faktörü uyumluluğu için yine de kullanılabilir.

Daha fazla bilgi ve en iyi uygulamalar için PC Üzerinde Google Play Games'de grafikleri yapılandırma bölümüne bakın.

ChromeOS ve Android büyük ekranlar

ChromeOS'te ve büyük ekranlı Android cihazlarda tam ekranda oyununuzun görüntülenebilir alanını en üst düzeye çıkarmak için tam ekran etkileyici modunu destekleyin ve decorView'da işaretleri ayarlayarak, sistem kullanıcı arayüzü görünürlüğünde veya WindowInsetsCompat API aracılığıyla sistem çubuklarını gizleyin. Ayrıca döndürme ve yapılandırma etkinliklerini yeniden boyutlandırmanız önerilir veya ChromeOS cihazlarda bu etkinliklerin meydana gelmesini önlemek isteyebilirsiniz.

Oyununuzun, büyük ekranlı Android cihazlarda henüz işlemediğiniz yapılandırmalarda çalışabileceğini unutmayın. Oyununuz tüm pencere boyutu ve yönü yapılandırmalarını desteklemiyorsa platform, oyununuzu uyumluluk modunda sinemaskoplu hale getirir ve gerekirse desteklenmeyen bir yapılandırmaya geçmeden önce oyuncuya istem gösterir.

Şekil 1. Yapılandırma uyumluluğu iletişim kutusu.

Bazı cihazlarda, desteklenmeyen bir yapılandırmaya geçen oyuncudan oyunu yeniden yükleme ve yeni pencere düzenine en uygun şekilde etkinliği yeniden oluşturma seçeneği istenebilir. Bu durum, oyun deneyimini kesintiye uğratmaktadır. Oyununuzu çeşitli çoklu pencere modu yapılandırmalarında (2/3, 1/2, 1/3 pencere boyutu) test edin ve oynanabilirlik ya da kullanıcı arayüzü öğelerinin kesik veya erişilemez olduğunu doğrulayın. Ayrıca, katlanabilir cihazlarda iç ve dış ekran arasında geçiş yaparken oyununuzun katlanabilir sürekliliğe nasıl tepki verdiğini de test edin. Sorun görürseniz bu yapılandırma etkinliklerini açıkça işleyin ve büyük ekran yeniden boyutlandırılabilirlik için gelişmiş destek ekleyin.

Büyük ekranı gelişmiş yeniden boyutlandırma

Şekil 2. Masaüstünde farklı kullanıcı arayüzleri ve masaüstü duruşuyla katlanabilir.

Uyumluluk modundan çıkmak ve etkinlikleri yeniden oluşturmamak için aşağıdakileri yapın:

  1. Ana etkinliğinizin yeniden boyutlandırılabilir olduğunu bildirin:

    <android:resizeableActivity="true" />
    
  2. Tüm büyük ekran yapılandırma etkinliklerini almak için oyun manifestinizin <activity> öğesinin android:configChanges özelliğinde "orientation", "screenSize", "smallestScreenSize", "screenLayout" ve "density" için açık destek beyan edin:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. onConfigurationChanged() öğesini geçersiz kılın ve geçerli yön, pencere boyutu, genişlik ve yükseklik dahil olmak üzere yapılandırma etkinliğini işleyin:

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

Geçerli cihaz döndürmesini kontrol etmek için WindowManager öğesini de sorgulayabilirsiniz. Bu meta veriyi kullanarak yeni pencere boyutlarını kontrol edin ve tam pencere boyutunda oluşturun. Bu yöntem, en boy oranı farklılıklarından dolayı her durumda işe yaramayabilir. Bu nedenle, alternatif olarak oyununuzun kullanıcı arayüzünü, yeni pencere boyutuna ve oynanışla ilgili temel içeriğinize sinemaskop ekleyin. Bu iki yaklaşımdan herhangi birini engelleyen teknik veya tasarım sınırlamaları varsa en boy oranını korumak için kendi motor içi sinemaskop efektinizi yapın ve resizeableActivity = false değerini bildirip yapılandırma modundan kaçınarak mümkün olan en iyi boyutlara ölçeklendirme yapın.

Kullandığınız yaklaşımdan bağımsız olarak, oyununuzu çeşitli yapılandırmalarda test edin (katlama ve açma, farklı döndürme değişiklikleri, bölünmüş ekran modu). Ayrıca oyunun herhangi bir kesimi veya çakışan oyun içi kullanıcı arayüzü öğeleri, dokunma hedefi erişilebilirliği veya en boy oranı sorunları olmadığından emin olun.

Buna ek olarak, çok daha geniş bir alan için aynı sayıda pikseliniz olduğundan, büyük ekranlar genellikle daha büyük piksel anlamına gelir. Bu durum, küçültülmüş oluşturma arabelleklerinde veya daha düşük çözünürlüklü öğelerde pikselleşmeye neden olabilir. Sorun olmaması için büyük ekranlı cihazlarda ve oyununuzun performans profilini kullanın. Oyununuz birden fazla kalite seviyesini destekliyorsa büyük ekranlı cihazları da hesaba kattığınızdan emin olun.

Birden fazla pencere modu

Çoklu pencere modu, birden çok uygulamanın aynı ekranı aynı anda paylaşmasını sağlar. Çoklu pencere modu, etkinlik yaşam döngüsünü değiştirmez. Ancak birden fazla penceredeki uygulamaların devam ettirilen durumu, Android'in farklı sürümlerinde değişiklik gösterir (Çoklu pencere modunda etkinlik yaşam döngüsü için Çoklu pencere desteği bölümüne bakın).

Oyuncu bir uygulamayı veya oyunu çoklu pencere moduna koyduğunda, sistem bir yapılandırma değişikliği etkinliğini Gelişmiş geniş ekran yeniden boyutlandırılabilirlik bölümünde belirtildiği gibi bildirir. Yapılandırma değişikliği, oyuncu oyunu yeniden boyutlandırdığında veya oyunu tekrar tam ekran moduna aldığında da gerçekleşir.

Uygulamanın birden fazla pencere moduna geçtiğinde yeniden odaklanacağının garantisi yoktur. Bu nedenle, oyununuzu duraklatmak için uygulama durumu etkinliklerinden herhangi birini kullanırsanız oyunu devam ettirmek için odaklama etkinliğine (odak değeri doğru olan onWindowFocusChanged()) güvenmeyin. Bunun yerine, onConfigurationChanged() veya onResume() gibi diğer etkinlik işleyicileri veya durum değişikliği işleyicileri kullanın. Mevcut etkinliğin çoklu pencere modunda çalışıp çalışmadığını algılamak için istediğiniz zaman isInMultiWindowMode() yöntemini kullanabileceğinizi unutmayın.

ChromeOS'teki çoklu pencere modunda, ilk pencere boyutları önemli bir unsurdur. Bir oyunun tam ekran olması gerekmez ve bu durumda pencerenin ne kadar boyutunda olması gerektiğini tanımlarsınız. Bu konuda önerilen iki yaklaşım vardır.

İlk seçenek, Android manifest dosyanızdaki <layout> etiketindeki belirli özellikleri kullanarak çalışır. defaultHeight ve defaultWidth özellikleri ilk boyutları kontrol eder. Oyuncularınızın oyun penceresini desteklemediğiniz boyutlarda yeniden boyutlandırmasını önlemek için minHeight ve minWidth özelliklerine de dikkat edin. Son olarak, başlatıldığında pencerenin ekranın neresinde görüneceğini belirleyen gravity özelliği vardır. Aşağıda, bu özellikleri kullanan bir düzen etiketi örneği verilmiştir:

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

Pencere boyutunu ayarlamaya yönelik ikinci seçenek, dinamik başlatma sınırlarını kullanarak çalışır. setLaunchBounds(Rect)⁠⁠ kullanarak başlangıç aralığı boyutlarını tanımlayabilirsiniz. Boş bir dikdörtgen belirtilirse etkinlik, maksimum durumda başlatılır.

Ayrıca, Unity veya Unreal oyun motorlarını kullanıyorsanız çoklu pencere modu için iyi destek sağlayan yeni bir sürüm (Unity 2019.4.40 ve Unreal 5.3 veya daha yeni bir sürüm) kullandığınızdan emin olun.

Katlanabilir duruş desteği

Oyuncuların sürükleyiciliğini ve etkileşimini artırmak için masa üstü gibi katlanabilir uygulamaları desteklemek üzere Jetpack WindowManager düzen kitaplığını kullanın:

Şekil 3. Oyun masaüstü duruşunda, ana görünümü ekranın dikey bölümünde, yatay bölümde kontrol ediliyor.

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