【Unity】玩家血条控制方案

Unity中Image组件

Image

链接: 传送门(Image组件Unity官方文档)

Image组件是一个UI组件在Unity中是一个非常常用的组件,包括咱们平常玩游戏的的背包,血条,游戏菜单,如果是基于Unity游戏引擎开发的都必须用到这个组件,这个组件最基础的用法就是显示一个图片在UI界面上,这是这个组件的基本结构:
Image组件

Source Image :这个的功能就是存放图片,如果你拖放了一张图片上去那么在Game和Scene窗口中你都可以看到这个图片
Color:这个就是为你的图片调颜色
Material材质,这个就是为你的图片增加预设好的材质如果学习过Unity3D的朋友应该知道这是什么

剩下功能我就不一一介绍了给大家介绍一下比较基本的部分

Filled模式

Filled
在Unity中Image有许多的Type模式可供你选择,选择方式如上图所示
ImageType --> Filled

Filled模式主要用来制作进度条,血条,加载条等动态变化的UI界面,是一个非常常用的模式

在第二行的Fill Method中就如字面意思说所意味这填充方法,
包括但不限于横向填充,纵向填充,旋转填充等等(此篇文章用于解释横向填充)

这个填充主要看个人需要,如果你做的血条是那种星露谷的纵向血条那么我推荐你选择Vertical,如果你想做那种旋转式血条我推荐你选择360的模式

制作教程

编辑器操作

接下来正式开始教程,我想要实现的效果类似于当血条减少后会有一个缓冲条,那么我们就要设置两个条外加一个背景图片

步骤一:创建组件

1.在UI界面下创建一个Canvas
-----------创建方法:鼠标右键 UI-> Canvas

2.在Canvas下创建子物体 PlayerUI
-----------创建方法:鼠标右键Create Empty

3.在PlayerUI下创建子物体 HealthyBar
-----------创建方法:鼠标右键Create Empty

4.在HealthyBar下创建子物体Bg,Effect,HP(名字可以自己取)
-----------创建方法:鼠标右键UI->Image (三次)
就像这样
UI
小心得:这里我创建了一个场景单独存放UI方便后期一起管理,这是一个很好的开发方式建议大家也都采用这种开发方式很整洁美观自己代码敲起来也爽

步骤二: 设置组件

在三个图片组件上设置你所想要的图片这里,并且设置你所需要的属性,这里我直接给出我的方案:
Bg:BackGround,血条的背景图片,他是静态不变的我就给他设置成了Simple
在这里插入图片描述
Effect:这个是跟随血条移动的缓冲条实现类似血条缓冲的效果是动态的,我便给他设置成了适合的Filled
在这里插入图片描述

HP:这个就是血条了效果是动态的,我便给他设置成了适合的Filled
在这里插入图片描述
到此我们就创建好了所有的组件设置了,接下来就让我进入代码阶段把。

代码

首先我们要实现这个功能那我们就要在脚本上拿到关于这个的Image组件,接下来我需要的是那么显而易见我们的第一步就是拿到组件:

	[Header("图片组件")]
    [SerializeField] [Tooltip("背景")] private Image bg;
    [SerializeField] [Tooltip("Effect")] private Image effect;
    [SerializeField] [Tooltip("HP")] private Image hp;
    
    [Header("属性")]
    [SerializeField] [Tooltip("缓冲效果程度")] private float buff;
    [SerializeField] [Tooltip("玩家当前血量")] public float currentHp;
    [SerializeField] [Tooltip("最大血量")] public float maxHp;

接下来我们返回Unity
先把这个脚本挂在HealthyBar上
再为这些组件赋值(直接拖拽就行)
在这里插入图片描述
那么接下来我们就在Update里面实时监控血条的变化,一旦我们的CurrentHP有所变化就立刻马上做出变化
UI更新协程
UpdateUI():

设置实际血条(hp)的填充量为当前血量比例

如果特效血条(effect)比实际血条多,则缓慢减少特效血条(缓冲效果)

如果特效血条比实际血条少,则直接对齐(快速恢复情况)

