i-school - VRアクションゲーム レーザーポインターでイベントを発生させる


LaserPointerController スクリプトを作成する


 LineRenderer コンポーネントを利用し、Ray に合わせてライン(ポインタ―)を描画する機能を実装します。
このポインターが侵入したゲームオブジェクトに EventBase クラスがアタッチされている場合には、
そのクラスを取得して、TriggerEvent メソッドを実行し、イベントを発火させます。

 LineRenderer によって描画されたラインは自動的には削除されないため、
一定時間が経過したら削除するようにしています。

 ラインの太さをスクリプト内で制御しています。
各制御値は private 修飾子ですが、インスペクターより設定値を変更したい場合には SerializeField 属性を付与してください。

 
LaserPointerController .cs

<= クリックすると開きます。



<LineRenderer コンポーネントの機能>


 Line Renderer (ラインレンダラー) コンポーネントは、空間の2つ以上の点の配列をとることで、それぞれの間に直線を描きます。


参考サイト
Unity 公式マニュアル
LineRenderer
https://docs.unity3d.com/ja/current/Manual/class-L...
Unity 公式スクリプトリファレンス
LineRenderer
https://docs.unity3d.com/jp/current/ScriptReferenc...


 今回実装している変数やメソッドについてまとめておきます。
必ず自分でも調べて、自分の知識として吸収しておいてください。


1.LineRenderer.startWidth

 LineRenderer で描画するラインの幅のスタートのサイズを設定することができる変数です。


参考サイト
Unity 公式スクリプトリファレンス
LineRenderer.startWidth
https://docs.unity3d.com/jp/current/ScriptReferenc...


2.LineRenderer.endWidth

 LineRenderer で描画するラインの幅の最後のサイズを設定することができる変数です。


参考サイト
Unity 公式スクリプトリファレンス
LineRenderer.endWidth
https://docs.unity3d.com/jp/current/ScriptReferenc...


 これらの他にも、色を変更する変数や、曲線を描くための変数なども用意されています。


3.LineRenderer.SetPosition

 ラインの頂点の位置を設定するメソッドです。この処理によって描画処理が実行されます。
2つの SetPosition メソッドを実行することで、A 地点から B地点という形式で、直線のラインが描画されます。

 直線以外の複数のラインを描画するメソッドとして SetPositions メソッドという処理も用意されています。


<描画>
        // LineRenderer の1点目と2点目を指定してレーザーとして描画
        lineRenderer.SetPosition(0, from);
        lineRenderer.SetPosition(1, to);



 なお、ラインを削除する専用のメソッドは用意されておりませんので、下記の処理を実行することで削除できます。

<削除>
        lineRenderer.SetPosition(0, Vector3.zero);
        lineRenderer.SetPosition(1, Vector3.zero);


参考サイト
Unity 公式スクリプトリファレンス
LineRenderer.SetPositions
https://docs.unity3d.com/jp/current/ScriptReferenc...


 そのほかの活用事例を紹介しているサイトもたくさんありますので、自分でも検索してみてください。

参考サイト
はなちるのマイノート 様
【Unity】LineRendererをスクリプトから自由自在に操る
https://www.hanachiru-blog.com/entry/2020/10/05/12...


LaserPointer ゲームオブジェクトを作成し、設定を行う


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty で新しいゲームオブジェクトを作成します。
名前を LaserPointer に変更し、LineRenderer コンポーネントを Add Component を使って追加してください。
マテリアルの設定が None になっていますので、任意のマテリアルを作成するか、Unity に用意されているものをアサインします。
マテリアルの設定以外は変更する部分はありません。



 続いて、LaserPointerController スクリプトをドラッグアンドドロップしてアタッチします。
インスペクター上でアタッチされていることを確認したら、各変数にアサインを行います。

 handAnchor 変数には、ポインターを発射するコントローラーを選択します。
今回は右手のコントローラーで操作することを想定していますが、左手でも問題ありません。

 LineRenderer 変数には、LaserPointer ゲームオブジェクトにアタッチした LineRenderer コンポーネントをアサインします。


<インスペクター画像>






ゲームを実行して動作を確認する


 実機にてゲームを実行して、Ray を発射した部分にラインが描画されるか、一定時間後に削除されるかを確認します。

 問題がなければそのまま、ItemEvent クラスがアタッチされているゲームオブジェクトにも発射してみてください。
デバッグ用の Canvas にイベントが実行されたことが表示されれば制御成功です。