JsonUtility.FromJson 不能设置{ get; set; }

本文介绍如何在Unity中使用JsonUtility解析从API获取的JSON数据,并通过具体代码示例展示了如何将JSON数据映射到C#类中,解决在设置属性时遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  http://json2csharp.chahuo.com/ 根据json数据生成的类,如下;

/*
     *其JsonUtility.FromJson 不能设置{ get; set; },一直报空引用,需要设置实例对象异常,最后我把{ get; set; }删了就可以存进来了,我真的想······
     *public class Data {
        public string A  { get; set; }
        public string B  { get; set; }
        public string C  { get; set; }
        public string D  { get; set; }
    }

    public class RootObject {
        public List<Data> data { get; set; }
        public string total  { get; set; }
    }
     *
     */

[System.Serializable]
    public class Item
    {

        public string A;
        public string B;
        public string C;
        public string D;

    }

    // 接受 api 返回的 json 数据
    [System.Serializable]
    public class ItemData
    {

        public List<Item> data;
        public int total;

    }

    void Start()
    {
        if (!File.Exists(JsonPath()))
            {
                Debug.LogError("读取的文件不存在!");
                return;
            }
//            string jsonString = File.ReadAllText(Application.dataPath + "/Data/ItemJsonFromApi.json");
            string json = File.ReadAllText(JsonPath());
        ItemData itemDate = JsonUtility.FromJson<ItemData>(json);
        Debug.Log(itemDate.total);
        foreach (var item in itemDate.data)
        {
            Debug.Log(item.A);
        }
    }
    //保存json文件路径
    string JsonPath()
        {
            return Application.streamingAssetsPath + "/trouble.json";
        }

 

///////////json 数据

{
    "data": [
        {
            "A": "zhanXXXXXXXXXXXg",
            "B": "00000000zhangXXXXXXXX",
            "C": "gun1.png",
            "D":"DDDD"
        },
        {
            "A": 2,
            "B": "gun2",
            "C": "gun2.png",
            "D":"DDDD"
        },
        {
            "A": 3,
            "B": "gun3",
            "C": "gun1.png",
            "D":"DDDD"
        },
        {
            "A": 4,
            "B": "gun4",
            "C": "gun2.png",
            "D":"DDDD"
        }
    ],
    "total": 333
}

using UnityEngine; [System.Serializable] public class GameData { // 玩家位置数据 public Vector3 playerPosition; // 场景名称 public string currentScene; // 存档时间戳 public string saveTime; // 构造函数 public GameData() { playerPosition = Vector3.zero; currentScene = "MainMenu"; saveTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm"); } } using System.IO; using UnityEngine; public class SaveSystem : MonoBehaviour { public static SaveSystem Instance { get; private set; } public GameData currentData { get; private set; } private string savePath; private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); Initialize(); } else { Destroy(gameObject); } } private void Initialize() { savePath = Path.Combine(Application.persistentDataPath, "savedata.json"); LoadGame(); } // 保存游戏 public void SaveGame(Vector3 playerPosition) { currentData.playerPosition = playerPosition; currentData.currentScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name; currentData.saveTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm"); string jsonData = JsonUtility.ToJson(currentData); File.WriteAllText(savePath, jsonData); Debug.Log($"游戏已保存: {savePath}"); } // 加载游戏 public void LoadGame() { if (File.Exists(savePath)) { string jsonData = File.ReadAllText(savePath); currentData = JsonUtility.FromJson<GameData>(jsonData); } else { currentData = new GameData(); } } // 删除存档 public void DeleteSave() { if (File.Exists(savePath)) { File.Delete(savePath); currentData = new GameData(); } } // 检查存档是否存在 public bool SaveExists() { return File.Exists(savePath); } } 我现在需要增加储存当前的state有三个分别为before,win,lose
最新发布
08-08
using System.Collections.Generic; using UnityEngine; using TMPro; using System.Collections; using UnityEngine.UI; using UnityEngine.SceneManagement; using UnityEngine.EventSystems; public class DialogueManager : MonoBehaviour { public enum DialogueState { Before, Win, Lost } public static DialogueManager Instance; [Header("UI Elements")] public TextMeshProUGUI tmpText; public float typingSpeed = 0.05f; [Header("Dialogue Content")] public List<string> beforeBattleDialogues = new List<string>(); public List<string> winDialogues = new List<string>(); public List<string> lostDialogues = new List<string>(); [Header("场景布置")] public GameObject image; public GameObject image1; public GameObject image2; public TextMeshProUGUI text; [Header("按钮设置")] public Button startButton; public Button loseButton; public Button winButton; private bool isTyping = false; private Coroutine typingCoroutine; private string currentSentence; public DialogueState currentState = DialogueState.Before; private int currentDialogueIndex = 0; private List<string> currentDialogueList; void Start() { // 隐藏所有按钮 // 检查战斗结果 int result = PlayerPrefs.GetInt("LastBattleResult", -1); if (result == 1) { Debug.Log("战斗胜利 - 触发胜利对话"); SetDialogueState(DialogueState.Win); } else if (result == 0) { Debug.Log("战斗失败 - 触发失败对话"); SetDialogueState(DialogueState.Lost); } else { Debug.Log("首次进入 - 默认对话"); SetDialogueState(DialogueState.Before); } // 清除状态 PlayerPrefs.DeleteKey("LastBattleResult"); } void Awake() { if (Instance == null) { Instance = this; } else { Destroy(gameObject); } // 初始化当前对话列表 currentDialogueList = beforeBattleDialogues; // 设置按钮点击事件 startButton?.onClick.RemoveAllListeners(); loseButton?.onClick.RemoveAllListeners(); winButton?.onClick.RemoveAllListeners(); if (startButton != null) startButton.onClick.AddListener(OnStartClick); if (loseButton != null) loseButton.onClick.AddListener(OnLoseClick); if (winButton != null) winButton.onClick.AddListener(OnWinClick); } void Update() { // 添加跳过功能:按E键跳过当前打字效果 if (Input.GetKeyDown(KeyCode.E) && isTyping) { SkipTyping(); } // 按E键继续下一句对话 else if (Input.GetKeyDown(KeyCode.E) && !isTyping && tmpText.gameObject.activeSelf) { NextSentence(); } } // 隐藏所有按钮 // 设置当前对话状态 public void SetDialogueState(DialogueState newState) { currentState = newState; currentDialogueIndex = 0; switch (newState) { case DialogueState.Before: currentDialogueList = beforeBattleDialogues; break; case DialogueState.Win: currentDialogueList = winDialogues; break; case DialogueState.Lost: currentDialogueList = lostDialogues; break; } Debug.Log($"状态已切换至: {newState}"); } // 启动当前状态的对话 public void StartStateDialogue() { if (currentDialogueList == null || currentDialogueList.Count == 0) return; // 如果正在显示其他文本,先停止 if (isTyping) { StopCoroutine(typingCoroutine); } // 确保索引在有效范围内 currentDialogueIndex = Mathf.Clamp(currentDialogueIndex, 0, currentDialogueList.Count - 1); currentSentence = currentDialogueList[currentDialogueIndex]; // 暂停玩家移动 playercontrol player = FindObjectOfType<playercontrol>(); if (player != null) player.canMove = false; // 锁定玩家输入 Cursor.lockState = CursorLockMode.None; Cursor.visible = true; // 显示对话框UI tmpText.gameObject.SetActive(true); // 启动打字效果协程 typingCoroutine = StartCoroutine(TypeSentence(currentSentence)); } // 显示下一句对话 public void NextSentence() { currentDialogueIndex++; if (currentDialogueIndex < currentDialogueList.Count) { StartStateDialogue(); } else { // 对话结束 EndDialogue(); } } IEnumerator TypeSentence(string sentence) { isTyping = true; tmpText.text = ""; // 逐字显示 foreach (char letter in sentence.ToCharArray()) { tmpText.text += letter; yield return new WaitForSeconds(typingSpeed); } isTyping = false; } // 跳过当前打字效果 public void SkipTyping() { if (isTyping) { StopCoroutine(typingCoroutine); tmpText.text = currentSentence; isTyping = false; } } public void EndDialogue() { if (isTyping) { StopCoroutine(typingCoroutine); isTyping = false; } // 恢复玩家控制 playercontrol player = FindObjectOfType<playercontrol>(); if (player != null) player.canMove = true; // 隐藏对话框 tmpText.gameObject.SetActive(false); // 根据状态显示对应按钮 switch (currentState) { case DialogueState.Before: if (startButton != null) startButton.gameObject.SetActive(true); break; case DialogueState.Win: if (winButton != null) winButton.gameObject.SetActive(true); break; case DialogueState.Lost: if (loseButton != null) loseButton.gameObject.SetActive(true); break; } // 确保事件系统可用 EnsureEventSystemExists(); // 设置按钮为选中状态 if (currentState == DialogueState.Before && startButton != null) { EventSystem.current.SetSelectedGameObject(startButton.gameObject); } else if (currentState == DialogueState.Win && winButton != null) { EventSystem.current.SetSelectedGameObject(winButton.gameObject); } else if (currentState == DialogueState.Lost && loseButton != null) { EventSystem.current.SetSelectedGameObject(loseButton.gameObject); } } private void EnsureEventSystemExists() { EventSystem eventSystem = FindObjectOfType<EventSystem>(); if (eventSystem == null) { GameObject eventSystemObj = new GameObject("EventSystem"); eventSystem = eventSystemObj.AddComponent<EventSystem>(); eventSystemObj.AddComponent<StandaloneInputModule>(); } else if (eventSystem.GetComponent<StandaloneInputModule>() == null) { eventSystem.gameObject.AddComponent<StandaloneInputModule>(); } } private void OnMainMenuClick() { Debug.Log("主菜单按钮点击"); SceneManager.LoadScene("MainMenu"); } private void OnStartClick() { Debug.Log("开始作战"); SceneManager.LoadScene("Fight"); } private void OnLoseClick() { Debug.Log("失败按钮点击"); SceneManager.LoadScene("Fight"); } private void OnWinClick() { if (currentState != DialogueState.Win) { Debug.LogWarning("尝试在非胜利状态执行胜利逻辑"); return; } playercontrol player = FindObjectOfType<playercontrol>(); if (player != null) player.canMove = true; Debug.Log("执行胜利逻辑"); image.SetActive(false); image1.SetActive(false); image2.SetActive(false); text.gameObject.SetActive(false); tmpText.gameObject.SetActive(false); winButton.gameObject.SetActive(false); } }using UnityEngine; [System.Serializable] public class GameData { // 玩家位置数据 public Vector3 playerPosition; // 场景名称 public string currentScene; // 存档时间戳 public string saveTime; // 构造函数 public GameData() { playerPosition = Vector3.zero; currentScene = "MainMenu"; saveTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm"); } } using System.IO; using UnityEngine; public class SaveSystem : MonoBehaviour { public static SaveSystem Instance { get; private set; } public GameData currentData { get; private set; } private string savePath; private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); Initialize(); } else { Destroy(gameObject); } } private void Initialize() { savePath = Path.Combine(Application.persistentDataPath, "savedata.json"); LoadGame(); } // 保存游戏 public void SaveGame(Vector3 playerPosition) { currentData.playerPosition = playerPosition; currentData.currentScene = UnityEngine.SceneManagement.SceneManager.GetActiveScene().name; currentData.saveTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm"); string jsonData = JsonUtility.ToJson(currentData); File.WriteAllText(savePath, jsonData); Debug.Log($"游戏已保存: {savePath}"); } // 加载游戏 public void LoadGame() { if (File.Exists(savePath)) { string jsonData = File.ReadAllText(savePath); currentData = JsonUtility.FromJson<GameData>(jsonData); } else { currentData = new GameData(); } } // 删除存档 public void DeleteSave() { if (File.Exists(savePath)) { File.Delete(savePath); currentData = new GameData(); } } // 检查存档是否存在 public bool SaveExists() { return File.Exists(savePath); } } 我想在原有的功能下实现添加储存当前的state
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值