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

Telefonlardan farklı büyük ekran form faktörlerine geçiş, oyununuzun pencere yönetimini nasıl ele aldığıyla ilgili hususları gündeme getirir. Oyununuz Googlebook, ChromeOS ve PC Üzerinde Google Play Games'de ana masaüstü arayüzü üzerinden pencereli modda çalışabilir. Android 12L (API düzeyi 32) veya sonraki sürümlerin yüklü olduğu ve ekran genişliği > 600 dp olan yeni Android tabletlerde ve katlanabilir cihazlarda oyununuz, bölünmüş ekran modunda diğer uygulamalarla yan yana çalışabilir, yeniden boyutlandırılabilir ve hatta katlanabilir cihazlarda iç ve dış ekran arasında taşınabilir. Bu durumda pencere boyutu ve bazı cihazlarda yön yapılandırması değişir.

Unity oyunlarında yeniden boyutlandırma

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

Oyununuzun yeniden boyutlandırmaya uygun olup olmadığını belirtin:

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

Yeniden boyutlandırma desteklenemiyorsa 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 pencere yeniden boyutlandırılabilirliğini yönetir. Pencere boyutu, optimum boyutlara otomatik olarak kilitlenir. Birincil yönünüz yatay ise en az 16:9 en boy oranını, oyununuz dikey modda ise 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 pencereyi yeniden boyutlandırma özelliği gerekli olmasa da diğer form faktörleriyle uyumluluk için iyi bir özelliktir.

Daha fazla bilgi ve en iyi uygulamalar için PC Üzerinde Google Play Games için grafikleri yapılandırma başlıklı makaleyi inceleyin.

Büyük ekranlar

Büyük ekranlı tabletlerde, katlanabilir cihazlarda, Googlebook'ta, ChromeOS'te ve bağlı ekranlarda oyununuzun görüntülenebilir alanını tam ekranda en üst düzeye çıkarmak için tam ekranlı etkileyici modu destekleyin ve decorView, sistem kullanıcı arayüzü görünürlüğü veya WindowInsetsCompat API'si üzerinden işaretler ayarlayarak sistem çubuklarını gizleyin. Ayrıca, döndürme ve yeniden boyutlandırma yapılandırma etkinliklerini sorunsuz bir şekilde yönetmek veya bunların gerçekleşmesini önlemek isteyebilirsiniz.

Büyük ekranlı Android cihazlarda oyununuzun, henüz ele almadığınız yapılandırmalarda çalışabileceğini unutmayın. Oyununuz tüm pencere boyutu ve yön yapılandırmalarını desteklemiyorsa platform, oyununuza uyumluluk modunda siyah bant ekler ve gerekirse desteklenmeyen bir yapılandırmaya geçmeden önce oyuncuya sorar.

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

Bazı cihazlarda, oyuncu desteklenmeyen bir yapılandırmaya geçtiğinde oyunu yeniden yükleme ve yeni pencere düzenine en uygun şekilde etkinliği yeniden oluşturma seçeneğiyle karşılaşabilir. Bu durum, oyun deneyimini olumsuz etkiler. Oyununuzu çeşitli çoklu pencere modu yapılandırmalarında (2/3, 1/2, 1/3 pencere boyutu) test edin ve oynanabilirlik veya kullanıcı arayüzü öğelerinin kesilmediğini ya da erişilemez hale gelmediğini doğrulayın. Ayrıca, katlanabilir cihazlarda iç ve dış ekran arasında geçiş yaparken oyununuzun katlanabilir cihazlarda sürekliliğe nasıl yanıt verdiğini test edin. Sorun görürseniz bu yapılandırma etkinliklerini açıkça işleyin ve gelişmiş büyük ekran yeniden boyutlandırılabilirliği desteği ekleyin.

Gelişmiş büyük ekranı yeniden boyutlandırma

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

Uyumluluk modundan çıkmak ve etkinliklerin yeniden oluşturulmasını önlemek için aşağıdakileri yapın:

  1. Ana etkinliğinizi yeniden boyutlandırılabilir olarak bildirin:

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

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. onConfigurationChanged() değerini geçersiz kılın ve mevcut 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();
    }

Mevcut cihaz döndürme durumunu kontrol etmek için WindowManager sorgusunu da kullanabilirsiniz. Bu meta verileri kullanarak yeni pencere boyutlarını kontrol edin ve tam pencere boyutunda oluşturun. En-boy oranı farklılıkları nedeniyle bu yöntem her durumda işe yaramayabilir. Alternatif olarak, oyun kullanıcı arayüzünüzü yeni pencere boyutuna sabitleyebilir ve temel oyun içeriğinize letterbox efekti uygulayabilirsiniz. Her iki yaklaşımı da engelleyen teknik veya tasarım sınırlamaları varsa en boy oranını korumak için kendi motor içi letterboxing'inizi yapın ve resizeableActivity = false bildirirken yapılandırma modundan kaçınarak mümkün olan en iyi boyutlara ölçeklendirin.

