?人物的名稱與血條的繪制方法很簡單,但是我們需要解決的問題是如何在3D世界中尋找合適的坐標。因為3D世界中的人物是會移動的,它是在3D世界中移動,并不是在2D平面中移動,但是我們需要將3D的人物坐標換算成2D平面中的坐標,繼而找到人物頭頂在屏幕中的2D坐標最后使用GUI將名稱與血條繪制出來。
首先學習本文的重點內容,如何將游戲世界中任意3D坐標轉換成屏幕中的2D坐標。根據這個方法計算出的2D坐標屏幕左下角的點為0.0 ,屏幕右上角的坐標為1.1 所以真實的2D坐標還得通過Screen.height 與Screen.width計算一下才行。
?
? ? ? ?在Unity工程導入角色控制器組件,不知道角色控制器的朋友請閱讀我之前的文章哈。創建一個Plane做為游戲的地面,然后利用角色控制器組件創建兩個模型,一個做為主角,一個作為NPC,主角可以通過控制來移動從四周來觀察NPC對象。由于地面的面積比較小移動主角時為了避免主角越界掉下去,我們做一個邊界的物理層。物理層其實很簡單,就是給平面四周放置四個平面在四周將平面包圍著,給四周的四個平面綁定上Box Collider組件,這樣主角就不會越界掉下去啦。因為沒有給貼圖所以效果上看不到這四個對象。哇咔咔~?如下圖所示,在場景是途中主角被四個平面包圍這,即時它拼命的想往外條但是還是跳不出去,哈哈。
?
?
創建腳本NPC.cs 然后把腳本掛在NPC對象身上,在腳本中我們繪制主角的血條以及名稱。
NPC.cs
?
注解1:通過collider.bounds.size?可以拿到模型對應三個軸向的高度,但是模型是可以縮放的,所以真實的模型高度應當是原始高度乘以縮放系數才行。 transform.localScale可以拿到模型對應三個軸向的縮放系數,因為這里我們需要模型的高度,所以忽略X軸與Z軸。
注解2:在這里我們計算血條的寬度,GUI.skin.label.Calcsize()這個方法是以默認的皮膚對象Label對象去參數對象的寬高。參數是new GUIContent(blood_Red)意思是拿紅色血條的貼圖的寬高,它將保存在返回的size中。最后以寬高將血條繪制在屏幕中,我們的血條采取兩層。背景是黑色的,前面是紅色的,當人物費血時紅色血條減少。
注解3: 這里通過字符串來獲取它整體的寬度與高度,因為NPC的名稱是可變的,所以我們需要動態的獲取整體的顯示區域。同樣是以GUI.skin.label對象去調用CalcSize。
?
如下圖所示,當使用鼠標點擊NPC對象時,NPC頭頂的血條將開始發生減血。這個例子我使用OnGUI繪制當然大家也可以在Hierarchy 視圖中的創建GUI Texture 或者GUI Text對象 來實現,不過原理都是這樣的 大家可以試試 哇咔咔。
?
?