Verileri okumak ve yazmak için PlayerPrefs'i kullanma

Sayfa güncel :
Sayfa oluşturma tarihi :

Doğrulama ortamı

Windows
  • Pencereler 11
Birlik Editörü
  • 2021.3.3f1
Giriş Sistemi Paketi
  • 1.3.0

Bu ipucu için önkoşullar

Aşağıdaki ayarlar, bu ipucunun açıklaması için bir öncül olarak önceden yapılmıştır.

İlk başta

Eğer oyun oynadıysanız, çoğunuz bunu deneyimlemişsinizdir. Muhtemelen bir oyunu duraklatmışsınızdır ve ayrılmak için oyun verilerinizi kaydetmiş veya yüklemişsinizdir.

Bir oyun oluştururken, genellikle bu kaydetme ve yükleme işlevini oluşturmanız, seçenekleri ayarlamanız vb. Gerekir. Burada, verileri depolamanın ve yüklemenin en PlayerPrefs basit yolunu kullanarak bunu başarmaya çalışacağız.

Kullanıcı Arabirimi Yerleşimi

Burada, giriş öğelerini ve düğmelerini yerleştirerek ve düğmeyi tıklatarak giriş içeriğini kaydetmeye veya okumaya çalışacağız. Şimdilik, yalnızca en az iki düğmeye ve bir giriş alanına ihtiyacınız var, bu yüzden bunları yerleştirmekten çekinmeyin.

UI İşleme için Hazırlanma

İlk olarak, kaydet düğmesini uygulayalım. Bir düğme olayının nasıl oluşturulacağı aşağıdaki ipuçlarında tanıtılmıştır, bu nedenle yalnızca ilgili kısımları listeleyeceğim.

Komut dosyası adını ButtonEvent olarak bırakın.

Komut dosyası şöyle görünür:

using UnityEngine;
using UnityEngine.UI;

public class ButtonEvent : MonoBehaviour
{
  /// <summary>名前入力フィールド。</summary>
  [SerializeField] InputField InputFieldName;

  /// <summary>HP 入力フィールド。</summary>
  [SerializeField] InputField InputFieldHP;

  /// <summary>攻撃力入力フィールド。</summary>
  [SerializeField] InputField InputFieldAttack;

  /// <summary>お金入力フィールド。</summary>
  [SerializeField] InputField InputFieldMoney;

  /// <summary>
  /// 保存ボタンをクリックしたときの処理。
  /// </summary>
  public void OnClickSave()
  {
  }

  /// <summary>
  /// 読み込みボタンをクリックしたときの処理。
  /// </summary>
  public void OnClickLoad()
  {
  }
}

Girilen değeri almak veya ayarlamak gerektiğinden, bunu bir alan olarak hazırlayın. Ayrıca, her düğmeyi tıklattığınızda çağrılacak yöntemi de ekleyin.

Komut dosyanızı ekleyin EventSystem ve her giriş alanını ayarlayın. Eklemek istediğiniz herhangi bir nesne olabilir.

Düğme tıklatıldığında çağrılacak her yöntemi ayarlayın.

Değeri kaydedin

Artık kaydet düğmesi tıklatıldığında OnClickSave yöntem çağrıldığına göre, kaydet düğmesinin işlemi aşağıdaki gibidir.

/// <summary>
/// 保存ボタンをクリックしたときの処理。
/// </summary>
public void OnClickSave()
{
  // 各値を指定したキーに保存します
  PlayerPrefs.SetString("Name", InputFieldName.text);
  PlayerPrefs.SetString("HP", InputFieldHP.text);
  PlayerPrefs.SetString("Attack", InputFieldAttack.text);
  PlayerPrefs.SetString("Money", InputFieldMoney.text);

  // 設定したデータを確定して保存します
  PlayerPrefs.Save();
}

PlayerPrefs.SetString Yöntem bir anahtara ve kaydedilecek bir değere ayarlanır. Anahtar, kaydedilen veriler yüklenirken belirtilir. SetString Burada yöntemi çağırıyoruz çünkü depolanacak değer bir dizedir. int float ve gibi başka bir türdeki bir değeri kaydetmek istiyorsanız SetInt , ve SetFloat gibi yöntemler vardır, bu nedenle bunları türe göre çağırın.

PlayerPrefs.Save Son olarak, kaydetmeyi onaylamak için yöntemi çağırın. Aslında, bu yöntemi çağırmasanız bile kaydedilebilir, ancak çağırmak daha güvenlidir.

