[Unity]VRでの簡易的なテレポート

icatch_teleport Ray

とりあえずVR開発の一つの目標として色々なVR上での移動方法の作成に挑戦することにしました。なので今回はその移動方法の一つとしてVRChatなどでよくあるような「ポインターで場所を指定するテレポート」を作ってみました。

※今回は【HTC VIVE】VR開発チュートリアル~ものをつかんで投げ、テレポートできるようにする~を非常に参考にさせていただきました。

ポインターの準備

テレポートの場所をわかりやすく指定するために、まずはレーザーポインターを作っていきます。といってもRayを飛ばして、Rayの出発点とヒット部分とをLineRendererによる線で結ぶだけなので、他の回で作成したレーザービームの銃とほとんど同じ作り方です。

pointer_child

コントローラの位置からRayを出したいので、RightHandAnchor(及びLeftHandAnchor)の子要素として空のオブジェクトを作成し”pointer”といった適当な名前に設定します。※左右のHandAnchorなどのようなプレイヤーの初期設定自体の詳しい話はここの最初の章にまとめています。

今作成したオブジェクトにLineRendererコンポーネントを追加します。大体のパラメータは以下のように設定しました。

linerenderer_par01

LineRendererのMaterialはUnlit(Un lighted)/Colorつまり光源に反映されないシェーダを設定しました。レーザーポインターのオンオフ制御は後でスクリプトで説明します。laser_material

レティクルの準備

レティクルはテレポートするポイントを視覚的に更にわかりやすくするために必要です。これ自体は参考にさせていただいたサイトで使われているものとほぼ同じようなものを作成しました。

作成したレティクル自体を一度シーン上に置き、プレファブ化してから消しておきます。レティクル自体の準備はこれで終わりです。

スクリプトの追加

最後に今作ったレーザーポインター及びレティクルPrefab、そしてテレポート移動をスクリプトで制御していきます。

まずはプレイヤーのコントローラに追加するスクリプトです。Update内でトリガーを引いている間、レーザーポインターを表示するメソッドを呼び出します。このとき、teleport関数で移動する座標情報を利用するため、メソッドからRaycastHitを戻り値として受け取っています。そしてInput.GetUpつまりトリガーを離した時にteleport関数を呼び出しています。teleport関数の中身自体はプレイヤーのtransform.positionに先ほどの戻り値を代入するだけです。

最後にレーザーポインター の開始地点となる空のオブジェクトに追加するスクリプトです。ShowLaser関数が呼び出されるとRayを前方に発射し、LineRendererの開始地点を設定します。Rayがテレポートできる位置(指定したレイヤーマスクの位置)に当たっている場合、LineRendererの収束地点をヒットした座標に設定し、レティクルをアクティブ化して表示しています。レティクルの座標はただヒットした座標で設定すると地面に埋まって表示されてしまう問題があったためVector3型のオフセットを個別に指定して、それを足した座標に設定しました。

ray_teleport

コメント

タイトルとURLをコピーしました