Her ekrana uygun oyunlar geliştirin

Android için oyun geliştirirken olası oyuncu deneyimlerinin çeşitliliğini öngörmek ve oyuncuların anlık etkileşim ihtiyaçlarına uyum sağlamak önemlidir. Farklı oyuncu deneyimlerini destekleyerek oyunun esnekliğini artırır ve oyununuzun erişim alanını genişletirsiniz.

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

  • Cihaz form faktörleri: Telefonlar geleneksel Android cihaz deneyimini sunsa da oyunlarla diğer form faktörlerinde etkileşim kurmak mümkündür. ChromeOS cihazlar, oyununuzu gösteren bir Android kapsayıcısı çalıştırabilir. Android çalıştırabilen tabletler, farklı doğruluk düzeylerini destekler. Android TV cihazlar, daha ayrıntılı ve sürükleyici deneyimleri destekler. Oyuncular, ekran uzantısı aracı kullanarak çok pencereli bir ortamı simüle edebilir. Ayrıca, katlanabilir cihazlarda oyuncular oyun oturumu sırasında ekranın boyutunu değiştirebilir.
  • Etkileşim yöntemleri: Oyuncular, cihazın ekranına dokunarak giriş yapabilir ancak bunun yerine fare, dokunmatik alan, klavye veya kumanda da kullanabilir. Ayrıca, ekran uzatma araçlarının ve katlanabilir cihazların kullanılabilmesi, oyuncuların oyununuzu daha büyük bir ekranda deneyimlemesine olanak tanır. Bu sayede, daha uzun oyun oturumları ve daha karmaşık arayüzler mümkün hale gelir.
  • Donanım desteği: Bazı Android destekli cihazlarda, el cihazlarında daha yaygın olan donanımlar (ör. arkaya bakan kamera, GPS ve ağ bağlantısı) bulunmaz. Oyununuz, mevcut donanıma uyum sağlamalı ve belirli özelliklerin kullanılamadığı durumlarda sorunsuz çalışmalıdır.

Bu kılavuzda, oyununuzu farklı ekran türleri ve kullanıcı etkileşimleri için geliştirme ile ilgili en iyi uygulamalar sunulmaktadır. Bu rehberde, oyununuzu tasarlama ve etkili bir test stratejisi geliştirme hakkında da öneriler sunulmaktadı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ı takip edin.

Yapılandırma değişikliklerine manuel olarak yanıt verme

Android sistemi, ekran boyutu, ekran yönü veya giriş yöntemi gibi bir yapılandırma değişikliği algıladığında varsayılan olarak mevcut etkinliği yeniden başlatır. Bir uygulama veya oyundaki durumu korumak için etkinlik, yeniden başlatılmadan önce varsayılan olarak onSaveInstanceState(), yeniden başlatıldıktan sonra ise onRestoreInstanceState() işlevini çağırır. 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 işleme kılavuzuna bakın.

Tipik bir oyun oturumunda çeşitli yapılandırma değişiklikleri yapılır. Oyununuz, her yapılandırma değişikliğinin sistem tarafından işlenmesine izin veriyorsa oyununuzun sahnesi sürekli olarak yok edilip yeniden başlatılır ve bu da oyununuzun performansını düşürür. Bu nedenle, bu yapılandırma değişikliklerini oyununuzda kendiniz yapmanızı şiddetle 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şleyicilerinin nasıl oluşturulacağıyla ilgili bölüme bakın.

Esnek bir mimari oluşturma

Oyununuzun mümkün olduğunca çok cihazda desteklenmesini sağlamak için aşağıdaki en iyi uygulamalardan yararlanın:

  • Tek tek APK'lar yerine Android App Bundle'ları dağıtın. Android uygulama paketleri, farklı çözünürlüklerdeki ve farklı mimari modellerdeki (ör. x86, ARM) yapıları tek bir yapıda paketlemenize olanak tanır. Dahası, Android App Bundle'lar oyununuz için daha yüksek boyut sınırlarını destekler. Her temel APK 150 MB'a kadar olabilir ve paketin kendisi de birkaç gigabayt boyutunda olabilir.
  • x86 mimarileri için destek eklendi. Bu adım, ARM'yi desteklemeyen cihazlarda oyununuzun performansını artırır. Çünkü bu cihazlar artık talimatları önce çevirmek zorunda kalmadan yürütebilir.

