nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

Unity で任意の直線上のオブジェクトを検索して処理する

はじめに

  • Unity で任意の直線上のオブジェクトのリストが欲しい場合は Physics.RaycastAll を使います
  • これは任意の座標から任意の方向に光線を発射し、当たったオブジェクトを返してくれる的なものです

コード

// 任意の座標から任意の方向に光線を発射し、光線が当たった結果をリストで取得
RaycastHit[] hits = Physics.RaycastAll (
    origin,    /** 光線の発射元の座標(Vector3) */
    Vector3.up /** 光線発射方向(Vector3(単位ベクトル))
                *  x座標の正方向: Vector3.right,   x座標の負方向: Vector3.left
                *  y座標の正方向: Vector3.up,      y座標の負方向: Vector3.down
                *  z座標の正方向: Vector3.forward, z座標の負方向: Vector3.back
                *  単位ベクトルを指定する必要があるので new Vector3() などで普通に作ったベクトルではだめ
                *  Vector3 同士の足し引きの結果などで距離を求めた Vector3 を Vector3.Normalize で正規化すれば任意の単位ベクトルを作れるそう
                */
);

// 結果を発射元から距離が近い順でソート
hits.Sort ((a, b) => a.distance.CompareTo(b.distance));

// 結果を順に処理
foreach (var hit in hits) {
    // 発射元からGameObjectまでの距離を取得
    // 衝突した場所までの距離なので、オブジェクト自信の座標ではなく、オブジェクトの外側の座標との距離
    float distance = hit.distance;
    // 当たったGameObjectの取得
    GameObject obj = hit.collider.gameObject;
}