Her ekrana uygun oyunlar geliştirin

Android için oyun geliştirirken olası oyuncu deneyimlerinin çeşitliliğini öngörmek ve bir oyuncunun gerçek zamanlı etkileşim ihtiyaçlarına uyum sağlamaya devam etmek önemlidir. Farklı oyuncu deneyimlerini destekleyerek oyun esnekliğini artırır ve oyununuzun daha geniş bir kitleye ulaşmasına yardımcı olursunuz.

Oyuncu deneyimindeki bazı farklılıklar şunlardır:

  • Cihaz form faktörleri: Telefonlar, geleneksel Android cihaz deneyimini sunsa da diğer form faktörlerinde oyunlarla etkileşimde bulunmak mümkündür. ChromeOS cihazlar, oyununuzun gösterildiği bir Android kapsayıcı çalıştırabilir. Android çalıştırabilen tabletler birkaç farklı kalite düzeyini destekler. Android TV cihazlar daha fazla ayrıntı açısından zengin ve daha sürükleyici deneyimleri destekler. Oyuncular bir ekran uzantısı aracı kullanarak çok pencereli bir ortamı simüle edebilir. Ayrıca oyuncular katlanabilir cihazları kullanırken oyun oturumu sırasında ekran boyutunu değiştirebilir.
  • Etkileşim yöntemleri: Oyuncular bir cihazın ekranına dokunarak giriş sağlayabilir, ancak bunun yerine fare, dokunmatik alan, klavye veya kumanda da kullanabilirler. Ayrıca, ekranlı uzantı araçlarının ve katlanabilir cihazların mevcut olması, oyuncuların oyununuzu daha büyük bir ekranda oynamasına olanak tanıyarak daha uzun oyun oturumları ve daha karmaşık arayüzler daha uygun hale getirir.
  • Donanım desteği: Bazı Android destekli cihazlarda arka kamera, GPS ve ağ bağlantısı gibi avuç içi cihazlarda daha tipik olan donanımlar yoktur. Oyununuz mevcut donanıma uyum sağlamalı ve belirli özelliklerin kullanılamadığı durumları sorunsuz bir şekilde ele almalıdır.

Bu kılavuzda, oyununuzu farklı ekran türleri ve kullanıcı etkileşimleri için geliştirmeyle ilgili en iyi uygulamalar yer almaktadır. Bu kılavuzda ayrıca oyununuzu tasarlama ve etkili bir test stratejisi geliştirmeyle ilgili öneriler de bulunmaktadır.

Oyun tasarımıyla ilgili en iyi uygulamalar

Oyununuzun tasarımını ve mimarisini planlarken aşağıdaki bölümlerde açıklanan en iyi uygulamaları izleyin.

Yapılandırma değişikliklerini manuel olarak yanıtlama

Android sistemi; ekran boyutunda, ekran yönünde veya giriş yönteminde değişiklik gibi bir yapılandırma değişikliği algıladığında sistem varsayılan olarak mevcut etkinliği yeniden başlatır. Bir uygulama veya oyundaki durumu korumak için etkinlik varsayılan olarak yeniden başlatılmadan önce onSaveInstanceState() ve yeniden başlatıldıktan sonra onRestoreInstanceState() çağrılarını yapar. Ancak bu işlem, etkinliğin ilişkili tüm hizmetleri ve kaynakları yeniden yüklemesini gerektirir. Bu varsayılan davranış hakkında daha fazla bilgi edinmek için yapılandırma değişikliklerini ele alma kılavuzuna bakın.

Tipik bir oyun oturumunda birkaç yapılandırma değişikliği yapılır. Tüm yapılandırma değişikliklerinin sistem tarafından yönetilmesine izin veriliyorsa oyununuzun sahnesi yok edilir ve tekrar tekrar yeniden başlatılır. Bu da oyununuzun performansı düşer. Bu nedenle, bu yapılandırma değişikliklerini oyununuzda kendiniz halletmenizi önemle tavsiye ederiz.

Bu yapılandırma değişikliği mantığını oyununuza nasıl ekleyeceğinizi öğrenmek için özel yapılandırma değişikliği işleyicileri oluşturma bölümüne bakın.

Esnek bir mimari oluşturma

