基于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.dll至Project/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
相关文章推荐
- [导入]从架构设计到系统实施——基于.NET 3.0的全新企业应用系列课程(3):设计基于WF的工作流.zip(11.65 MB)
- [导入]从架构设计到系统实施——基于.NET 3.0的全新企业应用系列课程(7):设计基于MMC 3.0的管理工具.zip(8.70 MB)
- Ext.tree.TreePanel,accordion布局基于SSH+JSON的系统级应用之菜单设计
- 基于unity3d(C#)的有限状态机设计
- Framework的设计与应用--基于Windows Forms的应用开发实践
- 基于云计算和大数据的图书馆 应用系统建设设计
- 从架构设计到系统实施-基于.NET 3.0的全新企业应用之加入Silverlight支持
- 基于构件开发的应用框架设计
- [导入]从架构设计到系统实施——基于.NET 3.0的全新企业应用系列课程(2):设计基于WCF的服务.zip(8.29 MB)
- [导入]从架构设计到系统实施——基于.NET 3.0的全新企业应用系列课程(6):为网站添加Silverlight支持.zip(6.31 MB)
- 如何设计Predix的应用--基于原子设计模式(Atomic design)
- 基于CBI传输结构的USB硬盘接口应用设计
- 基于构件开发的应用框架设计
- C++临时变量的另类应用:基于iostream的类型安全的log接口设计
- 基于TMS320LF2407和CAN总线的通信应用系统设计
- 基于容器应用设计的原则,模式和反模式
- 从架构设计到系统实施-基于.NET 3.0的全新企业应用之开发基于MMC 3.0的管理工具
- 基于特定领域国土GIS应用框架设计及应用
- 第十五章 终于有了——基于FPGA的C2Mif软件设计以及VGA应用
- [导入]从架构设计到系统实施——基于.NET 3.0的全新企业应用系列课程(1):基于.NET 3.0的系统架构.zip(8.83 MB)