我將講述三種不同類型血條UI的實(shí)現(xiàn)
第一種是常見的進(jìn)度條樣式的血條實(shí)現(xiàn):
進(jìn)度條式的血條樣式如圖示

要實(shí)現(xiàn)進(jìn)度條式的血條,我們需要使用到unity的UI中的滑動(dòng)條,它分為Slider滑動(dòng)條,Background滑動(dòng)條的背景,F(xiàn)ill Area填充條,這個(gè)組件就類似于進(jìn)度條不過帶了一個(gè)可以按住滑動(dòng)的滾鈕(Handle Slide Area),這里所用的血條UI去除了這個(gè)組件,可以根據(jù)你的實(shí)際使用需求選擇性刪除它。

在Slider對(duì)象上,你可看到Slider欄最底下有個(gè)value選項(xiàng),改變它的數(shù)值,你就能看到進(jìn)填充條的變化,Slider的子組件Fill Area/Fill上有Rect TransForm如果你沒有將左右設(shè)置為0,那么它不會(huì)將整個(gè)背景欄全部遮完,簡(jiǎn)單理解就是這里的左右相當(dāng)于修改了圖像變換的起始位置。(如果你難以理解,建議應(yīng)該學(xué)習(xí)一定的unity的UI知識(shí)后再來)
根據(jù)value會(huì)變換情況得知,我們只需要寫一個(gè)腳本,將最大值設(shè)置為對(duì)象的最大生命值,最小值默認(rèn)為0,使得value的值和對(duì)象的血量保持一致即可實(shí)現(xiàn)血條變換效果。
//這部分是敵人對(duì)象上部分的代碼
? [Range(0, 1000)]
public int max_blood;//最大血量
private int current_blood;//當(dāng)前血量
? ? //該腳本掛載在AI敵人對(duì)象上,代碼僅供參考
? ? private Blood blood;//控制敵人對(duì)象血條的對(duì)象,Blood是另一個(gè)腳本,unity中沒有這個(gè)類
? ? void Strat()
? ? {
? ? blood = GetComponentInChildren<Blood>();//獲取敵人對(duì)象的血條組件
? ? //Blood腳本是掛載在敵人子對(duì)象的slider上的,實(shí)際情況根據(jù)你自己的設(shè)置位置選擇獲取方式
? ?
? ? //這樣可以匹配不同的敵人的血量來顯示
? ? blood.Set_MaxHP(max_blood);//設(shè)置滑動(dòng)條的最大值最小值等(一般不用改最小值)
? ? }
? ? //控制AI血條值改變的方法,該方法在任何子彈碰撞到該物體時(shí)的OnCollisionStay2D下調(diào)用
? ? public void Change_HP(int change)//change是要修改的血量,正負(fù)皆可
{
? ? ? ? //返回修改后的血量,將值控制在0到max_blood之間
current_blood = Mathf.Clamp(current_blood + change, 0, max_blood);
? ? ? ? //在blood對(duì)象中控制修改數(shù)值
blood.Set_CurentHP(current_blood);
? ? ? ? //如果血量小于0就銷毀對(duì)象(正常情況應(yīng)該是先播放死亡動(dòng)畫,關(guān)閉碰撞,再銷毀)
if (current_blood <= 0)
{
Destroy(gameObject);
}
}
//掛載在Slider上的腳本
public class Blood : MonoBehaviour
{
? ? //slider對(duì)象
private Slider slider;
? ?
? ? //由于敵人對(duì)象初始化時(shí)執(zhí)行Set_MaxHP,如果不放在Awake就會(huì)導(dǎo)致slider還為null報(bào)錯(cuò)
? ? //這里不懂,可以參考以前的文章
void Awake()
{
slider = GetComponent<Slider>();
}
? ?
? ? //設(shè)置最大值得范圍,并將當(dāng)前值也設(shè)為最大值(默認(rèn)敵人生成時(shí)是滿血)
public void Set_MaxHP(int max_vlaues)
{
slider.maxValue = max_vlaues;
slider.value = max_vlaues;
}
? ?
? ? //修改數(shù)值,使value保持和當(dāng)前生命值一致
public void Set_CurentHP(int current_vlaues)
{
slider.value = current_vlaues;
}
}
第二種是多個(gè)圖片式的血條實(shí)現(xiàn):
圖片血條就是玩家每受到一次傷害就減少一顆心這樣的效果,用的是UI中的圖像選項(xiàng),效果如圖:

