Unity 傷害數字顯示
參考鏈接https://blog.csdn.net/book_longssl/article/details/39610775?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-7&spm=1001.2101.3001.4242
試著做了下傷害數字的顯示 效果如下

首先是新建一個c#腳本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DamageGUI : MonoBehaviour
{
private Vector3 mTarget;
private Vector3 mScreen;
public float value;
public float ContentWidth = 100;
public float ContentHeight = 50;
private Vector2 mPoint; //GUI坐標
public float DestoryTime = 2.0f; //傷害數字消失時間
// Start is called before the first frame update
void Start()
{
mTarget = transform.position; //獲取目標位置
mScreen = Camera.main.WorldToScreenPoint(mTarget); //轉化為螢屏位置
mPoint = new Vector2(mScreen.x, Screen.height - mScreen.y);
StartCoroutine("Free"); //開啟一個協程
}
// Update is called once per frame
void Update()
{
transform.Translate(Vector3.up * 0.5f * Time.deltaTime); //傷害數字上移效果
mTarget = transform.position;
mScreen = Camera.main.WorldToScreenPoint(mTarget);
mPoint = new Vector2(mScreen.x, Screen.height - mScreen.y);//實時變化位置
}
void OnGUI()
{
if (mScreen.z > 0) //傷害數字顯示
{
GUI.Label(new Rect(mPoint.x, mPoint.y, ContentWidth, ContentHeight), value.ToString());
}
}
IEnumerator Free() //協程,傷害數字時間一到消失
{
yield return new WaitForSeconds(DestoryTime);
Destroy(this.gameObject);
}
}
隨意新建一個空的物體
取名為DamageText,插入前面寫好的DamageGUI腳本
并設為預制體,放入Resources檔案夾

隨后在人物的頭頂位置Create Empty Object
我這里是新建了一個statusBar 以后也可以用于制作例如眩暈、減速等

隨后在之前寫好的戰斗模塊中呼叫這個DamageText預制體
public GameObject DamageGUI;
void Start()
{
DamageGUI = Resources.Load("DamageText") as GameObject;
}
public void AddHp(float value) {
GameObject DamageText = (GameObject)Instantiate(DamageGUI, transform.DeepFind("statusBar").gameObject.transform.position, Quaternion.identity);
DamageText.GetComponent<DamageGUI>().value = value;
}
呼叫這個預制體的腳本位于PlayerHandle這一層中


而初始的Damage GUI是空的,需要將預制體拖入,但為了不每次新建角色怪物時重新拖入,這里我使用了
DamageGUI = Resources.Load("DamageText") as GameObject;
從Resources資源檔案夾獲取之前放入的預制體,運行后就可以自動獲取
同時生成傷害數字的起始位置也是向下搜索
transform.DeepFind("statusBar").gameObject.transform.position
DeepFind的代碼如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class TransformHelpers
{
public static Transform DeepFind(this Transform parent, string targetName) {
Transform tempTrans = null;
foreach (Transform child in parent)
{
if (child.name == targetName)
{
return child;
}
else {
tempTrans = DeepFind(child, targetName);
if (tempTrans != null) {
return tempTrans;
}
}
}
return tempTrans;
}
}
簡單的白字傷害數字就此完成,此后還需添加樣式,例如更改傷害數字的大小,應該是從跳出時最大,逐漸變小,同時如果是暴擊,得變個顏色,而且隨著時間漸漸透明等,留待以后完成,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/265495.html
標籤:其他
下一篇:普歌-允異團隊-【Java實體】一起做一個簡單的王者榮耀RPG吧!從設計思路到代碼實作一條龍!-登錄與注冊(IO流)/記錄時間/屬性面板呈現
