見出し画像

ワイワイヘリコプターの実装方法



●ワイワイヘリコプターって?

ワイワイヘリコプター(以下YYヘリ)はときわさんが作成したVRChat内で使用できる無料のヘリコプターのフライトシステムです。
VRchat内で使用されているSacc Flightシステムに比べ以下のような特徴があります。

⚫︎比較的処理が軽量なのでFPSの低下が少ない
⚫︎戦闘機能が無い為、落ちても爆発しない

また、操作に関してアバターの大きさの影響を受ける為、操縦しにくいと感じたらアバタースケールを使用して調整してください。

下記のワールドリンクよりヘリコプターを試すことができます。


●操作方法

乗り降りの仕方

乗る時はパイロット席(右側)のコライダーをインタラクトしてください。
降りる時はパイロット席の人はジャンプボタンを押します。
それ以外は普通のVRC内の椅子のように移動すれば降りられます。

操縦方法

操縦方法は設定により2種類あります。

1:YYヘリ式
サイクリックスティックは実際に手を動かし、
ラダーは手首の捻りで行うタイプ。
実際に操縦桿を握る必要はありません。


2:Sacc Flight式
サイクリックスティックも含め手首で操作するタイプです。
Sacc Flightと同じ操作感覚で操作できます。

3:デスクトップ操作
デスクトップ操作はSacc Flightとは大きく異なり、WASDキーと矢印キーで操作します。

W:上昇(コレクティブ)
S:下降(コレクティブ)
A:左旋回(ラダー)
D:右旋回(ラダー)

↑:前進(ピッチダウン)
↓:後退(ピッチアップ)
←:左傾き(左ロール)
→:右傾き(右ロール)

スペース:降りる(ジャンプ)

転がった時

転がってひっくり返ってしまった場合、
機体後方付近にあるリセットボタンを押す事で
その場で姿勢を直す事ができます。

また、リスポーンボタンも別途で用意する事ができます。

●導入方法

ここでは初期実装のプレハブの設定ではなく飛ばしたいモデルを飛行させる方法を記載します。

応用すればヘリコプター以外のホウキなども飛行させる事が可能です。

※作成記録ですので正式ドキュメントではありません。内容が異なってたらすみません。
自力でテストフライトしてください!

実施環境は
Unity2019.4.31.f1
・YY Heli System230927
・このNoteは2023年10月23日時点の情報をベースに記載しています。

大まかな実装手順としまして
1:3Dモデルに必要なオブジェクトを追加
2:オブジェクトに必要なコンポーネントを追加
3:YYヘリの設定を行う
という流れになります

必要な物

⚫︎ワイワイヘリコプターシステム

⚫︎飛行させる3Dモデル
※ヘリコプターを飛行させる場合、下記の部品がメッシュ分割されていると動かすことができます。
・メインローター
・テールローター
・パイロットの操縦桿(アニメーションで駆動)
(コレクティブ、サイクリック、ラダー)
・格納式ランディングギア(アニメーションで駆動)

今回はStudio-Symphonys-さんのB-Bell429とNameko Heavy IndustriesさんのNH-2をベースに設定していきます。


なくても良い物

飛行中に鳴らす音源(3つまで設定可能)

●1:3Dモデルに必要なオブジェクトを追加する

スケールの確認

使用する3Dモデルのスケールが1.0である事を確認します。
100倍とかになっていると子のオブジェクトが0.01などの数値になりVRモードでの操作ができなくなる可能性があります。
blenderで出力し直してスケールを1にしてください。

FBXをインポートしてそのまま「すべてFBX」にしてエクスポートすれば大丈夫なはず・・・

モデルの当たり判定を設定する

モデルの当たり判定を作成する為にColiderを設定します。
・Box Collider
・Sphere Collider
・Capsule Collider
などを使用して機体の当たり判定をつけて地上に置けるようにします。

コライダーの場所の指定は基本ないですが、メインローターに当たり判定を付ける場合は回転させる予定のオブジェクトにコライダーを付けてください。

今回はlotorのオブジェクトを回すのでlotorにメインローターのコライダーを設定しています。

また、地上と設置する部分のColiderにはCollider内のMaterialに「LANDING GEAR」を追加する事で滑走着陸など、地上で滑る動作ができるようになります。

