You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:05:44