1. 程式人生 > >unity3d滑鼠點選,獲取世界座標

unity3d滑鼠點選,獲取世界座標

unity中有關於滑鼠位置的函式,Input.mousePosition。但不得不說,這個函式不到位,可以用一個print函式輸出一下這個座標會發現,只有X,Y值在改變,Z值沒有發生變化,並且在螢幕的左下角固定為(0,0,0),檢視文件後發現,文件上是這麼寫的。

The current mouse position in pixel coordinates. (Read Only)

當前所在畫素座標的滑鼠位置(只讀)。

The bottom-left of the screen or window is at (0, 0). The top-right of the screen or window is at (

Screen.width,Screen.height).

螢幕或視窗的左下角是座標系的(0,0)座標。右上角的座標是(螢幕寬度值,螢幕高度值)。

即我們得到的座標是其實是攝像機顯示畫面的座標,就是我們螢幕的座標,我直接就糾結了,這怎麼辦?

在近1個小時的文件檢視過程中還是沒有找到有關滑鼠位置的函式,但是偶然間看到了一個射線的方法

原來是用這種方式做的啊!!

找到目標後開始研究這個射線函式,霍霍,ScreenPointToRay這個太到位了!

 

Returns a ray going from camera through a screen point.

返回一條射線從攝像機通過一個螢幕點。

Resulting ray is in world space, starting on the near plane of the camera and going through position's (x,y) pixel coordinates on the screen (position.z is ignored).

產生的射線是在世界空間中,從相機的近裁剪面開始並穿過螢幕position(x,y)畫素座標(position.z被忽略)。

Screenspace is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (

pixelWidth,pixelHeight).

螢幕空間以畫素定義。螢幕的左下為(0,0);右上是(pixelWidth,pixelHeight)。

 

 這就明白了,函式給我們的是一條射線,起點是攝像機,且射線過螢幕上的一點,螢幕上的點不就是mousePosition嗎,解決了!

c#

  if (Input.GetMouseButton(0)) {
   //Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
   Ray ray = camera.ScreenPointToRay(Input.mousePosition);

上面註釋掉的函式:當你的指令碼沒有綁在mainCamera上時,又想用MainCamera做原點是使用。

接下來我們來試一下效果到底行不行,繼續寫void Update()

//這段程式碼是我照文件改的,自己似懂非懂,請各位讀者指點

RaycastHit hit;//

if(Physics.Raycast(ray, out hit))//函式是對射線碰撞的檢測,這個out是什麼意思?
   {
     Point = hit.point;//得到碰撞點的座標
    print (Point);//輸出一下
    print("I'm looking at " + hit.transform.name);//輸出碰到的物體名字
   }