libro
www.tuyano.com
JavaScriptではじめるUnityプログラミング入門

マウスクリックと画面の扱い (4/4)

作成:2014-05-17 10:54
更新:2014-05-17 10:54

■Rayによるオブジェクトの位置

マウスを利用して操作を行う場合、「マウスの地点にあるゲームオブジェクト」を調べる、という処理が必要となるでしょう。これは「Ray」と「Raycast」というオブジェクトを利用します。

Rayは、その名の通り「光線」のオブジェクトです。ある地点から決まった方向に発せられる真っ直ぐな光線をイメージして下さい。これがRayです。

マウスポインタの地点にゲームオブジェクトがあるかどうか?というのは、カメラからマウスポインタの位置を通る直線を伸ばし、その直線が何かのゲームオブジェクトにぶつかるかどうかを調べる、という感じで考えるのです。


●指定の地点を通過するRayを得る
var 変数 : Ray =《Camera》.ScreenPointToRay(《Vector3》);

●Rayの線状にオブジェクトがあるか調べる
var 変数 = Physics.Raycast(《Ray》,《RaycastHit》, 距離 );

まず、ScreenPointToRayを使って、引数に指定したスクリーン座標の地点を通過するRayオブジェクトを取得します。そして、Physics.Raycastを使い、Rayの直線上の指定した距離(第3引数の値)までの間にゲームオブジェクトがあるかどうかをチェックします。これは、Rayの上にオブジェクトがあればtrueを、なければfalseを返します。

線上に見つかったオブジェクトの情報は、Raycastの第2引数の変数に保管されます。これは「RaycastHit」というオブジェクトで、ここからヒットしたゲームオブジェクトのcolliderが取り出せます。後は、colliderから必要な情報を取り出していけばいいわけですね。

では、利用例を挙げておきましょう。これは、マウスポインタがある場所のゲームオブジェクトを黄色に変えるサンプルです。Camera.main.ScreenPointToRayで取得したRayオブジェクトをPhysics.Raycastでチェックし、もし重なったオブジェクトがあったら、hit.collider.renderer.material.colorを変更して色を変えています。Rayがオブジェクトからはずれたら、変数にバックアップしておいた元のColorに戻しています。

とりあえず、ここまでのことがざっとわかれば、マウスを使ってゲームを操作する基本は作れるようになるでしょう。「マウスボタンの状態とポインタの位置」「スクリーン座標とグローバル座標の変換」「Rayを使った特定位置にあるゲームオブジェクトの取得」の3点について、しっかり使えるようにしておきましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

#pragma strict

var hit:RaycastHit;
var c = null;
var obj:GameObject;
var flg = false;

function Update () {
    var v:Vector3 = Input.mousePosition;
    var r:Ray = Camera.main.ScreenPointToRay(v);
    if (Physics.Raycast(r, hit, 100)){
        if (!flg){
            c = hit.collider.renderer.material.color;
            obj = hit.collider.gameObject;
            flg = true;
        }
        hit.collider.renderer.material.color = new Color(1,1,0);
    } else {
        flg = false;
        if (c != null){
            obj.renderer.material.color = c;
            c = null;
        }
    }
    
}

※関連コンテンツ

「JavaScriptではじめるUnityプログラミング入門」に戻る