דרך עבודה מובנית עם JSON בקוד Unity
JSON (JavaScript Object Notation) הוא פורמט של החלפת נתונים בשימוש נרחב, ושילובו ב-Unity יכול להיות רב עוצמה לטיפול בתצורות, שמירת התקדמות המשחק או החלפת נתונים עם שירותים חיצוניים. מדריך זה ידריך אותך דרך היסודות של עבודה עם JSON ב-Unity.
שלב 1: הבנת JSON
JSON מורכב מזוגות מפתח-ערך ומבנים מקוננים.
שלב 2: עבודה עם JSON בקוד Unity
Unity מפשט את הסדרת ה-JSON והסידריאליזציה באמצעות המחלקה 'JsonUtility' שלו. מדריך זה מדגים את השלבים הבסיסיים לעבודה עם JSON ב-Unity ללא ספריות חיצוניות.
- צור מבנה JSON:
{
"playerName": "John Doe",
"playerLevel": 5,
"inventory": ["sword", "shield"]
}
- סריאליזציה - המרת אובייקט C# ל-JSON:
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);
}
}
- דה-סריאליזציה - המרת JSON לאובייקט C#:
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));
}
}
מגבלות ידועות
'JsonUtility' אינו תומך באופן ישיר בסריאליזציה ובדה-סריאליזציה של מערכים ברמה העליונה של אובייקטים (למשל, '[{},{},{}]') ללא מחלקת גלישה. כדי לעקוף את זה, אתה יכול להשתמש בכיתה עוזרת כדי לעטוף את המערך. הנה דוגמה:
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}");
}
}
}
בדוגמה שלמעלה, המחלקה 'PlayerDataArrayWrapper' משמשת לעטוף את המערך בעת ביצוע סידורי וסידריאליזציה. זה נוהג נפוץ ליצור מחלקות עטיפה כאלה כאשר עוסקים במערכים ברמה העליונה של אובייקטים ב-'JsonUtility'.
סיכום
'JsonUtility' מפשט את הסדרת ה-JSON ו-deserialization ישירות ללא ספריות חיצוניות. השתמש בגישה מקורית זו עבור פעולות JSON פשוטות בפרויקטים Unity.