您的位置:首页 > 移动开发 > Unity3D

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

2017-12-15 01:41 330 查看

写在前面

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

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

思路

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

实现

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

1.Unity与Mysql的连接

引入MySql.Data.dll及System.Data.dllProject/Plugins文件夹中【两个dll的下载地址:http://download.csdn.net/download/lemonxq/10159055

MySql中建库建表,配置root用户密码

连接代码如下:

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)
{

b31b
// 没有长按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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