Ancak, oyunu bu noktada çalıştırsanız bile, yalnızca değeri kaydeder, böylece düzgün bir şekilde kaydedilip kaydedilmediğini bilemezsiniz. Kaydedilen konumu kontrol ederseniz, verileri görebilirsiniz, ancak ...

Kaydedilen bir değer elde edin

Ardından, kaydedilen verileri yükleme işlemini uygulayın. Düğmenin işlenmesi kaydetme işlemiyle aynıdır, bu nedenle burada yalnızca yükleme işleminin kodu açıklanmaktadır.

/// <summary>
/// 読み込みボタンをクリックしたときの処理。
/// </summary>
public void OnClickLoad()
{
  // 指定したキーから値を読み込みます
  InputFieldName.text = PlayerPrefs.GetString("Name");
  InputFieldHP.text = PlayerPrefs.GetString("HP");
  InputFieldAttack.text = PlayerPrefs.GetString("Attack");
  InputFieldMoney.text = PlayerPrefs.GetString("Money");
}

Kaydedilen verileri yüklemek için PlayerPrefs.GetString bu yöntemi kullanın. Bağımsız değişken olarak kaydet'te belirtilen anahtarı belirterek bu anahtarla kaydedilen değeri alabilirsiniz. Değer, yöntemin dönüş değerinde alınır.

Bu aynı zamanda kaydederken olduğu gibi bir dize olarak kaydedilir, bu yüzden GetString yöntemi diyoruz. int float veya ile kaydediyorsanızGetIntGetFloat, yöntemi çağırın.

Alınan değer giriş alanına yansıtılır.

Artık verileri kaydedebilir ve yükleyebilirsiniz. Zor unsurlar olduğunu düşünmüyorum.

Taşımayı deneyin

Girmek, kaydetmek ve yüklemek için çalıştırın. Kaydedilen veriler kalıcıdır ve oyundan çıkıp oyunu yeniden çalıştırsanız bile yüklenebilmelidir. Aşağıdaki kalıbı doğrulayabilirseniz, sorun olmadığını düşünüyorum.

  1. Bir değer girin
  2. Kaydet düğmesini tıklatın
  3. Girdiğiniz değeri değiştirme
  4. Kaydedilen değere geri döndüğünü onaylamak için içe aktar düğmesini tıklatın.
  5. Oyundan çıkın
  6. Oyunu yeniden çalıştırın ve kaydedilen değeri hatırlayıp hatırlayamayacağınızı görmek için yükle düğmesine tıklayın
  7. Farklı bir değer girin, kaydedin ve güncellenmiş değerle aynı şeyi okuyup okuyamayacağınızı kontrol edin

Bir veri yığınını kaydetme ve yükleme

Örnekte şu ana kadar yalnızca birkaç parametre kaydedilmiştir. Aslında bir oyun yaptıkça, kaydedilecek parametrelerin sayısı istikrarlı bir şekilde artacak ve bunları tek tek okuyup yazarsanız, kod çok büyük olacaktır. Bu nedenle, gerçekten kaydedilecek verileri oluştururken, teori kaydedilecek verileri bir araya getirmek ve ardından hepsini bir kerede yazmaktır.

İlk olarak, sınıf olarak bir kaydetme veri yapısı oluşturun. Amaç, verileri bir kerede okuyabilmek ve yazabilmek, aynı zamanda kodun her bir veri parçasına erişmesini kolaylaştırmak için verileri sınıflandırmaktır.

Aşağıda, oyun kaydetme sınıflarına örnekler verilmiştir: Başka bir koddan referans alınabileceği herhangi bir yere yazılabilir. Bu sınıf yapısı bir örnektir, bu nedenle gerçek bir oyunda oyununuz için oluşturmanız gerekir.

/// <summary>セーブデータクラス。</summary>
public class SaveData
{
  public List<Character> Characters;
  public long Money;
}

/// <summary>1キャラクターの情報。</summary>
[Serializable]
public class Character
{
  public string Name;
  public int HP;
  public int Attack;
}

List Bu kez kullanılan Unity standart işlevinde, dizileri tanımlarsanız veya birden çok benzersiz sınıfa sahipseniz, System.Serializable Bir öznitelik eklemezseniz, doğru şekilde dönüştürülmez, bu yüzden Character özniteliği sınıfa Serializable ayarladım.

Sınıfı oluşturduktan sonra, kaydedilecek verileri oluşturun. Tabii ki, oyun boyunca bu sınıfın örneklerine sahip olabilirsiniz. Bu, oyunun nasıl yapıldığına bağlıdır.

