Unity3D实践3:BOSS血条

 

前文:https://blog.csdn.net/jaihk662/article/category/8688031(UGUI)

实现效果在这~:

 

第一步:制作代表血条的UI

除了LayerNum,其它全部都是图片(Image)

对于所有的“血条”图片,设置如下:

最后效果如下:

两条技巧:

  • 当你做完一套小UI时,建议拖成预制体
  • 对于同一层的UI,例如上面的三张血条图片,排位在前面的图片会被排外在后面的图片遮挡,也就是排位=深度,除此之外,父物体一定会被其子物体遮挡,所以可以通过调整UI在Hierarchy面板中的位置来调整UI的层数

 

第二步:编写血条主逻辑

直接上代码,代码中有注释(脚本拖到血条父物体"PlayerBlood"上)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MainHp : MonoBehaviour
{
    private Text picNum;
    private Transform myTran;
    private Image pic1, pic2, pic3;     //因为样例只有三个血条,所以这里可以直接定义三个字段
    private List<Image> bloodList = new List<Image>();      //用于管理每一层的血条

    private int whichPic;       //到了第几个血条
    private float hitPoint, selfPoint, temp;
    void Start()
    {
        myTran = this.GetComponent<Transform>();
        pic1 = myTran.Find("Layer1").GetComponent<Image>();
        pic2 = myTran.Find("Layer2").GetComponent<Image>();
        pic3 = myTran.Find("Layer3").GetComponent<Image>();
        picNum = myTran.Find("LayerNum").GetComponent<Text>();
        bloodList.Add(pic3);
        bloodList.Add(pic2);
        bloodList.Add(pic1);

        whichPic = 0;
        hitPoint = 1200;            //血量上限
        temp = selfPoint = hitPoint / 3;        //每一条血量值
        picNum.text = "x" + (3 - whichPic);
    }
    void BeenHit(float now)         //参数now为角色受到的伤害
    {
        if (whichPic == 2 && now >= selfPoint)              //如果只剩下一管血,并且当前伤害足以致命
        {
            selfPoint = 0;
            bloodList[whichPic].fillAmount = 0;
            picNum.text = "Sorry";
            return;
        }
        while (now > temp)          //防止伤害过高,一击打穿多管血量
        {
            now -= temp;
            bloodList[whichPic++].fillAmount = 0;           //简单代码逻辑,稍微会写点程序的都能看懂,这些就不讲了。。。
            picNum.text = "x" + (3 - whichPic);
            if (whichPic == 2 && now >= selfPoint)
            {
                selfPoint = 0;
                bloodList[whichPic].fillAmount = 0;
                return;
            }
        }
        if (now < selfPoint)
        {
            selfPoint -= now;
            bloodList[whichPic].fillAmount = selfPoint / temp;
        }
        else
        {
            bloodList[whichPic++].fillAmount = 0;
            selfPoint = temp - (now - selfPoint);
            picNum.text = "x" + (3 - whichPic);
            bloodList[whichPic].fillAmount = selfPoint / temp;
        }
    }
}

 

第三部:血条与角色交互

上面的代码因为已经将“扣血”封装成了方法,所以只需要角色绑定血条,当其受到伤害时调用方法即可

一个例子如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMechine : MonoBehaviour
{
    //……
    void OnTriggerEnter(Collider coll)
    {
        if (coll.tag == "Monster1Killer" && isDied==false)
        {
            myAnimator.SetTrigger("Damage");
            hp -= 20;
            myBlood.SendMessage("BeenHit", 20);
            if (hp <= 0)
                isDied = true;
        }
    }
}

搞定!

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值