1. 程式人生 > >三教杯專案問題2——實現物體一直面朝滑鼠方向

三教杯專案問題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該座標即可。