[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にすればレーザーっぽいライトが出来ます。

distance-sensor

ひとまずこれでレーザー距離計は完成です。
これを操作可能なプレイヤーに持たせて動かすと以下のように距離が測定できます。

需要があるかどうか分かりませんが、こんなことも出来るという紹介でした。

COMMENTS & TRACKBACKS

  • Comments ( 3 )
  • Trackbacks ( 0 )
  1. By Jbuta

    助かります!
    レイを下に飛ばしてらっかダメージを計算するのに使いたいと思います!

    • By ftvoid

      返信遅くなりすみません。
      お役に立てて何よりです!

  2. By kopu

    面白いですね!
    これからの時代、需要ありそうですね。