RPG游戏《黑暗之光》流程介绍与代码分析之(十一):装备购买、经验条以及环境碰撞器

本文主要是介绍RPG游戏《黑暗之光》流程介绍与代码分析之(十一):装备购买、经验条以及环境碰撞器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第十一章 装备购买、经验条以及环境碰撞器

本章内容较零散,主要是完善几个功能,即借助之前做好的装备系统实现装备商店与物品栏的交互,以及经验条和环境碰撞器的添加。

11.1 装备购买功能

我们首先添加商店NPC,类似药品商人,可参考7.2.1节( 链接)
添加完NPC后,正式进入装备商店的设计。由于装备比药品多,需要要装备商店的UI要结合药品商店和技能列表的下拉功能,如下左图所示。
在UI root下新建EquipmentShop作为装备商店的UI。将UI界面下Skill的SkillGrid和ScrollBar、DrugShop下的一个Item(上右图中(1)),复制一份到EquipmentShop下,将DrugShop中的Item改名为EquipmentShopItem(上右图中(2))

为EquipmentShopItem创建一个脚本EquipmentShopItem,用以显示物品信息,代码如下
using UnityEngine;
using System.Collections;public class EquipmentShopItem : MonoBehaviour {public static EquipmentShopItem _instance;private int id;private ObjectsInfo.ObjectInfo info;private UISprite icon_name;    //添加各子物体的引用private UILabel equipment_label;private UILabel equipment_buyMoney;private UILabel equipment_describe;void Awake(){_instance = this;}public void SetId(int id)    //通过id更新EquipmentShopItem下子物体的信息{InitProperty ();this.id = id;info = ObjectsInfo._instance.GetObjectInfoFromDict (id);icon_name.spriteName = info.icon_name;equipment_label.text = info.name;equipment_buyMoney.text = info.price_buy.ToString();if (info.attack > 0){equipment_describe.text = "+Attack:" + info.attack;}else if (info.defense > 0){equipment_describe.text = "+Defense:" + info.defense;}else if(info.speed > 0){equipment_describe.text = "Speed:" + info.speed;}}void InitProperty()    //初始化子物体{icon_name = transform.Find ("Equip").GetComponent<UISprite> ();equipment_label = transform.Find ("EquipLabel").GetComponent<UILabel> ();equipment_buyMoney = transform.Find ("BuyMoney").GetComponent<UILabel> ();equipment_describe = transform.Find ("Describe").GetComponent<UILabel> ();}}
之后需要通过访问ObjectsInfoInList中的装备信息,在EquipmentShop脚本中新建一个数组,用以管理所有的装备id(2001~2012),并添加一个grid引用,用于管理grid并实现动态添加装备的功能。
    public GameObject equipmentItemPrefab;public int[] EquipmentID;public UIGrid grid;

将动态创建装备写成一个函数,命名为InitEquipShop,代码如下(参考9.2.1的Grid, 链接)
    void InitEquipShop(){foreach (int id in EquipmentID)    //遍历所有装备id并创建{GameObject itemGO = NGUITools.AddChild(grid.gameObject,equipmentItemPrefab);grid.AddChild(itemGO.transform);itemGO.GetComponent<EquipmentShopItem>().SetId(id);}}
结果如下图所示。

购买装备同样参照药品的购买。我们在EquipmentShop脚本中新建一个函数OnBuyButtonClick(),并赋值给Prefab中的EquipmentShopItem的BuyButton,访问EquipmentShop中的Buy()函数,它们各自的实现如下
    public void OnBuyButtonClick(){EquipmentShop._instance.Buy (id);}public void Buy(int id){int buyMoney = ObjectsInfo._instance.GetObjectInfoFromDict (id).price_buy;    //获取装备价格bool success = Inventory._instance.IsGetCoinSuccess (buyMoney);    //判断当前剩余金额是否大于装备价格if (success){Inventory._instance.GetId(id);}}
即可实现购买功能(这里的功能完全可以在OnBuyButtonClick()函数中直接实现,多此一举的原因主要是因为面向对象的编程方式,在EquipmentShop进行购买会更易于维护)

11.2 经验条的显示

经验条用Colored Progress Bar显示,并添加一个EXPBar脚本控制,代码如下。
using UnityEngine;
using System.Collections;public class EXPBar : MonoBehaviour {public static EXPBar _instance;private UISlider progress;    void Awake(){_instance = this;progress = this.GetComponent<UISlider> ();    //取得进度条信息}public void SetValue(float value){progress.value = value;    //改变进度条的显示}}
经验条涉及到经验属性,因此在PlayerStatus中添加这一属性,并通过一个函数控制
    public float expCurrent = 0;    //当前经验public void GetExp(float exp){this.expCurrent += exp;    //当前exp加上杀怪获取int totalExp = 100 + this.level * 30;    //等级与经验的对应公式while (this.expCurrent >= totalExp)    //用while循环判断角色是否连升多级,若是,每升级一次,都增加技能点,并更新expCurrent的显示{++level;expCurrent -= totalExp;point_remain += 5;totalExp = 100 + this.level * 30;}EXPBar._instance.SetValue (this.expCurrent / totalExp);    //更新进度条的显示}
在之后击杀怪物时,我们再完善这一功能。
11.3 给环境添加碰撞器
现在角色在移动时可以穿越障碍物、直接过河等操作,这显然是不合理的,如下图所示
因此本节对此问题进行改善。我们在Hierarchy中添加一个空的Empty,命名为Colliders,作为碰撞器的存储位置,新建一个3D的Cube,作为碰撞器,如下左图所示。通过Crrl+D复制,以达到地图边界创建的效果,如下右图
对于一些可以行走的地方,例如桥,我们需要添加Mesh Collider,并更改它的Tag为Ground以实现在桥上的行走效果。为了去除围墙的显示效果,我们将Mesh Filter和Mesh Render移出即可。

这篇关于RPG游戏《黑暗之光》流程介绍与代码分析之(十一):装备购买、经验条以及环境碰撞器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/223727

相关文章

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs