unity學習之怪物名稱血條
阿新 • • 發佈:2019-01-26
人物的名稱與血條的繪製方法很簡單,但是我們需要解決的問題是如何在3D世界中尋找合適的座標。因為3D世界中的怪物是會移動的,它是在3D世界中移動,並不是在2D平面中移動,但是我們需要將3D的怪物座標換算成2D平面中的座標,繼而找到怪物頭頂在螢幕中的2D座標最後使用GUI將名稱與血條繪製出來。
//主攝像機物件
privateCamera
camera;
//NPC名稱
privatestringname="老鼠";
//主角物件
GameObject hero;
//怪物模型高度
floatnpcHeight;
//紅色血條貼圖
publicTexture2D
blood_red;
//黑色血條貼圖
publicTexture2D
blood_black;
//預設怪物血值
privateintHP=100;
voidStart()
{
//根據Tag得到主角物件
hero=GameObject.FindGameObjectWithTag("Player");
//得到攝像機物件
camera=Camera.main;
//註解1
//得到模型原始高度
floatsize_y=collider.bounds.size.y;
//得到模型縮放比例
floatscal_y=transform.localScale.y;
//它們的乘積就是高度
npcHeight =(size_y*scal_y);
}
voidUpdate()
{
//保持可以讓怪物一直面朝主角
transform.LookAt(hero.transform);
}
voidOnGUI()
{
//得到怪物頭頂在3D世界中的座標
//預設怪物座標點在腳底下,所以這裡加上npcHeight它模型的高度即可
Vector3 worldPosition=newVector3(transform.position.x,transform.position.y+npcHeight,transform.position.z);
//根據怪物頭頂的3D座標換算成它在2D螢幕中的座標
Vector2 position=camera.WorldToScreenPoint(worldPosition);
//得到真實怪物頭頂的2D座標
position=newVector2(position.x,Screen.height-position.y);
//註解2
//計算出血條的寬高
Vector2
bloodSize=GUI.skin.label.CalcSize(newGUIContent(blood_red));
//通過血值計算紅色血條顯示區域
intblood_width=blood_red.width*HP/100;
//先繪製黑色血條
GUI.DrawTexture(newRect(position.x-(bloodSize.x/2),position.y-bloodSize.y,bloodSize.x,bloodSize.y),blood_black);
//在繪製紅色血條
GUI.DrawTexture(newRect(position.x-(bloodSize.x/2),position.y-bloodSize.y,blood_width,bloodSize.y),blood_red);
//計算怪物名稱的寬高
Vector2 nameSize=GUI.skin.label.CalcSize(newGUIContent(name));
//設定顯示顏色為黃色
GUI.color=Color.yellow;
//繪製怪物名稱
GUI.Label(newRect(position.x-(nameSize.x/2),position.y-nameSize.y-bloodSize.y,nameSize.x,nameSize.y),name);
}