Hangi yaklaşımı benimserseniz benimseyin, oyununuzu çeşitli yapılandırmalarda test edin (katlama ve açma, farklı döndürme değişiklikleri, bölünmüş ekran modu) ve oyun içi kullanıcı arayüzü öğelerinde kesme veya çakışma, dokunma hedefi erişimiyle ilgili sorunlar ya da oyunun gerilmesine, sıkışmasına veya başka şekilde bozulmasına neden olan en-boy oranı sorunları olmadığından emin olun.

Ayrıca, daha büyük ekranlar genellikle daha büyük pikseller anlamına gelir. Bunun nedeni, çok daha büyük bir alan için aynı sayıda pikselin kullanılmasıdır. Bu durum, küçültülmüş oluşturma arabelleklerinde veya daha düşük çözünürlüklü öğelerde piksellenmeye neden olabilir. Büyük ekranlı cihazlarda en yüksek kaliteli öğelerinizi kullanın ve sorun olmadığından emin olmak için oyununuzun performans profilini oluşturun. Oyununuz birden fazla kalite düzeyini destekliyorsa büyük ekranlı cihazları hesaba kattığından emin olun.

Birden fazla pencere modu

Çoklu pencere modu, birden fazla 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 farklılık gösterir (Çoklu pencere modunu destekleme bölümündeki Çoklu pencere modunda etkinlik yaşam döngüsü başlıklı makaleye bakın).

Oyuncu bir uygulamayı veya oyunu çok pencereli moda geçirdiğinde sistem, Gelişmiş büyük ekran yeniden boyutlandırılabilirliği bölümünde belirtildiği gibi etkinliği yapılandırma değişikliği konusunda bilgilendirir. Oyuncunun oyunu yeniden boyutlandırması veya oyunu tekrar tam ekran moduna geçirmesi de yapılandırma değişikliği olarak kabul edilir.

Uygulamanın çoklu pencere moduna alındığında tekrar odaklanacağı garanti edilmez. Bu nedenle, oyununuzu duraklatmak için uygulama durumu etkinliklerinden herhangi birini kullanıyorsanız oyuna devam etmek için odaklanma etkinliğini (onWindowFocusChanged() odaklanma değeri doğru olacak şekilde) kullanmayın. Bunun yerine onConfigurationChanged() veya onResume() gibi diğer etkinlik işleyicileri ya da durum değişikliği işleyicilerini kullanın. Mevcut etkinliğin çok pencereli modda çalışıp çalışmadığını tespit etmek için her zaman isInMultiWindowMode() yöntemini kullanabileceğinizi unutmayın.

Googlebook, ChromeOS, büyük ekranlı tabletler ve katlanabilir cihazlarda masaüstü pencereleme özelliği kullanılırken ilk pencere boyutları önemli bir faktör haline gelir. Oyunun tam ekran olması gerekmez ve bu durumda pencerenin boyutunu belirtmeniz gerekir. Bu soruna yaklaşmak için önerilen iki yöntem vardır.

İlk seçenek, Android manifest dosyanızdaki <layout> etiketinde belirli özellikler kullanılarak çalışır. defaultHeight ve defaultWidth özellikleri, ilk boyutları kontrol eder. Oyuncularınızın oyun penceresini desteklemediğiniz boyutlara yeniden boyutlandırmasını önlemek için minHeight ve minWidth özelliklerine de dikkat edin. Son olarak, pencerenin başlatıldığında ekranda nerede görüneceğini belirleyen gravity özelliği vardır. Bu özelliklerin kullanıldığı örnek bir düzen etiketi aşağıda verilmiştir:

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

Pencere boyutunu ayarlamanın ikinci seçeneği, dinamik başlatma sınırlarını kullanır. setLaunchBounds(Rect)⁠⁠ kullanarak başlangıç penceresi boyutlarını tanımlayabilirsiniz. Boş bir dikdörtgen belirtilirse etkinlik, ekranı kaplayacak şekilde başlatılır.

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

Katlanabilir duruş desteği

Oyuncuların oyuna daha fazla odaklanmasını ve etkileşimini sağlamak için Jetpack WindowManager düzen kitaplığını kullanarak masaüstü gibi katlanabilir duruşları destekleyin:

Şekil 3. Ana görünüm ekranın dikey kısmında, kontroller ise yatay kısmında olacak şekilde masada oyun oynama

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