http://blog.csdn.net/zuoyamin/article/details/8813424
- World Space(世界坐標):我們在場景中添加物體(如:Cube),他們都是以世界坐標顯示在場景中的。transform.position可以獲得該位置坐標。
-
Screen Space(屏幕坐標):以像素來定義的,以屏幕的左下角為(0,0)點,右上角為(Screen.width,Screen.height),Z的位置是以相機的世界單位來衡量的。注:鼠標位置坐標屬於屏幕坐標,Input.mousePosition可以獲得該位置坐標,手指觸摸屏幕也為屏幕坐標,Input.GetTouch(0).position可以獲得單個手指觸摸屏幕坐標。
-
ViewPort Space(視口坐標):視口坐標是標准的和相對於相機的。相機的左下角為(0,0)點,右上角為(1,1)點,Z的位置是以相機的世界單位來衡量的。(用的不多,反正我暫時沒有用到~呵呵~)
-
繪制GUI界面的坐標系:這個坐標系與屏幕坐標系相似,不同的是該坐標系以屏幕的左上角為(0,0)點,右下角為(Screen.width,Screen.height)。
-
世界坐標→屏幕坐標:camera.WorldToScreenPoint(transform.position);這樣可以將世界坐標轉換為屏幕坐標。其中camera為場景中的camera對象。
-
屏幕坐標→視口坐標:camera.ScreenToViewportPoint(Input.GetTouch(0).position);這樣可以將屏幕坐標轉換為視口坐標。其中camera為場景中的camera對象。
-
視口坐標→屏幕坐標:camera.ViewportToScreenPoint();
- 視口坐標→世界坐標:camera.ViewportToWorldPoint();
- 案例1——在鼠標點擊的位置上繪制一張圖片出來(關於繪制GUI界面坐標系與屏幕坐標系之間的關系)。
using UnityEngine; using System.Collections; public class test : MonoBehaviour { //圖片 public Texture img; //儲存鼠標的位置坐標 private Vector2 pos; void OnGUI() { //鼠標左擊,獲取當前鼠標的位置 if (Input.GetMouseButton(0)) { pos = Input.mousePosition; } //繪制圖片 GUI.DrawTexture(new Rect(pos.x,Screen.height - pos.y,100,100), img); } }
案例2——坐標顯示和坐標轉換(這個是觸摸方面的。如果沒有觸摸屏,那就將那個if去掉吧!)
using UnityEngine; using System.Collections; public class test: MonoBehaviour { //場景的相機,拖放進來 public Camera camera; //場景的物體 private GameObject obj; void Start() { //初始化 obj = GameObject.Find("Plane"); } void Update () { //有觸摸 if (Input.touchCount > 0) { print("世界坐標" + obj.transform.position); print("屏幕坐標" + Input.GetTouch(0).position); print("世界坐標→屏幕坐標" + camera.WorldToScreenPoint(obj.transform.position)); print("屏幕坐標→視口坐標" + camera.ScreenToViewportPoint(Input.GetTouch(0).position)); print("世界坐標→視口坐標" + camera.WorldToViewportPoint(obj.transform.position)); } } }
場景中有一個照3D物體的透視攝像機,NGUI使用自己獨立的正交攝像機,轉換步驟如下:
1. 使用透視攝像機把世界坐標轉換到屏幕坐標
Vector3 pos = Camera.main.WorldToScreenPoint(worldPos);
pos.z = 0f; //z一定要為0.
2. 使用UI攝像機轉換到NGUI的世界坐標
Vector3 pos2 = UICamera.currentCamera.ScreenToWorldPoint(pos);
3. 賦值給NGUI控件
temp.transform.position = pos2; //temp為NGUI控件.
所有坐標系統間轉換, 可以通過屏幕坐標作為橋梁, 各坐標系映射到屏幕坐標再轉換到目標坐標系。
