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

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写   很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。   蓝山山   年龄:24   号码:12345678910   地址:上海市 邮箱:jianli@jianli.com   教育背景   时间:2011-09到2015-06   学校:蓝山大学   专业:护理学   学历:本科

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

UnrealScriptIDE调试环境部署

先安装vs2010   再安装VSIsoShell.exe, 下载地址 https://pan.baidu.com/s/10kPNUuDGTbWXbz7Nos-1WA       fd3t   最后安装unside,下载地址 https://archive.codeplex.com/?p=uside  安装中间有一步选择Binary文件夹要选对路径。   安装好以后,启动 UDKDe

公共筛选组件(二次封装antd)支持代码提示

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件 使用到的库 npm i antdnpm i lodash-esnpm i @types/lodash-es -D /components/CommonSearch index.tsx import React from 'react';import { Button, Card, Form } from 'antd'

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

工作流Activiti初体验—流程撤回【二】

已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流Activiti初体验【一】》 完整流程图 我们研究一下分发任务撤回到发起任务,其他环节的撤回类似 撤回的原理大概如下: 将分发任务后面的方向清空,把发起任务拼接到原来的判断网关,然后结束分发任务,这样流程就到发起任务了 此时的流程如上图,