どこでもドア
概要
ドラえもんの道具で一番有名って言ってもいい、どこでもドアを作ってみました。ただ、どこでもいけるわけじゃなくて、ここではリスポーンされた後にアバターが現れるワールドの原点(0,0,0)に戻るようになっています。
解説
全体
全体は3つに分かれています。真ん中上部が、最後Set Global Positionになっており、これでどこでもドアにぶつかってきたユーザーの位置を(0,0,0)にします。次に、右上部のPlay One Shotを使って、サウンドエフェクトをならします。最後にWriteが2つありますが、ここではどこでもドアの高さと角度を元通りにします。これはどこでもドアがグラブされてどこかに置かれて位置が変わったときに、斜めになったり、高さが変なところにならないようにするためです。
どこでもドアに入ると原点に移動する
左は、どこでもドアの本体のスロットの中の、Box Colliderコンポーネントにつながっています。そしてOn Collision Startによりこのスロットに衝突したときにImpulseが発生し、さらにぶつかった情報がIColliderで出力されます。ここからGet Slotでスロットを得て、Get Active UserとUser Root Slotを使って、ぶつかったユーザーのRootスロットの情報を得ます。これをSet Global Positionに入れることにより、ユーザーのグローバル座標をセットします。座標のFloat3に入力がありませんが、これは省略記法で(0,0,0)が入力されていることになっていて、原点にユーザーは戻ります。
サウンドエフェクトをならす
前項のImpulseは次にPlay One Shotノードの一番目の入力につながっています。これによりぶつかったときにサウンドエフェクトをならすことができます。次の入力はStaticAudioClipProviderコンポーネントに接続されていて、音源を指定しています。このコンポーネントは次の図のようになっています。
URL:のところに必要なサウンドエフェクトのURLを入力します。具体的には別なところからグラブしてドロップする、あるいは、仮想キーボードを表示させてから、PCの画面でNeosVRを表示させてそこにコピペで貼り付けるなどします。
最後の3番目の入力は音量で、1は最大の音量です。
どこでもドアの高さと回転角度を戻す。
どこでもドアをグラブしてどこかに置くと、高さがずれたり角度がずれて曲がったりしてドアらしくなくなるので、常に高さは床にくっついているようにして、角度はまっすぐに立っているようにします。
左にあるインタフェースノードは全体を示しているグローバル座標を記録しているスロットです。ここからまずPositionについてはいったんUnpack xyzを使って(x,y,z)にばらしておいて、yの情報だけを1.1にしてPack xyzでふたたびFLoat3にしてこれをWriteを使って書き出します。書き出す先はもとのPositionです。Neosではyは高さ方向の位置座標です。ここでWriteはImpulseを入力に必要なので、TimerとSequenceを使って、常にImpulseを出してWriteに接続して、座標を書き出しています。
次に角度の方ですが、これもインタフェースノードからRotationの情報(x,y,z,w)を取り出して、Euler Anglesの(α,β,γ)のFloat3に変換します。これを再びUnpack xyzで3つに分けてこのうちの二つを0度にします。つまりy軸周りの回転は許すが他の回転はさせません。そしてPack xyzでFloat3にもどし、From Eulerを使って(x,y,z,w)に変換します。これをWriteを使って、もとのRotationに書き出します。これも常に書き出しています。これでどこでもドアは常に直立しています。
おわりに
衝突したときに場所を移動するコンポーネントがあります。CharacterTeleporterというものです。これをどこでもドアに使うと、LocomotionがWalkの時にはきちんと動作するのですが、LocomotionがFlyになっていると衝突判定ができずに、動作しません。そこでここではOn Collision Startノードを使って衝突の判定をしています。
関連するノード
On Collision Start, Get Slot, Get Active User, User Root Slot, Set Global Position, Play One Shot, Timer, Sequence, Write, Unpack xyz, Pack xyz, Eular Angles, From Euler
関連するコンポーネント
CharacterTeleporter, StaticAudioClipProvider
謝辞
制作はlitalitaが行いましたが、CharacterTeleporterコンポーネント他についてはVEX(0_VEX_0)さんに、On Collision Startノードについてはオレンジ(@mikan3134)さんに教えていただきました。感謝申し上げます。