Unity中List<Vector3>序列化为JSON并存储到MySQL的实现
完整实现方案:Unity序列化Vector3列表到MySQL
嘿,我来帮你搞定这个序列化+存储的问题!首先得说,你直接用JsonUtility.ToJson(club3Dpts)会踩坑——因为Unity的JsonUtility默认不支持直接序列化顶级集合类型(比如List<T>),而且我们需要确保Vector3能被正确序列化。下面是分步的完整实现:
1. 创建可序列化的包裹类
先定义一个带[Serializable]标签的容器类,用来包裹你的Vector3列表,这样JsonUtility才能正确处理它:
using System.Collections.Generic; using UnityEngine; using System; [Serializable] public class ClubPointsContainer { public List<Vector3> club3Dpts; // 构造函数方便快速初始化 public ClubPointsContainer(List<Vector3> points) { club3Dpts = points; } }
2. 正确序列化Vector3列表
现在用这个容器类来序列化你的列表,生成合法的JSON字符串:
// 你的原始列表初始化 List<Vector3> club3Dpts = new List<Vector3>(); club3Dpts.Add(new Vector3(1.25f, 1.335f, 1.425f));//chipping club3Dpts.Add(new Vector3(1.26f, 1.331f, 1.625f));//chipping club3Dpts.Add(new Vector3(1.232f, 1.135f, 1.125f));//chipping // 用容器类包装后序列化 ClubPointsContainer container = new ClubPointsContainer(club3Dpts); string jsonString = JsonUtility.ToJson(container, true); // true表示格式化输出,方便调试 // 打印看看结果(可选) Debug.Log("序列化后的JSON: " + jsonString);
序列化后的JSON大概长这样:
{ "club3Dpts": [ { "x": 1.25, "y": 1.335, "z": 1.425 }, { "x": 1.26, "y": 1.331, "z": 1.625 }, { "x": 1.232, "y": 1.135, "z": 1.125 } ] }
3. 连接MySQL并存储JSON
接下来需要把这个JSON字符串存到MySQL里,步骤如下:
第一步:导入MySQL驱动
在Unity里,推荐用官方的MySqlConnector驱动:
- 打开Package Manager → 点击"+" → "Add package from git URL",输入
https://github.com/mysql/mysql-connector-net.git?path=/src/MySqlConnector,等待安装完成。 - 也可以直接下载对应版本的.dll文件,导入到Unity的Assets文件夹中(注意选择兼容你Unity版本的.NET框架版本)。
第二步:编写数据库存储代码
写一个异步方法处理数据库插入,一定要用参数化查询防止SQL注入:
using MySqlConnector; using System.Threading.Tasks; public async Task SavePointsToMySQL(string jsonData) { // 替换成你自己的数据库连接信息 string connectionString = "server=你的服务器地址;database=你的数据库名;user=用户名;password=密码;"; using (MySqlConnection connection = new MySqlConnection(connectionString)) { try { await connection.OpenAsync(); // 假设你的表名为club_points,存储JSON的字段为points_json(类型建议用TEXT/LONGTEXT) string insertQuery = "INSERT INTO club_points (points_json) VALUES (@jsonData)"; using (MySqlCommand command = new MySqlCommand(insertQuery, connection)) { // 添加参数,避免SQL注入风险 command.Parameters.AddWithValue("@jsonData", jsonData); // 执行插入 int rowsAffected = await command.ExecuteNonQueryAsync(); if (rowsAffected > 0) { Debug.Log("数据成功存入MySQL!"); } else { Debug.LogWarning("数据插入失败!"); } } } catch (MySqlException ex) { Debug.LogError("MySQL错误: " + ex.Message); } catch (Exception ex) { Debug.LogError("其他错误: " + ex.Message); } finally { await connection.CloseAsync(); } } }
第三步:调用存储方法
在你的代码里调用这个方法即可:
// 序列化完成后调用存储方法 await SavePointsToMySQL(jsonString);
注意:如果在Unity主线程调用异步方法,建议用Task.Run或者配合Unity的异步工具类,避免阻塞主线程影响游戏流畅度。
4. 额外注意事项
- MySQL字段类型:存储JSON的字段建议用
TEXT或者LONGTEXT,确保能容纳足够长的JSON字符串。 - 序列化优化:上线时可以把
JsonUtility.ToJson的第二个参数设为false,去掉格式化空格,减小字符串体积。 - 移动端权限:如果是Android平台,需要在
AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" />。 - 反序列化还原(可选):之后如果需要从MySQL读取JSON并转成
List<Vector3>,可以用JsonUtility.FromJson<ClubPointsContainer>(jsonString)来还原数据。
内容的提问来源于stack exchange,提问作者batuman
相关产品推荐
相关产品推荐

