unity 2d 四大座標系問題 滑鼠點選位置問題 詳細入門解析
首先,unity2d中的camera有四大座標系你需要了解清楚:
官方對unity camera的描述:
Description
A Camera is a device through which the player views the world.
A screen space point is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (pixelWidth,pixelHeight). The z position is in world units from the camera.
A viewport space point is normalized and relative to the camera. The bottom-left of the camera is (0,0); the top-right is (1,1). The z position is in world units from the camera.
A world space point is defined in global coordinates (eg. Transform.position).
翻譯:
攝像機是玩家觀看世界的入口。
螢幕空間:以畫素為單位,螢幕的左下為(0,0);右上是(PixelWidth,pixelHeight),z軸的值與camera相同。注意
視口空間:與camera相關的歸一化座標,相機的左下角為(0,0)點,右上角為(1,1)點,z軸的值與camera相同。(用的不多
世界空間:普遍座標系,是場景中物體的3D實際位置。注意:transform.position 的值預設是程式碼所貼附的物體的位置。
第四個座標系是 繪製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();
轉換函式一共六種,詳見下面的測試程式碼:
// print("Input.mousePosition: " + Input.mousePosition );
// print("Input.mousePosition world to viewport: " + Camera.main.WorldToViewportPoint(Input.mousePosition ));
// print("Input.mousePosition world to screen: " + Camera.main.WorldToScreenPoint(Input.mousePosition));
// print("Input.mousePosition Viewport To Screen: " + Camera.main.ViewportToScreenPoint(Input.mousePosition ));
// print("Input.mousePosition Viewport To World: " + Camera.main.ViewportToWorldPoint(Input.mousePosition));
// print("Input.mousePosition Screen To Viewport " + Camera.main.ScreenToViewportPoint(Input.mousePosition ));
// print("Input.mousePosition Screen To World: " + Camera.main.ScreenToWorldPoint(Input.mousePosition));
// print("-------------------" );
可以用以上程式碼來了解這些座標系的區別
下面介紹 unity2d 如何獲取滑鼠位置/如何實現點選哪裡就在哪裡生成一個新物體/獲取點選位置/點選位置轉換
獲取滑鼠位置,放置新物體:
void Update () {
screenPosition = Camera.main.WorldToScreenPoint(transform.position);
mousePositionOnScreen = Input.mousePosition;
mousePositionOnScreen.z = screenPosition.z;
mousePositionInWorld = Camera.main.ScreenToWorldPoint(mousePositionOnScreen);
if (Input .GetMouseButtonDown(0)) {
Instantiate (Soldier, mousePositionInWorld , Quaternion.identity);
}
}
1、在預設寫好的Update函式中,先獲取相機的z軸位置,(由於我們是2d介面,可能玩法跟3d程式設計有所出入)
2、
transform.position
是我程式碼所依附的空物體的位置,無所謂在哪,用了WorldToScreenPoint函式之後它的z軸值變為跟camera一樣,我們只用z軸的值;
3、
Input.mousePosition
雖然屬於螢幕座標,但它的z軸值不是螢幕座標系的z軸值,所以我們用
mousePositionOnScreen.z = screenPosition.z;
來把剛剛取到的camera z軸座標值賦給滑鼠點選座標,只有這時的值才是真正你在螢幕點選的位置,可以想像,觸控位置是螢幕,所以我們獲取的點選位置只有在螢幕座標下才是有效的,這一步就將世界座標下的mousePosition轉化到了螢幕座標下;
4、
由於生成新的物體,位置一定是世界座標系下的才有利於遊戲開發,因為標準相同,普遍適用,所以我們放置新的物體也要將物體座標轉化為世界座標,即
mousePositionInWorld = Camera.main.ScreenToWorldPoint(mousePositionOnScreen);
這樣得到了滑鼠點選位置在世界座標系下的座標,由於是2d遊戲,我們不涉及射線定位了,放置新物體也統一預設放置在世界座標x-y平面,z軸值為0;
5、
Input .GetMouseButtonDown(0)
感知滑鼠點選,觸發條件;
6、
Instantiate (Soldier, mousePositionInWorld , Quaternion.identity);
生成新物體。
參考文章:
http://www.juziku.com/wiki/53595.htmhttp://docs.unity3d.com/ScriptReference/Camera.html
http://blog.csdn.net/yanzhanyi/article/details/38235145