制作Unity中的单位血条
本文章用于记录Unity的学习过程,如有疑问,欢迎交流。
1.血条的显示
在Unity场景中创建空物体,然后新建两个Image(图片),当然只用一个也行,一个作为填充来显示血量,一个作为血条的外框。


然后在Unit上添加Slider组件
并将Transition和Navigation均设为None

将Fill(血条背景)拖拽到 Fill Rect

之后应该这样

之后就可以通过下方的Value 来控制填充的显示


可以将Fill设置为红色

也可适当添加UI

可以通过设置Slider 的最大值和最小值(一般都是0),来直接以整数来显示血条,可以避免区间在0-1是以小数比例来显示血条,
避免了不必要的麻烦和计算

选中Whole Number后,可以将Value限制为整数

2.脚本
要实现血条,从面向对象角度来说只至少需要两个脚本,控制血条显示的脚本和单位的血量等基本信息的类
新建脚本HealthBar
血条脚本的作用仅仅是显示和更新血量
public class HealthBar : MonoBehaviour
{
public Slider slider;
public void SetMaxHeath(int health) //设置最大血量
{
slider.maxValue = health;
slider.value = health;
}
public void SetHealth(int health) //刷新血量
{
slider.value = health;
}
}
然后是单位脚本Unit(类)
目前该单位只包含血量相关信息
public class Unit : MonoBehaviour
{
public int maxHealth = 100; //最大血量
public int currentHealth; //当前血量
public HealthBar healthBar; //声明一个HealthBar类
private void Start()
{
currentHealth = maxHealth; //初始化血量
healthBar.SetMaxHeath(maxHealth); //刷新血量显示
}
private void Update()
{
if (Input.GetKey(KeyCode.Space))
{
TakeDamage(20);
}
}
private void TakeDamage(int damage) //受伤方法
{
if (currentHealth >= damage && currentHealth > 0)
{
currentHealth -= damage;
}
healthBar.SetHealth(currentHealth); //刷新血量显示
}
}
然后将对应的血条搭载到Unit上

运行后每按一次空格血量便会减少20

3.血条颜色渐变
若想实现血量充足时为绿色,中等为黄色,少量为红色
可以使用 Gradient 类,该类能够动态控制颜色
在HealthBar脚本中声明一个Gradient
//public class HealthBar : MonoBehaviour
//{
// public Slider slider;
public Gradient gradient;
//public void SetMaxHeath(int health)
//{
//slider.maxValue = health;
//slider.value = health;
//}
//public void SetHealth(int health)
//{
//slider.value = health;
//}
//}
这样便能修改颜色渐变
注意:声明该类仅仅是有一个能够输入的数据,改变颜色还需要相应的方法

点击Gradient打开
这里存在Blend和Fixed两种模式


根据喜好选择即可,这样设置后血条就会呈现以上渐变效果
然后是代码
//public class HealthBar : MonoBehaviour
//{
//public Slider slider;
public Gradient gradient; //声明Gradient,在Inspector面板可对其赋值
public Image fill; //声明填充图形,用于修改所需的填充颜色
//public void SetMaxHeath(int health)
//{
//slider.maxValue = health;
//slider.value = health;
fill.color = gradient.Evaluate(1f); //填充颜色为1f,就是满血
//}
//public void SetHealth(int health)
//{
//slider.value = health;
fill.color = gradient.Evaluate(slider.normalizedValue);//填充颜色为slider的值映射到0-1,就是当前血量百分比
//}
//}
注意:
gradient.Evaluate(float value)会根据给定的值,来计算对应的颜色
后面value的值限制在 0 — 1 之间,其实就是根据输入来百分比计算对应颜色
例如剩余50滴血,总血量100,这里value就应该为 50/100 为0.5,会返回剩余百分之50血量时 gradient 中对应的颜色
4.血条的显示方式
新建一个方块视为一个单位
4.1显示在HUD上
无需多余修改,在Canvas移动位置即可

4.2.显示在单位上,可以在头上也可以在脚下
将 HealthBar 所在的画布(Canvas)的渲染模式修改为World Space

这样画布就会成为可移动的物体
同时适当修改Canvas大小

然后将Canvas拖拽到Unit下成为子物体

