【unity】利用sqlite制作排行榜

同学做项目的时候,想采用sqlite来制作排行榜。好吧,对于数据库,我只是简单的接触过,并不熟悉。所以今天花了半天多的时间来温习了下这部分知识。。。当然了,我觉得吧,能跟其他知识点结合起来运用,才能最大限度的接受它,了解它。所以呢,本篇文章,在利用本地数据库的同时,利用UGUI简单的制作一个排行榜吧。


第一部分、数据库管理
我在网上找资料的时候,发现关于数据库的东西,都已经是很以前写的了。。弄的我晕晕乎乎的。
总结了一番,加上自己当时学习时的领悟,下面来一步一步说明我的做法。 如有错误,希望指正。
啊,首先,你得安装个SQlite Manager,我用的是火狐。

打开它,新建一个.sqlite的文件到你的工程asset文件夹下。(路径一定要是工程下的.sqlite,否则数据是读不到的)。

在此我说明一点,我之前刚接触数据库的时候用的是sqlite3,现在反而用了sqlite,其实我觉得没什么差别,可能在sql语句上有所区别吧。关于两者区别,我也没细研究。所以请各位去网上找吧(- -。。。)

之后呢,我需要两个文件,

这两个文件都可以在Unity的安装包里找到的,

准备工作就这样了。下面我来说我的一个相对简单容易理解的数据库管理脚本。代码如下:
using System ;
using UnityEngine;
using System.Collections.Generic ;
using Mono.Data .Sqlite;
using System.Collections;
public class DBmanager {
  
   /// <summary>
     ///单例模式
     /// </summary>
    
      private static DBmanager instance;

     public static DBmanager Instance
     {
          get
          {
               if(instance == null )
               {
                    instance = new DBmanager ();
               }
               return instance ;
          }
     }

     private DBmanager (){}

     //连接
     private SqliteConnection dbConnect;
     //指令
     private SqliteCommand dbCommand;
     //写操作
     private SqliteDataReader dbDataReader;

     public  Dictionary <string,List <string >> dbDic;

     /// <summary>
     /// Opens the sql.
     /// </summary>
     public void OpenSql()
     {
          try
          {
               string path = "Data Source = " + Application.dataPath + "/rank.sqlite";
               dbConnect = new SqliteConnection (path );
               dbConnect.Open ();
               dbCommand = new SqliteCommand ();
               dbCommand.Connection = dbConnect ;
          }
          catch (Exception ex )
          {
               Debug.Log ("Exception is :" + ex.ToString ());
          }
     }
     /// <summary>
     /// Enquiries the sql.
     /// 读取数据
     /// </summary>
     /// <returns>返回数据集</returns>
     /// <param name="str">sql命令</param>
     public  Dictionary <string,List <string >> EnquirySql(string str)
     {

          dbDic = new Dictionary<string,List<string>> ();

          try
          {
               dbCommand.CommandText = str ;
               dbDataReader = dbCommand.ExecuteReader ();
              
               while (dbDataReader.Read ())
               {
                    for ( int i = 0 ; i < dbDataReader.FieldCount ; i ++)
                    {
                         string keyStr = dbDataReader.GetName (i);
                         string valueStr = dbDataReader.GetValue (i).ToString ();

                         if(!dbDic  .ContainsKey(keyStr ))
                         {
                              dbDic [keyStr ] = new List<string> ();
                              dbDic [keyStr ].Add (valueStr );
                         }
                         else
                         {
                              dbDic [keyStr ].Add (valueStr );
                         }
                    }
               }
               //记得读取完关上它 - -
               dbDataReader .Close ();
               return dbDic ;
          }
          catch (Exception ex)
          {
               Debug.Log ("Exception is :" + ex.ToString ());
               return dbDic ;
          }
     }


     /// <summary>
     ///执行增删改查操作
     /// </summary>
     /// <returns>The sql.</returns>
     /// <param name="str">String.</param>
     public     int ExecuteSql(string str)
     {
          try
          {
               dbCommand.CommandText = str;
               return dbCommand.ExecuteNonQuery ();
          }
          catch (Exception ex)
          {
               Debug.Log("Exception is :" + ex.ToString ());
               return 0;
          }
     }

     /// <summary>
     ///关闭数据库
     /// </summary>
     public void CloseSql()
     {
          dbConnect.Close ();
          dbCommand.Dispose();
     }
 }



对于我写的这个脚本,其实并没有什么太难的地方。写了4个方法,打开数据库连接,查询数据库,增删改查数据库,关闭数据库。唯一注意的就是,这个脚本是不挂在任何物体上的。(把继承于MonoBehaviour删掉)。另外,在查询数据库的地方我利用了字典方便管理我的数据库的数据。

第二部分 利用UGUI制作排行榜
最近蛮牛有好些UGUI的文章出现,我也来凑个热闹。。。。。。。。(其实我对UGUI比NGUI熟悉。。。谁让我这个后来人接触UNITY的时候,UGUI已经出了呢。。。。)

这个我一步一步来吧。首先新建一个Panel,在Panel下新建一个空物体,将它命名为list,作为我们存放排行信息的一个父物体。通过锚点设置给list大小设置为跟信息长宽相同大小。(下图)再在list下新建一个空物体,命名为data,用来当做我们每一条排行信息的父物体。并将之拉成预设体。在Panel上加上一个Scroll Rect组件(记得把list拖入Content中),在list上加上一个vertical Layout Group 以进行垂直的自动布局。如图:
为了模拟游戏的开始结束,我建了两个Button,分别假设为开始游戏的时候和游戏结束的时候。我现在的Game试图如下:

