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的分享