MRが楽しい

MRやVRについて学習したことを書き残す

MRTKのSurfaceMagnetismを使ってタップ時に指さしていた壁や床の位置にオブジェクトを配置する

本日は MRTK の小ネタ枠です。
MRTKのSurfaceMagnetismを使ってタップ時に指さしていた壁や床の位置にオブジェクトを配置する手順を記事にします。
f:id:bluebirdofoz:20210130230141j:plain

前提条件

前回記事の続きです。
bluebirdofoz.hatenablog.com

前回、MRTKのSurfaceMagnetismを使って視線の先の衝突位置にポインタオブジェクトを表示してみました。
今回はそこから更に一工夫して、タップ時の指定位置にオブジェクトを配置するシーンを作成します。

ハンドレイの切り替え

前回記事で設定した SolverHandler コンポーネントの[Tracked Target Type]を[Controller Ray]に変更します。
f:id:bluebirdofoz:20210130230205j:plain

これで頭部視点ではなく、ハンドレイの先の衝突位置にオブジェクトが表示されるようになりました。
f:id:bluebirdofoz:20210130230217j:plain

配置オブジェクトとスクリプト

次にタップ時に配置するためのオブジェクトして、以下の Cube オブジェクトを作成しました。
f:id:bluebirdofoz:20210130230229j:plain

更に配置を行うスクリプトとして、受け取ったトランスフォームにオブジェクトを移動する以下のスクリプトを作成しました。
・ObjectInfoSetting.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectInfoSetting : MonoBehaviour
{
    /// <summary>
    /// 受け取ったトランスフォームをオブジェクトに反映する
    /// </summary>
    /// <param name="a_transform"></param>
    public void SetTransform(Transform a_transform)
    {
        this.transform.SetPositionAndRotation(a_transform.position, a_transform.rotation);
    }
}

f:id:bluebirdofoz:20210130230247j:plain

作成したスクリプトを Cube オブジェクトに追加します。
更に初期状態では非表示にしておきたいのでオブジェクトを非アクティブにしておきます。
f:id:bluebirdofoz:20210130230259j:plain

タップイベント

次にタップ時に、Cube オブジェクトのアクティブ切り替えと位置反映を行う処理を追加します。
ポインタの Sphere オブジェクトの Inspector ビューを開き、[Add Component]から[Interactable]を検索して追加します。
f:id:bluebirdofoz:20210130230310j:plain

追加した[Interactable]コンポーネントの[Is Global]を有効にします。
これで常にタップイベントを検出するようになります。
f:id:bluebirdofoz:20210130230321j:plain

タップ時に実行する以下の2つのイベントを登録します。
・タップ時に Cube オブジェクトをアクティブにする
・タップ時のポインタ位置に Cube オブジェクトを移動する
[Event]の[+]ボタンでイベントを追加します。
f:id:bluebirdofoz:20210130230331j:plain

タップ時に Cube オブジェクトのアクティブを切り替えるには Cube オブジェクトを参照先にして[GameObject.SetActive]を指定します。
引数にチェックを入れて、オブジェクトがアクティブにするよう設定します。
f:id:bluebirdofoz:20210130230340j:plain

タップ時のポインタ位置に Cube オブジェクトを移動するには Cube オブジェクトを参照先にして、先ほどのスクリプトの[ObjectInfoSetting.SetTransform]を指定します。
f:id:bluebirdofoz:20210130230349j:plain

引数の反映するトランスフォームにはポインタの Sphere オブジェクトを指定しておきます。
f:id:bluebirdofoz:20210130230401j:plain

これで設定は完了です。

動作確認

シーンを再生して動作を確認します。
f:id:bluebirdofoz:20210130230412j:plain

タップを行った時、ポインタの位置に Cube オブジェクトが出現すれば成功です。
f:id:bluebirdofoz:20210130230422j:plain