Oyununuz için mümkün olduğunca fazla cihazda destek eklemek üzere aşağıdaki en iyi uygulamaları izleyin:

  • APK'ları ayrı ayrı dağıtmak yerine Android App Bundle'ları dağıtma. Android Uygulama Paketleri, farklı çözünürlüklere ve x86, ARM gibi farklı mimari modellerine sahip yapıları tek bir yapıda paketlemenizi sağlar. Daha da iyisi, Android App Bundle, oyununuz için daha yüksek boyut sınırlarını destekler. Her temel APK en fazla 150 MB büyüklüğünde, paketin kendisi ise birçok gigabayt büyüklüğünde olabilir.
  • x86 mimarileri için destek ekleyin. Bu adım, oyununuzun ARM'yi desteklemeyen cihazlarda performansını artırır. Bunun nedeni, bu cihazların artık çevirmeye gerek kalmadan talimatları yürütebilmesidir.

Vulkan desteği ekleme

Vulkan'ı destekleyerek oyununuzun grafik performansı daha yüksek olabilir. Çoğu cihaz bu grafik API'sini destekler.

Özel yapılandırma değişikliği işleyicileri oluşturma

Oyununuzun kendi kendisini işlediği yapılandırma değişikliği türlerini tanımlamak için manifestinizdeki bir ekranı veya karmaşık arayüzü temsil eden her <activity> öğesine android:configChanges özelliğini ekleyin.

Aşağıdaki kod snippet'inde, oyununuzun ekran boyutu, ekran yönü ve giriş yöntemi değişikliklerine dikkat ettiğini nasıl beyan edeceğiniz gösterilmektedir:

<activity ...
    android:configChanges="screenSize|orientation|keyboard|keyboardHidden">
</activity>

Beyan edilen yapılandırma değişiklikleri gerçekleştiğinde, sistem artık farklı bir yöntem (onConfigurationChanged()) çağırır. Bu yöntemde, oyununuzun kullanıcı arayüzünü güncellemek için mantık ekleyin:

Ekran yapılandırma değişikliklerini işleme

android:configChanges özelliğine sırasıyla screenSize ve orientation değerlerini eklediğinizde oyununuz ekran boyutu ve ekran yönü değişikliklerini manuel olarak işler. Sahnenizin içeriğini ve oynatıcı giriş alanlarını güncellemek için bu yeni değerleri kullanabilirsiniz. Oyununuzun düzenini güncellemeyi kolaylaştırmak amacıyla nasıl tasarlayacağınız konusunda yardım almak için farklı ekran boyutlarını destekleme rehberine bakın.

Oyununuzda onConfigurationChanged() kullanımında, ekran boyutu ve ekran yönü için güncellenen değerleri sırasıyla belirlemek amacıyla eklenen Configuration nesnesini ve pencere yöneticisinin Display nesnesini kullanın.

Aşağıdaki kod snippet'inde oyununuzun güncellenmiş ekran boyutunu ve yönünü nasıl alacağınız gösterilmektedir:

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

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    val newScreenOrientation: Int = newConfig.orientation

    // Get general rotation; one of: 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);

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    int newScreenOrientation = newConfig.orientation;

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    int newScreenRotation = getWindowManager().getDefaultDisplay()
            .getRotation();
}

Uygulamanız tam ekran modunda çalışsa bile katlanabilir cihazların pozisyonunu değiştirdiğinizde yapılandırmanın değiştiğini unutmayın. Bunun sonucunda kullanıcı, oyununuz çalışırken cihazı katlar veya açarsa uygulamanızın ekran boyutu veya piksel yoğunluğundaki değişikliklerle başa çıkması gerekebilir.

Oyuna özgü ekran kaliteleri

Aşağıdaki bölümlerde, oyununuzun kalitelerine bağlı olarak ekran boyutu veya ekran yönü değişikliklerine verdiği tepkinin nasıl ayarlanacağı açıklanmaktadır:

Tam ekran modu

ChromeOS gibi bazı platformlarda, Android uygulamaları ve oyunları varsayılan olarak pencereli ve yeniden boyutlandırılabilir. Oyununuzun her zaman tam ekran modunda çalışması gerekiyorsa aşağıdaki kod snippet'inde gösterildiği gibi <activity> öğelerinizin birinde android:resizeableActivity özelliğini false olarak ayarlayabilirsiniz:

<activity ...
    android:resizeableActivity="false">
</activity>

Boyut tabanlı yapılandırma değişikliklerinin gerçekleşmesini önlemek için android:resizeableActivity özelliğini de false olarak ayarlayabilirsiniz. Bununla birlikte, oyununuz her zaman tam ekran modunda çalışmadığı sürece bu özelliği yalnızca test amacıyla geçici bir düzeltme olarak eklemeniz gerekir.

Ekran yönü