Vulkan desteği ekleme

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

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

Oyununuzun kendi başına işlediği yapılandırma değişikliği türlerini bildirmek için manifestinizdeki 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şiklikleriyle nasıl ilgilendiğini beyan etme şekli gösterilmektedir:

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

Bildirilen yapılandırma değişiklikleri gerçekleştiğinde sistem artık farklı bir yöntem olan onConfigurationChanged()'ı çağırıyor. 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

Oyununuz, screenSize ve orientation değerlerini sırasıyla bir android:configChanges özelliğine eklediğinizde ekran boyutu ve ekran yönü değişikliklerini manuel olarak işler. Sahnenizin içeriğini ve oyuncu girişi alanlarını güncellemek için bu yeni değerleri kullanabilirsiniz. Oyununuzun düzenini güncellemeyi kolaylaştıracak şekilde tasarlama konusunda yardım almak için farklı ekran boyutlarını destekleme rehberine göz atın.

onConfigurationChanged() özelliğinin oyununuzdaki uygulamasında, ekran boyutu ve ekran yönü için güncellenen değerleri belirlemek üzere sırasıyla iletilen Configuration nesnesini ve pencere yöneticisinin Display nesnesini kullanın.

Aşağıdaki kod snippet'inde, oyununuzun güncellenmiş ekran boyutunun ve yönünün nasıl alınacağı 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();
}

Katlanabilir bir cihazın duruşunu değiştirmenin, uygulamanız tam ekran modunda çalışsa bile yapılandırmayı değiştirdiğini unutmayın. Bu nedenle, oyununuz çalışırken kullanıcı cihazı katlar veya açarsa uygulamanızın ekran boyutu ya da piksel yoğunluğundaki değişiklikleri işlemesi gerekebilir.

Oyuna özel ekran kaliteleri

Aşağıdaki bölümlerde, oyununuzun özelliklerine bağlı olarak oyununuzun ekran boyutu veya ekran yönü değişikliklerine nasıl tepki vereceğini ayarlama 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> öğelerinizden birinde android:resizeableActivity özelliğini false olarak ayarlayabilirsiniz:

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

Ayrıca, boyuta dayalı yapılandırma değişikliklerinin yapılmasını önlemek için android:resizeableActivity özelliğini false olarak da ayarlayabilirsiniz. Ancak oyununuz her zaman tam ekran modunda çalışmıyorsa bu özelliği yalnızca test amacıyla geçici bir çözüm olarak eklemelisiniz.

Ekran yönlendirme

Oyununuz, cihaz sensörlerinin belirli bir yönlendirmeye 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 özellikler göz önünde bulundurularak 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 tasarlanır. En boy oranındaki bu olası çeşitliliği ele almak 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ılabilir hale getirin. Android 7.0 (API düzeyi 24) ve sonraki sürümleri çalıştıran cihazlarda android:resizeableActivity seçeneğini true olarak ayarlayın.
  • Desteklenen maksimum en-boy oranını bildirin. Oyununuzla ilişkili bir <meta-data> özelliğinde, aşağıdaki kod snippet'inde gösterildiği gibi android.max_aspect değerini 2.4 olarak ayarlayın. Ancak belirttiğinizden daha büyük en-boy oranlarının, oyunun ekranda sinemaskop olarak görünmesine neden olacağını unutmayın.

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

Aynı anda birden fazla etkinlik görünür

Birçok modern cihaz, bölünmüş ekran, resim içinde resim ve geniş ekran 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 hale getirebilir.

Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran cihazlarda, görünür durumdaki tüm etkinliklerin aynı anda devam ettirilmesi mümkündür. Ancak bu davranışın çalışması için hem oyununuzun hem de cihazın OEM'sinin işlevselliği etkinleştirmesi gerekir. Aşağıdaki snippet'te gösterildiği gibi, oyununuzun manifest dosyasında android.allow_multiple_resumed_activities değerini true olarak ayarlayarak oyununuza destek ekleyebilirsiniz:

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

Ardından, çoklu devam ettirme özelliğinin düzgün çalışması için gerekli OEM desteğini hangi cihazların sağladığını görmek üzere oyununuzu farklı cihazlarda test edebilirsiniz.

Oyununuzu çok pencereli ekranın bir parçası olarak görünecek şekilde yapılandırma hakkında daha fazla bilgi için çok pencereli destek ekleme kılavuzuna bakın.

