Unity Code'da JSON ile Dahili Çalışma Şekli
JSON (JavaScript Object Notation), yaygın olarak kullanılan bir veri değişim formatıdır ve onu Unity'e entegre etmek, yapılandırmaları yönetmek, oyun ilerlemesini kaydetmek veya harici hizmetlerle veri alışverişi yapmak için güçlü olabilir. Bu kılavuz, Unity'de JSON ile çalışmanın temelleri konusunda size yol gösterir.
1. Adım: JSON'u Anlamak
JSON, anahtar-değer çiftlerinden ve iç içe geçmiş yapılardan oluşur.
Adım 2: Unity Kodunda JSON ile Çalışmak
Unity 'JsonUtility' sınıfı aracılığıyla JSON serileştirmesini ve seri durumdan çıkarma işlemini basitleştirir. Bu kılavuz, harici kütüphaneler olmadan Unity'de JSON ile çalışmanın temel adımlarını gösterir.
- Bir JSON Yapısı oluşturun:
{
"playerName": "John Doe",
"playerLevel": 5,
"inventory": ["sword", "shield"]
}
- Serileştirme - C# Nesnesini JSON'a Dönüştürme:
using UnityEngine;
[System.Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
public string[] inventory;
}
public class SerializationExample : MonoBehaviour
{
void Start()
{
PlayerData playerData = new PlayerData
{
playerName = "John Doe",
playerLevel = 5,
inventory = new string[] { "sword", "shield" }
};
string json = JsonUtility.ToJson(playerData);
Debug.Log(json);
}
}
- Seri durumdan çıkarma - JSON'u C# Nesnesine Dönüştürme:
using UnityEngine;
[System.Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
public string[] inventory;
}
public class DeserializationExample : MonoBehaviour
{
void Start()
{
string jsonData = "{\"playerName\":\"John Doe\",\"playerLevel\":5,\"inventory\":[\"sword\",\"shield\"]}";
PlayerData playerData = JsonUtility.FromJson<PlayerData>(jsonData);
Debug.Log($"Name: {playerData.playerName}, Level: {playerData.playerLevel}");
Debug.Log("Inventory: " + string.Join(", ", playerData.inventory));
}
}
Bilinen Sınırlamalar
'JsonUtility' sarma sınıfı olmadan üst düzey nesne dizilerinin (örneğin, '[{},{},{}]') serileştirilmesini ve seri durumdan çıkarılmasını doğrudan desteklemez. Bu soruna geçici bir çözüm bulmak için diziyi saracak bir yardımcı sınıf kullanabilirsiniz. İşte bir örnek:
using UnityEngine;
[System.Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
}
[System.Serializable]
public class PlayerDataArrayWrapper
{
public PlayerData[] players;
}
public class TopLevelArrayExample : MonoBehaviour
{
void Start()
{
// Serialization: Converting C# Object Array to JSON
PlayerData[] players = new PlayerData[]
{
new PlayerData { playerName = "John Doe", playerLevel = 5 },
new PlayerData { playerName = "Jane Smith", playerLevel = 8 }
};
PlayerDataArrayWrapper wrapper = new PlayerDataArrayWrapper { players = players };
string json = JsonUtility.ToJson(wrapper);
Debug.Log(json);
// Deserialization: Converting JSON to C# Object Array
string jsonData = "{\"players\":[{\"playerName\":\"John Doe\",\"playerLevel\":5},{\"playerName\":\"Jane Smith\",\"playerLevel\":8}]}";
PlayerDataArrayWrapper deserializedData = JsonUtility.FromJson<PlayerDataArrayWrapper>(jsonData);
foreach (var player in deserializedData.players)
{
Debug.Log($"Name: {player.playerName}, Level: {player.playerLevel}");
}
}
}
Yukarıdaki örnekte 'PlayerDataArrayWrapper' sınıfı, serileştirme ve seri durumdan çıkarma sırasında diziyi sarmak için kullanılır. 'JsonUtility''deki üst düzey nesne dizileriyle uğraşırken bu tür sarmalayıcı sınıfları oluşturmak yaygın bir uygulamadır.
Çözüm
'JsonUtility' JSON serileştirmesini ve seri durumdan çıkarma işlemlerini harici kütüphaneler olmadan doğrudan basitleştirir. Unity projelerinde basit JSON işlemleri için bu yerel yaklaşımı kullanın.