Unity实现各种样式的血条

这篇具有很好参考价值的文章主要介绍了Unity实现各种样式的血条。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我将讲述三种不同类型血条UI的实现

第一种是常见的进度条样式的血条实现:

进度条式的血条样式如图示

unity2d制作人物爱心生命值,unity,游戏引擎,ui,Powered by 金山文档

要实现进度条式的血条,我们需要使用到unity的UI中的滑动条,它分为Slider滑动条,Background滑动条的背景,Fill Area填充条,这个组件就类似于进度条不过带了一个可以按住滑动的滚钮(Handle Slide Area),这里所用的血条UI去除了这个组件,可以根据你的实际使用需求选择性删除它。

unity2d制作人物爱心生命值,unity,游戏引擎,ui,Powered by 金山文档

在Slider对象上,你可看到Slider栏最底下有个value选项,改变它的数值,你就能看到进填充条的变化,Slider的子组件Fill Area/Fill上有Rect TransForm如果你没有将左右设置为0,那么它不会将整个背景栏全部遮完,简单理解就是这里的左右相当于修改了图像变换的起始位置。(如果你难以理解,建议应该学习一定的unity的UI知识后再来)

根据value会变换情况得知,我们只需要写一个脚本,将最大值设置为对象的最大生命值,最小值默认为0,使得value的值和对象的血量保持一致即可实现血条变换效果。

//这部分是敌人对象上部分的代码
    [Range(0, 1000)]
    public int max_blood;//最大血量

    private int current_blood;//当前血量

    //该脚本挂载在AI敌人对象上,代码仅供参考
    private Blood blood;//控制敌人对象血条的对象,Blood是另一个脚本,unity中没有这个类

    void Strat()
    {
    blood = GetComponentInChildren<Blood>();//获取敌人对象的血条组件
    //Blood脚本是挂载在敌人子对象的slider上的,实际情况根据你自己的设置位置选择获取方式
    
    //这样可以匹配不同的敌人的血量来显示
    blood.Set_MaxHP(max_blood);//设置滑动条的最大值最小值等(一般不用改最小值)
    }

    //控制AI血条值改变的方法,该方法在任何子弹碰撞到该物体时的OnCollisionStay2D下调用
    public void Change_HP(int change)//change是要修改的血量,正负皆可
    {
        //返回修改后的血量,将值控制在0到max_blood之间
        current_blood = Mathf.Clamp(current_blood + change, 0, max_blood);

        //在blood对象中控制修改数值
        blood.Set_CurentHP(current_blood);

        //如果血量小于0就销毁对象(正常情况应该是先播放死亡动画,关闭碰撞,再销毁)
        if (current_blood <= 0)
        {
            Destroy(gameObject);
        }
    }
//挂载在Slider上的脚本
public class Blood : MonoBehaviour
{
    //slider对象
    private Slider slider;
    
    //由于敌人对象初始化时执行Set_MaxHP,如果不放在Awake就会导致slider还为null报错
    //这里不懂,可以参考以前的文章
    void Awake()
    {
        slider = GetComponent<Slider>();
    }
    
    //设置最大值得范围,并将当前值也设为最大值(默认敌人生成时是满血)
    public void Set_MaxHP(int max_vlaues)
    {
        slider.maxValue = max_vlaues;
        slider.value = max_vlaues;
    }
    
    //修改数值,使value保持和当前生命值一致
    public void Set_CurentHP(int current_vlaues)
    {
        slider.value = current_vlaues;
    }
}

第二种是多个图片式的血条实现:

图片血条就是玩家每受到一次伤害就减少一颗心这样的效果,用的是UI中的图像选项,效果如图:

unity2d制作人物爱心生命值,unity,游戏引擎,ui,Powered by 金山文档

那么问题是如何做到,如果是直接将心的图片删除,那么会回血上的不便。我们在使用unity时,可能经常用到设置图像可视性,当我们减血,只要把最高位上的心设置为不可见,这样当我们想要回复时,只需要再设置回可见,就能达到效果。

//玩家部分脚本
    private Blood_image blood_Line;//控制图形血量,初始化由你自己方式和放置的位置来写,我不再给出
    
    private int Max_blood;//最大血量大小

    private int Current_blood;//具体的血量大小
    
    //控制图形血量变化,如果传入的set是true说明是加血,否则是减血
    //提醒一下这种方式仅针对为每一次伤害或者回血为1的情况,如果大于1则不能使用此方法
    public void ChangeHP(bool set)
    {
        //修改图片的可视性,这个位置的索引正好就是blood
        if(set){
            //限制当前血量在范围内
            Mathf.Clamp(Current_blood + 1, 0, Max_blood);
            //blood不能直接传,因为加血是它指位置的是始终不是当前需要修改的位置
            //这一步即使blood已经是最大血量是由于是重复设为true所以也不会有问题
            blood_image.Active(Current_blood - 1, set);  
        }
        else{
            Current_blood -= 1;//减则是另外一回事,因为这里每次改的是1,和最后的判断死亡
            //故不需要使用Mathf.Clamp()
            blood_image.Active(Current_blood, set);
        }
        if(blood == 0){
            //无关部分,省略
        }
    }
//blood上的脚本
public class Blood_image : MonoBehaviour
{
    public GameObject[] Blood;//控制血图片对象组

    void Start()
    {
        //由于我是在编辑器界面直接给Blood添加每个图片的对象的,所有没有初始化的代码
        //根据你的实际情况可以选择为添加制的
    }
    
    //设置图片可视性
    public void Active(int index, bool set)
    {
        //根据传入对应的位置来修改图片的可视性
        Blood[index].SetActive(set);
    }
}