Farklı etkileşim modeli türlerini işleme

Oyununuz, keyboard ve keyboardHidden değerlerini sırasıyla bir android:configChanges özelliğine eklediğinizde 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şi türünü destekleyecek şekilde yapılandırırken aşağıdakileri göz önünde bulundurun:

  • Tek tek cihazlar yerine giriş yöntemlerini algılar. Bu yaklaşım, oyuncunun sahip olabileceği belirli cihaza çok fazla odaklanmadan oyuncu deneyimini iyileştirmeyi kolaylaştırır.
  • Manuel olarak işlenen yapılandırma değişiklikleri listenize keyboardHidden özelliğini ekleyin. Bu sayede oyununuz, klavyenin cihaza fiziksel olarak bağlı olduğu ancak kullanılamadığı zamanları takip edebilir.
  • Şu anda kullanılabilen giriş yöntemlerini belirleyin. Bunu yapmak için oyun başlatılırken ve her yapılandırma değişikliğinden sonra getInputDeviceIds() işlevini çağırın.

    Oyuncunun tercih ettiği giriş cihazına göre oyununuzla nasıl etkileşim kuracağını genellikle belirleyebilirsiniz:

    • Oyuncular genellikle hızlı düğme dizileri oluşturmak için klavye veya oyun kumandası kullanır.
    • Oyuncular genellikle daha karmaşık hareketler yapmak için dokunmatik ekran veya dokunmatik yüzey kullanır.
    • Oyuncular genellikle daha hassas giriş yapmak için fare kullanır.

Aşağıdaki bölümlerde, belirli giriş cihazı türleri için en iyi uygulamalar verilmiştir.

Klavye

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

Karakter hareketini kontrol etmek için genellikle WASD tuşları veya ok tuşları en iyisidir. Kontrol edilebilir bir karakterin oyununuzda gerçekleştirebileceği her önemli işlem veya beceri için belirli bir tuş atamanız da önerilir. Oyuncu deneyimini en üst düzeye çıkarmak için oyununuza özel tuş bağlamaları desteği ekleyebilirsiniz.

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

Oyununuzda klavye girişini destekleme hakkında daha fazla bilgi için klavye ile gezinmeyi destekleme ve klavye işlemlerini ele alma kılavuzlarına bakın.

Oyun kumandası

Oyununuzda kontrol cihazı girişini işleme hakkında daha fazla bilgi için Oyun kumandalarını destekleme kılavuzuna bakın.

Fare veya dokunmatik alan

Oyununuzda fare veya dokunmatik yüzeyden oyuncu girişi destekleniyorsa oyuncuların cihazla oyununuzu oynamanın dışında da etkileşimde bulunduğunu unutmayın. İşaretçi yakalama isteğinde bulunduğunuzda tüm fare girişinin oyununuza yönlendirileceğini unutmayın. Bu nedenle, oyununuz gerekli bilgilere sahip olduktan sonra işaretçi yakalamayı serbest bırakın. Böylece oyuncular, cihazlarının standart fare kontrolünü yeniden kazanır.

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

Oyununuza fare girişi ve dokunmatik yüzey girişi desteği ekleme hakkında daha fazla bilgi için dokunma ve işaretçi hareketlerini izleme ile çoklu dokunma hareketlerini işleme kılavuzlarına göz atın.

Oyununuzu test etme

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

Test planınızı güncelleme

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

  • Oyununuzu içeren pencereyi simge durumuna küçültün ve ekranı kaplayacak şekilde büyütün. (Oyununuz her zaman tam ekran modundaysa bu geçerli değildir.)
  • Ekran boyutunu değiştirin.
  • Ekran yönünü değiştirme (Oyununuzun sabit bir yönü varsa geçerli değildir.)
  • Klavye ve fare gibi giriş cihazlarını bağlayıp bağlantılarını kesebilirsiniz.
  • Oyununuz destekliyorsa çoklu devam ettirme işlemini gerçekleştirin.

Ayrıca, daha çeşitli oyuncu deneyimleri için optimizasyon yapabilmek amacıyla oyununuzun kalite kontrol sistemini güncellemeyi de düşünebilirsiniz.

Oyununuzu test etmeyle ilgili en iyi uygulamalar için Testin Temelleri Kılavuzu'na bakın.

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

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