1. 程式人生 > >NGUI研究之3D模型坐標轉2D屏幕坐標-血條

NGUI研究之3D模型坐標轉2D屏幕坐標-血條

uic bject blank orm 組成 自己 index lan rac

??

剛好今天有朋友問我,比較典型的樣例就是遊戲裏面人物的血條。

原理非常easy就是把3D點換算成2D的點。可是因為NGUI自身是3D所以我們須要先把NGUI下的點轉成2D點。然後在把他轉成3D的點。

聽起來有點繞,不要緊我直接上代碼。

對屏幕自適應不明確的看NGUI研究之怎樣自適應屏幕

眼下我一直都是用NGUI來做人物血條,可是2D血條都會有個限制。就是它不能和模型有遮擋關系。只是血條能夠依據人物的位置調節。比方遠一點的人物血條會小一些,近一點的人物血條會大一些。

最好讓美術做FBX的時候直接內置一個GameObject 的點。由於模型有的高有的低,所以血條的位置高度是不一樣的,假設美術內置的話能夠讓美術來調節模型頭頂上的點,這樣比較方便。


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { //角色 public Transform
Cube; //角色的血條 public Transform UI; //默認血條縮與攝像機的距離 private float Fomat; //角色頭頂的點, 最好讓美術把這個點直接做在fbx模型裏面。 private Transform Head; void Start () { //找到角色身上頭頂的點 Head = Cube.Find("head"); //計算下面默認血條的距離,也能夠寫個常量,就是標記一下 Fomat = Vector3.Distance(Head
.position,Camera.main.transform.position); } void Update () { //這裏能夠推斷一下 假設位置沒有變化就不要在賦值了 float newFomat = Fomat / Vector3.Distance(Head.position,Camera.main.transform.position); UI.position = WorldToUI(Head.position); //計算出血條的縮放比例 UI.localScale = Vector3.one * newFomat; //測試代碼。按下W S鍵前後移動角色 if(Input.GetKey(KeyCode.W)) Cube.Translate(Vector3.forward); if(Input.GetKey(KeyCode.S)) Cube.Translate(Vector3.back); } //核心代碼在這裏把3D點換算成NGUI屏幕上的2D點。 public static Vector3 WorldToUI(Vector3 point) { Vector3 pt = Camera.main.WorldToScreenPoint(point); //我發現有時候UICamera.currentCamera 有時候currentCamera會取錯。取的時候註意一下啊。 Vector3 ff = UICamera.currentCamera.ScreenToWorldPoint(pt); //UI的話Z軸 等於0 ff.z = 0; return ff; } }

再說一下,一般血條可能都是由多個UISprite組成。那麽最好把這些Sprite都掛在同一個GameObject以下,這樣僅僅須要修正父對象。所以子對象的縮放都會正確。控制角色移動近一點的截圖。

技術分享

控制角色移動遠一點的截圖,你會發現血條在屏幕上的比例是不會變化的。

NGUI研究之3D模型坐標轉2D屏幕坐標-血條