JsonUtility将结构序列化为JSON Unity

时间:2019-10-30 00:50:20

标签: c# unity3d

在使用Unity的JasonUtility序列化结构时,我遇到了一些问题。我读到它可以序列化它们,但似乎没有这样做。

这是我的结构:

using System;
using UnityEngine;
// Classes Array
// Index:
// 0 Level,         1 Strength,     2 Endurance,    3 Intellect
// 4 Resistence,    5 Dexterity,    6 Evasion,      7 Haste
[Serializable]
public struct AllClasses
{
                            // Default Values
    public int[] Adventuer { get; set; } // { 1, 1, 1, 1, 1, 1, 1, 1 }
    public int[] Warrior { get; set; }   // { 0, 3, 1, 0, 0, 2, 0, 0 }
    public int[] Guardian { get; set; }  // { 0, 0, 3, 0, 2, 0, 1, 0 }
    public int[] Archer { get; set; }    // { 0, 2, 0, 0, 0, 3, 0, 1 }
    public int[] Rogue { get; set; }     // { 0, 1, 0, 0, 0, 0, 2, 3 }
    public int[] Cleric { get; set; }    // { 0, 0, 2, 1, 3, 0, 0, 0 }
    public int[] Wizard { get; set; }    // { 0, 0, 0, 3, 1, 0, 0, 2 }
    public int[] Tactician { get; set; } // { 0, 0, 0, 0, 2, 1, 3, 0 }

    public AllClasses(int[,] data)
    {
        // I correctly assign them here, consoling them shows correct values
        // removed this block for readability
    }    
}

当我使用unity实用程序将其序列化为json时,它使我的数据结构产生一个空数组。

我将它们存储在玩家的偏好中,我认为这可能是造成这种情况的原因。但是,即使只是在实际保存之前将其记录为空。我已经尝试了几天了。我试图只使用2D数组,但完全忽略了它。我去了结构,似乎有些工作。它在我的播放器类中正确声明。只是它的序列化。

编辑:忘记了我实际执行此操作的地方

   public static void CreateCharacter (Player player)
    {
        Text txtResults = GameObject.Find("CharacterCreationResultsText").GetComponent<Text>();
        Debug.Log(player.name);
        PlayerData playerData = new PlayerData(player);
        Debug.Log(playerData.id);
        Saves data = CharacterList();
        // Checks if a character already exists
        if (CheckSumCharacter(playerData, data))
            return;
        // Adds in the character to the list, and saves it.
        data.saves.Add(playerData);
        Debug.Log(JsonUtility.ToJson(data));
        ZPlayerPrefs.SetString("characters", JsonUtility.ToJson(data));
        ZPlayerPrefs.Save();
        txtResults.color = Color.green;
        txtResults.text = "Character Creation Successful!";
        MainMenu.AddCharacter(player.id);
    }

1 个答案:

答案 0 :(得分:1)

我相信您的问题之所以出现,是因为所有整数数组都被声明为属性。从我的测试看来,属性不会被序列化。要进行序列化,应将数据声明为带有[SerializedField]属性标记的公共字段或私有字段。

我做了一点测试来验证:

SELECT count(u_id) AS 'Count', MONTH(reg_date) AS Month
from user
WHERE(reg_date) BETWEEN '2019-01-01' AND '2019-12-31'
GROUP BY YEAR(reg_date), MONTH(reg_date);

在控制台中,fieldArray和propertyArray2(私有字段)都已序列化,而data.PropertyArray根本未序列化。由于未序列化,因此如果从json加载该结构,它将被初始化为其默认值(null)。

我希望这可以帮助您解决问题。