Giriş: Neden Çok Dilli Bir Oyun Geliştirmelisiniz?
Günümüz globalleşen dünyasında, bir oyunun başarısı genellikle ne kadar geniş bir kitleye ulaşabildiğiyle doğru orantılıdır. Oyununuzu sadece kendi dilinizde sunmak, potansiyel oyuncu kitlenizi ciddi şekilde kısıtlar. Çok dilli bir oyun, farklı kültürlerden ve coğrafyalardan oyunculara erişim sağlayarak hem oyununuzun popülaritesini artırır hem de oyuncu deneyimini zenginleştirir. Unity, bu ihtiyaca yönelik olarak güçlü ve esnek bir çözüm sunar: Unity Localization Sistemi.
Bu rehberde, Unity Localization Sistemi’ni kullanarak oyunlarınıza nasıl çoklu dil desteği ekleyeceğinizi adım adım öğrenecek, metinlerden varlıklara kadar her şeyi nasıl lokalize edeceğinizi keşfedecek ve yaygın hatalardan kaçınarak performanslı bir lokalizasyon süreci yöneteceğiniz pratik bilgiler edineceksiniz.
Unity Localization Sistemi Kurulumu ve Temelleri
Unity Localization Sistemi’ni kullanmaya başlamak oldukça basittir. İlk adım, gerekli paketi projenize dahil etmektir.
1. Localization Paketini Yükleme
Unity Editor’da Window > Package Manager yolunu izleyerek Package Manager’ı açın. Sol üstteki açılır menüden Unity Registry‘yi seçin ve arama çubuğuna Localization yazın. Localization paketini bulun ve Install düğmesine tıklayarak projenize ekleyin.
2. Localization Settings Oluşturma
Paket yüklendikten sonra, projenizin lokalizasyon ayarlarını yapmanız gerekir. Edit > Project Settings > Localization yolunu izleyin. Eğer ilk kez açıyorsanız, Create Localization Settings düğmesine tıklayın. Bu işlem, projenizin temel lokalizasyon ayarlarını içeren bir Localization Settings varlığı oluşturacaktır.
3. Locale (Dil) Ekleme
Localization Settings penceresinde, Available Locales bölümünde Locale Generator düğmesine tıklayın. Burada oyununuzda desteklemek istediğiniz dilleri seçebilirsiniz (örneğin, Türkçe (tr), English (en), German (de)). Seçtiğiniz diller, oyununuzun kullanabileceği diller havuzunu oluşturacaktır.
4. String Table ve Asset Table Oluşturma
Unity Localization Sistemi, lokalize edilecek verileri iki ana tablo türünde yönetir:
- String Table (Metin Tablosu): Oyununuzdaki tüm metinleri (UI metinleri, diyaloglar, menü öğeleri) içerir. Her dil için ayrı bir sütun bulunur.
- Asset Table (Varlık Tablosu): Resimler, ses dosyaları, Prefab’ler gibi varlıkları lokalize etmek için kullanılır. Örneğin, diline göre değişen bir başlangıç ekranı logosu veya karakter sesi.
Bu tabloları oluşturmak için Localization Settings penceresinde String Tables veya Asset Tables bölümünün altındaki Create düğmesini kullanabilirsiniz. Her tablo için bir isim belirleyin (örn: MainMenuStrings, UIAssets).
Metin Lokalizasyonu: String Table Kullanımı
Oyununuzdaki metinleri lokalize etmek, genellikle lokalizasyon sürecinin ilk adımıdır.
UI Metinlerini Lokalize Etme
Unity’nin UI sistemiyle (UGUI) entegrasyonu oldukça kolaydır. Bir Text (Legacy) veya TextMeshPro bileşenine sahip bir UI öğesini seçin. Inspector penceresinde Add Component düğmesine tıklayın ve Localize String Event veya Localize String Component ekleyin. Bu bileşen, bağlı olduğu metin kutusunu otomatik olarak lokalize eder. Açılan alanda, kullanmak istediğiniz String Table‘ı ve bu tablodaki ilgili metin girdisini (Entry) seçmelisiniz.
Kod ile String Table’a Erişim
Bazen metinleri kod aracılığıyla dinamik olarak lokalize etmeniz gerekebilir. Örneğin, bir mesaj kutusunun içeriğini veya bir envanter öğesinin açıklamasını lokalize etmek için:
using UnityEngine.Localization.Settings;
using UnityEngine.Localization.Tables;
using System.Collections;
using UnityEngine;
public class LocalizationExample : MonoBehaviour
{
public string tableName = "MainMenuStrings"; // Tablo adı
public string entryKey = "WelcomeMessage"; // Metin girdisinin anahtarı
void Start()
{
StartCoroutine(GetLocalizedText());
}
IEnumerator GetLocalizedText()
{
// Lokalizasyon sisteminin yüklenmesini bekleyin
yield return LocalizationSettings.InitializationOperation;
// String Table'ı alın
StringTable stringTable = LocalizationSettings.StringTables.GetTable(tableName);
if (stringTable != null)
{
// Metin girdisini anahtarla alın
StringTableEntry entry = stringTable.GetEntry(entryKey);
if (entry != null)
{
string localizedText = entry.GetLocalizedValue();
Debug.Log("Lokalize Edilmiş Metin: " + localizedText);
// UI metin bileşenine atayabilirsiniz
// myTextComponent.text = localizedText;
}
else
{
Debug.LogError("Metin girdisi bulunamadı: " + entryKey);
}
}
else
{
Debug.LogError("String Table bulunamadı: " + tableName);
}
}
}
Varlık Lokalizasyonu: Asset Table Kullanımı
Metinlerin yanı sıra, oyununuzdaki görseller, sesler veya Prefab’ler de dile göre değişebilir.
Görsel ve Ses Varlıklarını Lokalize Etme
Bir Image, Sprite Renderer veya Audio Source bileşenine sahip bir GameObject’i seçin. Inspector penceresinde Add Component düğmesine tıklayarak Localize Sprite Event, Localize Audio Event veya Localize Texture Event gibi ilgili bileşeni ekleyin. Ardından, kullanmak istediğiniz Asset Table‘ı ve bu tablodaki ilgili varlık girdisini seçin.
Kod ile Asset Table’a Erişim
Varlıkları kod ile dinamik olarak yüklemek için benzer bir yöntem izleyebilirsiniz:
using UnityEngine.Localization.Settings;
using UnityEngine.Localization.Tables;
using UnityEngine;
using System.Collections;
public class AssetLocalizationExample : MonoBehaviour
{
public string tableName = "UIAssets"; // Asset Table adı
public string entryKey = "StartScreenLogo"; // Varlık girdisinin anahtarı
void Start()
{
StartCoroutine(GetLocalizedAsset());
}
IEnumerator GetLocalizedAsset()
{
yield return LocalizationSettings.InitializationOperation;
AssetTable assetTable = LocalizationSettings.AssetTables.GetTable(tableName);
if (assetTable != null)
{
// Varlık girdisini anahtarla alın (Sprite için)
TableEntry entry = assetTable.GetEntry(entryKey);
if (entry != null)
{
// Varlığı asenkron olarak yükle
var loadOperation = entry.Get (); // Varlık tipine göre değişir
yield return loadOperation;
if (loadOperation.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
{
Sprite localizedSprite = loadOperation.Result;
Debug.Log("Lokalize Edilmiş Sprite Yüklendi: " + localizedSprite.name);
// myImageComponent.sprite = localizedSprite;
}
else
{
Debug.LogError("Varlık yüklenemedi: " + entryKey);
}
}
else
{
Debug.LogError("Varlık girdisi bulunamadı: " + entryKey);
}
}
else
{
Debug.LogError("Asset Table bulunamadı: " + tableName);
}
}
}
İleri Seviye Lokalizasyon Teknikleri
Dinamik Metinler ve Parametreler
Bazen lokalize edilecek metinler dinamik değerler içerebilir (örneğin, “Hoş geldiniz, [OyuncuAdı]!”). Unity Localization Sistemi, bu tür durumlar için parametre kullanımını destekler. String Table’da bir metin girdisi oluştururken, parametreleri {0}, {1} gibi yer tutucularla belirtebilirsiniz.
Kodda bu metinleri kullanırken StringTableEntry.GetLocalizedValue() metoduna parametreleri geçirebilirsiniz:
string playerName = "Ahmet";
string localizedWelcome = stringTable.GetEntry("WelcomePlayerMessage").GetLocalizedValue(playerName);
Debug.Log(localizedWelcome); // Çıktı: "Hoş geldiniz, Ahmet!" (Türkçe ise)
Dil Değiştirme Mekanizmaları
Kullanıcının oyun içinde dil değiştirmesine izin vermek için aşağıdaki kodu kullanabilirsiniz:
using UnityEngine.Localization.Settings;
using UnityEngine.Localization;
using System.Collections;
using UnityEngine;
public class LanguageSwitcher : MonoBehaviour
{
public void ChangeLanguage(Locale locale)
{
StartCoroutine(SetLocale(locale));
}
public void ChangeLanguage(int localeIndex) // Bir UI butonu için indeks kullanabilirsiniz
{
if (localeIndex >= 0 && localeIndex < LocalizationSettings.AvailableLocales.Locales.Count)
{
Locale selectedLocale = LocalizationSettings.AvailableLocales.Locales[localeIndex];
ChangeLanguage(selectedLocale);
}
else
{
Debug.LogError("Geçersiz dil indeksi: " + localeIndex);
}
}
IEnumerator SetLocale(Locale locale)
{
yield return LocalizationSettings.InitializationOperation;
LocalizationSettings.SelectedLocale = locale;
Debug.Log("Dil değiştirildi: " + locale.LocaleName);
}
}
Bu script’i bir GameObject’e ekleyip, UI’daki bir düğmeye ChangeLanguage metodunu bağlayarak dil seçimini kolayca entegre edebilirsiniz.
Pratik İpuçları
İpucu 1: Shared String Table Kullanımı
Farklı sahnelerde veya modüllerde kullanılan ancak aynı anlama gelen metinler için (örn: “Evet”, “Hayır”, “Ayarlar”), tek bir Shared String Table oluşturarak yönetimi kolaylaştırabilirsiniz. Bu, çeviri tutarlılığını artırır ve tekrarı azaltır.
İpucu 2: Harici Çeviri Araçları Entegrasyonu
Büyük projelerde çeviri sürecini harici çevirmenlerle yürütmek gerekebilir. Unity Localization Sistemi, tablolarınızı CSV (Comma Separated Values) formatında dışa aktarmanıza ve çeviriler tamamlandıktan sonra tekrar içe aktarmanıza olanak tanır. Bu özellik, çeviri ajanslarıyla çalışmayı veya Google Sheets gibi araçları kullanmayı çok daha pratik hale getirir.
İpucu 3: Hızlı Test ve Geliştirme
Editor’da oyununuzu test ederken, Localization Settings penceresindeki Selected Locale açılır menüsünden hızlıca dil değiştirebilirsiniz. Bu, farklı dillerde UI’nızın ve metinlerinizin nasıl göründüğünü anında kontrol etmenizi sağlar. Ayrıca, özellikle sağdan sola yazılan diller (Arapça, İbranice) için UI düzeninizin doğru çalıştığından emin olmak kritik öneme sahiptir.
İpucu 4: Fallback Locale Ayarları
Bir metin girdisi için belirli bir dilde çeviri bulunmadığında ne olacağını belirleyebilirsiniz. Localization Settings altında, her Locale için bir Fallback Locale tanımlayabilirsiniz. Örneğin, Türkçe çevirisi olmayan bir metin için İngilizce’yi yedek dil olarak ayarlayabilirsiniz. Bu, oyuncuların eksik çeviriler nedeniyle boş metinlerle karşılaşmasını engeller ve daha tutarlı bir deneyim sunar.
Yaygın Hatalar ve Çözümleri
Hata 1: Lokalizasyon Ayarlarının Eksikliği
Sorun: Bazı UI öğeleri veya metinler lokalize olmuyor, varsayılan dilde kalıyor.
Çözüm: İlgili GameObject’in üzerinde bir Localize String Component veya Localize Asset Component olup olmadığını kontrol edin. Bu bileşenlerin doğru String Table veya Asset Table‘a ve doğru Entry‘ye bağlı olduğundan emin olun.
Hata 2: Yanlış Locale Seçimi
Sorun: Oyun başladığında veya dil değiştirildiğinde, beklenenden farklı bir dil yükleniyor.
Çözüm: Oyunun başlangıcında `LocalizationSettings.SelectedLocale` değerini kontrol edin. Genellikle, kullanıcının daha önce kaydettiği dil tercihini veya işletim sisteminin dilini otomatik olarak algılamak için bir başlangıç rutini yazmanız gerekir. Ayrıca, dil değiştirme fonksiyonunuzun doğru `Locale` objesini atadığından emin olun.
Hata 3: Performans Sorunları
Sorun: Çok sayıda Asset Table veya büyük varlıkların lokalizasyonu nedeniyle oyunun başlangıcında veya dil değiştirirken takılmalar yaşanıyor.
Çözüm: Özellikle büyük boyutlu varlıklar (yüksek çözünürlüklü dokular, uzun ses dosyaları) için Asset Table‘ları Unity’nin Addressables sistemiyle entegre etmeyi düşünün. Bu sayede, varlıklar sadece ihtiyaç duyulduğunda (örneğin, ilgili sahne yüklendiğinde) asenkron olarak yüklenir. Bu, başlangıç yükleme sürelerini kısaltır ve bellek yönetimini optimize eder.
Hata 4: Dinamik Metinlerdeki Argüman Uyuşmazlığı
Sorun: Dinamik metinlerdeki parametreler doğru şekilde görünmüyor veya hata veriyor.
Çözüm: `StringTableEntry.GetLocalizedValue()` metoduna geçirdiğiniz argümanların sırasının ve sayısının, String Table’daki yer tutucularla ({0}, {1} vb.) eşleştiğinden emin olun. Ayrıca, `string.Format` benzeri işlemlerde tip uyumsuzluklarına dikkat edin.
Performans ve Optimizasyon Notları
Unity Localization Sistemi, doğru kullanıldığında oldukça performanslıdır, ancak bazı noktalara dikkat etmek önemlidir:
- Gereksiz Yüklemelerden Kaçının: Oyununuzun sadece aktif olarak kullanılan dillerini yüklediğinden emin olun. Tüm dillerin varlıklarını oyun başlangıcında yüklemek, gereksiz bellek tüketimine ve uzun yükleme sürelerine neden olabilir. `Localization Settings` içinde `Preload All Tables` seçeneğini dikkatli kullanın.
- Addressables Entegrasyonu: Yukarıda bahsedildiği gibi, büyük
Asset Table‘ları için `Addressables` kullanmak, varlıkların isteğe bağlı olarak yüklenmesini sağlayarak performansı büyük ölçüde artırır. Bu, özellikle mobil oyunlar için kritik öneme sahiptir. - Bellek Yönetimi: Lokalize edilmiş varlıkları (özellikle görselleri ve sesleri) artık ihtiyaç duyulmadığında bellekten boşaltmayı düşünün. `Addressables` ile yüklenen varlıklar için `Release` metodunu kullanmak bu konuda yardımcı olur.
Sonuç
Unity Localization Sistemi, oyunlarınıza çoklu dil desteği eklemek için güçlü ve kapsamlı bir çözüm sunar. Bu rehberde öğrendiğiniz temel kurulum adımları, metin ve varlık lokalizasyonu teknikleri, pratik ipuçları ve yaygın hatalardan kaçınma stratejileri ile oyununuzu dünya çapında milyonlarca oyuncuya ulaştırabilirsiniz. Global bir kitleye hitap etmek, oyununuzun başarısı için atacağınız en önemli adımlardan biridir. Unity Localization Sistemi‘ni etkili bir şekilde kullanarak, oyuncularınıza ana dillerinde unutulmaz deneyimler sunmaya başlayın!