那么問題是如何做到,如果是直接將心的圖片刪除,那么會(huì)回血上的不便。我們?cè)谑褂胾nity時(shí),可能經(jīng)常用到設(shè)置圖像可視性,當(dāng)我們減血,只要把最高位上的心設(shè)置為不可見,這樣當(dāng)我們想要回復(fù)時(shí),只需要再設(shè)置回可見,就能達(dá)到效果。
//玩家部分腳本
? ? private Blood_image blood_Line;//控制圖形血量,初始化由你自己方式和放置的位置來寫,我不再給出
? ?
? ? private int Max_blood;//最大血量大小
? ? private int Current_blood;//具體的血量大小
? ?
? ? //控制圖形血量變化,如果傳入的set是true說明是加血,否則是減血
? ? //提醒一下這種方式僅針對(duì)為每一次傷害或者回血為1的情況,如果大于1則不能使用此方法
? ? public void ChangeHP(bool set)
{
? ? ? ? //修改圖片的可視性,這個(gè)位置的索引正好就是blood
if(set){
? ? ? ? ? ? //限制當(dāng)前血量在范圍內(nèi)
? ? ? ? ? ? Mathf.Clamp(Current_blood + 1, 0, Max_blood);
? ? ? ? ? ? //blood不能直接傳,因?yàn)榧友撬肝恢玫氖鞘冀K不是當(dāng)前需要修改的位置
? ? ? ? ? ? //這一步即使blood已經(jīng)是最大血量是由于是重復(fù)設(shè)為true所以也不會(huì)有問題
? ? ? ? ? ? blood_image.Active(Current_blood - 1, set);?
? ? ? ? }
? ? ? ? else{
? ? ? ? ? ? Current_blood -= 1;//減則是另外一回事,因?yàn)檫@里每次改的是1,和最后的判斷死亡
? ? ? ? ? ? //故不需要使用Mathf.Clamp()
? ? ? ? ? ? blood_image.Active(Current_blood, set);
? ? ? ? }
? ? ? ? if(blood == 0){
? ? ? ? ? ? //無關(guān)部分,省略
? ? ? ? }
}
//blood上的腳本
public class Blood_image : MonoBehaviour
{
public GameObject[] Blood;//控制血圖片對(duì)象組
void Start()
{
//由于我是在編輯器界面直接給Blood添加每個(gè)圖片的對(duì)象的,所有沒有初始化的代碼
? ? ? ? //根據(jù)你的實(shí)際情況可以選擇為添加制的
}
? ?
? ? //設(shè)置圖片可視性
public void Active(int index, bool set)
{
? ? ? ? //根據(jù)傳入對(duì)應(yīng)的位置來修改圖片的可視性
Blood[index].SetActive(set);
}
}
這種血條的問題在于如果對(duì)象屬于擁有高生命值時(shí),我們不可能繪制一堆心心在界面上,一種解決這種問題的方法是設(shè)置圖片的透明度或者大小,當(dāng)這個(gè)圖片的透明度為0或者大小為0時(shí)對(duì)下一張圖片繼續(xù)同樣操作即可。
第三種是畸形血條樣式的實(shí)現(xiàn):
一種常見的畸形血條就是環(huán)形血條,這個(gè)更多是作為技能冷卻條而不是血條,我這里就是技能條的類型,但是可以做成血條,基本的思路是一樣的,如圖左上角。文章來源:http://www.zghlxwxcb.cn/news/detail-768814.html

設(shè)置環(huán)形血條也用的是UI中的圖像選項(xiàng),只不過將其的遮罩方式改為了填充方式(根據(jù)你的需求可以設(shè)置不同的方式,比如這里的環(huán)形遮罩方式是Radial360)當(dāng)你修改了填充度時(shí),圖像就會(huì)根據(jù)填充度環(huán)形的填充,1時(shí)整個(gè)圖像全部顯示,0.5只顯示上半部分(這個(gè)受你設(shè)置的起始點(diǎn)影響),類推一下,你就會(huì)發(fā)現(xiàn)這個(gè)實(shí)現(xiàn)原理其實(shí)和進(jìn)度條幾乎一樣,所以我就不廢話了,放碼!文章來源地址http://www.zghlxwxcb.cn/news/detail-768814.html

//具體原理基本和slider一樣便不再重復(fù)
public class Blood_Circle : MonoBehaviour
{
private Image image;
? ?
? ? //由于fillAmount的范圍只能設(shè)為0~1,因此可以使用Current_blood/Max_blood來計(jì)算
public void SetValue(float value)
{
image.fillAmount = value;
}
}
到了這里,關(guān)于Unity實(shí)現(xiàn)各種樣式的血條的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!