Unity de PlayerPrefs’i Etkili kullanma

Yusuf Enes AkyÜz
Crafterdevs
Published in
4 min readApr 7, 2024

Merhaba, ben Yusuf Enes Akyüz. Bu yazımızda Unity’de PlayerPrefs’i etkili bir şekilde nasıl kullanacağımıza bakacağız. PlayerPrefs, Unity’de veri depolamanın basit bir yoludur. Özellikle oyunlarda oyuncu ilerlemesini, ayarları veya diğer verileri saklamak için sıkça kullanılır. PlayerPrefs, oyunun çalıştığı platforma bağlı olarak farklı yerlerde verileri saklar. Herhalde hiç kimse oyunu kapatıp açtığında tüm ilerlemesini kaybettiği bir oyunu oynamaz :)

İşte PlayerPrefs’in temel kullanım adımları:

  1. Veri Kaydetme: PlayerPrefs ile veri kaydetmek için Set metodu kullanılır. Örneğin, bir oyuncunun puanını kaydetmek için:
PlayerPrefs.SetInt("PlayerScore", 1000);

2. Veri Alma: Kaydedilen veriyi almak için Get metodunu kullanabiliriz. Önceki örnekte kaydettiğimiz puanı almak için:

int score = PlayerPrefs.GetInt("PlayerScore");

3. Veri Silme: PlayerPrefs’ten bir anahtarla ilişkilendirilmiş veriyi silmek için DeleteKey metodunu kullanabiliriz:

PlayerPrefs.DeleteKey("PlayerScore");

4. Tüm Veriyi Silme: PlayerPrefs’teki tüm veriyi silmek için DeleteAll metodunu kullanabiliriz:

PlayerPrefs.DeleteAll();

PlayerPrefs’in şimdi özelliklerini farklı veri türlerinde kullanalım. Yukarıda zaten int veri tipini kullandık şimdi farklılarını kullanalım.

Float Değerler:

float playerHealth = 75.5f;
PlayerPrefs.SetFloat("PlayerHealth", playerHealth);
float health = PlayerPrefs.GetFloat("PlayerHealth");

String Değerler:

string playerName = "YusufEnes";
PlayerPrefs.SetString("PlayerName", playerName);
string name = PlayerPrefs.GetString("PlayerName");

Bool Değerler:

bool isGamePaused = false;
PlayerPrefs.SetInt("IsGamePaused", isGamePaused ? 1 : 0);
bool paused = PlayerPrefs.GetInt("IsGamePaused") == 1 ? true : false;

Vector3 Değerler:

Vector3 playerPosition = new Vector3(10f, 5f, 3f);
PlayerPrefs.SetFloat("PlayerPosX", playerPosition.x);
PlayerPrefs.SetFloat("PlayerPosY", playerPosition.y);
PlayerPrefs.SetFloat("PlayerPosZ", playerPosition.z);
Vector3 position = new Vector3(
PlayerPrefs.GetFloat("PlayerPosX"),
PlayerPrefs.GetFloat("PlayerPosY"),
PlayerPrefs.GetFloat("PlayerPosZ")
);

PlayerPrefs’in kendi özelliği olmamasına rağmen Vector3 değerlerini saklamak için x, y ve z bileşenlerini ayrı ayrı float olarak saklarız. Bu şekilde, PlayerPrefs kullanarak Vector3 değerlerini depolayabilir ve geri alabiliriz.

Biraz pratik yapalım.

Bu temel adımlar, PlayerPrefs’in genel kullanımını özetledik. PlayerPrefs’i kullanırken, özellikle hassas verileri saklamak için dikkatli olmalı ve güvenlik önlemlerini almalıyız. Ayrıca, PlayerPrefs’i oyunumuzun gereksinimlerine göre esnek bir şekilde kullanarak, kullanıcı deneyimini iyileştirmek için çeşitli senaryoları düşünebiliriz.

Temel işlemleri tamamladıktan sonra, kaydettiğimiz verilerle nasıl kontrol sağlayacağımızı inceleyelim. Örneğin, bir oyuna başladığımızda başlangıçta belirli bir miktar para vermek istiyoruz, ancak bu para daha önce belirlenmediyse verilecek. Bu senaryoyu ele alalım.

Oyuncunun oyunu ilk kez başlattığında, PlayerPrefs’i kullanarak para miktarını kontrol edebiliriz. Eğer para miktarı daha önce belirlenmediyse, belirli bir varsayılan değeri atayabiliriz.

public float money;

private void Awake()
{
if (!PlayerPrefs.HasKey("MoneyValue"))
{
money = 100000;
PlayerPrefs.SetFloat("MoneyValue", 100000);
}
}

