LoginSignup
6
3

More than 5 years have passed since last update.

UnityでのVR開発初心者なのでとりあえずRayを飛ばしてUIの位置を調節する話

Posted at

最初に

本記事は以下の本にて得た知見からとりあえずRayを飛ばしてみた記事となっております。遅刻して申し訳ないです。

image.png

事前準備

この本ではUnity5.6.0f3を使用しています。が、私はC#6を使いたいのでUnity最新版を取ってきてます。

また予め実行する環境としてHTC Viveを用意しております。

Rayってなんだ?

以前記事にもしたためたのですが、簡単に言うとRayとは「任意の地点から透明な線を設定した方向に引いたもの」です。Ray上に何かしらのコライダがあるか検知をすることができます。これによって当たり判定系に使用することが可能です。以下、まとめていた記事。

Unityのレイキャストとは何ぞや?(自分用)

作ってみる

まずは自身の視線がどこにあるかを表示するためにMainCameraに対してCanvas追加とRawImageをぶら下げておきます。
image.png

RawImageには任意のカーソル用画像を設定しておきましょう。
image.png

カーソルをぶらさげているCanvasを適切な位置に調節するため、Canvasに以下のコードを書いたScriptを追加しておきます。

using UnityEngine;

public class CursorPositioner : MonoBehaviour
{
    private float defaultPosZ;

    // Start is called before the first frame update
    void Start()
    {
        defaultPosZ = transform.localPosition.z;
    }

    // Update is called once per frame
    void Update()
    {
        Transform camera = Camera.main.transform;

        // 引数として(Rayの発生地点 , Rayが進む方向(今回はcameraの前方へ))
        Ray ray = new Ray(camera.position, camera.rotation * Vector3.forward);
        RaycastHit hit;

        // 引数として(どのRayで検知するか , 衝突したobjectの情報を格納するための変数 , Rayの長さ(今回は未設定のためMathf.Infinity(無限)) , Rayが衝突と判定するレイヤー(今回は未設定のため「Ignore Raycast」以外の全レイヤーが対象))
        if(Physics.Raycast(ray,out hit))
        {
            if(hit.distance <= defaultPosZ)
            {
                transform.localPosition = new Vector3(0, 0, hit.distance);
            }
            else
            {
                transform.localPosition = new Vector3(0, 0, defaultPosZ);
            }
        }
    }
}

やってることはとても単純です。
Rayを飛ばして、衝突したオブジェクトの距離に合わせて、その位置にCanvasを移動させているだけ。

ちなみにDebug.DrawRayを使うことでDebug用にRayを可視化することも可能です。

ほかにも「RaycastAll」でRayが衝突した全オブジェクトの情報を得ることが出来たり、「Physics.SphereCast」や「Physics.CapsulCast」で円状や楕円系のRayを半径指定して飛ばすこともできます。また、「Linecast」で始点と終点を設定して任意の場所にRayを張っておくようなAPIも存在しています。

Ray系は使用頻度が高いので押さえておくほうがベターでしょう。

参考

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3