Unity3D实践3:BOSS血条

 

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

实现效果在这~:

Unity3D实践3:BOSS血条_第1张图片

 

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

Unity3D实践3:BOSS血条_第2张图片

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

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

Unity3D实践3:BOSS血条_第3张图片

最后效果如下:

Unity3D实践3:BOSS血条_第4张图片

两条技巧:

  • 当你做完一套小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 bloodList = new List();      //用于管理每一层的血条

    private int whichPic;       //到了第几个血条
    private float hitPoint, selfPoint, temp;
    void Start()
    {
        myTran = this.GetComponent();
        pic1 = myTran.Find("Layer1").GetComponent();
        pic2 = myTran.Find("Layer2").GetComponent();
        pic3 = myTran.Find("Layer3").GetComponent();
        picNum = myTran.Find("LayerNum").GetComponent();
        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;
        }
    }
}

搞定!

 

你可能感兴趣的:(☆游戏开发☆,Unity3D)