三教杯專案問題2——實現物體一直面朝滑鼠方向
描述
在xz平面中,玩家控制的物體時刻面朝滑鼠的方向。
實現
首先需要將玩家(物體)的世界座標轉化為螢幕座標。
Vector3 playerScreenPosition = Camera.main.WorldToScreenPoint(playerRigidbody.position);
然後獲取滑鼠的螢幕座標。
Vector3 mousePosition = Input.mousePosition;
由於是隻在xz螢幕移動,因此讓滑鼠的螢幕座標z軸等於玩家的螢幕座標的z軸。
mousePosition.z = playerScreenPosition.z;
將滑鼠的螢幕座標轉換為世界座標。
world = Camera.main.ScreenToWorldPoint(mousePosition);
使用LookAt控制玩家始終朝向滑鼠方向。
playerRigidbody.transform.LookAt(world);
因此完整程式碼如下:
Vector3 playerScreenPosition = Camera.main.WorldToScreenPoint(playerRigidbody.position); Vector3 mousePosition = Input.mousePosition; mousePosition.z = playerScreenPosition.z; world = Camera.main.ScreenToWorldPoint(mousePosition); playerRigidbody.transform.LookAt(world);
分析
我們使用Input.mousePosition來獲取滑鼠的位置。下面是官方API中關於該方法的描述(自己翻譯的,僅供參考):
Input.mousePosition
獲得當前滑鼠在畫素座標中的位置(Read Only)。
螢幕或視窗的左下方位於(0,0),螢幕或視窗的右上方位於(Screen.width,Screen.height)。
Input.mousePosition報告了滑鼠的位置,即使滑鼠不在遊戲檢視之中,例如當Cursor.lockState設定為CursorLockMode.None。當在視窗模式中且游標不受限制的話,位置的值小於0或者大於螢幕尺寸(Screen.width,Screen.height)表示滑鼠在遊戲視窗之外。
也就是說該方法返回的是滑鼠的螢幕座標,接下來我們需要了解一下螢幕座標和世界座標。
螢幕座標是指通過主攝像機將物體投射在螢幕上的座標,是以畫素為單位定義的,左下方是(0,0),右上角是(pixelWidth,pixelHeight),z軸在相對於相機的世界單位中。
世界座標是一個物體真實座標,即為三維的座標。
也就是說我們要把滑鼠的螢幕座標轉換為世界座標。而我們要求物體必須在xz平面運動,不能在y軸運動,因此我們需要提前賦予滑鼠的螢幕座標z軸一個值,該值應該和玩家轉換為螢幕座標後的z軸值相等。於是我們需要用Camera.WorldToScreenPoint來將玩家的世界座標轉換為螢幕座標,然後令mousePosition.z = playerScreenPosition.z,再將螢幕座標轉換為世界座標,令玩家LookAt該座標即可。