如何避免为数组类型重复编写Firestore转换器(Firestore+Unity/C#)
解决Firestore中自定义转换器自动支持数组类型的问题
你不需要单独编写Vector2IntArrayConverter,Firestore的Unity SDK支持自动复用单个类型的转换器来处理数组、列表等集合类型,只要做好以下配置:
1. 全局注册自定义转换器
在初始化Firestore实例时,将你的Vector2IntConverter添加到全局转换器列表中。这样SDK会自动将该转换器应用到所有Vector2Int类型的字段,包括数组元素:
// 初始化Firestore数据库时注册全局转换器 FirestoreDb db = FirestoreDb.Create("你的项目ID"); db.Settings.Converters.Add(new Vector2IntConverter());
2. 直接在DTO中使用数组属性
完成全局注册后,你的DTO类中可以直接声明Vector2Int[]类型的属性,无需额外指定转换器,SDK会自动遍历数组元素并调用Vector2IntConverter处理:
[FirestoreData] public class LevelDataDto { [FirestoreProperty] public Vector2Int[] SpawnPositions { get; set; } // 单个Vector2Int字段也可以正常使用,无需重复指定转换器 [FirestoreProperty] public Vector2Int PlayerStartPos { get; set; } }
3. 确保转换器实现正确
检查你的Vector2IntConverter是否正确实现了单个类型的序列化/反序列化逻辑,示例实现如下:
public class Vector2IntConverter : FirestoreConverter<Vector2Int> { public override Vector2Int FromFirestore(object value) { var data = value as Dictionary<string, object>; if (data == null || !data.ContainsKey("x") || !data.ContainsKey("y")) { throw new ArgumentException("Invalid Vector2Int data from Firestore"); } return new Vector2Int( Convert.ToInt32(data["x"]), Convert.ToInt32(data["y"]) ); } public override object ToFirestore(Vector2Int value) { return new Dictionary<string, object> { { "x", value.x }, { "y", value.y } }; } }
注意事项
- 确保你使用的是最新版本的Firestore Unity SDK,旧版本可能存在不支持自动适配集合类型的问题。
- 如果不想全局注册转换器,也可以在DTO的数组属性上通过
[FirestoreConverter(typeof(Vector2IntConverter))]指定,但全局注册更简洁,避免重复代码。
内容的提问来源于stack exchange,提问作者guilleatm
相关产品推荐
相关产品推荐

