Odak modu
Bu eğitimde, uygulamanın oturumları arasında kalıcı olması için kullanıcının seçtiği rengi kaydetmek ve yüklemek için kod yazacaksınız. Bu eğitimin sonunda şunları yapabileceksiniz:
Şu anda, Unity Editör'de devam eden çalışmayı test ederken, depodaki forkliftler için seçtiğiniz renk, uygulamayı bir sonraki açışınız için kaydedilmeyecek. Bu uygulamanın bir derlemesini oluşturursanız, kullanıcı uygulamayı her çalıştırdığında bu birbirinden bağımsız bir deneyim olacaktır.
Kullanıcının uygulamayı başlattığında otomatik olarak seçilmesi için son seçilen rengi kaydetmesi yararlı olacaktır. Bu öğreticide, sahneler arasında ve oturumlar arasında veri kalıcılığı uygulamak için önceki çalışmanızı geliştireceksiniz.
Projenizde şöyle görünebilir:
İpucu: Bu eğitim ile önceki eğitim arasında bir ara verdiyseniz, devam etmeden önce veri kalıcılığına giriş bölümünü gözden geçirmeniz yararlı olabilir.
Bu derste, kullanıcı tarafından seçilen rengi bir dosyaya yazacaksınız. Ardından, uygulama başladığında bu dosyanın var olup olmadığını kontrol etmek için MainManager'ı yapılandıracaksınız. Dosya varsa, MainManager dosyada saklanan rengi okuyacak ve renk seçiciyi o renge ayarlayacaktır.
Başlamadan önce, proje özetini gözden geçirmek için birkaç dakikanızı ayırın. Bu görevi kendi başınıza yapacağınızı hayal edin. Aşağıdaki soruların cevaplarını yazın:
Bir göreve başlamadan önce zaten bildiklerinizi düşünmek için birkaç dakika ayırmak çok yararlı bir alıştırmadır, özellikle de bu görev size zor geliyorsa. Unity Essentials'ı tamamladıysanız, içerik oluşturucuların Unity'yi öğrenirkenki düşünce yapılarını keşfettiniz.
Elinizin altındaki araçları belirlemek ve önceki öğreniminizi gözden geçirmek, kısa bir toplantı için farklı yaklaşımlar üzerinde düşünmek için gerçekten yararlı fırsatlar sağlayabilir. Bu yolun çok ötesinde öğrenme yolculuğunuza devam ederken bu yaklaşımı benimseyebilirsiniz - bir şeyi yapmanın tek bir yolu olması nadirdir!
Verilerin oturumlar arasında kalıcı olması için bir şekilde saklanması gerekir. Sizin durumunuzda, kullanıcınızın seçtiği rengi, depolanabilecek bir biçime dönüştürmeniz ve ardından uygulamayı tekrar yüklediğinde okuyabilmeniz gerekir.
Karmaşık verileri saklanabilecekleri bir biçime dönüştürme işlemine serializasyon denir. Verilere tekrar erişmeye hazır olduğunuzda, onu geri dönüştürme işlemine deserializasyon denir.
Açıklama: Akış diyagramı serileştirme sürecini gösterir: baytlara dönüştürülen ve ardından depolanan bir nesne; seri kaldırma işlemi bunu tersine gösterir.
Verilerin ne olduğuna ve onunla ne yapmak istediğinize bağlı olarak, verileri depolamak için kullanabileceğiniz farklı biçimler vardır. Bu durumda JSON formatını kullanacaksınız.
JSON, verileri depolamak ve platformlar arasında değiş tokuş etmek için kullanılan bir metin biçimidir. İlk olarak web için geliştirilmiştir ve tam adı JavaScript Object Notation'dır. JavaScript'i temel alır, ancak dilden bağımsızdır - ister C# kodu yazıyor, ister başka bir programlama dili kullanıyor olun, onu kullanabilirsiniz.
JSON biçimi, verileri bir anahtar:değer çifti biçiminde depolar. Anahtar bir dizedir ve değer şöyle olabilir:
Bu biçim nasıl çalışır?
Aşağıdaki JSON dizesi, bir kişi hakkında temel bilgileri depolayan bir nesneyi kodlar:
{
"name": "John",
"age": 27,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York"
}
"pet": [“dog”, “cat”]
}
Örneği inceleyelim:
JSON, çok farklı sistemler arasında veri alışverişi yapmak için geliştirildi, bu da onu uygulamanızda veri kaydetmeye uygun hale getiriyor. Unity, JsonUtility adlı bir yardımcı sınıfa sahiptir ve bu, serileştirilebilir bir sınıf almanıza ve onu JSON temsiline dönüştürmenize olanak tanır. Bunun verileri hem seri hale getirmek hem de seri durumdan çıkarmak için nasıl çalıştığını görelim.
Verileri Serialize Etme
Aşağıdaki PlayerData sınıfını göz önünde bulundurun:
[Serializable]
public class PlayerData
{
public int level;
public Vector3 position;
public string playerName;
}
Bu sınıfı aşağıdaki değerlerle JsonUtility'ye geçirmek istediğinizi düşünün:
PlayerData myData = new PlayerData();
myData.level = 1;
myData.position = new Vector3(3.0f, 4.4f, 2.3f);
myData.playerName = "John";
json = JsonUtility.ToJson(myData); aşağıdaki JSON dizesiyle sonuçlanacaktır:
{
“level”: 1,
“position”: {
“x” : 3.0,
“y” : 4.4,
“z” : 2.3 },
“playerName”: “John”
}
Konum bir vektör 3 olduğundan, üç anahtarla yeni bir JSON nesnesi olarak kodlandığını unutmayın: x, y ve z. Bunun nedeni, Vector3 sınıfının (son derece basitleştirilmiş):
[Serializable]
public class Vector3
{
public float x;
public float y;
public float z;
}
Verilerin Deserialize Edilmesi
JsonUtility'nin ayrıca az önce gördüğünüz işlemin tersini yapan bir yöntemi vardır: FromJson<T>.
Bu yöntem, bazı JSON verilerini içeren bir dize alır ve alanları doldurulmuş olarak nesnenin bir örneğini oluşturur. Bir şablon argümanı kullanır — PlayerData JSON dizesini incelerken fark etmiş olabileceğiniz gibi, JSON dosyasında bu verilerin orijinal türü saklanmaz. Unity, doğru alandaki doğru değeri okumak için şablon argümanına ihtiyaç duyar.
Örneğimizi genişletmek için PlayerData myData = JsonUtility.FromJson<PlayerData>(json); myData'yı JSON dizesindeki değerlerle dolduracaktır.
JsonUtility'nin Sınırlamaları
Unity'nin performans ve basitlik için tasarlanmış JsonUtility sınıfında bazı sınırlamalar vardır. JsonUtility, ilkel türler, diziler, listeler veya sözlükler üzerinde çalışmaz.
Tahmin edebileceğiniz gibi, JsonUtility yalnızca Serileştirilebilir tür - MonoBehaviour veya üzerine [Serializable] özniteliğini ekleyebileceğiniz yazdığınız diğer sınıflar/yapılar üzerinde çalışır. Birden fazla veri parçası içeren bir sınıfı kaydetmeye çalışırsanız ve bunlardan biri kaydedilmezse, bunun nedeni muhtemelen seri hale getirilebilir olmamasıdır. Örneğin, ortasında dictionary bulunan bir sınıfı JSON'a dönüştürürseniz, seri hale getirilemediği için dictionary kaydedilmez.Bir sınıfta düzgün bir şekilde kaydedilmeyen bir şey varsa, bunun serileştirilebilir bir tür olduğundan emin olun!
Daha fazla bilgi için JSON Serileştirme ile ilgili Unity belgelerine bakın.
Veri kaydetmeyle İlgili Sorunları Giderme
Tahmin edebileceğiniz gibi, JsonUtility yalnızca Serileştirilebilir tür - MonoBehaviour veya üzerine [Serializable] özniteliğini ekleyebileceğiniz yazdığınız diğer sınıflar/yapılar üzerinde çalışır.
Birden fazla veri parçası içeren bir sınıfı kaydetmeye çalışırsanız ve bunlardan biri kaydedilmezse, bunun nedeni muhtemelen seri hale getirilebilir olmamasıdır. Örneğin, çok fazla veri ve ortasında bir sözlük bulunan bir sınıfı JSON'a dönüştürdüğünüzü hayal edin. Bu sözlük kaydedilmeyecek çünkü seri hale getirilemez. Bir sınıfta düzgün bir şekilde kaydedilmeyen bir şey varsa, bunun serileştirilebilir bir tür olduğundan emin olun!
Kullanıcının son seçtiği rengi kaydetmek ve yüklemek için MainManager sınıfında üç şeye ihtiyacınız olacak:
SaveData sınıfıyla başlayalım:
[System.Serializable]
class SaveData
{
public Color TeamColor;
}
Yeni kodu inceleyin
SaveData, yalnızca kullanıcının seçtiği rengi içeren basit bir sınıftır. Üstüne bir [System.Serializable] özniteliği eklediğinizi unutmayın. Bu satır, az önce öğrendiğiniz gibi JsonUtility için gereklidir - yalnızca Serileştirilebilir olarak etiketlenmişlerse işleri JSON'a dönüştürür.
Neden bir sınıf oluşturuyorsunuz ve MainManager örneğini doğrudan JsonUtility'ye vermiyorsunuz? Eh, çoğu zaman derslerinizdeki her şeyi kaydetmezsiniz. Yalnızca kaydetmek istediğiniz belirli verileri içeren küçük bir sınıf kullanmak iyi bir uygulamadır ve daha verimlidir.
Ardından SaveColor yöntemini ekleyelim:
public void SaveColor()
{
SaveData data = new SaveData();
data.TeamColor = TeamColor;
string json = JsonUtility.ToJson(data);
File.WriteAllText(Application.persistentDataPath + "/savefile.json", json);
}
using System.IO;
Yeni Kodu İnceleyin
Bu yeni metodu sırayla inceleyelim. İlk olarak, kaydetme verilerinin yeni bir örneğini oluşturdunuz ve ekip renk sınıfı üyesini MainManager'da kaydedilen TeamColor değişkeniyle doldurdunuz:
SaveData data = new SaveData();
data.TeamColor = TeamColor;
Ardından, bu örneği JsonUtility.ToJson ile JSON'a dönüştürdünüz:
string json = JsonUtility.ToJson(data);
Son olarak, bir dosyaya bir dize yazmak için File.WriteAllText özel metodunu kullandınız:
File.WriteAllText(Application.persistentDataPath + "/savefile.json", json);
İlk parametre dosyanın yoludur. Application.persistentDataPath adında, uygulamanın yeniden yüklenmesi veya güncellenmesi arasında hayatta kalacak verileri kaydedebileceğiniz ve buna savefile.json dosya adını ekleyebileceğiniz bir klasör verecek olan bir Unity yöntemi kullandınız.
Note: Unity Komut Dosyası API'si, platform başına gerçek yolları listeler.
İkinci parametre, o dosyaya yazmak istediğiniz metindir - bu durumda JSON'unuz!
Şimdi LoadColor metodunu ekleyelim:
public void LoadColor()
{
string path = Application.persistentDataPath + "/savefile.json";
if (File.Exists(path))
{
string json = File.ReadAllText(path);
SaveData data = JsonUtility.FromJson<SaveData>(json);
TeamColor = data.TeamColor;
}
}
Yeni Kodu İnceleyin
Bu metod, SaveColor metodunun tersidir:
string path = Application.persistentDataPath + "/savefile.json";
Bir .json dosyasının olup olmadığını kontrol etmek için File.Exists yöntemini kullanır. Olmazsa, hiçbir şey kaydedilmemiştir, bu nedenle başka bir işlem yapılması gerekmez. Dosya varsa, yöntem içeriğini File.ReadAllText ile okuyacaktır:
if (File.Exists(path))
{
string json = File.ReadAllText(path);
Daha sonra elde edilen metni tekrar SaveData örneğine dönüştürmek için JsonUtility.FromJson'a verir:
SaveData data = JsonUtility.FromJson<SaveData>(json);
Son olarak, TeamColor'ı o SaveData'da kaydedilen renge ayarlayacaktır:
TeamColor = data.TeamColor;
Yeni Kodunuzu İki Kez Kontrol Edin
Devam etmeden önce, MainManager sınıfı kapsamında olduğundan emin olmak için eklediğiniz kodu iki kez kontrol edin:
[System.Serializable]
class SaveData
{
public Color TeamColor;
}
public void SaveColor()
{
SaveData data = new SaveData();
data.TeamColor = TeamColor;
string json = JsonUtility.ToJson(data);
File.WriteAllText(Application.persistentDataPath + "/savefile.json", json);
}
public void LoadColor()
{
string path = Application.persistentDataPath + "/savefile.json";
if (File.Exists(path))
{
string json = File.ReadAllText(path);
SaveData data = JsonUtility.FromJson<SaveData>(json);
TeamColor = data.TeamColor;
}
}
Neredeyse bitirdiniz, ancak önce uygulama başladığında kaydedilen rengi (varsa) yüklemeniz ve çıkışta rengi kaydetmeniz gerekir. Şimdi bunu uygulayalım:
LoadColor();
ColorPicker.SelectColor(MainManager.Instance.TeamColor);
Bu satır, menü ekranı başlatıldığında MainManager'da (varsa) kaydedilen rengi önceden seçecektir.
MainManager.Instance.SaveColor();
Bu satır, uygulamadan çıktığında kullanıcının en son seçtiği rengi kaydeder.
Son olarak, uygulamadan rengi anında kaydedip yükleyebilmeniz için MenuUIHandler'a bazı hızlı test işlevleri ekleyelim:
public void SaveColorClicked()
{
MainManager.Instance.SaveColor();
}
public void LoadColorClicked()
{
MainManager.Instance.LoadColor();
ColorPicker.SelectColor(MainManager.Instance.TeamColor);
}
Editörde Test Edin
Standart çıkışta kaydetme ve başlatmada yükleme dahil olmak üzere uygulamadaki değişikliklerinizi kapsamlı bir şekilde test edin.
Bu eğitimde, uygulamanızdaki oturumlar arasında veri kalıcılığı uyguladınız, böylece kullanıcı tarafından seçilen son renk, uygulamayı yeniden yüklediğinde önceden seçilmiş olur. Harika şeyler! Ardından, yeni bir Unity projesinde temel bir oyun özetini karşılamak için öğrendiklerinizi uygulayarak bir gönderi hazırlayacaksınız.
Yazılım Kariyerinde İlerlemeni Hızlandıracak Programlar
Patika+ programlarımız ile 4-8 aylık yoğun yazılım kamplarına katıl, temel bilgilerden başlayarak kapsamlı bilgiler edin, yazılım kariyerine başla!
Yorum yapabilmek için derse kayıt olmalısın!