طريقة مدمجة للعمل مع JSON في Unity Code

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 وإلغاء التسلسل مباشرة بدون مكتبات خارجية. استخدم هذا الأسلوب الأصلي لعمليات JSON المباشرة في مشاريع Unity.

المقالات المقترحة
التعامل مع الاستثناءات ومعالجة الأخطاء في رمز الوحدة
العمل مع السلاسل ومعالجة البيانات النصية في الوحدة
إنشاء GrabPack في Unity مستوحى من Poppy Playtime
إنشاء تأثير وقت الرصاصة في الوحدة
استخدام وحدة تحكم Runtime Animator في Unity
إنشاء لعبة ألغاز في Unity
تنفيذ النقل الآني في الوحدة