本案例主要实现功能如下:
1.创建UI界面,包含两个装备栏,四个武器选择栏以及显示人物的属性的文本框
2.每一个装备都有自己的属性(AD/AP/AR/MP)
3.人物也有自己的基础属性(AD/AP/AR/MP)
4.可添加或移除装备到人物的装备栏中,最多两个
5.丢弃装备后,可添加新的装备
6.添加装备,人物的对应属性增加
7.减少装备,人物的对应属性减少
8.界面属性值和数据库中数据同步
创建数据库,包括英雄(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 = ;
//打开数据库
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> ().
!= defaultName) {
//获取当前按钮上展示的装备图片的名字
string equipName = equipbtn.GetComponent<Image> ().;
//移除该装备,即将该装备按钮上的图片更换成默认
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> ().;
string equip1 = transform.GetChild (1).GetComponent<Image> ().;
//图片的默认名字
string defaultName = "InputFieldBackground";
if (defaultName == equip0) {
return 0;
} else if (defaultName == equip1) {
return 1;
} else {
//不可以添加装备了
return -1;
}
}
保留图片
方法一:使用PlayerPrefs将已有的图片信息存到本地
方法二:在数据库中创建一个表用来存储图片信息
具体的存,取功能 的实现与PlayerPrefs相同
在场景中HeroInfoText上添加脚本用来控制在脚本中显示英雄的基本信息
//获得要展示英雄数据的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];
}
.Net Core