在制作游戲中我們經常會遇到這樣一個需求:
在人物模型的上面顯示 名字、稱號 一類的文字或者圖片 如下圖
人物模型屬於是Camera1
UI Title信息屬於NGUI Camera2
如下圖
這時候我們就要用到坐標轉換了 確定UI Title 的世界坐標
代碼如下:
Transform charater = null;//角色Transform Transform TitleLabel = null;//Title Label Transform Camera camera1 = Camera.main;//照射模型Camera Camera camera2 = UICamera.currentCamera;//NGUI Camera Vector3 pos = camera1.WorldToScreenPoint(charater.position);//Camera1的世界坐標轉為屏幕坐標 pos.z = 0;//不需要 制為0 Vector3 pos2 = camera2.ScreenToWorldPoint(pos);//屏幕坐標轉為camera2的世界坐標 TitleLabel.position = pos2;//設置TitleLabel的世界坐標
想知道為什么 我們一起來詳細的了解一下Unity 坐標的知識
查看Unity聖典 Transfrom 和 Camera 組件
Transfrom 組件有如下圖2個變量
Camera 組件有如下圖6個函數
看完上面翻譯的信息 是不是對於 世界坐標 屏幕坐標 視口坐標 不是很理解 下面我們來詳細介紹一下這些坐標
WorldSpace(世界坐標):
游戲場景原點世界坐標為(0,0,0)
獲取和設置代碼如下:
transform.position = Vector3.zero;//設置transform的世界坐標為原點(0,0,0) Vector3 vector3 = transform.position;//獲得transform的世界坐標給vector3
ScreenSpace(屏幕坐標):
Screen Space是以像素來定義的 左下角為(0,0) 右上角為(Screen.width,Screen.height) Z的位置是以相機的世界單位來衡量的。
例如場景分辨率1024x768,如果屏幕被縮小至100x100,那么點擊右上角是100x100,而不是分辨率的1024x768。
鼠標的坐標 單個手指觸摸屏幕坐標 都為屏幕坐標
Debug.Log(Input.mousePosition);//鼠標的坐標 Debug.Log(Input.GetTouch(0).position);//單個手指觸摸屏幕坐標
ViewPortSpace(視口坐標):
視口坐標是標准的和相對於相機的。相機的左下角為(0,0)點,右上角為(1,1)點,Z的位置是以相機的世界單位來衡量的。
GUI坐標
這個坐標系與屏幕坐標系相似,不同的是該坐標系以屏幕的左上角為(0,0)點,右下角為(Screen.width,Screen.height)。
NGUI坐標
其實沒有什么NGUI坐標
要設置NGUI坐標 需要獲得UICamera.currentCamera來轉換坐標
了解了上面的知識 相信你利用 Camera 的那6個函數 可以隨便的轉換坐標了。
完結!