-------------这里如果不了解协程的话最好先去了解一下协程----------------

	private void Start()
    {
        currentHp = maxHp;
    }
    private void Update()
    {
        StartCoroutine(UpdatePlayerHealthyUI());
    }
    
    private IEnumerator UpdatePlayerHealthyUI()
    {
        hp.fillAmount = currentHp / maxHp;
        while (effect.fillAmount > hp.fillAmount)
        {
            effect.fillAmount -= buff;
            yield return new WaitForSeconds(0.5f); // 等待0.5秒
        }
        if (effect.fillAmount < hp.fillAmount)
        {
            effect.fillAmount = hp.fillAmount;
        }
    }

接下来就是直接减少或者增加这个组件的currentHp这个看自己项目的具体情况

我给出的方案是使用事件呼叫的方式,一旦呼叫这个事件那么直接减少血量并播放动画

	private void OnEnable()
    {
        EventHandler.AddHealthyUI += OnHealthyUIAdd;
        EventHandler.DeleteHealthyUI += OnHealthyUIDelete;
    }
    private void OnDisable()
    {
        EventHandler.AddHealthyUI -= OnHealthyUIAdd;
        EventHandler.DeleteHealthyUI -= OnHealthyUIDelete;
    }

    private void OnHealthyUIAdd(float addHealthyValue)
    {
        
        currentHp += addHealthyValue;
        if (currentHp > maxHp) currentHp = maxHp;
    }
    private void OnHealthyUIDelete(float deleteHealthyValue)
    {
        currentHp -= deleteHealthyValue;
    }

这里我在网上学习了一种EventHandler来管理所有事件的变成模式推荐大家学习

using System;
using UnityEngine;

public class EventHandler
{
    public static event Action<float> AddHealthyUI;
    public static void CallAddHealthyUI(float attack_healthy)
    {
        AddHealthyUI?.Invoke(attack_healthy);
    }
    public static event Action<float> DeleteHealthyUI;
    public static void CallDeleteHealthyUI(float beattack_healthy)
    {
        DeleteHealthyUI?.Invoke(beattack_healthy);
    }
}

结束

效果展示

演示

感谢大家看我的文章,希望大家多多支持我!!!

### 实现 Unity 2D 游戏中跟随角色功能 为了实现能够动态地跟随玩家移动的效果,可以通过脚本控制 UI 元素的位置来完成这一目标。以下是具体的解决方案: #### 使用 Canvas 和 Image 组件创建Unity 中,通常会使用 `Canvas` 来承载所有的 UI 元素。通过将作为子对象附加到玩家对象上,并调整其位置和旋转属性,可以让它始终跟随玩家。 1. 创建一个新的 `UI -> Image` 对象并命名为 `HealthBar`。 2. 将该图像的颜色设置为红色或其他适合表示生命值的颜色。 3. 调整 `RectTransform` 的大小以匹配所需的宽度和高度。 #### 编写脚本来更新位置 下面是一个简单的 C# 脚本示例,用于使始终保持在玩家上方一定距离处[^4]: ```csharp using UnityEngine; public class HealthBarFollow : MonoBehaviour { public Transform target; // 玩家的Transform组件 private Vector3 offset = new Vector3(0, 2, 0); // 相对于玩家的位置偏移量 void LateUpdate() { if (target != null) { transform.position = Camera.main.WorldToScreenPoint(target.position + offset); } } } ``` 此脚本中的核心逻辑在于利用 `LateUpdate()` 方法,在每一帧渲染之后重新计算的位置。这里还考虑到了摄像机视角的变化可能影响屏幕坐标系下的物体显示位置,因此采用了 `Camera.main.WorldToScreenPoint()` 函数转换世界空间坐标至屏幕空间坐标[^5]。 #### 设置父子关系(可选) 另一种方法是直接把健康栏设成玩家的游戏物件的孩子节点。这样就不必手动同步两者之间的相对位移了。不过需要注意的是,当采用这种方式时要确保父级变换不会意外扭曲或缩放子级UI元素[^6]。 #### 注意事项 - 如果游戏场景中有多个相机,则需指定具体哪台负责映射位置。 - 建议给添加遮罩层(Mask),以便只展示特定区域内的部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值