13 装备的添加和移除(Unity3D)
本案例主要实现功能如下:
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; .创建数据库连接并打开数据库
/// <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);
}
} .关闭数据库方法
public void CloseSqliteConnection ()
{
try {
//在数据库打开的前提下
if (connection != null) {
//关闭数据库
connection.Close ();
}
} catch (System.Exception ex) {
//异常信息
Debug.Log (ex.Message);
}
} .查询属性的基本信息(人物或装备)
/// <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[];
//查询语句
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 = ; 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;
}
} .当添加或移除装备,人物信息的变化
/// <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 == && equipInfo.Length == ) {
//声明存放运算结果的数组
float[] result = new float[];
if (isAdd) {
//将两个数组的元素相加
for (int i = ; i < result.Length; i++) {
result [i] = heroInfo [i] + equipInfo [i];
}
} else {
//移除装备
for (int i = ; i < result.Length; i++) {
result [i] = heroInfo [i] - equipInfo [i];
}
}
return result;
}
//参数不合法
return null;
} catch (System.Exception ex) {
Debug.Log (ex.Message);
return null;
}
}
.更新英雄信息到数据库,修改信息后要将新的信息更新到数据库中
/// <summary>
/// 更新英雄信息到数据库
/// </summary>
/// <param name="newHeroInfo" 更新后的英雄信息
/// <param name="heroName"> 更新信息英雄名
public void UpdateHeroPropety (float[] newHeroInfo, string heroName)
{
try {
string sql = "update Hero set AD=" + newHeroInfo [] + ",AP=" + newHeroInfo [] + ",AR=" + newHeroInfo []+ ",MP=" + newHeroInfo [] + " " + "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.先获取到点击要添加的图片
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 ().GetComponent<Image> ().sprite.name;
string equip1 = transform.GetChild ().GetComponent<Image> ().sprite.name;
//图片的默认名字
string defaultName = "InputFieldBackground";
if (defaultName == equip0) {
return ;
} else if (defaultName == equip1) {
return ;
} else {
//不可以添加装备了
return -;
}
}
保留图片
方法一:使用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 [] + "\n" +
"法强: " + info [] + "\n" +
"护甲值: " + info [] + "\n" +
"魔抗值: " + info [];
}
13 装备的添加和移除(Unity3D)的更多相关文章
- Vue中,给当前元素添加类名移除兄弟元素类名的方法
在Vue中,给当前元素添加类名移除兄弟元素类名的方法 今天在项目中需要做一个效果,点击对应的li改变当前的color,其他的li取消颜色,在jQuery中这很容易,由于之前已经引入了jQuery,所以 ...
- 手写面试编程题- 数组去重 深拷贝 获取文本节点 设置奇数偶数背景色 JS中检测变量为string类型的方法 第6题闭包 将两个数组合并为一个数组 怎样添加、移除、移动、复制、创建和查找节点? 继承 对一个数组实现随机排序 让元素水平 垂直居中的三种方式 通过jQuery的extend方法实现深拷贝
第1题==>实现数组去重 通过 new Set(数组名) // var arr = [12, 12, 3, 4, 5, 4, 5, 6, 6]; // var newarr1 = new Set ...
- DOM操作 ——如何添加、移除、移动、复制、创建和查找节点等。
DOM操作 --如何添加.移除.移动.复制.创建和查找节点等. (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个 ...
- spring:如何用代码动态向容器中添加或移除Bean ?
先来看一张类图: 有一个业务接口IFoo,提供了二个实现类:FooA及FooB,默认情况下,FooA使用@Component由Spring自动装配,如果出于某种原因,在运行时需要将IFoo的实现,则F ...
- jQuery中添加/改变/移除改变CSS样式例子
在jquery中对于div样式操作我们会使用到CSS() removeClass() addClass()方法来操作了,下面我们就整理了几个例子大家一起来看看吧. CSS()方法改变CSS样式 ...
- 1.javascript节点的操作 创建、添加、移除、移动、复制、插入(修改)
(1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节 ...
- DOM操作——JavaScript怎样添加、移除、移动、复制、创建和查找节点
(1). 创建新节点 createDocumentFragment() // 创建一个DOM片段 createElement() // 创建一个具体的元素 createTextNode() // 创建 ...
- jQuery添加/改变/移除CSS类
转自:http://www.jbxue.com/article/24589.html 在jquery中用到removeClass移除CSS类.addClass添加CSS类.toggleClass添加或 ...
- DOM操作怎样添加、移除、移动、复制。创建和查找节点?
(1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节 ...
随机推荐
- 关于Simulink的sample time的问题
在对simulink建模的过程中,有时候会遇到sample time出现错误的问题,比如下图是我在使用simulink自带的Recursive least square Estimator最小二乘估计 ...
- python面向对象之练习题2
练习题 需求: 士兵 可以 花钱买一个AK47 士兵 可以 用开开火 士兵 可以 买弹夹 士兵 可以 上子弹 士兵 可以 给 枪 添加子弹 枪 需要弹夹和有子弹的情况下,借助士兵扣动扳机 才能开火 枪 ...
- 【剑指Offer面试编程题】题目1388:跳台阶--九度OJ
题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n< ...
- 新闻网大数据实时分析可视化系统项目——13、Cloudera HUE大数据可视化分析
1.Hue 概述及版本下载 1)概述 Hue是一个开源的Apache Hadoop UI系统,最早是由Cloudera Desktop演化而来,由Cloudera贡献给开源社区,它是基于Python ...
- 如何让浏览器的左上角显示自己的logo的小诀窍
很简单,只需要在head头部加上以下代码 <link rel="icon" href="图片路径" type="image/x-icon&quo ...
- Bootstrap入门(一)准备
Bootstrap入门(一)准备 网页的样式化与布局展示是很多开发者要面对的问题,目前有多的框架和工具包,可以使网页设计的任务变得更加简单.轻松.方便.快捷一些,其中,bootstra ...
- 洛谷 P1094 纪念品分类
刚开始看到这题就确定这题最好先要排序 第一个想法是排好序后先让第一个和从倒数第一个开始相加和如果就 <= w,那么用n除以2或者再加一得出答案,然后发现随便 当w = 110 n = 5序列 ...
- GitHub fork 合作开发 - 快速实现版
目录 一 预备条件 二 fork项目 三 将项目clone到本地 四 push代码到自己的仓库 五 通过pull request提交代码 六 通过本地配置upstream来同步更新主repo的内容 七 ...
- IdentityServer4专题之三:OAuth、SSO和OpenID
一.oauth 典型案例:如果一个用户R拥有两项服务:一项服务是图片在线存储服务A,另一个是图片在线打印服务B.由于服务A与服务B是由两家不同的服务提供商提供的,所以用户在这两家服务提供商的网站上各自 ...
- mysql 单表索引优化
建表语句 CREATE TABLE IF NOT EXISTS `article` ( `id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMEN ...