基于Unity3D的MySql数据库应用设计

写在前面

谁说Unity只能做游戏╭(╯^╰)╮

  前段时间数据库老师布置了课程设计,做一个数据库应用。大家基本都用的SqlServer+Eclipse或者VS或者直接用Access做,但是!!!特立独行的我怎么可能跟大家一样呢【其实是当时刚用Unity开发完游戏,比较熟2333】,所以,我就跳入了Unity+MySql+VS的坑……

思路

  这次做的是一个类似图书馆新书推荐的系统,分为管理员和普通用户两种角色。管理员可以对图书进行增删改查操作,还可以管理用户,修改用户密码等。普通用户可以查看当前推荐书目,使用关键字、出版信息、ISBN等进行模糊/精确查询。整个系统提供登录注册功能。

实现

  这里只讲一下开发过程中遇到的几个难点,其余有不清楚的可以参考我的源码【已上传Github https://github.com/Lemon-XQ/BookRecommendSystem ,觉得还可以的欢迎star=w=】

1.Unity与Mysql的连接

string constr = String.Format("data Source={0};database={1};user id={2};pwd={3}",host,database,id,pwd);
connection = new MySqlConnection(constr);
connection.Open();

2.数据库的增删改查操作

【注:以下cmdText均为拼接后的SQL语句,如何拼接参见源码Database.cs】

  • 增:
MySqlCommand cmd=new MySqlCommand(cmdText,connection);
int resLine = cmd.ExecuteNonQuery();// 返回受影响的行数
// 返回自增长的id值
cmd.CommandText = "select last_insert_id() from "+table+" limit 1";
MySqlDataReader reader = cmd.ExecuteReader();
reader.Read();
insertId=reader.GetInt16(0);
reader.Close();
return resLine;
  • 删:
MySqlCommand cmd = new MySqlCommand(cmdText, connection);
int resLine = cmd.ExecuteNonQuery();// 返回受影响的行数
return resLine;
  • 改:
MySqlCommand cmd = new MySqlCommand(cmdText, connection);
int resLine = cmd.ExecuteNonQuery();// 返回受影响的行数
return resLine;
  • 查:
dataAdapter = new MySqlDataAdapter(cmd, connection);
//实例化数据集,并写入查询到的数据   
DataSet ds = new DataSet();
dataAdapter.Fill(ds);
return ds;

3.Unity中表格制作与动态生成

  Unity原生好像没有表格插件,网上找的表格制作教程做出来的不是我想要的那种效果@_@自己摸索了一会,效果图如下:

  • 表体制作
    • 新建一个Scroll View,命名为Body,表示整个表的可见范围
    • Body->Viewport->Content上绑定组件Vertical Layout Group,使得Content的所有子物体成组垂直排列,就像表格的每一行
  • 表头制作
    • 再新建一个Scroll View,命名为Title,表示表头(之所以用ScrollView是因为我这里表头过长,所以需要能够横向滚动)
    • 为Title绑定Horizontal Bar,注意需与Body的Horizontal Bar一致,以实现表头表体一起横向卷动
    • Title->Viewport->Content上绑定组件Horizontal Layout Group,使得Content的所有子物体水平排列,就像表格的每一列

4.数据库图片存储与Unity中读取图片问题【待改进

  考虑到数据库直接存图片不太现实(占空间大),这里存的是图片id(也是图片名)。读取一开始是用Resources.Load()方法,但是在工程进行打包后,Resources文件夹中的资源将进行加密与压缩,打包后的程序内将不存在Resources文件夹,故无法通过路径访问以及更新资源。
  而相比之下,StreamingAssets文件夹(流媒体文件夹)内的资源将不会经过压缩与加密,原封不动的打包进游戏包内。在安装时,StreamingAssets文件夹内的资源将根据平台,移动到对应的文件夹内。所以!!!适合用来更新一些资源。

  • Assets文件夹下新建一个文件夹,命名为StreamingAssets(如果该文件夹已存在则不用新建)
  • 将图片命名为id.png后放进StreamingAssets文件夹中【:id指的是数据库中存储的imageId= =,这样方便程序读取】
  • StreamingAssets文件夹下的文件在程序中只能通过IO Stream或者WWW的方式读取,这里使用IO Stream,从streamingAssets文件夹中读取图片流,转化为Texture2D,再转化为Sprite,代码如下:
// 图片路径,bookImage为封面图id
String path = Application.streamingAssetsPath + "/" + record.bookImage + ".png";
FileStream fs = File.OpenRead(path); //OpenRead
int filelength = 0;
filelength = (int)fs.Length; // 获得文件长度 
Byte[] image = new Byte[filelength]; // 建立一个字节数组 
fs.Read(image, 0, filelength); //按字节流读取      
System.Drawing.Image result = System.Drawing.Image.FromStream(fs);
fs.Close();

// 将图片流转化为png格式写入ms流
MemoryStream ms = new MemoryStream();
result.Save(ms,System.Drawing.Imaging.ImageFormat.Png);

// 生成Texture
Texture2D _tex = new Texture2D(64, 64);
_tex.LoadImage(ms.ToArray());
// Texture转化为Sprite
bookImage = Sprite.Create(_tex,new Rect(0,0,250,340),Vector2.zero );
ms.Close();

注:需要引入System.Drawing.dll,在C:\Program Files\Unity\Editor\Data\Mono\lib\mono\2.0中可以找到,复制至Plugins文件夹下即可

5.实现选中(单选/多选)记录效果

效果图如下:
【单选,单击鼠标左键】

【多选,长按Ctrl键+单击鼠标左键】

  • 在记录prefab最左侧添加choose button,同时整个prefab添加Image组件,颜色为蓝色,表示选中时的效果
  • 为每条记录prefab的choose button绑定OnChooseBtnClick事件
  • 代码如下:
// 存储当前选中记录索引值的列表
List<int> currentIndexList = new List<int>();
// 存储所有记录prefab的蓝色遮罩列表
List<Image> maskList = new List<Image>();
// 判定当前为单选/多选的标志位,默认单选
private bool isMulti = false;

// 监听选择按钮点击事件,index表示第几条记录
void OnChooseBtnClick(int index)
{
    // 非多选时先清空选中的index集合
    if(!isMulti) 
        currentIndexList.Clear();
    currentIndexList.Add(index);// 更新选中的index集合
    // 开启多选协程,监测多选事件
    StartCoroutine("MultiChoose", index);
}

// 多选协程
IEnumerator MultiChoose(int index)
{
    while (true)
    {
        // 没有长按Ctrl键,为单选
        if (!Input.GetKey(KeyCode.RightControl) && !Input.GetKey(KeyCode.LeftControl))
        {
            for (int i = 0; i < maskList.Count; i++)
            {
                isMulti = false;
                // 选中的记录显示蓝色遮罩效果,其余记录不显示
                if (i != index)
                    maskList[i].enabled = false;
                maskList[index].enabled = true;
            }
            yield break;
        }
        else // 长按Ctrl键可多选
        {
            // 多选选中的记录都显示蓝色遮罩效果
            isMulti = true;
            maskList[index].enabled = true;
            yield break;
        }
    }
}

6.实现可编辑dropdown(下拉框)

效果图如下:

  • dropdown上添加一个Input Field组件,调整长度使其不覆盖下拉箭头
  • 代码中监听dropdown和Input Field的ValueChanged事件,这里用0和1区分是dropdown还是Input Field引起的函数调用,代码如下:
...
// 设置下拉框和输入框的值变化监听
cityDropdown.onValueChanged.AddListener(delegate { OnCityValueChanged(0); });
cityInput.onValueChanged.AddListener(delegate {OnCityValueChanged(1);});
...
// 事件处理函数
void OnCityValueChanged(int type)
{
    switch (type)
    {
        case 0:// 下拉框
            // 获取选中项的值
            pressCity = cityDropdown.options[cityDropdown.value].text;
            // 只处理不等于0的情况,即下拉框选中的不是默认值
            if (cityDropdown.value != 0)
            {
                // 清空输入框的值
                cityInput.text = "";
                // 下拉框不透明
                cityDropdown.GetComponent<Image>().color = new Color(1, 1, 1, 1);
                // 输入框透明,防止遮挡
                cityInput.GetComponent<Image>().color = new Color(1, 1, 1, 0);
            }
            break;

        case 1:// 输入框
            // 获取输入框的值
            pressCity = cityInput.text;
            // 只处理输入框文本不为空的情况
            if (cityInput.text != "")
            {
                // 下拉框选中默认值(空白)
                cityDropdown.value = 0;
                // 下拉框透明    
                cityDropdown.GetComponent<Image>().color = new Color(1, 1, 1, 0);
                // 输入框不透明,使输入框文本内容置顶
                cityInput.GetComponent<Image>().color = new Color(1, 1, 1, 1);
            }
            break;
    }
}

发布(build)时的一些设置

  辛辛苦苦本地调试完了,一发布成exe,就连接不了数据库TAT……后来才发现是Project中缺少几个dll的原因……

  • Build&Setting->PlayerSetting里的.Net选择2.0
  • 引入I18N.dll、I18N.CJK.dll、I18N.West.dll至Plugins文件夹中【这几个dll在C:\Program Files\Unity\Editor\Data\Mono\lib\mono\unity中可以找到】
    • 重新build

猜你喜欢

转载自blog.csdn.net/LemonXQ/article/details/78801774
今日推荐