1. 程式人生 > >unity學習之怪物名稱血條

unity學習之怪物名稱血條

      人物的名稱與血條的繪製方法很簡單,但是我們需要解決的問題是如何在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); }