【Resonite+Flux】ジャンプ中にセカンダリでフライと歩行を切り替える方法

【Resonite+Flux】ジャンプ中にセカンダリでフライと歩行を切り替える方法 TIPS

この記事はS.Haruyaさんによって寄稿された記事です。
オリジナル記事はこちら:https://zenn.dev/sfuka/articles/45268a867c9c1f

はじめに

この記事はResoniteでジャンプ中(空中)でセカンダリを押したときにロコモーションのフライと歩行を切り替える方法です。

コンテキストメニューを開かなくても素早く切り替えられて快適ですし、何より歩行モードで不意に足を滑らせて落下しそうな時でもとっさにセカンダリを押すだけでフライモードになれるのはとても便利です。
(Resoniteはみんな空を飛ぶのが標準過ぎて結構柵も壁もな…いえ、なんでもありません)

今回の仕様

今回のFluxの仕様は…

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

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

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

Flux

使用したノード

名前説明(※今回使った入出力しか書いていません。またノードによっては説明以外の機能(型)がある場合もあります)
Get Slot入力:Component
出力:入力のComponentを保持するスロット
Get Slot Name入力:Slot
出力:SlotのName
Get Active User Self出力:このノード自身がユーザーの子になっている時にそのユーザー。このFluxはアバターにパックするので自然とアバターを着ているユーザーになる
If入力:パルス、Bool値
出力:Bool値に応じてそれぞれの出力からパルスを出す
Fire On True入力:パルスを出すユーザー、チェックするBool値
出力:入力のBool値がTrueになるとパルスが出る
==入力:String(A),String(B)
出力:AとBが等しい場合はTrueを、等しくない場合はFalse
<入力:Float(A),Float(B)
出力:AがBよりも小さければTrue、等しいか大きいの場合はFalse
Standard Controller入力:ユーザー、取得したいコントローラーの左右(LeftまたはRight)
出力:入力のユーザーの指定した側のVRコントローラーのセカンダリが押されていればTrue
Find Character Controller From User入力:ユーザー
出力:ユーザーの持つCharacterController(Component)
Is Character On Ground入力:CharacterController (Component)
出力:コライダー上に立っている場合はTrue
Get Active Locomotion Module入力:ユーザー
出力:現在のロコモーションモジュール
Switch Locomotion Module入力:パルス、ユーザー、設定したいロコモーション名
機能:ロコモーションモジュールを切り替え
Elapsed Time入力:パルス
出力:最後にパルスが入力されてからの経過時間

Tips

今回の作り方を理解するのに役立ちそうなFluxまとめました。
ちなみにユーザー部分は仮として Get Active User Self を使ってます。
Get Active User Self はこのノードがアバターの子になっているときにユーザーを返すノードです。

セカンダリが押されているかをチェックする方法

コントローラーのボタンを取得する方法として Standard Controller を使うことができます。
IndexコンやViveコン等、専用入力に対応したノードもありますが、トリガーやセカンダリを取得するだけなら汎用性のあるStandard Controllerがお勧めです。
取得するユーザーと左右どちらのコントローラーかを指定することで、コントローラーに関する様々な入力を取ることができます。

地面に足がついているかをチェックする方法

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

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

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

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

ロコモーションを切り替える方法

ロコモーションは Switch Locomotion Module を使って切り替えます。
ユーザーと、フライに切り替えたい場合は「Locomotion.Fly.Name」、歩行に切り替えたい場合は「Locomotion.WalkRanGripping.Name」を入力します。

ダブルコールを検知する方法

ダブルボタンプレスやダブルトリガーや今回のようなダブルセカンダリなど、パルスが指定の間隔内に再度流れた時にパルスを発生させる方法です。
Elapsed Time はパルスが流れた際にカウントが始まり出力から経過時間を取得できます。
そのため Call が押された際にそこカウントをチェックすることによって指定の時間内に再びボタンが押されたかどうかをチェックすることができます。

おしまい

以上!ジャンプ中にセカンダリでフライと歩行を切り替える方法でした。

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