1、功能:在一个UIPanel上动态加载若干个Items,每一个Item包含一个UIButton和UISprite。然后每一行放置5个。如果超出UIPanel范围的Item则可以拖动它来显示。按钮的标签内容和精灵的图片根据数据库的内容来动态显示。
2、实现的步骤:
1)导入NGUI资源包:我这里使用的是无水印的,来自互联网上各路好汉的分享,大家可以在百度谷歌上去找。当然免费版的也可以,跟我的图示当中会有些差异,大家注意了。导入NGUI成功后就会发现Unity Editor导航菜单栏中多了一项“NGUI”菜单。(有NGUI的同学就可以跳过这一步了)
2)制作图集(UIAtlas):首先在网上找一些图片素材,最好是.jpg或者.png格式的,大小无要求。分别命名后一起存入Assets/MyAtlas目录下,当然你可以把MyAtlas换成你所喜欢的。在Unity Editor的Project视图中选中刚刚导入进来的所有图片,然后选择导航菜单中的“NGUI|Open the Atlas Maker”。如图所示:
命名后点击“Create”即可创建自己的Atlas。当然,可以用NGUI做好的图集,只不过这样图片差异太大,风格不统一。
3)创建sqlite数据库:首先你得下载sqlite Expert,我下载的是 Personal版本。免费版的下载地址为:http://www.sqliteexpert.com/download.html。安装运行之。然后找到正确Application.persistantDataPath的位置,可以通过Debug.Log一下得到,然后在该路径下创建数据库,取名“tzzm.db”。新建一个表,取名“Animal”,添加两个字段,id(INT)和name(CHAR),添加完之后点击“Apply”。在Data视图中按图集“Animal Atlas”中图片的顺序添加记录。
参考雨松MOMO的博客,创建DbAccess.cs脚本。引入“System.Data.dll”和“Mono.Data.sqlite.dll”,放置在“Assets/Plugins”目录下,注意这个名字不能更改。雨松MOMO博客地址:http://www.xuanyusong.com/archives/831
DbAccess.cs脚本的代码如下(这个脚本不要挂在任何对象上):
1 using UnityEngine; 2 System; 3 System.Collections; 4 Mono.Data.sqlite; 5 6 public class DbAccess 7 { 8 private sqliteConnection dbConnection; 9 sqliteCommand dbCommand; 10 sqliteDataReader reader; 11 12 public DbAccess(string connectionString) 13 { 14 OpenDB(connectionString); 15 } 16 17 public DbAccess() 18 19 20 21 22 void OpenDB( 23 24 try 25 { 26 dbConnection=new sqliteConnection(connectionString); 27 dbConnection.Open(); 28 } 29 catch(Exception e) 30 31 Debug.Log(e.ToString()); 32 33 34 35 void ClosesqlConnection() 36 37 if(dbCommand!=null) 38 39 dbCommand.Dispose(); 40 41 dbCommand=; 42 if(reader!= 43 44 reader.Dispose(); 45 46 reader= 47 if(dbConnection!= 48 49 dbConnection.Dispose(); 50 51 dbConnection=; 52 53 54 public sqliteDataReader ExecuteQuery( sqlQuery) 55 56 dbCommand=dbConnection.CreateCommand(); 57 dbCommand.CommandText=sqlQuery; 58 reader=dbCommand.ExecuteReader(); 59 return reader; 60 61 62 public sqliteDataReader ReadFullTable( tableName) 63 64 string query="SELECT * FROM " + tableName; 65 ExecuteQuery(query); 66 67 68 public sqliteDataReader InsertInto(string tableName,[] values) 69 70 INSERT INTO " + tableName + VALUES (" + values[0]; 71 for(int i=1;i<values.Length;i++ 72 73 query+=, values[i]; 74 75 query +=)" 76 77 78 79 public sqliteDataReader UpdateInto(string[] cols,255)">string[] colsvalues,255)">string selectedKey,0)"> selectedValue) 80 81 UPDATE SET " + cols[0] + = " + colsvalues[ 82 1;i<colsvalues.Length;i++ 83 84 query+=" + cols[i] + colsvalues[i]; 85 86 query+= WHERE " +selectedKey + " + selectedValue + " 87 88 89 90 public sqliteDataReader Delete([] colsvalues) 91 92 DELETE FROM = 93 94 95 query+= OR 96 97 98 99 100 public sqliteDataReader InsertIntoSpecific(101 102 if(cols.Length!=values.Length) 103 104 throw new sqliteException(cols.Length!=values.Length); 105 106 (107 1;i<cols.Length;i++108 109 query+= cols[i]; 110 111 query+=112 113 114 115 public sqliteDataReader DeleteContents(116 117 118 119 120 121 public sqliteDataReader CreateTable(string name,0)">[] colsTypes) 122 123 colsTypes.Length) 124 125 cols.Length!=colsTypes.Length126 127 CREATE TABLE " + name + " + colsTypes[128 129 130 query+= colsTypes[i]; 131 132 query+=133 134 135 136 public sqliteDataReader SelectWhere(string[] items,255)">string[] operations,128)">137 138 if(cols.Length!=operations.Length || operations.Length!=139 140 cols.Length!=operations.Length || operations.Length!=values.Length141 142 SELECT " + items[143 1;i<items.Length;i++144 145 query+= items[i]; 146 147 query+= FROM " +cols[0] + operations['' 148 149 150 query += AND " + cols[i] + operations[i] + 151 152 153 154 }
完成脚本后我们再进行下一步。
4)制作NGUI(最核心的步骤):
一、新建一个空场景,删掉原来的Main Camera。点击“NGUI|Open the UI Wizard”,点击“Create”。选中Panel,将其clipping属性改为“Soft Clip”,size设为“700,400”,softness设置为“10,10”。然后为其添加一个UIDraggablePanel组件,勾选Restrict Within Panel选项,Scroll Wheel Factor设为“-2”。其它属性保持默认。
二、创建一个空对象,更名为UIItable,并作为Panel的子对象,reset该空对象。为其添加UITable的组件,colunms设为4,direction设为down,padding设为“10,10”,勾选hide inactive和keep in panel属性。
三、再创建一个空对象,更名为UIItem,作为UITable的子对象,reset该空对象。为其添加一个Box Collider组件,并将其size属性设为“200,200”,再添加一个UIDragPanelContents组件。
四、在UIItem对象下创建各种wedgits,如UIButton,UISprite之类的,制作好一个之后运行看效果是否能够达到预期,即是否能拖动并在边界弹回。如果发生按钮不能点击的情况,请设置两个colliders的相对位置。调整好UIItem之后,在Project视图下创建一个新的prefab,命名为item,将Hierarchy视图中的UIItem拖入item预设中。
1 2 3 System.Data; 4 5 6 s1 : MonoBehavIoUr { 7 string LevelName=Animal 8 GameObject item; 9 Transform table; 10 11 // Use this for initialization 12 Start () { 13 DbAccess db=new DbAccess(URI=file:" + Application.persistentDataPath + /tzzm.db14 15 using(sqliteDataReader reader=db.ReadFullTable(LevelName)) 16 17 while(reader.Read()) 18 { 19 i++20 } 21 22 string[] sceneNames=new [i]; 23 int j=0;j<i;j++24 25 using(sqliteDataReader reader=db.SelectWhere(LevelName,255)">string[]{name"},0)">id=[]{j.ToString()})) 26 27 28 { 29 sceneNames[j]=reader.GetString(reader.GetOrdinal()); 30 GameObject it = NGUITools.AddChild(table.gameObject,item); 31 it.transform.localScale=new Vector3(0.7f,32 it.transform.localPosition=0,128)">33 it.GetComponentInChildren<UILabel>().text=sceneNames[j]; 34 it.GetComponentsInChildren<UISprite>()[1].spriteName=35 it.GetComponentInChildren<UILabel>().depth=j; 36 it.GetComponentsInChildren<UISprite>()[1].depth=37 table.GetComponent<UITable>().repositionNow=true38 } 39 40 41 42 43 44 Update is called once per frame 45 Update () { 46 47 48 }