Oyununuz, bir cihazın sensörlerinin belirli bir yöne sahip olmasına bağlıysa aşağıdaki kod snippet'inde gösterildiği gibi oyununuzun etkinliğinde android:screenOrientation için bir değer belirtin. Bu ayar, oyununuzdaki bir sahnenin beklenmedik bir şekilde ters dönmesini önlemeye yardımcı olur.

<activity ...
    android:screenOrientation="landscape">
</activity>

Cihaza özgü ekran kaliteleri

Aşağıdaki bölümlerde, bazı cihazların sahip olduğu belirli nitelikler dikkate alınarak ekrana dayalı yapılandırma değişikliklerinin nasıl ele alınacağı açıklanmaktadır.

En boy oranı

Bazı cihazlar farklı en boy oranlarını destekler. Örneğin katlanabilir cihazlar, katlanmış durumdayken 21:9 en boy oranını destekleyecek şekilde tasarlanmıştır. En boy oranındaki bu potansiyel çeşitliliği karşılamak için aşağıdakilerden en az birini yapın:

  • Android 8.0 (API düzeyi 26) veya sonraki sürümleri hedefleyin.
  • Oyununuzun sahnesini ve arayüzünü yeniden boyutlandırın. Android 7.0 (API düzeyi 24) ve sonraki sürümleri çalıştıran cihazlarda android:resizeableActivity değerini true olarak ayarlayın.
  • Desteklenen maksimum en boy oranı belirtin. Oyununuzla ilişkili bir <meta-data> özelliğinde android.max_aspect değerini aşağıdaki kod snippet'inde gösterildiği gibi 2.4 olarak ayarlayın. Bununla birlikte, belirttiğinizden daha büyük en boy oranlarının, oyunun bir ekranda sinemaskoplu olarak görünmesine neden olduğunu unutmayın.

    <application>
    <meta-data android:name="android.max_aspect"
               android:value="2.4" />
    </application>
    

Birden fazla etkinlik aynı anda görünür

Birçok modern cihaz; bölünmüş ekran, pencere içinde pencere ve geniş görüntüleme alanları gibi çeşitli ekran düzenlerini destekler. Bu düzenlerden birini kullanırken, sistem aynı anda birden fazla etkinliği görünür yapabilir.

Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran cihazlarda, en çok görünen tüm etkinlikler aynı anda devam ettirilebilir. Ancak bu davranışın işe yaraması için hem oyununuzda hem de cihazın OEM'sinin bu işlevi etkinleştirmesi gerekir. Aşağıdaki snippet'te gösterildiği gibi, oyununuzun manifest dosyasında android.allow_multiple_resumed_activities öğesini true olarak ayarlayarak oyununuz içinde destek ekleyebilirsiniz:

<application>
    <meta-data android:name="android.allow_multiple_resumed_activities"
               android:value="true" />
</application>

Daha sonra, oyununuzu farklı cihazlarda test ederek hangisinin, çoklu devam ettirmenin düzgün çalışması için gereken OEM desteğini sağladığını görebilirsiniz.

Oyununuzu çok pencereli bir ekranın parçası olarak görünecek şekilde yapılandırma hakkında daha fazla bilgi için çoklu pencere desteğinin nasıl ekleneceği hakkındaki kılavuzu inceleyin.

Farklı etkileşim modeli türlerini yönetme

android:configChanges özelliğine sırasıyla keyboard ve keyboardHidden değerlerini eklediğinizde oyununuz klavye varlığını ve klavye kullanılabilirliğini manuel olarak işler. Oyununuzun birincil giriş yöntemini güncellemek için bu yeni değerleri kullanabilirsiniz.

Oyununuzu birden fazla kullanıcı girişini destekleyecek şekilde yapılandırırken aşağıdakileri göz önünde bulundurun:

  • Cihazları tek tek algılamak yerine giriş yöntemlerini algılama. Bu anlayış, oyuncunun sahip olabileceği cihaza çok fazla odaklanmadan oyuncu deneyimini iyileştirmesini kolaylaştırır.
  • Manuel olarak yürütülen yapılandırma değişiklikleri listenize keyboardHidden özelliğini ekleyin. Bu şekilde, oyununuz bir klavyenin cihaza fiziksel olarak takılı olduğu ancak kullanılamadığı durumları takip edebilir.
  • Mevcut giriş yöntemlerini belirleyin. Bunu yapmak için oyun başlatılırken ve her yapılandırma değişikliğinden sonra getInputDeviceIds() numaralı telefonu arayın.

    Genellikle oyuncunun tercih ettiği giriş cihazına göre oyununuzla nasıl etkileşimde bulunmayı planladığını belirleyebilirsiniz:

    • Oyuncular hızlı düğme sıralamaları yapmak için genellikle klavye veya oyun kumandası kullanır.
    • Oyuncular genellikle daha karmaşık hareketleri gerçekleştirmek için dokunmatik ekran veya dokunmatik alan kullanır.
    • Oyuncular daha yüksek hassasiyetli girişler için genellikle fare kullanır.

