接着(上)部分的内容,本节关注物品栏中一些功能的实现,及
  • 拾取操作的模拟
  • 背包的显示与隐藏
  • 物品提示信息

5.4 拾取模拟

有了(上)部分的铺垫,本节的目标是实现物品拾取功能。
物品拾取功能的逻辑分为三步:
  • 查找所有物品中是否存在该物品
  • 如果存在,num+1
  • 如果不存在,查找空的网格,把新建的Inventory放入此方格中
首先,我们采用按键X模拟拾取动作
public GameObject InventoryItem;
void Update(){if (Input.GetKeyDown (KeyCode.X))    //每次按下X都随机拾取一种药品{GetId(Random.Range(1001,1004));        }}public void GetId(int id){InventoryItemGrid grid = null;foreach (InventoryItemGrid temp in itemGridList)    //这个循环判断temp.id是否等于当前网格的id,若是,  grid = temp,否则grid为null{if(temp.id == id)grid = temp;break;}if (grid != null)    //如果存在该物品{grid.PlusNumber();}else    //不存在{foreach(InventoryItemGrid temp in itemGridList){if(temp.id == 0){grid = temp;break;}}if(grid != null){GameObject itemGO = NGUITools.AddChild(grid.gameObject,InventoryItem);itemGO.transform.localPosition = Vector3.zero;    //每个物体在网格中的相对坐标都是0grid.SetId(id);}}}
运行后,即可看到结果
此时,网格中的的数字会被药品所遮挡。需要调整一下InventoryItemGrid和NumbelLabel的depth,由于Inventory是6,修改InventoryItemGrid和NumbelLabel的depth为7和9,即可解决。8留给新添加的物品
因此,在添加物品的时候,直接将其depth设置为8,即
itemGO.GetComponent<UISprite>().depth = 8;    //通过访问UISprite元素以改变depth的值

5.5 背包的显示与隐藏

在开始时,背包默认为隐藏,只有点击背包按钮时,才进行显示。因此在Inventory的Awake()中和show()中设定,隐藏则在Hide()中设定。判断动画播放完成后,进行隐藏
   void Awake(){    //用Awake而不用Start是因为Awake是在脚本对象实例化时被调用,而Start是在第一帧被调用_instance = this;tween = this.GetComponent<TweenPosition> ();tween.AddOnFinished (this.OnTweenPlayFinished);    //通过AddOnFinished监听动画是否播放完成,若完成,则isShow = false,隐藏背包栏this.gameObject.SetActive (false);}private bool isShow = false;    //初始化isShow为false,表示初始时不显示void Show(){isShow = true;this.gameObject.SetActive (true);tween.PlayForward ();}void Hide(){isShow = false;tween.PlayReverse ();}void OnTweenPlayFinished()    //播放完毕后,隐藏{if (isShow == false){this.gameObject.SetActive(false);}}public void TransformState(){if (isShow == false)    {Show ();}else{Hide ();}}
但这里会出现如下的错误,主要原因是Inventory设置为隐藏时,Inventory的子文件InventoryItemGrid将无法访问。因此,Inventory不需要隐藏,只要播放tween动画后Inventory处在Camera之外即可。
故删除OnTweenPlayFinished() 函数即可实现功能。

5.6 背包物品的提示信息

为了提高游戏性,在鼠标放在物品之上时,需要显示物品信息。在背包Inventory中添加一个Child Sprite,作为信息描述界面,并在其中添加一个Child Label,如下所示
当鼠标放在物品上时,要实现的功能包括
  1. 更新DesLabel的描述
  2. 更新InventoryDes的位置
接下来实现上述两个功能。将InventoryDes的中心点设置为左上角,即Widget中的Pivot设置为LeftTop
首先,DesLabel的描述如下,
public class InventoryDes : MonoBehaviour {public static InventoryDes _instance;    //描述设置为实例private UILabel label;// Use this for initializationvoid Awake () {_instance = this;label = this.GetComponentInChildren<UILabel> ();}// Update is called once per framevoid Update () {}public void Show(int id){ObjectsInfo.ObjectInfo info = ObjectsInfo._instance.GetObjectInfoFromDict (id);    //通过Show()传递的id获取info信息。string des = "";switch (info.type) {    //判断info中的物品种类case ObjectsInfo.ObjectType.Drug:des = GetDrugDes(info);break;}label.text = des;}string GetDrugDes(ObjectsInfo.ObjectInfo info)    //具体描述,返回一个string{string str = "";str += "名称:" + info.name + "\n";str += "回复血量值:" + info.hp + "\n";str += "回复魔法值:" + info.mp +"\n";str += "出售价:" + info.price_sell + "\n";str += "购买价:" +info.price_buy + "\n";return str;}}
之后,为了监听鼠标是否移动到物品上方,我们在Prefabs之中的InventoryInsideItem,添加EventListener和EventTrigger,并在InventoryInsideItem脚本中新建两个函数处理这两个事件
    public void OnHoverOver(){print ("enter");}public void OnHoverOut(){print ("exit");}
即可在鼠标移动到物品上是显示enter,移出时显示exit,事件被成功监听,可以对事件中的代码进行操作。
为了实现显示提示的效果,我们需要在InventoryInsideItem中调用Show()函数时获取当前的id,因此可以利用InventoryInsideItem中的SetIconName(string icon_name)函数,添加一个形参id,传入id值,更新OnHoverOver()和OnHoverOut()
private int id;private bool isHover = false;    //isHover作为标志位public void OnHoverOver(){isHover = true;}public void OnHoverOut(){isHover = false;}
void Update(){if (isHover){InventoryDes._instance.Show (id);    //若isHover为true,显示信息}}
如下所示
最后只需要实现跟随鼠标功能即可
在每次调用InventoryDes中的Show()时,需要更改提示框的位置。在Show()中添加
this.gameObject.SetActive (true);
timer1 = 0.1f;
transform.position = UICamera.currentCamera.ScreenToWorldPoint (Input.mousePosition);
以获取当前鼠标的位置信息,并赋值给提示框,将提示框在Awake()中进行隐藏
this.gameObject.SetActive (false);
之后,在Update()中判断提示框是否处于隐藏来计时,并在计时结束后隐藏提示框
    void Update () {if (this.gameObject.activeInHierarchy == true)    //当前提示框是否处于隐藏状态,true表示显示{timer1 -= Time.deltaTime;    //将timer1减0.1秒}if (timer1 <= 0)    //当计时器小于0时,即鼠标离开后,隐藏提示框{this.gameObject.SetActive(false);}}

至此,就实现了提示框跟随鼠标移动的功能。

总结:背包系统的工程量较大,实现之前需要对整体的逻辑进行整理,否则挺容易出Bug的。。

RPG游戏《黑暗之光》流程介绍与代码分析之(六):背包系统的实现(下)相关推荐

  1. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(上)

    最近开始接触游戏制作,用Unity制作一些简单的游戏进行入门.这几篇博客总结了Space Shooter的制作流程,并对代码进行了分析.一是方便自己日后进行回顾与补充,二是为了让让更多的游戏爱好者接触 ...

  2. Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(下)

    这部分内容关注的是游戏性的提升,包括音效.计分等功能的实现. 传送门: 太空射击(Space Shooter)流程介绍与代码分析(上) 太空射击(Space Shooter)流程介绍与代码分析(中) ...

  3. RPG游戏《黑暗之光》流程介绍与代码分析之(一):游戏载入界面的创建

    <黑暗之光>是一款中等大小的RPG游戏,在入门Unity后适合用来上手,了解一整套游戏开发流程以及游戏内的各种功能.借助几篇博客整理一下整体的开发步骤以及代码,方便自己回顾,也便于各位交流 ...

  4. RPG游戏《黑暗之光》流程介绍与代码分析之(二):角色创建界面的实现

    第二章 角色创建 上一章中完成了初始化的场景界面的创建,本章就接着上一篇博客的内容,介绍角色创建的方法. 2.1 角色创建的UI界面 角色创建的背景采用与加载界面所用背景相同,并且Camera不需要移 ...

  5. RPG游戏《黑暗之光》流程介绍与代码分析之(五):背包系统的实现(上)

    第五章:背包系统 背包系统作为游戏中的一个重要功能,与游戏存在着诸多的交互性,购买商品.怪物掉落等各种情形都需要访问背包系统,结构较为复杂.因此背包系统将通过两篇博客进行分析. (上)部分包括 功能面 ...

  6. RPG游戏《黑暗之光》流程介绍与代码分析之(十四):角色技能系统的实现

    十四章:角色技能系统的实现 技能系统是本游戏开发的最后一部分内容,与普通攻击系统不同,我们需要添加释放技能的特效.动画以及播放时间.并将动画分为回复.Buff.单体和群体. 14.1添加技能的特效名称 ...

  7. RPG游戏《黑暗之光》流程介绍与代码分析之(十三):角色攻击系统的实现

    十三章:角色攻击系统 角色攻击是杀怪时的核心功能,攻击模式又可细分为普通攻击和技能攻击,其中技能攻击的信息存储在SkillInfoInList,本章节只涉及普通攻击部分. 为Magician添加一个P ...

  8. RPG游戏《黑暗之光》流程介绍与代码分析之(四):任务系统的实现

    第四章:任务系统 这部分主要对任务系统进行设计,游戏的关键因素之一就是任务系统与玩家的交互,但在代码实现中并不算复杂.本篇博客主要通过一下几个方面实现任务系统. 任务模型的导入与任务UI界面的创建 任 ...

  9. RPG游戏《黑暗之光》流程介绍与代码分析之(十五):主角受攻击效果以及场景切换

    十五章:主角受攻击效果以及场景切换 本篇博客将<黑暗之光>开发的最后工作做完,包括之前未实现的主角被击效果,以及实际运行中的场景切换. 15.1 主角的受攻击效果 我们参照WolfBaby ...

最新文章

  1. Cell综述:口腔微生物群的部位特点:微米级生境与生态位
  2. 如何给mysql用户分配权限
  3. SAP UI5 Focus related
  4. LPTHW 笨方法学习python 16章
  5. 云服务器主机内网 ip 和外网 ip 的区别
  6. java integer常量池_为什么Integer常量池的行为在127发生变化?
  7. matlab的点平方,性能 – 有效地计算Matlab中的成对平方欧几里德距离
  8. JavaScript 原始数据类型转换
  9. UDP网络程序,客户端和服务端交互原理
  10. 【WIN7安装Github遇到的问题】
  11. 如何做一个本地漫画党:了解漫画+下载漫画+漫画APP推荐
  12. 用python获取某年日历表
  13. 概要设计模板 外部接口设计_0226 rest接口设计
  14. typecho图片插件_AutoPhotos图片自动排版/图集Typecho插件
  15. kux2mp4(优酷kux转换为mp4软件) v2021
  16. python 对文件夹下的所有图片进行重命名
  17. Latex制作beamer幻灯片、写论文的基本语句
  18. N1刷入Armbian(Debian11 bullseye)笔记
  19. 四轴笔记----PSRAM存储器介绍
  20. linux音乐应用程序,适用于节拍,循环,录音的最佳免费Linux音乐制作应用程序 | MOS86...

热门文章

  1. 小陈js基础 输入输出语句
  2. 如何编辑“只读模式”下的PPT文件?
  3. 影响网站关键词排名效果的因素总结_搜索引擎算法汇总
  4. 如何在 macOS 使用 AList + RCLONE 把网盘挂载到本地
  5. NetCore跨平台桌面框架Avalonia的OSX程序打包
  6. Android-0.IPC相关简介
  7. python源码图片_初学者用python爬凡客图片的源码
  8. 如何通过登录电信官网进行套餐变更
  9. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第一场)
  10. 一篇文章入门 Redis(万字长文干货)