1. 程式人生 > >unity 2d 四大座標系問題 滑鼠點選位置問題 詳細入門解析

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相同。注意

:滑鼠位置座標屬於螢幕座標,但Input.mousePosition獲得的位置座標是世界座標,z軸值為0,需要轉換,見下文。

視口空間:與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.htm
http://docs.unity3d.com/ScriptReference/Camera.html
http://blog.csdn.net/yanzhanyi/article/details/38235145