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