// 保存するデータ作成
var saveData = new SaveData
{
  Money = 10000,
  Characters = new List<Character>
  {
    new Character { Name= "レイシア", HP = 50, Attack = 40, },
    new Character { Name= "アイリ", HP = 56, Attack = 27, },
    new Character { Name= "ニール", HP = 72, Attack = 36, },
    new Character { Name= "トリー", HP = 61, Attack = 30, },
  },
};

Sınıfın örneğindeki verileri ayarladıktan JsonUtility.ToJson sonra, yöntemle bir JSON dizesine dönüştürün (serileştirin). Nesnenin değeri, veri yapısına sahip JSON adlı tek bir "dize" olduğundan, tümPlayerPrefs.SetString veriler yönteme tek bir çağrı ile yazılabilir.

// オブジェクトを JSON 文字列に変換します
var saveJson = JsonUtility.ToJson(saveData);

// データを保存します
PlayerPrefs.SetString("SaveData", saveJson);
PlayerPrefs.Save();

Ancak, tüm veriler bir arada toplandığından, yalnızca bir kısmını kaydetmek veya yalnızca bir kısmını okumak mümkün değildir. Bu nedenle, bir kaydetme verisi için tek bir nesne olarak birleştirmek gibi özetlenmesi kolay bir birim haline getirilmesi tercih edilir.

Kaydedilen verileri okurken, kaydederken ters işlemi yapabilirsiniz. Okunacak veriler tek bir dizedir, ancak içerikler JSON biçimli veri yapılarıdır, bu nedenle JsonUtility.FromJson yöntemlerle sınıf örneklerine dönüştürülebilir (seri durumdan çıkarılabilir). Ancak, dizede hangi sınıfa dönüştürüleceği bilgisine sahip olmadığımız FromJson için, yöntemi çağırırken türü belirtmeliyiz.

// データを読み込みます
var loadJson = PlayerPrefs.GetString("SaveData");

// JSON 文字列からオブジェクトにデシリアライズします
var newData = JsonUtility.FromJson<SaveData>(loadJson);

Taşımaya çalışırsanız, doğru şekilde kaydedildiğini ve yüklenebileceğini görebilirsiniz.

Bu arada, bu sefer Unity standart JsonUtility sınıflarını kullanıyoruz, ancak çok işlevsel olmadıkları için karmaşık veri yapılarına sahip sınıfları dönüştüremeyebilirler. Bu durumda, diğer kütüphanelerin kullanılması önerilir.

Veriler nerede depolanır?

PlayerPrefs Verileri depolamak için bir sınıf kullandığınızda, kaydedildiği konum üzerinde çalıştığınız platforma bağlıdır. Gerçekte nerede saklandığını öğrenmek için lütfen aşağıdaki resmi sayfaya bakın.

Windows gibi bazı ortamlarda, bunlar bir dosyada değil, kayıt defteri gibi sistem ayarlarında depolanır. Bir dosya olmadığından, kaydedilen verileri kaydetmek için uygun değildir, örneğin, kaydetme verileri çok büyükse veya PlayerPrefs kaydetme verilerini başka bir ortamla eşitlemek istiyorsanız. Tersine, kaydedilecek veri seçenek seviyesinin boyutuysa veya yalnızca çalıştığı ortamda tamamlanan bağımsız bir oyunsa, PlayerPrefs verileri .

Ayrıca, kaydedilen konumun yolu "CompanyName" ve "ProductName" ayarlarından etkilenebilir. Oyununuzu yayınlamak istiyorsanız, bu değerlere önceden karar vermeniz ve oyununuzu yayınladıktan sonra bunları değiştirmemeniz gerekir.

Veri şifreleme hakkında

Depolanan veriler otomatik olarak şifrelenmez. Oyuncunun yetenekleri olduğu gibi kaydedilirse, kullanıcı oyunu etkileyecek değerleri özgürce yeniden yazacaktır.

Şifrelemeniz gerekiyor mu ve eğer öyleyse, hangi güç seviyesi gereklidir ve şifreleme anahtarını nasıl ele alırsınız? Göz önünde bulundurulması gerekenler oyundan oyuna değişir.

Burada şifreleme yöntemini açıklamayacağım ama internette bakarsanız önemli bir dil ve araç, bu yüzden çeşitli yöntemler olduğunu düşünüyorum. Şimdilik, dosyayı açsanız bile saklanan içeriklerin anlamını anlamazsanız ve verileri kötü bir şekilde kurcalarsanız, kaydetme verilerini kullanamazsınız, bazı dolandırıcılık karşıtı etkiler olacağını düşünüyorum.