本日は MRTK の小ネタ枠です。
MRTKのSurfaceMagnetismを使ってタップ時に指さしていた壁や床の位置にオブジェクトを配置する手順を記事にします。
前提条件
前回記事の続きです。
bluebirdofoz.hatenablog.com
前回、MRTKのSurfaceMagnetismを使って視線の先の衝突位置にポインタオブジェクトを表示してみました。
今回はそこから更に一工夫して、タップ時の指定位置にオブジェクトを配置するシーンを作成します。
ハンドレイの切り替え
前回記事で設定した SolverHandler コンポーネントの[Tracked Target Type]を[Controller Ray]に変更します。
これで頭部視点ではなく、ハンドレイの先の衝突位置にオブジェクトが表示されるようになりました。
配置オブジェクトとスクリプト
次にタップ時に配置するためのオブジェクトして、以下の Cube オブジェクトを作成しました。
更に配置を行うスクリプトとして、受け取ったトランスフォームにオブジェクトを移動する以下のスクリプトを作成しました。
・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); } }
作成したスクリプトを Cube オブジェクトに追加します。
更に初期状態では非表示にしておきたいのでオブジェクトを非アクティブにしておきます。
タップイベント
次にタップ時に、Cube オブジェクトのアクティブ切り替えと位置反映を行う処理を追加します。
ポインタの Sphere オブジェクトの Inspector ビューを開き、[Add Component]から[Interactable]を検索して追加します。
追加した[Interactable]コンポーネントの[Is Global]を有効にします。
これで常にタップイベントを検出するようになります。
タップ時に実行する以下の2つのイベントを登録します。
・タップ時に Cube オブジェクトをアクティブにする
・タップ時のポインタ位置に Cube オブジェクトを移動する
[Event]の[+]ボタンでイベントを追加します。
タップ時に Cube オブジェクトのアクティブを切り替えるには Cube オブジェクトを参照先にして[GameObject.SetActive]を指定します。
引数にチェックを入れて、オブジェクトがアクティブにするよう設定します。
タップ時のポインタ位置に Cube オブジェクトを移動するには Cube オブジェクトを参照先にして、先ほどのスクリプトの[ObjectInfoSetting.SetTransform]を指定します。
引数の反映するトランスフォームにはポインタの Sphere オブジェクトを指定しておきます。
これで設定は完了です。
動作確認
シーンを再生して動作を確認します。
タップを行った時、ポインタの位置に Cube オブジェクトが出現すれば成功です。