マウスクリックと画面の扱い (4/4)
作成:2014-05-17 10:54
更新:2014-05-17 10:54
更新:2014-05-17 10:54
■Rayによるオブジェクトの位置
マウスを利用して操作を行う場合、「マウスの地点にあるゲームオブジェクト」を調べる、という処理が必要となるでしょう。これは「Ray」と「Raycast」というオブジェクトを利用します。
Rayは、その名の通り「光線」のオブジェクトです。ある地点から決まった方向に発せられる真っ直ぐな光線をイメージして下さい。これがRayです。
マウスポインタの地点にゲームオブジェクトがあるかどうか?というのは、カメラからマウスポインタの位置を通る直線を伸ばし、その直線が何かのゲームオブジェクトにぶつかるかどうかを調べる、という感じで考えるのです。
●指定の地点を通過するRayを得る
●Rayの線状にオブジェクトがあるか調べる
まず、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点について、しっかり使えるようにしておきましょう。
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点について、しっかり使えるようにしておきましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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プログラミング入門」に戻る