氷のような滑り方をする為、スキッドタイプのような横方向にも滑る物に向いています。

最後にコライダーが邪魔でプレイヤーが機体に乗り込めない事態や降りるときに機体が吹き飛ぶ事態を防ぐ為にコライダーがあるオブジェクトは全てLayerをDefaultからWalkthroughに変更します。
こうすることで建物などとの当たり判定は残しつつもプレイヤーへの当たり判定は無くなります。

これを忘れるとまともに飛びません!


パイロット席の設定

パイロット席のみ他の席と設定が異なりますので前準備だけ行います。
・椅子として座る座標の少し下に空のオブジェクトを作成する(座る方向に青い矢印を向けるように)

※このオブジェクトがアバターのTポーズ時の足の位置になります。客席を作る時も同様です。

Coパイロット席、客席の設定

パイロット席以外は一般的なVRCの椅子の作り方で問題ありません。
パイロットと同様に作成した空のオブジェクトに
・Box Collider
・VRC Station
・UDON Behaviour:[StationGraph]
をコンポーネントに追加します。

Box Colliderが座るためのスイッチ部分になります。
席が向い合せの場合は青い矢印の向きに注意!
パイロット以外は上のような設定、Enter,Exit Locationには作成した空のオブジェクトを入れます

揚力に関連するオブジェクトの設定

揚力とコントロールに関連する
・メインローター
・テールローター
の出力軸を作成します。

メインローター揚力を発生させる軸になる部分に
空のオブジェクトを作成します。(名前は自由です)
この時Y軸が揚力を出す方向に向くように作成してください。

Y軸の方向に揚力が発生する為、若干前傾させる事で少し実機らしいホバリングになります。
また、脚がタイヤの機体は前傾させる事でタキシング(地上走行)がしやすくなります。

テールローター推力を発生させる軸になる部分に
空のオブジェクトを作成します。
この時X軸が横向き且つ、X軸の矢印が右向きになるように作成してください。

どうしてもテールローターの回転方向が合わない場合のみX軸が左向きになるように設定してください。X軸の向きが後述のパラメーター設定に影響します

テールローターのオブジェクトに駆動したい部品を子オブジェクトとして入れておくと回転するようになります。メインローターは後述のパラメーター設定時に説明します。

重心位置のオブジェクトを作成

Ridgidbodyの重心位置を決める為にオブジェクトを1つ作り重心位置にしたい場所にセットします。

ヘリコプターの場合、メインローターの直下付近且つ、客席付近より下に持っていくと
安定性が上がると思います。

コントローラのオブジェクトを作成

右手、左手のコントロールを付与する為に
オブジェクトを2つ作成します。

各コンポーネントにUDON Behaivoiorを追加し、CONTLORERのUDONを追加してください。

この2つのオブジェクトはinactiveにしてください。
CONTROLLERを入れてこんな表示に変わればOKです。設定は後で行います。

リセット用のオブジェクトを作成

転がって動けなくなった時にその場で復旧する為のスイッチです。
リセットボタンにするオブジェクトを作成し
・Box Collider
・UDONの[RESET_ANG]
を追加します。

下の写真は正方形のコライダーですが180度ひっくり返った事を想定して縦長のコライダーにしておくとリセットしやすくなります。

ターゲットに機体の親オブジェクトを入れてください。
Is Triggerにチェックを入れるとコライダーの機能が無くなり、純粋にスイッチとしての機能
のみになります。

-----無くても良いゾーン-----

Audioのオブジェクトの設定

飛行中に鳴らすことのできるAudioを3つまで用意する事ができます。
ヘリコプターにおける
メインローター
テールローター
エンジンの音を追加できます。

コレクティブレバーの出力の増減によって
・メインローター、テールローターは音の大きさが変わります。
・エンジンは音の大きさと音のピッチが変わります。

各音を入れるオブジェクトに
Audio Source
・VRC Special Audio Source

を追加してください。

オーディオ設定ナンモワカランので省きます!
設定コピーしてください!

また、音を出す場合
回すオブジェクトが無い場合でも、後述するパラメータ設定内で
MAIN_ROTORO_SPEED
・TAIL_ROTOR_SPEEDの数値を1.0以上に設定してください。
回すオブジェクトがない場合はダミーの空のオブジェクトを入れておいてください。