这种血条的问题在于如果对象属于拥有高生命值时,我们不可能绘制一堆心心在界面上,一种解决这种问题的方法是设置图片的透明度或者大小,当这个图片的透明度为0或者大小为0时对下一张图片继续同样操作即可。

第三种是畸形血条样式的实现:

一种常见的畸形血条就是环形血条,这个更多是作为技能冷却条而不是血条,我这里就是技能条的类型,但是可以做成血条,基本的思路是一样的,如图左上角。

unity2d制作人物爱心生命值,unity,游戏引擎,ui,Powered by 金山文档

设置环形血条也用的是UI中的图像选项,只不过将其的遮罩方式改为了填充方式(根据你的需求可以设置不同的方式,比如这里的环形遮罩方式是Radial360)当你修改了填充度时,图像就会根据填充度环形的填充,1时整个图像全部显示,0.5只显示上半部分(这个受你设置的起始点影响),类推一下,你就会发现这个实现原理其实和进度条几乎一样,所以我就不废话了,放码!文章来源地址https://www.toymoban.com/news/detail-768814.html

unity2d制作人物爱心生命值,unity,游戏引擎,ui,Powered by 金山文档
//具体原理基本和slider一样便不再重复
public class Blood_Circle : MonoBehaviour
{
    private Image image;
    
    //由于fillAmount的范围只能设为0~1,因此可以使用Current_blood/Max_blood来计算
    public void SetValue(float value)
    {
        image.fillAmount = value;
    }
}

到了这里,关于Unity实现各种样式的血条的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • unity2d实现一个全方位的无限随机地图

    要实现一个全方位的无限随机地图,可以考虑以下步骤: 1.创建一个空的场景,并添加一个相机和一个玩家对象。 2.创建一个TileMap,它将作为你的地图板块。你可以使用随机数生成算法生成各种类型的地形,如森林、草地、沙漠等等,并使用TileMap将它们组装在一起来创建你

    2024年02月07日
    浏览(42)
  • unity2d里实现鼠标拖拽物体的功能

    在 Unity 中实现鼠标拖拽物体的功能需要使用到 Unity 的 Physics 系统。 要实现鼠标拖拽物体,你需要在场景中添加以下内容: 一个 Rigidbody 2D 组件,用于控制物体的运动。 一个 Box Collider 2D 组件,用于检测鼠标与物体的碰撞。 一个脚本,用于监听鼠标的输入,并在鼠标按下时拖

    2024年02月11日
    浏览(43)
  • 【Unity2D】实现打怪掉落物品(如爆金币等)的功能

    本文章记录实现打怪掉落物品的功能,以下代码为2D实现,3D模式稍加修改即可。 目录 一、代码部分 二、注意事项 三、效果展示 创建一个C#脚本命名为Item,并将该脚本挂载到需要掉落的物品上。 1.需要禁用掉落物品与自身和其他人物之间的碰撞(否则可能被物品撞飞)。

    2024年02月11日
    浏览(37)
  • 【用unity实现100个游戏之14】Unity2d做一个建造与防御类rts游戏(附项目源码)

    【视频】:https://www.udemy.com/course/awesome-builder-defender-game-in-unity/?couponCode=CMCOURSEDEC23 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月05日
    浏览(55)
  • Unity2D 实现UGUI滚动鼠标滑轮以鼠标位置点为中心缩放图片

     先放参考文章: Unity3d UGUI以鼠标位置点为中心缩放图片(含项目源码) https://blog.csdn.net/qq_33789001/article/details/117749837 再放实现效果: 说说事情缘由,项目需要用到这个效果,所以上网找了个参考文章,后来不知道为什么失效了,所以想着自己改改,看看是什么毛病。 贴原

    2024年02月11日
    浏览(48)
  • 【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)

    当今,塔防游戏已经成为游戏市场上备受欢迎的一类游戏类型。《保卫萝卜》作为其中的经典之作,深受玩家喜爱。本项目旨在基于《保卫萝卜》的玩法和特点,开发一个Unity2D塔防游戏,让玩家可以在游戏中体验到精彩的策略对抗与刺激的关卡挑战。 本项目将通过Unity引擎进

    2024年02月04日
    浏览(52)
  • 【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)

    本期紧接着上一篇,本期主要内容是实现商店、购买、出售、升级等功能。 新增TurretSettings 配置不同炮塔参数 绘制商店UI 新增TurretCard,渲染商品数据,如果前面有绘制价格文本,还可以渲染价格文本,这里我就偷懒不弄了 挂载脚本,并配置 新增TurretShopManager,商店管理器

    2024年01月21日
    浏览(57)
  • 【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏5(附项目源码,完结)

    本期是本项目的最后一篇,主要内容是配置环境、生成不同敌人、结束重开。 我用的环境素材 https://assetstore.unity.com/packages/2d/environments/2d-sugar-world-asset-pack-urp-256585

    2024年02月05日
    浏览(53)
  • 【Unity2D】角色动画的切换

    第一种方法是设置一个中间状态,从中间状态向其余各种状态切换,且各状态向其他状态需要设置参数 实现动作转移时右键点击Make Transition即可  实现动画转移需要设置条件 点击一种动画到另一种动画的线 ,然后点击加号添加Condition 比如机器人从向左走切换到向右走的条件

    2024年02月15日
    浏览(51)
  • Unity2D学习笔记-Tilemap

    tilemap算是接触了几次,但是无论是看视频还是看文章都一知半解,这次把编辑地图的开始步骤搞清楚。 首先要知道tilemap是做什么的。 这里提到的Tilemap其实不止是Tilemap:Tilemap本身是地图编辑器(虽然我更倾向于理解为“场景”,不过编辑地图才是核心)。之前学的印象是,

    2023年04月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包