13 裝備的添加和移除(Unity3D)

本案例主要實現功能以下:
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];
    }
相關文章
相關標籤/搜索