[Unity] レーザー距離計を作ってみた
今回はUnityのネタ的なTipsです。
物体との距離を測る距離計を実装してみました。
Unityで自律移動ロボットのシミュレータを作りたいと思ったのがきっかけです。
実装方針
ある点から物体までの距離はRaycastにより計算できます。
自分の位置、計測方向のベクトルを指定すれば距離を取得できます。
物体にはあらかじめコライダーを設定しておく必要があります。
より正確な距離を計測する場合はMeshColliderが良いでしょう。
また、距離計測には直結しないがレーザーっぽく見せるために計測方向に照射するSpotLightを設置することにします。
作ってみる
毎フレームごとに前方の物体との距離計算を行うスクリプトを実装します。
今回は以下のようなスクリプトを実装してみました。
using UnityEngine; using System.Collections; // レーザー距離計 public class DistanceSensor : MonoBehaviour { public const float NOTHING = -1; // 計測不能 public float maxDistance = 30; // 計測可能な最大距離 public float distance; // 計測距離 // 距離計測 void Update() { // 前方ベクトル計算 Vector3 fwd = transform.TransformDirection(Vector3.forward); // 距離計算 RaycastHit hit; if ( Physics.Raycast(transform.position, fwd, out hit, maxDistance) ) { distance = hit.distance; } else { distance = NOTHING; } } }
transform.TransformDirection(Vector3.forward)がGameObjectの前方を表すベクトルです。
Vector3.forwardは(0,0,1)のローカル座標系における前方ベクトルです。
これをワールド座標系に変換するためにTransformDirection()メソッドを使っています。
Physics.Raycast(transform.position, fwd, out hit, maxDistance)でRaycastを飛ばして距離計算を行っています。
引数にはそれぞれ計測位置、向きベクトル、Raycastのヒット情報、計測可能範囲の距離を指定します。
物体にRaycastが当たればtrueが返り、hit.distanceに計測距離が格納されます。
上記スクリプトを距離計としたいGameObjectにアタッチします。
MaxDistanceには測定可能な最大距離を指定します。
同時に、Lightもアタッチします。
LightのTypeをSpot、SpotAngleを1、ColorをRGB=(255,0,0)、Intensityを8にすればレーザーっぽいライトが出来ます。
ひとまずこれでレーザー距離計は完成です。
これを操作可能なプレイヤーに持たせて動かすと以下のように距離が測定できます。
需要があるかどうか分かりませんが、こんなことも出来るという紹介でした。
COMMENTS & TRACKBACKS
- Comments ( 3 )
- Trackbacks ( 0 )
助かります!
レイを下に飛ばしてらっかダメージを計算するのに使いたいと思います!
返信遅くなりすみません。
お役に立てて何よりです!
面白いですね!
これからの時代、需要ありそうですね。