然后需要让血条始终面向摄像机
创建脚本BillBoard
搭载到Canvas上
public class BillBoard : MonoBehaviour
{
public Transform cam; //需要朝向的摄像机
void LateUpdate()
{
transform.LookAt(transform.position + cam.forward);
}
}
这里采用 LateUpdate() ,若为其它Update(),会在相机运动时同时计算血条位置,会发生抖动
应在计算完摄像机位置之后再计算血条位置
制作Unity中的单位血条的更多相关文章
- Unity UGUI HUD 怪物血条实现
首先做一个血条,创建一个名为Follow3DObject的脚本添加到血条控件上. Follow3DObject.cs的代码如下: using UnityEngine; using System.Col ...
- unity制作简单血条
学习Unity已经10天了,也没发现有什么长进,真的急.昨天仿着官方Demo做了个射击游戏轮廓,其中需要给每个怪做一个血条. 搜了一些,挺复杂的,用NGUI或者UGUI,外加很长的代码...不过还是找 ...
- Unity中制作血条2.0
##1.血量显示 不必像之前那样添加Slider组件 直接创建Image 在添加Source Image之后,将Image Type 修改为Filled 通过修改Fill Mode就可以显示不同效果 ...
- Unity NGUI弧形血条的制作
unity版本:4.6 NGUI版本:3.6. (转载请注明参考链接及作者) 参考链接:http://www.cnblogs.com/louissong/p/3841656.html,作者:博客园 L ...
- Unity NGUI 血条制作
NGUI 血条制作步骤 实现过程: 模拟血条的变化当点击按钮Button是血条会实时发生变化. 1.向Unity中导入NGUI2.6.3.unitypackage 点击create your ui 后 ...
- 关于Unity中NGUI的3D角色血条的实现
首先要到Unity的Assets Store里面去下载一个扩展的Package叫NGUI HUD Text v1.13(81),注意如果没有安装NGUI就必须先安装NGUI插件,否则会用不了,因为HU ...
- unity如何显示血条(不使用NGUI)
用unity本身自带的功能,如何显示血条? 显示血条,从资源最小化的角度,只要把一个像素的色点放大成一个矩形就足够,三个不同颜色的矩形,分别显示前景色,背景色,填充色,这样会消耗最少的显存资源. un ...
- [Unity]制作游戏中名字板的过程记录
先大概说一下需求: 1 每个模型上都要有名字板:人.怪.npc等等. 2 名字板上会显示:名字(文字).血条(图片)等 3 因为是透视相机,名字板离得太近会变得超大,且主角移动,名字板的位置相对于相机 ...
- unity 中UGUI制作滚动条视图效果(按钮)
1.在unity中创建一个Image作为滚动条视图的背景: 2.在Image下创建一个空物体,在空物体下创建unity自带的Scroll View组件: 3.对滑动条视图的子物体进行调整: 4.添加滚 ...
随机推荐
- MATLAB绘制一幅中国地图
今天博主跟大家讲一下如何用MATLAB制作一幅中国地图,那废话不多说,我们先看一下最终效果吧. mercator墨卡托圆柱投影地图 lambert兰伯特圆锥投影地图 一张中国地图大概包括以下要素: 中 ...
- RepLKNet:不是大卷积不好,而是卷积不够大,31x31卷积了解一下 | CVPR 2022
论文提出引入少数超大卷积核层来有效地扩大有效感受域,拉近了CNN网络与ViT网络之间的差距,特别是下游任务中的性能.整篇论文阐述十分详细,而且也优化了实际运行的表现,值得读一读.试一试 来源:晓飞 ...
- Python之GUI用户界面Tkinter(一)
Label Label(标签)组件用于在屏幕上显示文本或图像,仅能显示单一字体的文本 •参数 Label(master=None, **options) (class)**options 组件选项,下 ...
- ActiveX 是什么,和IE什么关系
在推出25年多以后,IE浏览器终于要退役了. 据外媒报道,微软决定自2022年6月15日起,让IE浏览器彻底退出互联网舞台,并全面改用Microsoft Edge浏览器. 关于IE的历史可以参考这篇文 ...
- python 模块之 selenium 自动化使用教程
一.安装 pip install Selenium 二.初始化浏览器 Chrome 是初始化谷歌浏览器 Firefox 是初始化火狐浏览器 Edge 是初始化IE浏览器 PhantomJS 是一个无界 ...
- python 输入加密的MD5值,并搜索文件中的原始值
此程序可以输入一串MD5的值,并在指定的文件中搜索到原始值.程序自有用处. #输入加密的MD5值,并搜索文件中的原始值 by qianxiao996 #博客地址:https://blog.csdn.n ...
- 基于SpringBoot实现自动装配返回属性
一:需求背景 在业务开发中经常会有这个一个场景,A(业务表)表中会记录数据的创建人,通常我们会用userId字段记录该数据的创建者,但数据的使用方会要求展示该数据的创建者姓名,故我们会关联用户表拿该用 ...
- Thread 类的 sleep()方法和对象的 wait()方法都可以让线 程暂停执行,它们有什么区别?
sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程 暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保 持,因此休眠时间结束后会自动恢复(线程回 ...
- 什么是可重入锁ReentrantLock?
举例来说明锁的可重入性 public class UnReentrant{ Lock lock = new Lock(); public void outer(){ lock.lock(); inne ...
- 什么是可重入锁(ReentrantLock)?
举例来说明锁的可重入性 public class UnReentrant{ Lock lock = new Lock(); public void outer(){ lock.lock(); inne ...