VRChatでビーム砲展開からのチャージビームを撃ちたい
はじめに
ありませんか?VRChatでビーム撃ちたくなる瞬間。変な人に絡まれたりフレンドとふざけてたりしてるときに「あぁ…ビームさえあればなぁ…」ってなりませんか???
それも起動した瞬間ぶっ放すビームではなくてカッコイイ予備動作の後チャージしてからの…発射ッ!!!!
ついでに発射後の終了動作があるとカッコイイね!!
撃ちたいよね~。作り方の記事を探しても全っ然検索に出なかったので備忘録がてら記事を書こうと思った次第。
あっ、普段はVtuberやってるヴィラン Vtuber Vainと申します。
やりたいこと
1.砲身が伸びたりとかカバーをガパッと開けたりしてからチャージ開始
2.チャージ完了後に自動で発射しオフにするまでビームが出続ける
3.ビームオフで砲身を収納
動作環境
・Unity 2019.4.30f1
・VRCSDK3-AVATAR-2021.09.03.09.25_Public
超注意事項
・VRCSDK3の方向けの記事。
・この記事では主にアニメーションコントローラーの設定について書かれているので、パーティクル自体の設定とかアニメーションの作成方法とかアップロードの仕方等は割愛させていただきます。少なくとも1度以上は自作のアニメーションとかをExpression Menuに登録してアップロードしたことある人向け。
・要素の名称を分かりやすいように記事内では日本語名にしていますが、皆さんは必ず半角英数字を使ってね。予期せぬ誤作動を起こす場合が有りうるので。
・持たせた銃からチャージ→単発ビーム発射だけしたいのであれば当記事はあんま参考にはならないと思ってください。あくまでもミソはチャージ時にビーム砲を展開する部分とビームが出続ける部分(いわゆるゲロビ)とオフにするとビーム砲の収納アニメを挟むこと。
①アバターの準備
今回は自作の配布アバター「ガンマトルーパー」をBlenderでちょっと改造したものを使う。マテリアルもなんとなく金色にしちゃった…
改造した部分はシェイプキーとビーム砲メッシュの追加で
【キー1】…胸パーツが開閉するシェイプキー 値100で開ききる
【キー2】…砲身が伸縮するシェイプキー 値100で伸びきる
といった具合で改造を施した。Blenderを触れる技術があるならシェイプキーでなくボーンのアニメーションも使えるのでそっちのが見栄えはいいかも。
内蔵式の大口径ビーム砲…浪漫あるよね…
それでは調理開始。まずHierarchyからArmature(骨格)をどんどん開いて上体のボーンの子に右クリックでCreate Emptyを選択しGameObjectを作成。
このGameObjectはビームやチャージパーティクルの発射点にするので砲口の位置に移動させておく。
GameObjectのこの置き方はパーティクルのシミュレーションスペースがLocal前提で話を進めていく。シミュレーションスペースをWorldで作る場合はArmatureの外に置いてRigidBodyやらで繋げたりなんやらしないといけないけど、そちらは解説してる記事も多いしそもそもビームだから直線的かつ瞬時に着弾するならLocalでいいかも。
次はGameObjectの子に同じく右クリックでGameObjectを2つ作成し名前を変更。この記事用に日本語を名前に使ってるだけなのでみんなはちゃんと半角英数字を使ってね。今回は発射時の「ビームオン」とチャージ時の「チャージオン」という名前にしている。
名前を変更した2つのGameObjectそれぞれを右クリック→Effect→ParticleSystemで子パーティクルを追加し名前を変更。今回は「ビームパーティクル」「粒子パーティクル」という名前にしている。粒子はビーム砲発射前に砲口に吸い込まれる光のような感じで作成。
(パーティクルって「粒子」って意味だから「粒子パーティクル」だと「パーティクルパーティクル」になるんだけどね…)
そしてパーティクルの親のGameObject2つ「ビームオン」「チャージオン」を非表示にして準備は完了。
2つのパーティクル自体の設定は他所の記事を参考にいい感じで用意してね。今回は自作したやつだけどBoothに有志の方々が作った設定済みビームパーティクルがたくさんあるのでそちらをぶち込んでもOK。ただしチャージ用のパーティクルはあまり見かけないので自作がいいかも。ぶち込む場合は直接プレハブをぶち込むんじゃなくて親にGameObjectを置いて子にプレハブをぶち込まないと制御できなくなる場合がある点は注意。
②アニメーションの準備
用意するアニメーションは4つ。アニメによってループ設定の有無があるのでアニメーションのLoopTimeのチェックボックスを確認しよう。アニメーションの作成方法は割愛ッッ
アニメーション作成時に強いて気を付けるべきことはアップロードする予定のモデルを複製し作成はそちらで行うことくらいか。
【待機状態】(ループ有り)…ビーム動作全てをオフにするデフォルト状態のアニメ。今回はパーティクルが入っている2つのGameObject非表示と砲身展開シェイプキー2種類の値を0にする。
【チャージ状態】(ループ無し)…チャージを開始するアニメ。今回は
0:00~0:50→胸開閉シェイプキーを0→100に 以降100を維持
0:50~1:00→砲身シェイプキーを0→100に 以降100を維持
1:00~→チャージパーティクルが入ったGameObjectを表示 終了まで維持
【ビーム発射状態】(ループ有り)…ビーム発射中のアニメ。今回は砲身展開状態を維持したままにするのでシェイプキー2種類の値を100に、ビームパーティクルの親GameObjectを表示する。チャージパーティクルは必要ないので親GameObjectを非表示に。
【収納状態】(ループ無し)…ビームを終了し砲身を収納するアニメ。今回は
0:00~1:00→ビームパーティクルが入ったGameObjectを非表示 以降終了まで維持、収納のため砲身シェイプキーを100→0に 以降0を維持
1:00~2:00→胸開閉シェイプキーを100→0に 以降0を維持
終了→ビーム動作全てをオフにする
一連の動作を繋ぐと待機状態→チャージ→ビーム→収納→待機状態…とループしていく流れになる。その設定を次の項目で解説しよう。
③アニメーションコントローラーの設定
こっからが肝心要の設定。前項の4種類のアニメーションを繋いでいく。コントローラー自体は新規で作成するも良し。既存のものにレイヤーを追加するも良しである。レイヤーを分けない場合、AnyStateを挟まない都合上モノの出し入れによく使われるIntパラメーターとは共存しにくい点は注意しよう。出来ないことはないけど。
今回は単純なON/OFFだけで動作するBoolパラメーターを使っていく。まずコントローラーの画面に入ったらパラメーターをクリックし+からBoolを選択。その後パラメーターの名前設定だが今回は分かりやすく「Boolビーム」にしておいた。
アニメーションの配置の手順は
1.何もない場所に【待機状態】アニメーションをドラッグアンドドロップ。Entryからオレンジの矢印が伸びればOK
2.【チャージ】【ビーム発射】【収納】アニメーションを何もない場所にD&D。図のように四角になるように配置すると分かりやすい
3.【待機状態】を右クリックしMakeTransitionを選択。矢印がついた線がマウスカーソルにくっつくのでその状態で【チャージ】をクリックすると二者間が矢印で繋がれる。
4.同じ要領でアニメーション間を上画像のように繋いでいこう。
矢印自体をクリックすると詳細設定画面が出るのでまずはConditionsの+をクリックしBoolパラメーターを追加しよう。今回は「Boolビーム」が追加され赤丸の選択が「true」になっている。「true」が「ON」でその逆の「false」が「OFF」である。それぞれの矢印をクリックしていき、図の赤色矢印を「true」、青矢印を「false」でコンディションを設定していこう。
ちなみにHasExitTimeのチェックがついているかも確認。これがないと挙動が駄々っ子になりやすい。遷移時のアニメの流れをブレンドするSettingsグラフだがこの辺はお好みで調整しよう。
補足
これがどういう挙動なのか説明すると
------------------------------------------------------------
【待機状態】時にパラメーターがtrue(ON)を検知→【チャージ】に移行
------------------------------------------------------------
【チャージ】終了時にパラメーターがtrueのまま→【ビーム発射】に移行
【チャージ】終了時にパラメーターがfalseを検知→【収納】に移行
------------------------------------------------------------
【ビーム発射】時にパラメーターがfalse(OFF)を検知→【収納】に移行
------------------------------------------------------------
【収納】終了時にパラメーターがfalseのまま→【待機状態】に移行
【収納】終了時にパラメーターがtrueを検知→【チャージ】に移行
------------------------------------------------------------
つまり【チャージ】中のビーム発射中止や【収納】中の再チャージの挙動が自然に行えるのである。
④アップロードまでの流れ
あとは慣れている方々には説明不要かもしれないが、パラメーターの定義とメニュー&サブメニューの設定である。
アップロードするモデルにVRCAvatarDescriptorを追加し
FX→先ほど設定したアニメーションコントローラーを設定
Menu&Parameters→VRCSDK3内から複製したEXメニューとEXパラメーターの名前を変更したものをとりあえずぶち込もう。今回は「ビームメニュー」「ビームパラメーター」とする。
サブメニュー用に「ビームメニュー」を複製し名前を変更した「ビームサブメニュー」を準備。
後の設定は割愛ッッ!!!!言わなくても分かるよね(圧)
このあたりも解説記事が多いのと1回以上EXメニュー自作した方なら流れは同じである。気を付ける点はパラメーター定義時に名前と種類(Bool)を間違えないこととサブメニューでのアニメーション作動方式をToggle式に設定しBoolパラメーターを選択することくらいである。
特にVRChat上での色んなモノの出し入れのEXメニュー解説ではIntの数値変化を用いている記事が多いので違いに注意。BoolはIntより単純すぎるぐらいなのが利点である。
あとはアップロードし挙動をVRChatで確認してみよう
ミョンミョンミョンミョン…
でたぁ!!
この機構に色々付け加えたりして自分に実装した動画がこちら
動画のビームに使わせて頂いたアセットはこちら 製作者:ゆゆラボ様
トラブルシューティング
・アバターリセット時に変な挙動やパーティクルが出ている→【待機状態】アニメーションが全ての挙動をOFFにしているか確認。
・チャージ中止と収納からの再チャージが行えない→【チャージ】【収納】2つのアニメーションを繋ぐ相互矢印のコンディション「true」「false」が正しいか確認。
・延々チャージしたりビーム発射が勝手に終わる→ループの設定が間違っていないか確認。コントローラーでAnyStateを挟んでしまうとループを切っていても問答無用でループしてしまうので注意が必要。
備考
・当たり前の話だがビームぶっ放す時はTPOを弁えよう。
・この挙動を基礎に色々パーティクルやら動作を付け加えるともっとカッコよく出来るのは確かだが、何かを追加するたびに【待機状態】と【収納】のアニメーションでそれらをOFFにするアニメーションキーを追加することをお忘れなく。
・【チャージ】と【ビーム発射】を1つのアニメーションにまとめたものも使えるが、その場合チャージ中からの中止入力にも関わらず発射される場合もあるので分けさせて頂いた。
・同じ要領でACVに出てくるオーバードウェポンみたいなのも作れる。ただしあちらはチャージを任意のタイミングで離すとブッパする挙動なのでループ設定やアニメーションの追加と遷移の追加やコンディションの「true」「false」を変更したりする必要がある。作りたいって方は連絡ちょうだいね。
以上。こういう浪漫砲は撃つべき時にしか撃てないからこそ浪漫があるので何度も言うけどTPOは守ろうね!