Aşağıdaki bölümlerde belirli giriş cihazı türleriyle ilgili en iyi uygulamalar sunulmuştur.

Klavye

Oyununuz için bir klavye düzeni oluştururken oyuncunun belirli bir sahnede nasıl gezindiğini ve oyununuzun ayarlarıyla nasıl etkileşime girdiğini göz önünde bulundurun.

WASD tuşları veya ok tuşları genellikle karakter hareketini kontrol etmek için en iyi seçenektir. Ayrıca, kontrol edilebilir bir karakterin oyununuzda gerçekleştirebileceği her önemli işlem veya beceri için belirli bir anahtar atamak da en iyisidir. Oyuncu deneyimini en üst düzeye çıkarmak için oyununuzdaki özel tuş bağlamalarını destekleyin.

Oyuncular ayrıca oyununuzun menülerini açıp klavyeyi kullanarak bu menülerde gezinebilmelidir. Esc tuşu, bir sahneyi duraklatmak ve oyunun menüsünü göstermek için yaygın olarak kullanılan bir eşlemedir.

Oyununuzda klavye girişini desteklemeyle ilgili daha fazla bilgi için klavyeyle gezinmeyi destekleme rehberine ve klavye işlemlerinin nasıl yapılacağına dair kılavuza bakın.

Oyun kumandası

Oyununuzda kumanda girişini işleme hakkında daha fazla bilgi için oyun kumandalarını destekleme rehberine bakın.

Fare veya dokunmatik alan

Oyununuz fare veya dokunmatik alan üzerinden oyuncu girişini destekliyorsa, oyuncuların oyununuzu oynamak dışında cihazla etkileşimde bulunduğunu unutmayın. İşaretçi yakalama isteğinde bulunduğunuzda tüm fare girdisinin oyununuza yönlendirildiğini unutmayın. Bu nedenle, oyununuz ihtiyaç duyduğu bilgilere sahip olduktan sonra işaretçi yakalamayı serbest bırakın. Böylece oyuncular cihazlarındaki standart fare kontrolünü tekrar kazanır.

Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlarda, işaretçi yakalama işlemine yardımcı olması için MouseCapture API'yi kullanabilirsiniz. Yüksek hassasiyetli girişlere tepki veren oyunlarda, getX() ve getY() yöntemlerini çağırarak işaretçinin geçerli koordinatlarını alabilirsiniz.

Oyununuzda fare girişi ve dokunmatik alan girişi desteği ekleme hakkında daha fazla bilgi için dokunma ve işaretçi hareketlerini izleme kılavuzuna ve çoklu dokunma hareketlerinin nasıl kullanılacağına dair kılavuza bakın.

Oyununuzu test etme

Oyununuzu başlatmadan önce, aşağıdaki bölümlerde açıklanan adımları tamamlayarak oyunun yapılandırma değişikliklerine nasıl yanıt verdiğini test edin.

Test planınızı güncelleyin

Oyununuzun işlevselliğini doğrularken aşağıdaki test senaryolarını dahil edin:

  • Oyununuzu içeren pencereyi küçültün ve büyütün. (Oyununuz her zaman tam ekran modundaysa geçerli değildir.)
  • Ekran boyutunu değiştirin.
  • Ekran yönünü değiştirin. (Oyununuzun yönü sabitse geçerli değildir.)
  • Klavye ve fare gibi giriş cihazlarını bağlayın ve bunların bağlantısını kesin.
  • Oyununuz destekliyorsa çoklu devam ettirme yapın.

Ayrıca, daha çeşitli oyuncu deneyimleri için optimizasyon yapabilmek üzere oyununuzun kalite kontrol sistemini güncelleyebilirsiniz.

Oyununuzu test etmeyle ilgili en iyi uygulamalar için Testle İlgili Temel Bilgiler kılavuzuna bakın.

Test ve hata ayıklama araçlarını kullanma

Platformun desteklediği çeşitli araçları kullanarak testler yapabilirsiniz: