[Godot] C#使用Json进行数据结构的保存与加载

之前,我使用Godot内置的Resource类实现了游戏的保存与加载功能Godot C# 使用Resource类实现保存功能https://blog.csdn.net/qq_58742026/article/details/146168646然而,随着深入的使用,我发现其功能逐渐不能满足我的要求,最重要的一点是,他进行文件的存取必须使用 res://user:// 开头的路径,所以,对于我最近的使用来说,我需要换一种办法实现数据的存取

最终,我决定使用Json进行数据存取系统,下面我将给大家介绍一下我的实现过程

脚本编写

首先,为了方便使用,我决定先写一个类文件,这里我将我的代码分享给大家

cs 复制代码
using System;
using System.IO;
using System.Text.Json;

public static class SaveHalper
{
    public static bool Save<T>(T data, string path)
    {
        try
        {
            var json = JsonSerializer.Serialize(data, new JsonSerializerOptions { WriteIndented = true });      //序列化
            File.WriteAllText(path, json);
            return true;
        }
        catch
        {
            return false;
        }
    }

    public static T Load<T>(string path)
    {
        try
        {
            var file = File.ReadAllText(path);
            return JsonSerializer.Deserialize<T>(file);    //反序列化
        }
        catch
        {
            return default;
        }
    }
}

通过这个脚本,我们可以方便的实现数据的存取

数据类编写

对于我们的数据类,我们需要按照下面的格式来写

cs 复制代码
using System;
using System.Collections.Generic;

[Serializable]
public class Data
{
    public string Text { get; set; }
    //需要其他自定义类和数组还可以按下面的写
    public List<自定义结构类> cardDatas { get; set; } = new();
}

注意,我们需要写Serializable才能序列化,为了正常存取,变量需要转成属性

代码使用

这样,我们就能在脚本里面正常的存取了

cs 复制代码
var error = SaveHalper.Save(data, path);        //保存data数据到path路径

var gameData = SaveHalper.Load<data>(path);       //读取path数据(data类型)到gameData
//其中,我们可以判断error来看保存是否正常,判断gameData是否为null来看读取是否正常

如上所述,我们就能实现数据的存取了

其他-数据保存

下面,我给大家分享一下我的保存代码

cs 复制代码
public bool Save()
    {

        if (data== null)
            return false;

        var error = SaveHalper.Save(data, path + ".tmp");      //创建临时文件

        if (!error)      //判断是否创建错误
        {
            DirAccess.RemoveAbsolute(path + ".tmp");        //移除临时文件
            return false;
        }

        if (FileAccess.FileExists(path))
            DirAccess.RemoveAbsolute(path);     //移除原文件
        DirAccess.RenameAbsolute(path + ".tmp", path);      //对临时文件重命名

        return true;
    }

这样,我们通过创建临时文件的方法,防止了文件保存错误导致原文件错误的问题,大家也可以随意修改分享代码,感谢观看!

相关推荐
玖玥拾2 天前
C# 语言进阶(十四)Unity UI界面开发 + 网络消息联动
服务器·开发语言·网络·ui·unity·c#·游戏引擎
野区捕龙为宠2 天前
Unity 持久化数据
unity·游戏引擎·lucene
郝学胜-神的一滴2 天前
[简化版 GAMES 101] 计算机图形学 17:纹理技术从基础原理到多场景实战应用
c++·unity·游戏引擎·图形渲染·three.js·opengl·unreal
_ZHOURUI_H_3 天前
MyFramework: 同样是 Unity 游戏开发框架,和 HTFramework 的设计取向有什么不同?(下)
unity·游戏引擎·游戏开发·游戏ui·手游开发
KillJUMP3 天前
SDF函数
godot·着色器
丁小未5 天前
基于MVVM框架的XUUI HelloWorld 新手教程
unity·性能优化·c#·游戏引擎
松树戈5 天前
【Godot4精进之路】03~Godot编辑器常用界面介绍
编辑器·游戏引擎·godot
YigAin5 天前
Unity Spine 资源出现白边的解决办法
unity·游戏引擎·spine
郝学胜-神的一滴6 天前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
_helen_5206 天前
unreal engine 虚拟现实 + airsim
游戏引擎·vr·虚幻