コントロールのアニメーションの作成

操縦桿を動いて見えるようにする為に
アニメーションを設定する事ができます。

・コレクティブレバーを下から上に引くアニメ
・ラダーペダルを踏み込みから踏み込みのアニメ
・サイクリックの前後左右に動かした状態のアニメ4つ
・ランディングギアを格納するアニメ、脚を出した状態のアニメ
を用意します。

設定はYYヘリにある[HELI]又は[HELI2]のアニメーターをコピーして使用します。

コレクティブ、ラダーの設定

上記の2点は作成したアニメーションを差し替えれば完成します。

サイクリックのブレンドツリーの設定

サイクリックのアニメーションはブレンドツリーというものが使用されています。
VRChat内だと歩行アニメーションだったり
EXメニューから尻尾を4方向に振るアニメ
視線を動かすアニメなどに使っている事が多いです。

1:CYCLICのBlendTreeをダブルクリック

2:作成した4方向のアニメーションをBlendTree内にそれぞれ当てはめます。

作成するアニメーションは4方向に動かし切った状態のアニメーションです。

3:作動を確認する
Inspector内の赤い点をドラッグして動かしてみましょう
Preview内の操縦桿が動けばOKです。

動きが合わないようならアニメーションを入れた場所が違う可能性がありますので
入れ替えてみましょう

ランディングギアのアニメ設定

デフォルトのHELI2のようにパッと出し入れする挙動であればデフォルトのアニメーションの差し替えでOKです。

脚を動作させる場合はデフォルトの状態を作成します。
デフォルト➡脚上げ➡脚下げの順番に繋ぎます。

脚を上げるとTrue
脚を下げるとFalseです
格納アニメーションは出すか入れるかどちらか1つを作成し、アニメーションの再生速度を-1にすれば逆再生ができます。

●2:必要なコンポーネントを追加する

1:で不足しているコンポーネントを追加していきます。

親のオブジェクトの設定

1番上の親のオブジェクトには下記のコンポーネントが必要です。
⚫︎UDON Behaivior:HELI
⚫︎UDON Behaivior:HELI AUDIO (音源がある場合)
⚫︎UDON Behaivior:UPDN_LANDING_GEAR(脚の格納アニメがある場合)
⚫︎VRC Objiect Sync(機体の同期用)
⚫︎Ridgid body(物理演算用)
⚫︎VRC Station(パイロットの座席)
⚫︎Box Colider(パイロット座席のインタラクト用)
⚫︎Animator (操縦桿のアニメーションがある場合)

コントローラの設定

右手左手のコントローラーです。

左手はKEEP POSITIONにチェックを入れましょう。

右手は後述のAdvanced Modeの場合は
KEEP POSITION
KEEP ROTATIONの2つにチェックを入れることを推奨します。

KEEP ◯◯にチェックを入れると操縦桿から手を離しても操縦桿は真ん中に戻らず最後の位置で保持するようになります。

LEFT_HANDは左右関係なくチェックを入れる必要はありません

パイロット席の設定

パイロット席は客席の設定と異なり
・UDON Behaviour:[StationGraph]が不要です
・Box Collider、・VRC Stationは一番親のオブジェクトに設定する必要があります。

Disable Station Exitにチェックをいれてください

●3:YY Heliのパラメータセッティング

重量、空気抵抗の、設定

Ridgid bodyの設定を行います。
重さ(Mass)を大きくする事で離陸に必要な揚力の強さも大きくする必要があります。単位はkgです。
ここの要素は後述のパラメータ全てに影響する為先に決める事を推奨します。

空気抵抗(Drag)は飛行中の減速の速さや加速のしにくさに関わります。同じ揚力でもこの値が小さいと機体の最高速度が上がります。
その代わり減速が遅くなり止まりにくくなります。初期値は0.5です。

揚力の設定

これらを順次設定します

コレクティブレバーの操作でコントロールする揚力の大きさを決めます。
最小値と最大値を決める事ができます。
最小値(LIFT_POWER_MIN)は機体に乗った時の初期状態です、Ridgid bodyのMassより小さければ勝手に浮く事は無いと思います。
最大値(LIFT_POWER_MAX)はコレクティブレバーを最大まで引いた時のパワーです。Massの10〜15倍くらいが目安かと思います。