public void Start()
{
Earn money();
money = PlayerPrefs.GetFloat("MoneyValue");
}
private void Update()
{

PlayerPrefs.SetFloat("MoneyValue", money);
}

public void Earn money()
{
money += 10000;
}

PlayerPrefs’in HasKey yöntemi, belirli bir anahtarın var olup olmadığını kontrol etmemizi sağlar. Bu sayede, oyuncuların oyunu ilk kez başlattığında belirli bir başlangıç ​​durumuna sahip olmalarını sağlayabiliriz.

Bu kod parçası, oyunculara belirli bir başlangıç ​​miktarıyla para veren ve daha sonra oyuncunun kazandığı parayı saklayan basit bir para sistemini uygular.

İlk olarak, Awake fonksiyonunda, PlayerPrefs'te "MoneyValue" anahtarının olup olmadığını kontrol ederiz. Eğer bu anahtar daha önce belirlenmediyse, varsayılan olarak money değişkenine 100.000 birim para atarız ve bu değeri PlayerPrefs'e kaydederiz.

Sonrasında, Start fonksiyonunda, PlayerPrefs'ten "MoneyValue" anahtarına karşılık gelen değeri alarak money değişkenine atarız. Bu, oyuncunun oyunu yeniden başlattığında veya devam ettirdiğinde son kaydedilmiş para miktarını almasını sağlar.

Her güncellemede, Update fonksiyonunda, oyuncunun kazandığı parayı sürekli olarak PlayerPrefs'e kaydederiz. Böylece, oyuncu herhangi bir değişiklik yapmadan oyunu kapattığında veya yeniden başlattığında, son kazandığı para miktarını hatırlar.

EarnMoney fonksiyonu, oyuncunun para kazandığı bir eylemi temsil eder. Bu örnekte, her çağrıldığında oyuncuya 10.000 birim para ekler.

Oyunumuzda, para kazanma işlevselliğini başlangıçta Start fonksiyonu içinde çağırdık ve bu sayede sistemimiz sorunsuz bir şekilde çalışıyor. Ancak, oyun senaryomuza göre, para kazanma eylemi belirli bir olay gerçekleştiğinde gerçekleşmeli ve paramız artmalıdır.

Örneğin, bir görevin tamamlanması, bir düşmanın yenilmesi veya belirli bir eylemin gerçekleşmesi gibi olaylar, para kazanma eylemini tetikleyebilir. Bu durumu ele almak için, EarnMoney fonksiyonunu bu olaylar gerçekleştiğinde çağırabiliriz. Böylece, oyuncular belirli bir eylemi başarıyla gerçekleştirdiklerinde para kazanacaklar.

Bu şekilde, oyunun akışına uygun bir şekilde para kazanma işlevselliğini entegre etmiş oluruz. Oyuncular, oyun içinde ilerledikçe ve belirli görevleri tamamladıkça para kazanacaklar, bu da oyun deneyimini daha keyifli hale getirecektir.

Son olarak bazı konularada değinmem lazım. PlayerPrefs, basit veri depolama senaryoları için oldukça kullanışlıdır, ancak daha karmaşık senaryolar için alternatif depolama çözümleri de mevcuttur. Örneğin, SQLite veritabanı veya JSON dosyaları gibi. Bu alternatifler, daha karmaşık veri yapılarını depolamak ve yönetmek için daha uygun olabilir.

SQLite veritabanı, ilişkisel bir veritabanı yönetim sistemidir ve genellikle daha büyük veri setlerini depolamak ve karmaşık sorgular yapmak için kullanılır. Özellikle büyük oyunlarda veya uygulamalarda, veri tabanı kullanmak daha iyi bir performans ve veri yönetimi sağlayabilir. Ancak, SQLite kullanırken daha fazla kod yazma ve veritabanı yönetimi gerekebilir.

JSON dosyaları ise, verileri insan tarafından okunabilir bir formatta saklamak için kullanılan hafif ve popüler bir veri formatıdır. Özellikle yapılandırma dosyaları veya oyun içeriği gibi metin tabanlı verileri saklamak için idealdir. JSON dosyaları, Unity’de kolayca okunabilir ve yazılabilir, ve PlayerPrefs’e kıyasla daha esnek bir veri yapılarına izin verir.

Bu alternatif depolama çözümleri, PlayerPrefs’in yeteneklerini genişletmek ve daha karmaşık veri depolama ihtiyaçlarını karşılamak için kullanılabilir. Ancak, bu çözümler genellikle daha fazla kod yazma ve daha fazla teknik bilgi gerektirebilir.

İleri seviye hafızada tutma yöntemleri ve bu alternatif depolama çözümleri hakkında daha fazla ayrıntıyı ileriki yazılarımızda ele alacağız.

--

--