🌻

【NeosVR+LogiX】ジャンプ中にセカンダリでフライに切り替えが便利だった話

2022/05/14に公開

はじめに

この記事は私がNeosVR内で、ジャンプ中にセカンダリを押すことで歩行モードからフライモードに切り替えられるようカスタマイズしたところ、非常に便利で面白かったため、その方法を記事にしました。

ジャンプからのフライへの切り替えは相性がいい

そもそものきっかけとして、私は普段ネオロイドを使用しているので歩行で移動することがほとんどありません。しかし毎回コンテキストメニューからフライを選択するのは結構な手間。

その時ふと思ったのがNeosは二段ジャンプができないのだから、ジャンプ中にセカンダリを押したらそのままフライに切り替えてもいいんじゃないか?ということ。

そもそも上昇したいのだから、最初にジャンプしたところで問題もないし、アニメや特撮でもジャンプから飛行モードに切り替わるのはごく自然なこと!

面白そうだと思って組んだのが今回のLogiXです。

今回の仕様

今回のLogiXの仕様は…

  1. 歩行モードの時、地面に足がついていない状態で左コントローラーのセカンダリを押すとフライモードに切り替える。
  2. フライモードの時、左コントローラーのセカンダリを2回連続で押すことで歩行モードに切り替える。

主にこの二つを実装します。

ジャンプの判定は歩行モードで地面に足がついているかどうかで判別しています。

完成したLogiX

これが完成したLogiXです。
このLogiXをアバターのどこでもいいのでパッキングしてやれば、機能します。

ジャンプ中にセカンダリでフライに切り替えるLogiX

今回使ったLogiXのノード一覧

Slots

名前 説明 リンク
Get Slot 入力されたComponentを保持するスロットを出力 公式Wiki
Get Slot Name Nameを出力 公式Wiki
Get Active User Self このノード自身がユーザーの子になっている時にそのユーザーを出力 公式に記載なし

Flow

名前 説明 リンク
If 二つのインパルス先へ分岐できる 公式Wiki
Fire On True Trueになるとインパルスを出す 公式Wiki

Operators

名前 説明 リンク
!= 等しくない場合はTrueを、等しい場合はFalseを出力 公式Wiki
< 入力 A が B よりも小さいかどうかをチェック 公式Wiki

Input Devices>Controllers

名前 説明 リンク
Standard Controller サポートされているすべてのVRコントローラ 公式Wiki

Physics

名前 説明 リンク
Find Character Controller 入力されたユーザーまたはスロットからCharacterController(Component)を見つけて出力 公式Wiki
Is Character On Ground CharacterController (Component) がコライダー上に立っているかをチェック 公式Wiki

Locomotion

名前 説明 リンク
Get Active Locomotion Module ユーザーの現在のロコモーションモジュールを出力 公式Wiki
Switch Locomotion Module ユーザーのロコモーションモジュールを切り替える 公式Wiki

Input

名前 説明 リンク
Elapsed Time 最後のimpulse入力から経過した時間を出力 公式Wiki

LogiXの簡単な説明

1、Get Active User Self を使う

まずこのLogiXを実行する起点として Get Active User Self を使います。
Get Active User Self はこのノード自身がユーザーの子になっている時にそのユーザーを出力します。
アバターは着ている時点でユーザーの子になっているので、ノードがパッキングされたアバターを着ているということは、この Get Active User Self は確実にアバターを着ているユーザーを出力してくれます。

2、左コントローラーのセカンダリが押されたときにパルスを出す

コントローラーへの入力を取得するには「Standard Controller」を使います。
一つ目の入力はコントローラーを取得するユーザーなので Get Active User Self をつなぎます。
二つ目の入力はどちらのコントローラーを取得するかなので、今回は左コントローラー(Left)を指定します。

出力の6つ目がセカンダリの状態なので、これが押されている状態(つまりTrue)になった時にインパルスを出すために Fire On True に繋ぎます。

3,地面に足がついているかどうかを取得する

地面に足がついているかどうかは Is Character On Ground で取得します。
このノードは、CharacterController がコライダーの上に立っている時に True を返します。
入力には調べたいユーザーの CharacterController が必要なので Find Character Controller を使って取得します。
Find Character Controller は入力されたユーザーの CharacterController を返すものなので、Get Active User Selfに繋ぎます。

これをIfに繋げることで、地面に足がついてない場合フライモードに切り替えることができます。

4,現在のロコモーション(移動能力)を取得する

現在のロコモーションを取得するには Get Active Locomotion Module 使用します。
このノードはユーザーを入力することで、そのユーザーの現在のロコモーションを取得することができます。
さらに Get Slot で、そのロコモーションを設定しているスロットを取得します。
そのスロットの名前を Get Slot Name で取得することによって、フライモードなら「フライ」という名前のスロット名を取得することができます。

これをIfにつなげることで、歩行モードなら地面に足をついているかをチェックしたうえで、フライモードへ。
フライモードならダブルセカンダリを検知したうえで歩行モードへ切り替えることができます。

5、7、ロコモーションを切り替える

ロコモーションを切り替えるには Switch Locomotion Module を使用します。
Switch Locomotion Module はパルスを受け取ると、指定したユーザーのロコモーションを切り替えることができます。
一つ目の入力にはパルス。
二つ目の入力は変更したいユーザーなので Get Active User Self を繋げます。
三つ目の入力は切り替えたいロコモーションの文字列が入りますが、この文字列は Switch Locomotion Module の 公式Wiki ページに記載があります。

6、ダブルセカンダリを検出する

セカンダリが2回連続で押されたことを検出するには Elapsed Time を使用します。
このノードはインパルスが入力されてから、次にインパルスが入力された時の時間差(秒)を出力します。
つまりこの差が仮に0.5未満であるなら、2回連続でセカンダリボタンが押されたと判断して良いと思います。

If に0.5未満なら Switch Locomotion Module へ、つまりロコモーションを切り替えに、0.5以上なら Elapsed Time へインパルスを通すことで Elapsed Time をリセットしています。

おしまい

ちなみにこの仕込みにはもう一つ大きな利点があって、歩行中に誤って床から足を踏み外した時にとっさにセカンダリを押せばフライモードに切り替わるため空中にとどまることができます。

これはフライモードが一般的なせいで、あまり柵が設置されていないNeosのワールドにおいて驚くほど便利です!

そうでなくてもなんとなく楽しいので皆さんも是非やってみてください。

余談

ワールドに入ったときにフライモードに切り替えるだけなら、ワールドにJoinしたときか、アバターが読み込まれた時などにフライモードに切り替えるLogiXを組んだ方が多分手ごろですw

↓作りました
https://zenn.dev/sfuka/articles/7ac303f292291f

Discussion