視錐台を理解する のセクションではカメラのビューのどの地点でもワールド座標の線に相当することを説明しました。その線の数学的な表現を,もちいることが便利なときがありますが,UnityはこれをRay という形で提供しています。Rayはつねにビューの点に相当するのでCameraクラスはScreenPointToRay および ViewportPointToRay を提供しています。この二つの違いはScreenPointToRayが点をピクセル座標を必要とするのに対してViewportPointToRayは正規化された座標を0..1 の範囲(ビュー上で0が左または下,1が右または上)です。この各々の関数は原点とそこからの向きを表すベクトルから構成されます。RayはCameraのtransform.position ではなくニアクリッピング平面を起点としています。
Rayの最も一般的な使用方法は レイキャスト をシーンに向かって実行することです。raycastは仮想の “レーザービーム” をrayに沿って原点から発してシーンのコライダに衝突するまで進みます。次にオブジェクトの情報についてRaycastHit のどこに当たったのかが返されます。これは画面上でオブジェクトを見つけるのに便利な方法です。例えば,マウス位置にあるオブジェクトは次のコードで判定出来ます:
var hit: RaycastHit;
var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, hit)) {
var objectHit: Transform = hit.transform;
// Do something with the object that was hit by the raycast.
}
画面位置に対応するrayを取得してカメラをそれに沿って移動させると便利な場合があります。例えばユーザがオブジェクトをマウスで選択して同じ画面位置を “ピンで維持” しながらズームインしたい場合があるかもしれません(カメラが部分マップを見ている時に便利かもしれません)。これを行うためのコードは比較的容易です:-
var zooming: boolean;
var zoomSpeed: float;
if (zooming) {
var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);
zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
camera.transform.Translate(ray.direction * zoomDistance, Space.World);
}