不要在乎美工这些细节。。。我就是来实现功能的- -。。。。之后就是代码部分啦。思路是,依靠循环生成我的data数据,想生成几个就循环几次。之后,因为List有自动排序功能,所以要控制list的高度,让他随着数据的增加,高度也增加。

[code]csharpcode:

public class Creat : MonoBehaviour {

     /// <summary>
     ///该脚本挂到list上
     /// </summary>


     private RectTransform rt;
     //记录高度
     private float height;

     void Start () {
          rt = GetComponent <RectTransform >();
          //生成5条数据
          for ( int i = 0 ; i < 5 ; i ++)
          {
               GameObject go =Instantiate (  Resources .Load ("Data")) as GameObject ;
          //生成的数据为List的子物体
               go.transform.SetParent (transform );
               //list的高度变化
               height += go.GetComponent <RectTransform >().sizeDelta.y;
          }
          //将height赋值给List
          rt.sizeDelta = new Vector2 (rt.sizeDelta.x,height );
     }

以上是一个简化版的排行榜,并没有将数据存放进去。
那么,下面我们的工作其实就是将数据库与UGUI制作的排行榜结合起来。

第三部分:排行榜与数据库融合

我是做了一个模拟游戏进度的两个Button,但实际上可以自己开动大脑来实现一下这两部分功能,所以在这个部分,我就直接上代码了。如果有什么 问题,请留言提问。

[code]csharpcode:

using UnityEngine;
using System.Collections.Generic ;
using UnityEngine.UI;
public class rankList : MonoBehaviour {

	//防止点击Button重复生成data采用的bool
	private bool isCreatGoOn;

	//list的高度
	private  float height;
	private  RectTransform rt;

	//生成的data放入数组方便统一管理
	private GameObject[] dataArray; 
	
	public Text nameText;
	public Text scoreText;

	void Start () {
		rt = GetComponent <RectTransform >();
		isCreatGoOn = true  ;
	}

	/// <summary>
	/// 制作排行榜的方法
	/// </summary>
	/// <param name="datacount">多少个数据</param>
	public void RankList(int datacount )
	{
		for ( int i = 0 ; i < datacount  ; i ++)
		{
			nameText.text = DBmanager.Instance.dbDic ["Name"][i];
			scoreText .text = DBmanager .Instance .dbDic  ["score"][i];
			 dataArray[i ]   =  Instantiate ( Resources .Load ("data")) as GameObject ;
			if(dataArray[i]  != null )
			{
				dataArray[i] .transform.SetParent (this.transform );
			}
			height += 100;
		}

		rt.sizeDelta = new Vector2 (rt.sizeDelta.x,height );
	}


	/// <summary>
	///begin点击Button事件 
	/// </summary>
	public void GameBegin()
	{
		print ("gp");
		if(isCreatGoOn )
		{
			DBmanager.Instance.OpenSql ();
			DBmanager.Instance.EnquirySql ("select * from information order by score desc");

			//此时千万不要写成DBmanager.Instance.dbDic.Count,因为要获取的是行数,而不是键值对的个数
			List <string > tempList = DBmanager.Instance.dbDic["Name"] ;

			dataArray = new GameObject[tempList.Count ];	 
			RankList (tempList.Count );
			
			DBmanager.Instance.CloseSql ();
			isCreatGoOn = false ;
		}

	}

	/// <summary>
	/// Games the over Button点击事件.
	/// </summary>
	public void GameOver()
	{
		isCreatGoOn = true ;
		for( int i = 0 ; i < dataArray.Length ; i ++)
		{
			Destroy (dataArray[i].gameObject );
			//结束游戏要还原height值,否则会导致list自动排序出错
			height -=dataArray [i].GetComponent <RectTransform >().sizeDelta .y;
		}
		ChangeRank ("小贝",14,95);	
		rt.sizeDelta = new Vector2 (rt.sizeDelta.x,height );
	}

	/// <summary>
	///测试下。。。。 
	/// </summary>
	/// <param name="name">Name.</param>
	/// <param name="age">Age.</param>
	/// <param name="score">Score.</param>

	public void ChangeRank(string name,int age,float score)
	{
		DBmanager.Instance.OpenSql ();
		DBmanager.Instance.ExecuteSql("insert into information  values(' " + name +" '," + age.ToString () + "," + score.ToString () + ")" );
		DBmanager.Instance.EnquirySql ("delete from information where rowid in (select rowid from information order by score asc limit 0,1)");
	}
}



说明一下我的运行结果,我在数据库的时候,先添加了5条数据:

当我点击开始游戏按钮,我的排名是这样的:

当我结束的时候,玩家会有个成绩,我写了个测试方法,就是添加一条数据进去,之后排序后删掉分数最低的数据:

其实对于最后一个为了测试的方法,这里面的东西其实还是有一点绕的,一个是关于string与sqlite的TEXT文本的转换,另一个就是sql的复合语句的运用。
对于sqlite语句,网上真的是很多,所以我就不说了,我更喜欢做一点小东西出来分享,而不是太基础的死知识。~

我还需要说明一点,对于PC端,这么写是没问题的,但是如果放在安卓和ios上,还是会有一些新的问题的,对于在手机上使用sqlite,雨松大神有两篇博文专门写这个的。下面附上链接:


好了今天就这样吧,其实这些东西还是花了我不少功夫的,但是还是有一些小问题的。(比如UGUI适配我没有弄),不过今天我确实学到了不少东西哈。
希望对跟我类似刚接触Untiy的盆友有所帮助,同时也希望大神们给予指正,帮助。

【本人首次发表于蛮牛,系本人原创】

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="