背景:最近自己在學習寫小遊戲的時候想要在玩家頭頂顯示玩家當前血量和名字遇到了此問題,在此攻略一下。
攻略:谷歌了一下,人物頭頂和名稱的顯示大致上分爲兩種方法:使用UI組件設置和使用GUI繪製,我採用的方式是後者,在此之前嘗試過前面的方法,但是總是出一些問題,這裏討論使用GUI繪製,使用組件設置稍後再去研究。
使用GUI繪製重在代碼邏輯,這裏貼出我的代碼
private Camera Miancamera;
private string playerName;
public GameObject player;
private float height;
public Texture2D hpForeground;//血條的前景貼圖
public Texture2D hpBackground;//血條的背景貼圖
private int HP;
private int offset = 30;//位置偏移,計算位置時可能出現有一些誤差,偏移消除這些誤差
public Font fort;//顯示名字的文字字體樣式
private void Start()
{
Miancamera = Camera.main;
float size_y = player.GetComponent<Collider>().bounds.size.y;//獲取遊戲對象原始模型的高度值
float scal_y = transform.localScale.y;//獲取遊戲對象當前縮放比例
height = size_y * scal_y;//原始模型高度 * 當前縮放比例 = 模型當前高度
}
private void OnGUI()
{
//計算繪製血條和名稱所在的世界座標,此座標就是玩家的世界座標
Vector3 worldPosition = new Vector3(transform.position.x, transform.position.y + height, transform.position.z);
//血條和名稱所在世界座標轉換成屏幕座標
Vector2 position = Miancamera.WorldToScreenPoint(worldPosition);
//計算繪製血條和名稱坐在的屏幕座標,由於屏幕座標屏幕在右下角是(0,0)點,左上角是(Screen.Width,Screen.Height)所以使用減法
position = new Vector2(position.x, Screen.height - position.y);
//計算繪製血條的大小,大小有hpForeground確定,[GUI.skin.lable]-GUIStyle
Vector2 hpSize = GUI.skin.label.CalcSize(new GUIContent(hpForeground));
//計算繪製血條的寬度,這樣就可以實現扣血時,血條寬度的變化
int hpWidth = hpForeground.width * HP / 200;
//繪製血條
GUI.DrawTexture(new Rect(position.x - hpSize.x / 2, position.y - hpSize.y - offset, hpSize.x, hpSize.y), hpBackground);
GUI.DrawTexture(new Rect(position.x - hpSize.x / 2 , position.y - hpSize.y - offset, hpWidth, hpSize.y), hpForeground);
//計算繪製名稱的大小,以確定繪製名稱的位置
Vector2 nameSize = GUI.skin.label.CalcSize(new GUIContent(playerName));
GUI.color = Color.black;
//設置字體樣式
GUI.skin.label.font = fort;
//繪製名稱
GUI.Label(new Rect(position.x - (nameSize.x / 2), position.y - nameSize.y - hpSize.y - offset, nameSize.x, nameSize.y), playerName);
}
最終的顯示效果:
參考博文:
http://www.xuanyusong.com/archives/1032