Unity中使用CSVReader出现Script serialization error的解决求助
Unity CSVReader 脚本序列化错误排查与解决
错误原因分析
你遇到的脚本序列化错误,核心原因是Unity的序列化系统不支持Dictionary<string, object>这类非可序列化类型。如果你的MonoBehaviour脚本中直接将CSVReader返回的List<Dictionary<string, object>>声明为public或带有[SerializeField]标记的字段,Unity会尝试序列化这个字段,但由于Dictionary和object类型不在Unity的序列化支持列表中,就会触发错误。
解决方案
方案1:使用自定义可序列化类替代Dictionary
创建与CSV结构匹配的可序列化类,将CSV数据映射为Unity可序列化的对象:
- 定义可序列化数据类(根据你的CSV字段调整):
[System.Serializable] public class CSVEntry { // 示例字段,替换为你CSV中的实际列名和类型 public int ID; public string ItemName; public float Price; }
- 修改CSVReader,新增方法返回自定义类型列表:
public static List<CSVEntry> ReadCSVEntries(string file) { var entries = new List<CSVEntry>(); TextAsset data = Resources.Load(file) as TextAsset; if (data == null) return entries; var lines = Regex.Split(data.text, LINE_SPLIT_RE); if (lines.Length <= 1) return entries; var header = Regex.Split(lines[0], SPLIT_RE); for (var i = 1; i < lines.Length; i++) { var values = Regex.Split(lines[i], SPLIT_RE); if (values.Length == 0 || values[0] == "") continue; var entry = new CSVEntry(); // 按CSV列顺序赋值,注意类型匹配 entry.ID = int.Parse(values[0].Trim(TRIM_CHARS)); entry.ItemName = values[1].Trim(TRIM_CHARS); entry.Price = float.Parse(values[2].Trim(TRIM_CHARS)); entries.Add(entry); } return entries; }
- 在MonoBehaviour中使用:
public class DataLoader : MonoBehaviour { public List<CSVEntry> csvData; // 现在可以正常序列化显示在Inspector中 void Start() { csvData = CSVReader.ReadCSVEntries("YourCSVFileName"); // 路径为Resources下的相对路径,无需.csv后缀 } }
方案2:阻止Unity序列化非支持字段
如果不需要在Inspector中查看CSV数据,可使用[NonSerialized]标记字段,避免Unity尝试序列化它:
public class DataLoader : MonoBehaviour { [NonSerialized] private List<Dictionary<string, object>> csvData; void Start() { csvData = CSVReader.Read("YourCSVFileName"); } }
额外检查项
- 确认CSV文件放在Resources文件夹下,路径调用时使用相对路径(如文件在
Resources/CSV/Items.csv,则调用Read("CSV/Items"))。 - 检查CSV文件编码为UTF-8,避免读取时出现乱码或解析错误。
内容的提问来源于stack exchange,提问作者BlackSperm
相关产品推荐
相关产品推荐

