本案例主要實現功能以下:
1.建立UI界面,包含兩個裝備欄,四個武器選擇欄以及顯示人物的屬性的文本框
2.每個裝備都有本身的屬性(AD/AP/AR/MP)
3.人物也有本身的基礎屬性(AD/AP/AR/MP)
4.可添加或移除裝備到人物的裝備欄中,最多兩個
5.丟棄裝備後,可添加新的裝備
6.添加裝備,人物的對應屬性增長
7.減小裝備,人物的對應屬性減小
8.界面屬性值和數據庫中數據同步sql
建立數據庫,包括英雄(Hero)信息和裝備(Equip)信息數據庫
建立DataController腳本,用於封裝一些數據庫的操做
該腳本爲單例腳本,方便外部的調用.
引入Mono.Data.Sqlite命名空間(須要在Project中導入Plugins文件夾,裏面含有對應的dll文件)數組
將腳本寫爲單例腳本 //單例腳本 public static DataController Instance; void Awake () { Instance = this; } 腳本中聲明是的字段 //數據庫對象 SqliteConnection connection; SqliteCommand command; SqliteDataReader reader; //數據庫路徑 string sqlitePath; 1.建立數據庫鏈接並打開數據庫 /// <summary> /// 鏈接數據庫方法 /// </summary> /// <param name="DBName">數據庫名稱</param> public void ConnectToSqlite (string DBName) { //若是不包含.sqlite 添加 if (!DBName.Contains (".sqlite")) { DBName += ".sqlite"; } //數據庫路徑配置 sqlitePath = "Data Source =" + Application.streamingAssetsPath + "/" + DBName; //建立數據庫鏈接對象 connection = new SqliteConnection (sqlitePath); //建立數據了庫命令對象 command = connection.CreateCommand (); try { //打開數據庫 connection.Open (); } catch (System.Exception ex) { //異常信息 Debug.Log (ex.Message); } } 2.關閉數據庫方法 public void CloseSqliteConnection () { try { //在數據庫打開的前提下 if (connection != null) { //關閉數據庫 connection.Close (); } } catch (System.Exception ex) { //異常信息 Debug.Log (ex.Message); } } 3.查詢屬性的基本信息(人物或裝備) /// <summary> /// 查詢屬性的基本信息 /// </summary> /// <returns>返回查詢的結果(float數組)</returns> /// <param name="isHero">true:表示查詢的某個英雄的信息 /// false:查詢某個裝備的信息 /// <param name="name">傳入查詢對象的方法</param> public float[] SelectProPertyInfo (bool isHero, string name) { try { //用於存儲查詢到的信息(AD/AP/AR/MP) float[] result = new float[4]; //查詢語句 string sql; if (isHero) { //若是查詢的是英雄 sql = "select AD,AP,AR,MP from Hero where HeroName='" + name + "'"; } else { sql = "select AD,AP,AR,MP from Equip where EquipName='" + name + "'"; } //將SQL語句賦值給命令對象 command.CommandText = sql; //執行語句 reader = command.ExecuteReader (); //只讀取一行 reader.Read (); for (int i = 0; i < reader.FieldCount; i++) { //逐個獲取字段值,存入數組 result [i] = System.Convert.ToSingle (reader.GetValue (i)); } reader.Close (); return result; } catch (System.Exception ex) { Debug.Log (ex.Message); return null; } } 4.當添加或移除裝備,人物信息的變化 /// <summary> /// 添加或移除裝備 /// </summary> /// returns:當添加或移除裝備後對應英雄變化後的數據 /// <param name="isAdd" true:添加 false:移除裝備 /// <param name="heroInfo 要添加或移除裝備的英雄信息 /// <param name="equipInfo 要添加或移除的裝備信息 public float[] AddOrRemoveProperty (bool isAdd, float[] heroInfo, float[] equipInfo) { try { if (heroInfo.Length == 4 && equipInfo.Length == 4) { //聲明存放運算結果的數組 float[] result = new float[4]; if (isAdd) { //將兩個數組的元素相加 for (int i = 0; i < result.Length; i++) { result [i] = heroInfo [i] + equipInfo [i]; } } else { //移除裝備 for (int i = 0; i < result.Length; i++) { result [i] = heroInfo [i] - equipInfo [i]; } } return result; } //參數不合法 return null; } catch (System.Exception ex) { Debug.Log (ex.Message); return null; } } 5.更新英雄信息到數據庫,修改信息後要將新的信息更新到數據庫中 /// <summary> /// 更新英雄信息到數據庫 /// </summary> /// <param name="newHeroInfo" 更新後的英雄信息 /// <param name="heroName"> 更新信息英雄名 public void UpdateHeroPropety (float[] newHeroInfo, string heroName) { try { string sql = "update Hero set AD=" + newHeroInfo [0] + ",AP=" + newHeroInfo [1] + ",AR=" + newHeroInfo [2]+ ",MP=" + newHeroInfo [3] + " " + "where HeroName='" + heroName + "'"; command.CommandText = sql; command.ExecuteNonQuery (); } catch (System.Exception ex) { Debug.Log (ex.Message); } } 在商店物品欄的父物體Shop上添加AddEquipScript腳本,實現點擊裝備對應的按鈕後添加對應的裝備到裝備欄上,並修改人物的屬性,跟新UI界面的顯示. 腳本中定義的字段 //更新英雄信息的腳本 HeroInfoDisplayScript heroInfoScr; //裝備欄上的腳本 EquipBoxesScript equipInfoScr; 在Start方法中初始化字段 void Start () { heroInfoScr = GameObject.Find ("HeroInfoText").GetComponent<HeroInfoDisplayScript> (); equipInfoScr = GameObject.Find ("EquipBoxes").GetComponent<EquipBoxesScript> (); } 添加按鈕點擊響應事件 /// <summary> /// 點擊揹包中的裝備按鈕,給英雄添加裝備 /// </summary> /// <param name="btn">Button.</param> public void AddEquipBtnAction (GameObject btn) { int index = equipInfoScr.CanAddEquip (); if (index != -1) { //說明當前有空的裝備欄,能夠添加 //1.先獲取到點擊要添加的圖片 Sprite equipImg = btn.GetComponent<Image> ().sprite; //2.將添加的按鈕的圖片賦值給裝備欄中按鈕 equipInfoScr.transform.GetChild (index).GetComponent<Image> ().sprite = equipImg; //根據添加的裝備名字查找這個裝備 string equipName = btn.name; //打開數據庫 DataController.Instance.ConnectToSqlite ("LOL"); //找到裝備信息 float[] equipDatas = DataController.Instance.SelectProPertyInfo (false, equipName); // 找到英雄信息 float[] heroDatas = DataController.Instance.SelectProPertyInfo (true, "EZ"); //爲英雄添加裝備信息 float[] newHweoDatas = DataController.Instance.AddOrRemoveProperty (true, heroDatas, equipDatas); //跟新信息到數據庫 DataController.Instance.UpdateHeroPropety (newHweoDatas, "EZ"); //更新UI heroInfoScr.DisplayHeroInfo (newHweoDatas); //關閉數據庫 DataController.Instance.CloseSqliteConnection (); } } 在裝備欄父物體上添加EquipBoxesScript腳本,控制裝備欄中兩個裝備按鈕的點擊,主要是移除裝備,而且減小英雄的屬性,以及對外判斷是否以繼續添加裝備,(在退出時記住裝備欄中的裝備,在程序從新加載時保持原狀) 腳本中定義的字段 //默認裝備欄圖片 public Sprite defaultPic; //英雄屬性的腳本 HeroInfoDisplayScript heroInfoScr; //全部的裝備 public Sprite[] equipPics; 在Start方法中初始化 void Start () { //得到展現英雄信息的腳本 heroInfoScr = GameObject.Find ("HeroInfoText").GetComponent<HeroInfoDisplayScript> (); ShowImg (); } 添加或者移除裝備 //添加裝備欄中按鈕時,若是該裝備欄有裝備,則移除裝備 //同時更新英雄屬性展現,以及更新數據庫英雄數據 //參數equip:表示點擊的是哪一個裝備按鈕 public void RemoveEquipBtnAction (GameObject equipbtn) { //裝備的默認圖片,(即沒有裝備時的圖片) string defaultName = "InputFieldBackground"; //若是點擊的當前按鈕的圖片不是默認圖片的名字 //就表示當前點擊的按鈕是有裝備的,執行移除裝備操做 if (equipbtn.GetComponent<Image> ().sprite.name != defaultName) { //獲取當前按鈕上展現的裝備圖片的名字 string equipName = equipbtn.GetComponent<Image> ().sprite.name; //移除該裝備,即將該裝備按鈕上的圖片更換成默認 equipbtn.GetComponent<Image> ().sprite = defaultPic; // 開始更新數據庫英雄的數據(由於裝備移除了) DataController.Instance.ConnectToSqlite ("LOL"); //查詢當前移除的裝備信息 float[] equipDatas = DataController.Instance.SelectProPertyInfo (false, equipName); //查詢當前操做的英雄信息 float[] heroDatas = DataController.Instance.SelectProPertyInfo (true, "EZ"); //更新數據後的英雄信息 float[] newHeroInfos = DataController.Instance.AddOrRemoveProperty (false, heroDatas, equipDatas); //將更新後的英雄信息存儲到數據庫中 DataController.Instance.UpdateHeroPropety (newHeroInfos, "EZ"); //更新UI界面英雄信息展現 heroInfoScr.DisplayHeroInfo (newHeroInfos); //關閉數據庫 DataController.Instance.CloseSqliteConnection (); } } 判斷是否能夠添加裝備 public int CanAddEquip () { //獲取裝備上的圖片名稱 string equip0 = transform.GetChild (0).GetComponent<Image> ().sprite.name; string equip1 = transform.GetChild (1).GetComponent<Image> ().sprite.name; //圖片的默認名字 string defaultName = "InputFieldBackground"; if (defaultName == equip0) { return 0; } else if (defaultName == equip1) { return 1; } else { //不能夠添加裝備了 return -1; } }
保留圖片
方法一:使用PlayerPrefs將已有的圖片信息存到本地ui
方法二:在數據庫中建立一個表用來存儲圖片信息this
具體的存,取功能 的實現與PlayerPrefs相同spa
在場景中HeroInfoText上添加腳本用來控制在腳本中顯示英雄的基本信息code
//得到要展現英雄數據的Text Text infoText; void Start () { infoText = GetComponent<Text> (); //展現英雄數據 //1.打開數據庫 DataController.Instance.ConnectToSqlite ("LOL"); //2.查詢英雄數據 float[] infos = DataController.Instance.SelectProPertyInfo (true, "EZ"); //展現英雄信息到heroInfoText上 DisplayHeroInfo (infos); //關閉數據庫 DataController.Instance.CloseSqliteConnection (); } /// <summary> /// 展現英雄信息 /// </summary> /// <param name="info">要展現的數據</param> public void DisplayHeroInfo (float[] info) { infoText.text = "攻擊力: " + info [0] + "\n" + "法強: " + info [1] + "\n" + "護甲值: " + info [2] + "\n" + "魔抗值: " + info [3]; }