using UnityEngine;
using System.Collections;
public class DamagePopup : MonoBehaviour {
//目標位置
private Vector3 mTarget;
//屏幕坐標
private Vector3 mScreen;
//傷害數(shù)值
public int Value;
//文本寬度
public float ContentWidth=100;
//文本高度
public float ContentHeight=50;
//GUI坐標
private Vector2 mPoint;
//銷毀時間
public float FreeTime=1.5F;
void Start ()
{
//獲取目標位置
mTarget=transform.position;
//獲取屏幕坐標
mScreen= Camera.main.WorldToScreenPoint(mTarget);
//將屏幕坐標轉化為GUI坐標
mPoint=new Vector2(mScreen.x,Screen.height-mScreen.y);
//開啟自動銷毀線程
StartCoroutine("Free");
}
void Update()
{
//使文本在垂直方向山產(chǎn)生一個偏移
transform.Translate(Vector3.up * 0.5F * Time.deltaTime);
//重新計算坐標
mTarget=transform.position;
//獲取屏幕坐標
mScreen= Camera.main.WorldToScreenPoint(mTarget);
//將屏幕坐標轉化為GUI坐標
mPoint=new Vector2(mScreen.x,Screen.height-mScreen.y);
}
void OnGUI()
{
//保證目標在攝像機前方
if(mScreen.z>0)
{
//內(nèi)部使用GUI坐標進行繪制
GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString());
}
}
IEnumerator Free()
{
yield return new WaitForSeconds(FreeTime);
Destroy(this.gameObject);
}
}
在上面的代碼中我們需要把握下面幾點:
1野芒、根據(jù)Transform組件獲取位置坐標胆建,將此坐標轉化為屏幕坐標及GUI坐標。
2、常見的四種坐標系:
a、世界坐標:場景中物體的坐標,使用 transform.position獲得。
b、屏幕坐標:以像素來定義的咬像,以屏幕的左下角為(0,0)點生宛,右上角為(Screen.width县昂,Screen.height),Z的位置是以相機的世界單位來衡量的陷舅。如Input.mousePosition即為屏幕坐標倒彰。
c、視口坐標:視口坐標是標準的和相對于相機的莱睁。相機的左下角為(0,0)點待讳,右上角為(1,1)點,Z的位置是以相機的世界單位來衡量的仰剿。
d创淡、GUI坐標:該坐標系以屏幕的左上角為(0,0)點南吮,右下角為(Screen.width琳彩,Screen.height)。
3部凑、在代碼中我們將世界坐標先轉化為屏幕坐標露乏,再轉化為GUI坐標
好了,下面我們將這個腳本綁定在一個空的游戲體上涂邀,并制作成預設施无,在下面的示例中,我們將使用這個預設必孤。
如圖,我們希望實現(xiàn)當角色攻擊紅色的膠囊體時,在游戲場景中顯示玩家對膠囊體造成的傷害值敷搪。具體怎么做呢兴想?我們可以先給模型和膠囊體加上碰撞器,并勾選IsTrigger使其成為一個觸發(fā)器赡勘。我們分別將他們的tag設為Player和Enemy嫂便。接下來,為Enemy編寫一個腳本:[csharp] view plaincopyprint?using UnityEngine;? using System.Collections;? ? public class Enemy : MonoBehaviour {? ? ? ? public GameObject PopupDamage;? ? ? ? void OnTriggerEnter(Collider mCollider)? ? ? {? ? ? ? ? if(mCollider.gameObject.tag=="Player")? ? ? ? ? {? ? ? ? ? ? ? //克隆傷害彈出組件? ? ? ? ? ? ? GameObject mObject=(GameObject)Instantiate(PopupDamage,transform.position,Quaternion.identity);? ? ? ? ? ? ? mObject.GetComponent().Value=Random.Range(20,40);
}
}
}
這里我們設定玩家對敵人造成的傷害值為20到40闸与,運行程序毙替,我們會得到下面的結果:
由于這里使用的是非精確碰撞,所以導致程序一開始角色就和膠囊體發(fā)生了碰撞践樱,而OnTrigger()方法由于只能在碰撞開始的時候捕捉碰撞厂画,所以這里只顯示了一次傷害值。理論上只有當玩家攻擊膠囊體拷邢,才會觸發(fā)傷害值的顯示袱院,不過這個問題再這里我們可以先不追究,因為我們關注的是傷害數(shù)值的顯示瞭稼。到目前為止忽洛,這個問題已經(jīng)圓滿的解決了。
有朋友可能會問:為什么人家的游戲里顯示的傷害效果看起來那么眩目环肘,而你的程序卻只能顯示普普通通的文字呢欲虚?對于這個問題,我們這里給出兩種思路悔雹,留給大家自己去探究啊复哆。第一種方法是在項目中創(chuàng)建一個GUISkin,然后在DamagePopup腳本中添加一個GUIStyle類型的成員變量mStyle荠商,通過該變量我們可以引用到在項目中創(chuàng)建的GUISkin寂恬。這樣,我們就可以定義整體的GUI樣式莱没。此時初肉,我們將OnGUI中的方法修改為:
GUI.Label(new Rect(mPoint.x,mPoint.y,ContentWidth,ContentHeight),Value.ToString(),mStyle);
這樣我們就可以實現(xiàn)自定義的文字效果了。第二種方法是使用貼圖饰躲,即首先準備0-9的數(shù)字圖片牙咏,然后我們將Value各個數(shù)位上的數(shù)字分別截取出來,根據(jù)截取的結果來繪制貼圖嘹裂,這樣同樣可以實現(xiàn)自定義的效果妄壶。好了,今天的內(nèi)容就是這樣了.