操縦の強さの設定

操縦の強さを決定します。値が大きいと機敏な動きができますが、細かい操縦が必要です。
操縦の姿勢は基本的に重心位置を軸に動きます。

CYCLIC_POWERはピッチ、ロール方向の強さ
RUDDER_POWERはヨー方向の強さを調整できます。

CYCLIC_POWERはYYヘリ式の操縦の場合、Saccタイプの設定値の2倍程の値にすると操縦しやすくなります。

メインローターの回転方向の設定

デフォルトは反時計回りになっています。
MAIN_ROTOR_CLOCKWISEにチェックを入れるとメインローター、テールローター共に
逆回転になります。

ローター回転数の設定

メインローター、テールローターの回転数を決定します。
MAIN_ROTOR_SPEED:メインローターが1秒に何回転するか
TAIL_ROTOR_FACTOR:テールローターがメインローターの何倍で回転させるかと言う値で決定します。


メインローター:5.0
テールローター:6.0とした場合
5×60=300RPM
300×6=1800RPM
でそれぞれ回転する事になります。

音を出す為に、回すオブジェクトが無い場合でも1.0以上の値を入れておいてください。

地面効果の設定

ヘリコプターが地表近くで離陸に必要なパワーが軽減される現象の事です。
地表辺りでふわふわ浮くような挙動が強くなります。Ridgid bodyの重さ(Mass)が変わると結構挙動が変わる印象です。
GND_EFFECTで設定します。

重心の設定

何も設定しなかった場合Ridgidbodyがあるオブジェクトの中心が重心に設定されます。
その為CENTER_OF_MASSにステップ1で作成した重心位置のオブジェクトを指定します。

操縦方法の選択

デフォルトではYYヘリ式の操縦方法になっています。
Saac flightタイプに変更する場合はSACC_COMPATIBLE_CONTROLにチェックを入れてください。

コントローラーの設定

ステップ2で作成した右手、左手のコントローラーをそれぞれ
LEFT_CONTROLLER
RIGHT_CONTROLLER
に指定してください。

揚力の発生場所の設定

メインローターが発生させる上向きの揚力の発生場所を決定します。
ステップ1の「揚力に関連するオブジェクトの設定」で作成した2つのオブジェクトを
メインローターはROTOR
テールローターはTAIL_ROTOR_RENDERERに指定します。

メインローターの回転させたいオブジェクトはMAIN_ROTOR_RENDERERに指定します。

パイロット席の設定

HELIシステムを起動するパイロット席の設定します。
一番親のオブジェクトにパイロット席のVRC Stationを入れているはずなので
VRCSTATIONに一番親のオブジェクトを指定します

●3.1:YY HeliのADVANCED(ADV)パラメータセッティング

ADVANCEDセッティングをONにする事で
ヘリコプターの
⚫︎トルク効果
⚫︎テールロータードリフト
⚫︎垂直尾翼の推力
が働くようになります。

また上記の関係上Rudder Powerは無効化され
代わりに後述するTail Potor PowerがRudder Powerの代わりになります。

 ADVモードはADV項目のTAIL_ROTORにオブジェクトを指定する事で起動します。

トルク効果の強さの設定

TORQUE_REACTIONを強くする程機体が回される力が強くなります。カ◯コンヘリが墜落時にぐるぐる回るあんなアレです。
これによって右旋回、左旋回のしやすさにも影響します。
この値が強い程、機体が空中で横滑りするテールロータードリフトという現象も強くなります。

メインローターの回転方向を時計回りにした場合は数値をマイナスにするとトルク効果が逆になり、リアルさが少し増します。

Tail Rotor Powerの設定

Rudder Powerが無効化された為、TAIL_ROTOR_POWERでヨー方向の再設定を行います。
最大パワーで飛行している時に回りにくい方向にも旋回できるようにRUDDER Powerで設定した時の値より大きくする事を推奨します。
TORQUE_REACTION値がプラスの時は左旋回がしにくく
TORQUE_REACTION値がマイナスの時は右旋回がしにくくなります。

テールローター位置の設定

NORMALモードでは重心位置を軸に動いていたヨー軸の動きがADVモードでは変わります。

