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

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

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的。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28372.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3d开发MOBA游戏类《王者荣耀》记录(一)

由于最近工作忙&#xff0c;之前一直想写的王者荣耀教程直接就忘记了&#xff0c;最新才记起来&#xff0c;现在继续更新~。 上一篇起始大概介绍了一下我对这个工程的简单思路现在开始一步步实现&#xff0c;首先先创建一个Unity3d工程&#xff0c;这里我先用5.4.0吧&#xff…

《炉石传说》架构设计赏析(3):Gameplay初探

经过前面两篇文章的分析&#xff0c;我们对炉石的代码已经不陌生了&#xff0c;接下来我初步尝试分析其游戏逻辑代码。欢迎转载&#xff0c;请注明作者【燕良游戏开发】及原文地址&#xff1a;http://blog.csdn.net/neil3d/article/details/39453291 经过前面的分析&#xff0…

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

第四章&#xff1a;任务系统 这部分主要对任务系统进行设计&#xff0c;游戏的关键因素之一就是任务系统与玩家的交互&#xff0c;但在代码实现中并不算复杂。本篇博客主要通过一下几个方面实现任务系统。 任务模型的导入与任务UI界面的创建任务的接受与完成针对不同对象的指针…

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

第二章 角色创建 上一章中完成了初始化的场景界面的创建&#xff0c;本章就接着上一篇博客的内容&#xff0c;介绍角色创建的方法。 2.1 角色创建的UI界面 角色创建的背景采用与加载界面所用背景相同&#xff0c;并且Camera不需要移动。 创建的UI界面与之前类似&#xff0c;其中…

【游戏开发渲染】Unity ShaderGraph使用教程与各种特效案例:Unity2022(持续更新)

文章目录 一、ShaderGraph前言二、ShaderGraph科普1、渲染管线&#xff08;Render Pipline&#xff09;2、可编程渲染管线&#xff0c;SRP&#xff08;Scriptable Render Pipline&#xff09;3、高清渲染管线&#xff0c;HDRP&#xff08;High Definition Render Pipleline&…

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

十五章&#xff1a;主角受攻击效果以及场景切换 本篇博客将《黑暗之光》开发的最后工作做完&#xff0c;包括之前未实现的主角被击效果&#xff0c;以及实际运行中的场景切换。 15.1 主角的受攻击效果 我们参照WolfBaby中的受攻击效果&#xff08; 链接&#xff09;&#xff0c…

Unity实现王者荣耀登陆界面动画背景

我呢&#xff0c;特别爱打王者荣耀。 而最近几个版本的更新中,王者荣耀的登录背景变成了动画背景,看着很有动感炫酷,这里来看下王者荣耀是怎么个效果。 这里找的一个B站UP主的视频,因为现在官方不知道为啥换了换背景&#xff0c;虽然他这个不是官方自制的吧,是自己修改的游戏…

Unity 之 ShaderGraph 实现火焰效果入门级教程

Unity 之 ShaderGraph 实现火焰效果入门级教程 前言一&#xff0c;效果展示二&#xff0c;原理介绍三&#xff0c;实现效果四&#xff0c;使用示例五&#xff0c;完整图示 前言 若你的工程还没有进行基础配置&#xff0c;请查看我的博文Unity 之 ShaderGraph入门使用详解&#…

Unity RPG 黑暗之光 问题记录 下(64-110 技能、装备商店、头像栏、快捷栏、敌人攻击系统、玩家攻击系统)

黑暗之光 64-73技能系统 数据读取 数据 表 黄色枚举&#xff0c;红色没有的 数据 文本 数据 读取 背包时是itemList&#xff0c;读取属性时各有不同&#xff0c;无法统一&#xff0c; 这种方式是为了方便读取&#xff0c;所有需要的数据表都可以在DataHub上读取到&#x…

Unity官方案例噩梦射手开发总结<一> 角色的攻击功能实现

愉悦的寒假生活总是会猝不及防地迎来尾声&#xff0c;这也意味着我大一生活的进度条已经过半了。幸运的是&#xff0c;在我某位优秀的学长的带领下&#xff0c;我完整地开发出来了unity的官方案例噩梦射手并基本实现所有功能&#xff0c;也是让我这个大一的苟蒻积攒了不少的新知…

GAMES202-Shadow总结概括

