Unity 插件EasySave3拓展读取写入.csv文件

1、需求

程序运行中获取记录一些想要的数据

2、代码

public class ConfigLogicBase
{
    private string filePath;

    public ConfigLogicBase(string fileName)
    {
        filePath = Path.Combine(Application.streamingAssetsPath, fileName);
    }

    private ES3Spreadsheet eS3Spreadsheet;

    private bool LoadFile()
    {
        //Application.dataPath + "/Resources/"

        Debug.LogError($"加载路径:{filePath}");

        if (File.Exists(filePath))
        {
            eS3Spreadsheet = new ES3Spreadsheet();

            ES3Settings eS3Settings = new ES3Settings(filePath);

            eS3Settings.location = ES3.Location.Resources;

            eS3Spreadsheet.Load(filePath);

            return true;
        }
        else
        {
            Debug.LogError("不存在");

            return false;
        }
    }

    protected Dictionary<int, T> ReadFile<T>() where T : IConfigDataField, new()
    {
        Dictionary<int, T> keyValuePairs = new Dictionary<int, T>();

        bool isLoadFile = LoadFile();

        if (!isLoadFile)
            return null;

        for (int i = 0; i < eS3Spreadsheet.RowCount; i++)
        {
            if (i == 0)
                continue;

            T configData = new T(); // 使用 new() 约束确保可以实例化 T

            Type type = typeof(T);

            FieldInfo[] publicFields = type.GetFields(BindingFlags.Public | BindingFlags.Instance);

            for (int j = 0; j < publicFields.Length; j++)
            {
                var field = publicFields[j]; //字段

                var value = eS3Spreadsheet.GetCell(field.FieldType, j, i);

                if (value != null && field.FieldType.IsAssignableFrom(value.GetType()))
                {
                    field.SetValue(configData, value);
                }
            }

            // 确保在添加之前设置了 ID
            if (!keyValuePairs.ContainsKey(i))
            {
                keyValuePairs.Add(i, configData);
            }
        }

        return keyValuePairs;
    }

    public int GetRowCount()
    {
        return eS3Spreadsheet.RowCount;
    }

    protected int WriteFile<T>(T t) where T : IConfigDataField
    {
        var row = eS3Spreadsheet.RowCount;

        Type type = typeof(T);

        FieldInfo[] publicFields = type.GetFields(BindingFlags.Public | BindingFlags.Instance);

        for (int i = 0; i < publicFields.Length; i++)
        {
            var field = publicFields[i];

            var vaule = field.GetValue(t);

            if (vaule is Vector3 vector3Value)
                eS3Spreadsheet.SetCell<Vector3>(i, row, vector3Value);
            else if (vaule is Vector2 vector2Value)

                eS3Spreadsheet.SetCell<Vector2>(i, row, vector2Value);
            else
                eS3Spreadsheet.SetCell(i, row, vaule);
        }

        eS3Spreadsheet.Save(filePath);

        return row;
    }
}

public interface IConfigDataField
{
}

ConfigLogicBase这个类 主要是获取文件 ,读取文件,写入文件

下面使用的示例

public class CameraPosConfigData : ConfigLogicBase
{
    public class CameraPos : IConfigDataField
    {
        public int id;

        public string name;

        public Vector3 rot;

        public Vector3 pivot;

        public Vector2 pos;

        public float scale;
    }

    public CameraPosConfigData(string fileName) : base(fileName)
    {
    }

    private Dictionary<int, CameraPos> configDic;

    public Dictionary<int, CameraPos> Init()
    {
        configDic = ReadFile<CameraPos>();

        return configDic;
    }

    public void Write(CameraPos cameraPos)
    {
        int rowCount = GetRowCount();

        if (cameraPos.id == 0)
            cameraPos.id = rowCount;

        int row = WriteFile(cameraPos);

        if (!configDic.ContainsKey(row))
        {
            configDic.Add(row, cameraPos);
        }
    }
}

CameraPosConfigData 这个类主要是用来记录相机的坐标位置等信息

要注意的是分别对应.csv 文件的

然后

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestConfig : MonoBehaviour
{
    private CameraPosConfigData cameraPosConfigData;

    // Start is called before the first frame update
    private void Start()
    {
        cameraPosConfigData = new CameraPosConfigData("Test.csv");

        cameraPosConfigData.Init();
    }

    // Update is called once per frame
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            CameraPosConfigData.CameraPos cameraPos = new CameraPosConfigData.CameraPos();
            cameraPos.name = "";
            cameraPos.rot = transform.rotation.eulerAngles;
            cameraPos.pivot = transform.position;
            cameraPos.pos = transform.GetChild(0).position;
            cameraPos.scale = transform.GetChild(0).position.z;
            cameraPosConfigData.Write(cameraPos);
        }

        if (Input.GetKeyDown(KeyCode.B))
        {
            var dic = cameraPosConfigData.Init();

            foreach (var item in dic)
            {
                Debug.LogError($"{item.Key} {item.Value.id}  {item.Value.pivot}");
            }
        }
    }
}

创建TestConfig 去调用测试

3、插件地址下载链接:https://pan.baidu.com/s/1mNAX9XaJ2DD7b5xkFJdSPg?pwd=p932
提取码:p932
--来自百度网盘超级会员V7的分享

使用 Unity Easysave3 插件保存读取 LuaTable 类型数据,你需要将 LuaTable 转换为字符串类型数据,然后将其保存到本地或云端。 以下是一个保存读取 LuaTable 数据的示例代码: ```csharp using UnityEngine; using LuaInterface; using PathologicalGames; public class SaveLuaTable : MonoBehaviour { LuaTable luaTable; void Start() { // 创建 LuaTable 数据 luaTable = LuaScriptMgr.Instance.DoFile("TestTable.lua") as LuaTable; // 将 LuaTable 转换为字符串类型数据 string luaTableStr = ESSerializer.SerializeLuaTable(luaTable); // 保存字符串类型数据到本地 ES3.Save<string>("luaTable", luaTableStr); // 读取本地保存的字符串类型数据 string loadedLuaTableStr = ES3.Load<string>("luaTable"); // 将字符串类型数据转换回 LuaTable 类型数据 LuaTable loadedLuaTable = ESUtility.LuaTableFromString(loadedLuaTableStr); } } ``` 在上述代码中,我们首先创建了一个 LuaTable 数据,然后使用 `ESSerializer.SerializeLuaTable()` 方法将其转换为字符串类型数据。接着,我们使用 `ES3.Save()` 方法将字符串类型数据保存到本地。在读取本地保存的数据时,我们使用 `ES3.Load()` 方法读取保存的字符串类型数据。最后,我们使用 `ESUtility.LuaTableFromString()` 方法将读取的字符串类型数据转换回 LuaTable 类型数据。 需要注意的是,Unity Easysave3 插件不支持直接保存读取 LuaTable 类型数据,因此我们需要将其转换为字符串类型数据进行保存读取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值