TAIL_ROTORに設定した位置から力が発生して回そうとします。
その為「揚力に関連するオブジェクトの設定」で決めたテールローターのオブジェクトのX軸を反対にしている場合、推力の出る向きが逆になってしまい、ヨーの操作が逆になってしまいます。

回転方向の関係でX軸の向きを変えている場合は数値をマイナスに設定してください。

作成中・・・・垂直尾翼の推力の設定(任意)

ヘリコプターは前進速度が出ている時、テールローターの推力と同じ方向に推力を出しています。

これにより、前進飛行中はテールローターに使うパワーが少なくできる為、ラダーを強く踏み続ける必要が無くなります。
HELIシステム上はVERTICAL_TAIL_POWERが大きい程、TORQUE_REACTIONを0にするように働きます。使わない場合は数値を0にすれば良いです。

速度が上がるにつれて効果が大きくなる為
設定項目として
推力の最大値(VERTICAL_TAIL_POWER)
推力が効き始める最小速度(単位m/s) VERTICAL_TAIL_MIN_SPEED
推力が最大値になる最大速度(単位m/s) VERTICAL_TAIL_MAX_SPEED
を設定します。

●4:HELI_AUDIOの設定

機体に乗り込んだ時に鳴らす音の設定をします。

ステップ1で説明したように
コレクティブレバーの上下の作動によって
・メインローター、テールローターは音の大きさが変わります。
・エンジンは音の大きさに加えて音のピッチが変わります。

●5:UPDN_LANDING_GEARの設定

脚の格納の設定に関しましては

・脚を出し入れする高度
・高度を検知するセンサーの位置補正
を設定します。

・UPDN_HEIGHTはオブジェクト位置を基準とした、脚を出し入れする高度(m単位)

・地上にいるのに脚を閉まってしまう場合、オブジェクトが地上にいる時に
地面を貫通して地面より下の高度を取得している事が原因の為
SENSOR_HEIGHT_OFFSETの数値を上げて測定する基準を上に上げてください。(m単位)

この写真ではオブジェクト位置より50cm上の所を基準に
15m上昇したら脚を格納します。

●その他の設定

機体リスポーンボタンの設定

機体にリセットボタンはありますが
任意の場所にリスポーンさせる事ができます。

リスポーンボタンにしたいオブジェクトに
・UDON Behaivior:RESPAWN
・BOX Colider (インタラクト用)

を追加します。

RESPORNの項目に
リスポーンさせたいオブジェクト
・リスポーンさせたい座標、回転方向

を入力します。

コライダー(タイヤタイプ)の設定

0927の更新でホイールタイプのコライダーが追加されました。
Physics MterialにUDONを付与する事で横滑りしにくくなります。

ホイール用のコライダーの設定
・横滑り防止の力のかかる場所の設定
・横滑り防止の力の強さの設定
を行います。

・コライダーの設定
ホイールのコライダーは当たり判定のSphere Colliderと地面を検知するBox Colliderから構成されます。
地面を検知するコライダーが地面のコライダーと接触していると横滑りを抑える機能が働きます。
プレハブのHELI2から足のオブジェクトをコピーしてタイヤの部分に合わせて取り付けてください。

また、スキッド同様に滑る様にする為Sphere ColliderにはPhysics MaterialとしてLANDING_GEAR_TIREをセットしてください。

・力のかかる場所を設定
横滑りした時に横滑りを抑えるように逆向きの力を加えて滑り抑える為、力がかかる場所が変だと簡単に横転します。
力をかける場所は「前後位置がタイヤと同じ位置(Z軸)」かつ「重心位置と同じ高さ(Y軸)」が安定すると思います。
重心位置からズラす程タキシング中の安定性が低下すると思います。

・力の強さの設定
UDONのLANDING_GEARの中にあるGripの項目を挙げるほど横滑りしにくくなります。
ステアリングを行うタイヤのGripは地面にいても勝手に滑らない程度(1000〜3000程度)に、固定されたタイヤはガッツリ(10000程度)にすると地上でも操作できるようになると思います。

また、FORCE_POSITIONに先ほど設定した力のかかるオブジェクトを指定してください。




この記事が気に入ったらサポートをしてみませんか?