截图均来自于闫令琪老师的GMAES202-Shadow&#xff0c;本文在于对课程内容进行总结以及加上自己的理解&#xff0c;希望帮助同学们加深对课程内容的理解&#xff0c;如有谬误请各位指正 复习本节需要的基本知识 1. Shadow Mapping 为了获得一张Shadow Mapping&#xff0c;需要…

暗黑破坏神:不朽 unity mmo arpg资源分包精讲

unity大型游戏资源管理——分包 视频讲解&#xff1a;点击观看 unity mmo arpg 暗黑破坏神&#xff1a;不朽 是一个大型的重度游戏&#xff0c;该游戏资源已经超过10G 所以它用了资源分包技术减少下载时间。 首包只包含基础资源&#xff0c;在玩家玩第一关的时候&#xff0c;后…

股票卖出技巧及原则,你了解哪些

股票卖出技巧及原则&#xff0c;你了解哪些&#xff1f;有句股谚说&#xff0c;“会买的是徒弟&#xff0c;会卖的是师傅&#xff0c;会空仓的是祖师爷”。以前都是把大部分精力放在了选股和如何买股上面&#xff0c;而对如何卖股票太忽视了。难怪总是出不了师&#xff0c;小学…

通达信破底翻选股公式,用缠论底分型进行优化

上次在写《通达信破底翻形态选股公式&#xff0c;选出破底之后再翻回的股票》这篇文章时&#xff0c;编写破底翻选股公式就考虑使用缠论底分型&#xff0c;但是底分型的包含关系较为复杂&#xff0c;不容易处理&#xff0c;只能暂时搁置&#xff0c;采用了一种简单的方式&#…

股票大作手操盘术[图解]

目录 第一章&#xff1a;投机是一项挑战 第二章 何时入场才是好时机 第三章 追随领头羊 第四章 手里的钱财 第五章 关键点 第六章 百万美元的大错 第七章 三百万美元的盈利 第八章 利弗莫尔市场要决 杰西•利弗莫尔为什么能在投机事业中取得巨大成功&#xff0c;这…

【通达信指标公式】主力博弈分时指标,分时图抓日内弱转强牛股

GHYJKU:BETWEEN((CLOSE*1)/(SUM(AMOUNT,BARSCOUNT((CLOSE*1)))/SUM(VOL*100,BARSCOUNT((CLOSE*1)))),1.05,0.95); VBNH:IF(GHYJKU0,MA((CLOSE*1),BARSCOUNT((CLOSE*1))),(SUM(AMOUNT,BARSCOUNT((CLOSE*1)))/SUM(VOL*100,BARSCOUNT((CLOSE*1))))); 紫色跟风:EXPMA((CLOSE/VBNH),…

ChatGPT写代码之——CodeWhisperer在VS Code下如何安装

一、安装 1. 在VS Code扩展中搜索AWS 点安装就安装好了 #二、配置 1. 点击状态栏出现的AWS 选择add New Connection 选择Use a personal email to sign up and sign in with AWS Builder ID 选择Copy Code for AWS builder ID 跳转到浏览器 2. 在浏览器上一步步用自己的邮…

计算机程序设计类论文,计算机编程论文

计算机编程论文 介绍:本栏目是计算机和编程和论文相关的论文例文,免费教你怎么写关于计算机编程的论文提供相关文献资料。 【摘 要】本探究经过问卷调查、现场采访、走访调查、查阅文献资料等方法对河南省各大高校计算机专业大学生的学习情况(特别是编程能力)进行了调查和研。 …

爱丁堡计算机专业硕士世界排名,爱丁堡大学计算机世界排名

导读&#xff1a;,伴随着科技与经济的高速发展&#xff0c;计算机技术专业成为一门热门的专业&#xff0c;越来越受到人们的欢迎&#xff0c;学校的师资力量和教育水平&#xff0c;也直接成为影响我们选择高校的原因之一。 伴随着科技与经济的高速发展&#xff0c;计算机技术专…

爱丁堡大学计算机专业alevel,爱丁堡大学alevel要求?

原标题&#xff1a;爱丁堡大学alevel要求&#xff1f; 爱丁堡大学接受A-level和国际文凭课程的直接申请&#xff0c;每个学位课程都必须达到特定标准的要求才能入学。例如&#xff1a;申请爱丁堡大学商学院本科课程A-level要求AAA-ABB&#xff0c;兽医学(5年制)A-level要求为AA…