見出し画像

VRChat備忘録⑤ SDK3.0 物の出し入れ(解説編)

こんにちは、こむぎ* と申します。
VRChatの片隅を漂う無言勢の様な何かです。

前回は、SDK3.0での基本的な物の出し入れについて、手順のみ書きました。
今回は、それぞれの工程の意味や、各種ファイルについて等自分に分かる範囲で説明したいと思います。

前回記事はこちら


はじめに

まず、各種ファイル類について紹介、その後前回の手順の意味など書いていきたいと思います。
前回の記事を開いて並行で見ていただけると分かりやすいかも知れません。

また、今回も色々書きすぎて、かなりのボリュームになりました。
単純な出し入れの手順だけなら他の方の記事の方が分かりやすいと思いますが、細かく書いたつもりなので、お暇な方だけお付き合いいただければと思います…


メンバー紹介(概要)

それじゃあ、物の出し入れに関係するイカれたメンバーを紹介するぜ!
どんな感じかフワッと説明して、物の出し入れで具体的に何をしたのかとか、細かい部分は後で説明します。

・アニメーションクリップ

"Animation Clip"。通称アニメーション、です。

スクリーンショット (372)

Unity上でのアイコンは上記画像。

アニメーションは、色々と数値・状態の変更などが記録されたファイルになります。

スクリーンショット (382)

前回の記事では、Cubeを非表示にするアニメーションと、逆に表示にするアニメーションを作りました。
上記画像の下部の、"Cube : Game Object.Is.Active 0" という内容が、Cubeの表示のチェックボックスを外す、という内容になります。

他にも、オブジェクトの色やサイズ、アバターの表情、動作、とりあえずUnity上で変更できる数値などが大体記録・再生出来ます。

スクリーンショット (373)

この辺はVRCSDKに元々入ってるアバターの動作に関するアニメーション類。

※関係無いですが、Projectウィンドウの右下のスライダーを動かすとアイコンのサイズが変えられて、一番左で最小化した時は上記の様にファイル名が出ます。意外と最初その情報が出てこなかったので思い出したところで記載。


・アニメーターコントローラー

"Animator Controller"。通称…は特にない気がします。
"Animatorウィンドウ" とか、"Animator" というコンポーネント、とか、類似品が沢山有るので混同しないよう注意。

スクリーンショット (374)

Unity上でのアイコンは上記画像。
アイコンの▶部分が+になっている Override Controller という物が有りますが、こちらは別物なのでご注意を。
Override ControllerはSDK2.0のアバターで表情変更用に使われている事が多いです。

アニメーターコントローラーは、前回の記事で色々いじった、矢印とStateという四角が出てきたやつです。

スクリーンショット (376)

前回作ったのはこんな感じの奴でしたね。

アニメーターコントローラーは一言で説明するのは難しいのですが、上記で説明したアニメーションを、どの様なタイミングで再生するか、などの制御を行います。

パラメーターという数値と組み合わせ、メニューの特定のボタンが押されたら、Stateに登録された "Cubeを消す" というアニメーションを実行する、みたいなイメージですね。

その "ボタンが押されたら" の部分は矢印部分に設定して、うまく自分が想定した状況・順番にアニメーションが動くように作っていきます。

また、"パラメーター" と呼ばれるいわゆる "変数" も、こちらに登録する必要があります。前回の記事で  "手順7.パラメーターの登録" で用意したCube ON って名前にした奴ですね。Boolとかその辺のキーワードが出たやつ。
※パラメーターは、もう一つ別のファイルにも登録が必要です。

スクリーンショット (377)

これはデフォルトで用意されている手の形に関するアニメーターコントローラーです。
それぞれの矢印に、コントローラーのボタンがどういう組み合わせで押されているかのパラメーターの数値が設定されており、Aボタン・トリガー・グリップボタン3つが押されたら Fist のStateへ、AボタンだけならPeaceへ、等と作られています。


・ExpressionParameters

読みはエクスプレッションパラメーターズ、でいいんですかね…?

スクリーンショット (378)

Unity上でのアイコンは上記画像。
専用のアイコンではないので、次に説明する ExpressionsMenu なども同じアイコンです。
アイコンだけでは区別がつかないので、分かりやすい名前を付けておくか、クリックしてInspectorの中身で判別しましょう。

スクリーンショット (379)

こんな感じの中身です。

役割としては、パラメーターと呼ばれる、いわゆる "変数" を登録するファイルになります。

前回だと、上記画像の "Cube ON" というパラメーターを、アニメーターコントローラーと ExpressionParameters 両方に登録しました。

ここで用意したパラメーターの数値などを元に、上記アニメーターコントローラーの矢印部分で実行の判断などが行われます。"Cube ON" が "true" だったら…とか。具体例は後程。

先程上記アニメーターコントローラーの項目で軽く触れましたが、基本的にはアニメーターコントローラーと、こちらのExpressionParameters、同じパラメーターを両方に登録する事になります。

ExpressionParameters側にだけパラメーターを登録する事で、自分にしか見えない変化を起こしたり出来るようですが、まだ試したことが無いです。
通常は自分と他人に同じに見えた方が良いと思うので、両方に登録するよう覚えておくとベターです。


・ExpressionsMenu

こちらはエクスプレッションズメニュー、でしょうか。
どうでもいいことですが、ExpressionParameters は、s が最後で、
ExpressionsMenu は s が真ん中です。よく間違えます。
何の事か分かればいいので、間違えててもそっとしておいて下さい。

スクリーンショット (380)

Unity上でのアイコンは上記画像。
ExpressionParametersの項目でも言いましたが、専用のアイコンではないのでExpressionParametersと同じアイコンですね。分かりやすい名前にするか、中身を見ましょう。

スクリーンショット (406)

こんな感じですね。前回最後に "手順9.ExpressionsMenuの登録" でボタンを登録した物になります。

ExpressionsMenuは、メニューボタン長押し(デスクトップモードなら Rキー)で出てくる円形のメニューの内容を設定する物になります。

主な使い道としては、ボタンを押したときに、特定のパラメーターの数値を変更する、などですね。
上記画像であれば、CubeON というボタンが作られて、押すと Cube ON というパラメーターが "true" という状態になります。
この辺の設定内容などの詳細は後述します。

以上で、メンバー紹介は終わりです。
前回の物の出し入れは、この4つのファイルが組み合わさって動作するように作っていきました。


実際の動作の流れ

では、各ファイルなどについて簡単に説明した所で、前回作った物の出し入れの仕組みが、ボタンを押したときにどういった流れで動作するのか、大まかな流れを見てみましょう。

※前回の記事を見直して気づいたのですが、アニメーション・パラメーター・State 等で同じor似たような名前を使っていて、説明の時混ざっちゃいますね…
混ざりそうな場面では、「というパラメーター」、「というState」 の様に種類を明記しますので、注意して読んでください。

大まかな流れ
1.ExpressionsMenuで設定したボタンを押す
2.ExpressionsMenu でそのボタンに割り当てられた "Cube ON" というパラメーターが ON(true)になる。
3.ExpressionParameters → アニメーターコントローラー の順にパラメーターの数値が渡される
4.アニメーターコントローラー内で設定した "Cube OFF" というState(四角いやつ)から、"Cube ON" という State の間の矢印に設定された
"パラメーター Cube ON が true だったら" の条件を満たすので、"Cube OFF" (state) → "Cube ON" (state) に進む。
5."Cube ON" (state) に設定されたアニメーション "Cube ON" (アニメーション) が再生される
6."Cube ON" (アニメーション)  に記録された "Cubeを表示状態にする" 内容が実行され、キューブが出てくる

上記のような流れになります。

次でもう少し詳細に。


1.ExpressionsMenuで設定したボタンを押す

スクリーンショット (385)

VRChat内でメニューを開くと、ExpressionsMenu で設定したボタンが出ています。
こちらをスティックで選択する事でボタンが押されます。


2.ExpressionsMenu でそのボタンに割り当てられた "Cube ON" というパラメーターが ON(true)になる。
こちらを押す(ONにする)と、ExpressionsMenu で設定したパラメーターに変化が起こります。上記画像赤枠部分です。
パラメーターの種類で変わってきますが、前回の記事で設定した "Cube ON" というパラメーターで使った Bool という種類は、ON/OFF(true/false)の2つの状態しかないので、ボタンを押すと必ず "true" という状態になります。


3.ExpressionParameters → アニメーターコントローラー の順にパラメーターの数値が渡される

スクリーンショット (395)

上記ボタン操作で ExpressionParameters に設定した "Cube ON" というパラメーターが "true" になり、連動して アニメーターコントローラー内で設定した "Cube ON" という同名のパラメーターがONになります。


4.アニメーターコントローラー内で設定したStateの条件を満たす

スクリーンショット (396)

アニメーターコントローラー内の、赤枠で囲った "Cube OFF"(state) → "Cube ON"(state) と繋がっている矢印の中身が画像右側になります。

Conditionsという、この矢印を進む条件を設定する部分に "Cube ON : true" と記載されているので、先程ボタンが押された事で "Cube ON" というパラメーターが "true" になったので、先に進んで "Cube ON" というState にたどり着きます。


5."Cube ON" (state) に設定されたアニメーション "Cube ON" (アニメーション) が再生される

スクリーンショット (397)

上記画像右上が、"Cube ON" というState の中身です。
Motion という欄に "Cube_ON" というアニメーションが登録されている為、このStateにたどり着くと該当アニメーションが再生されます。

アニメーションの中身は画像右下です。
"Cube : Game Object.Is.Active 1" という内容が記載されている為、Cube というオブジェクトの、"Game Object.Is.Active" という項目が 1 に設定されます。

スクリーンショット (400)

実際には"Game Object.Is.Active" とは画像赤枠の、オブジェクトの表示・非表示のチェックボックスの部分です。
0 = チェックが外れている、1 = チェックが入っている、となります。
なので、上記アニメーションが再生されると、上記画像のチェックがONになります。
結果、非表示だったCubeが表示されます。



前回の記事の手順の意味・内容

とりあえずどういったファイルが有るかと、完成後のおおまかな動作の流れを書きました。
後はそれを踏まえて、前回の記事はどういう順番で組み立てたのか、どういった意図が有ってあの順番だったのかを書いて終わりです。

全ての手順を再度書いても仕方がないので、並行で前回の記事を見ながらこちらの説明を読んでいただけると幸いです。

尚、この後の本文中でもある程度説明しますが、手順は前回の記事の順番である必要はありません。
むしろ前回は初めての人向けに兎に角手順を減らして書いているので、実は分かりやすさ・やりやすさはイマイチです。
仕組み的に必ず後になる手順などはありますが、理解できれば全く違う順番でもよいです。
最終的に、先程書いた流れになるよう全部が用意されればそれでOK。


手順1.アバターのセットアップ について

ここは特に説明することはありませんね。
前回の記事は物の出し入れの説明なので、その前の段階はやっておいてね、というだけです。


手順2.出し入れするものの用意 について

画像16

手順2については、出し入れするものを先に用意しましょう、といった内容ですね。内容自体はそれだけなので説明する事も有りません。

真っ先にやった理由としては、他の手順の後にする理由が無いのと、この後の手順であるアニメーション作成より前で無ければいけないからです。
逆に言えば、アニメーション作成より前であれば、いつでも良いです。
※「〇〇を出す・消す」のアニメーションを作る為には、〇〇が先に無ければいけませんので。

また、最初に物を用意、これを出し入れしますよ!の方が分かりやすいですよね。

今回はお勉強の為、という事で何の面白みもない Cube を用意しました。
自分が出し入れしたいものの場合は、この時点でアバターの手に持たせたり、頭にかぶせたり、位置合わせなどもしておきましょう。


手順3.Animator Controllerの準備 について

画像17

ここからがややこしくなってきます。

この後用意・設定するものとしては、今回の記事の最初の方でメンバー紹介した

・アニメーション
・アニメーターコントローラー
・ExpressionParameters
・ExpressionsMenu

の4つが必要になります。
ですが、彼ら4つは密接にかかわっており、単品で完結する物が無いのです。

今回は、まず最初にアニメーターコントローラーを用意しました。
理由としては2つ。

1.各ファイルは相互に関係しますが、アニメーターコントローラーは他の3つ全てと関連が有る事
2.この後行うアニメーションの作成(録画)の際、アニメーターコントローラーを先に作っておく必要が有る事。(アニメーション録画の準備)

です。

では前回の手順の説明です。

まず最初に、Hierarchyでアバターを選択し、Inspector の VRC Avatar Descriptor > Playable Layers >FX を確認する。との手順でファイルの有無を確認しました。上記画像のですね。

アニメーターコントローラーは、SDK3.0対応のアバターであれば高確率で最初から用意されている為、特別な理由が無ければそちらを流用すれば良いからです。


スクリーンショット (273)

もしファイルが無かった場合は準備しましょう、という事で、前回は上記画像の様に vrc_AvatarV3HandsLayer というファイルをコピーして使いました。
このファイルは、VRCSDKフォルダ内に元々用意されているサンプルファイル的な物と思われます。

なぜこのファイルをコピーするのかというと…はっきりとは分かりません。
大体どこのサイトでもこれを使うよう指定されます。
元々は、コントローラーの入力に応じて指の形を変える内容が入っています。
恐らくは、SDK3.0で指の形に応じて表情を変える場合はこちらを流用するので、それが理由かと思われます。

その後の名前変更・フォルダ移動は、単なる管理上の問題です。
自分が分かりやすいようにしておきましょう。
動作テストなんかで本格的に使う予定はないのであれば、上記vrc_AvatarV3HandsLayer ファイルをそのまま使っても動作はします。



手順4.Cubeの出し入れのアニメーションの準備1(録画準備まで) について

画像19

前回の記事の手順4では、まず新規でファイルを作成し、空のアニメーションを用意しました。

全く新しいアニメーションを作る際は、主に空のアニメーションを用意して、そこに録画(or手動で内容を追記)という形を取る事が多いので、まず先にファイルを用意します。

アニメーションのついてもファイル名、保存場所は自分の管理上の問題なので、好きにしましょう。
大抵、アバターの直下にアニメーションをまとめているフォルダが有るのでその中や、出し入れしようとしているオブジェクトのフォルダの中などに入れておけば分かりやすいかと思います。


スクリーンショット (284)

その後、アニメーターコントローラーを開き、Cube という レイヤー(Layers) を作りました。
レイヤーは一つの処理をまとめた階層…とでも言えばいいんでしょうか。

一つのレイヤー内では、同時に一つの State(四角いやつ)しか実行されない為、やりたい事ごとにレイヤーを分ける必要が有ります。

上記の画像だと、元々あるRight Hand 等は指の動きに合わせて表情を変える処理の入っているレイヤーなので、そこにCubeの出し入れを追記してしまうと、表情とCubeの出し入れが同時にできなくなってしまいます。

ちなみにレイヤーの名前も特に決まりはないので、自分の好きな名前にしましょう。


スクリーンショット (285)

次に、Weightという数値を1にしました。
これは、0のままだとそのレイヤーは動作しないからです。当然これから使うレイヤーなので1にしておきましょう。
動作確認時に全く動かない!という場合は大抵ここが0のままです。なんでデフォが0なんですかね…


スクリーンショット (287)

スクリーンショット (288)

その後、新規Stateを作成しました。
この後アニメーションを登録していく所ですね。

新しいレイヤーに初めてStateを作成した場合、Entryから矢印が繋がり、オレンジ色になります。
2つ目以降は灰色です。

アニメーターコントローラーのレイヤー内での動きとしては、まずアバターなどが読み込まれた初期状態は、Entryからスタートし、オレンジ色のStateに自動で進みます。
オレンジ色のStateは最初に必ず実行される…って認識で良いと思います。


スクリーンショット (290)

次に、Stateの名前を変え、Write Default というチェックボックスをOFFにしました。

名前は管理上分かれば良いので、なんでも大丈夫です。

Write Default とは何かと言うと、正確な表現は私には難しいのですが…
これがONの時の基本的な動きとしては、アニメーションを再生して何か数値などを変更した後、再生を終了すると自動で元の数値に戻ります。

例えば今回の様な物の出し入れの場合・・・

・初期状態:Cube 非表示
・用意したアニメーション:Cube を表示させる

この状態でアニメーションを再生するとCubeが表示され、アニメーションを止めると、自動で非表示に戻ります。
Cubeを非表示にするアニメーションの用意は不要です。

逆にWrite DefaultがOFFの場合、初期状態が非表示だとしても、アニメーションを止めても自動で元の状態に戻らないので、Cubeは表示されたままになります。

一見便利ですが、VRChatではOFFにすることが推奨されています。
勝手に数値が戻るのは予期せぬ動きを招くのでよろしくない、といった話を聞いた気がします。
なんにせよ公式が使うなと言っているので、OFFで進めます。長いものには巻かれましょう。


スクリーンショット (292)

スクリーンショット (293)

次に、先程用意した空のアニメーションのファイルを、アニメーターコントローラーのStateに登録しました。

なぜ空のファイルをこのタイミングで登録するのかというと、この後の手順でアニメーションの録画を行うわけですが…

・アバターのAnimatorのControllerの欄にAnimator Controllerファイルが登録されている。
・該当のAnimator Controllerファイルの中に、これから録画したいアニメーションファイルが登録されている。

この2つの条件を満たしていると、録画ボタンを使う事が出来るようになるようです。
よって、先に登録しておかないと録画ボタンが使えずアニメーションの中身が作成出来ない、といった理由があるのでした。
(録画ボタン以外のやり方も、有るにはあります)


スクリーンショット (294)

というわけで、上記アニメーション録画の条件を満たすために、アニメーターコントローラーをアバターの上記画像部分に登録します。
この作業はあくまでもアニメーション録画の為だけに行います。


スクリーンショット (298)

で、前回記事の手順に従ってアニメーションウィンドウを開いて赤枠の部分をクリックすると、先程登録したアニメーターコントローラーの中に有るアニメーションのファイルが全部出てきます。
上記画像については、元々表情などのアニメーションが登録されていたので、そちらも出てきています。

ここまでで、
・空のアニメーションファイルを用意
・それをアニメーターコントローラーに登録
・そのアニメーターコントローラーをアバターに登録
しましたので、録画ボタンが使える準備が整いました。


手順5.Cubeの出し入れのアニメーションの準備2(録画、複製) について

スクリーンショット (300)

スクリーンショット (301)

さて、準備が出来たので実際の録画の手順に移りましょう。
上記画像の様に録画ボタンを押すと録画開始です。


スクリーンショット (302)

画像31

録画中に、Unity上で何らかの数値やチェックボックスを変更すると、アニメーションファイルに変更後の状態が記録されます。

前回の手順であれば、上の画像のCubeの表示/非表示のチェックボックスを外した為、下の画像の下部のように "Cube : Game Object.Is Active" という内容が記録されました。
これでOFFのアニメーションは作成完了です。

注意:アニメーション録画の際は、数値の変化が必要です。
元々と同じ数値を上書きで入力しても、変化なしと見なされて録画されません。(数値0の所に、上から数値0と入力)
その場合は、一度適当な数値を入れると項目が作成されるので、その後元の数値に戻せばOKです。(0→1→0 とか)


・アニメーションについて余談

アニメーションに記録される内容は多岐に渡り、オブジェクトの位置を変更する、サイズを変える、色を変える、割り当てられているマテリアルを変える、など大抵の事は記録出来ます。

また、今回は物の出し入れなので一瞬でON/OFFするだけのアニメーションですが、時間経過で数値が変化するようなアニメーションも作れます。
というか本来はそっちが普通かな…?


スクリーンショット (405)

例えば上記。アニメーションウィンドウの右側に◆と白い縦線がいくつか出ていると思いますが、こちらは上部に出ている時間に、どういった状態になっているかが記録されています。
画像上側が0:00の時で、 "Cube : Rotation" の "Rotation.y" が0です。
画像下側が1:00の時で、 "Cube : Rotation" の "Rotation.y" が360です。
このアニメーションを実行すると、0:00~1:00の1秒間かけて、Cubeのy軸の角度が0~360で変化します。つまり、1秒かけて1回転するアニメーションになります。(間の記録されていない部分は、自動で補完されます。)

上記のようなアニメーションを録画する際は、最初に0:00部分で0という数値を録画後、1:00という時間部分をクリックすると白線が移動する為、今度はそちらで360の数値を録画する、という手順を取ってください。

余談終わり


画像34

画像35

さて、OFFのアニメーション作成後は、ONのアニメーションを作成します。
前回の手順では、ONについてはOFFと同じ録画ではなく、上記画像の様にOFFのファイルを複製して作成していきました。


スクリーンショット (308)

複製したファイルを開き、0になっているところを1にしました。
これだけで完了です。

先程OFFのファイルは録画する為に色々と事前準備をしましたが、ONのファイルはどこにも登録していないので、録画ボタンはグレーアウトして押せないままです。

ですが、すでに記録されている項目の数値を変更するだけで有ればこの状態でも可能なのです。

なので、同じ項目の数値を別の値に変えるようなアニメーションを作る場合は、面倒なのでコピーして数値部分だけ変えて作った方が楽ですよ、という手順でした。
※もちろん、録画ボタンが好きならそっちで録画しても何の問題も有りません。

ちなみに、OFFのアニメーションを録画した時の画像と見比べると分かるのですが、同じ項目なのに録画した時は "□"(チェックボックス)になっており、ONのファイルを編集するときは数値の 0 になっています。
チェックボックスの OFF/ON などは、録画後は数値の 1/0 に置き換えられます。そう言うものなので気にしないでください。


スクリーンショット (324)

スクリーンショット (321)

その後、アニメーターコントローラーを開き、新しいState(灰色のボックス)を作成し、名前をCube ONに変更し、Motionの欄に先程作ったCube ONのアニメーションを登録しました。

下のCube OFFのオレンジ色のStateには、Cube OFFのアニメーションが登録されています。
こちらは、空の状態で登録→中身を記録、という手順でした。
Motionの欄は「このファイルを再生します」というだけなので、登録後にアニメーションの中身を変えてもきちんと動作します。

上のCube ONの灰色のStateには、先程完成済みのCube ONのアニメーションを登録しました。

これで、OFFにするアニメーションと、ONにするアニメーションを用意し、アニメーターコントローラー内でも、それぞれを実行する場所が準備出来ました。


画像39

その次の手順で、上記画像の アバターを選択→Animator > Controller 欄のファイル名を削除、の手順を行いました。

この手順については先にも言った通り、ここにアニメーターコントローラーを登録した事自体が録画の準備の為だけだったので、録画が終了して不要な登録を解除している作業になります。


手順6.Expressions Menu、Expression Parameters の準備 について

画像40

次の手順でやった事は

・ExpressionParameters
・ExpressionsMenu

の準備をしました。

こちらも手順3.Animator Controllerの準備と同じく、元々ファイルが有るか確認しています。
購入したアバター等で、何かしらギミックが入っているアバターなら両方用意されている可能性が高いです。


画像41

ない場合は新規作成します。
手順3.Animator Controllerの準備では、アニメーターコントローラーが無かった場合、サンプルをコピーして使いました。

実は今回のExpressionの2つのファイルについても。VRCSDKのフォルダ内にサンプルが有ったりします。
では何故こちらはサンプルを使わないで新規作成するのかと言うと、どちらのファイルもメリットがないからです。

ExpressionParameters には余計な空白データが多数入っており邪魔、ExpressionsMenu  は余計なデータこそ無いものの、逆に何も入っていない空のファイルの為、新規作成するのと違いが有りません。コピーするだけ手間です。


画像43

用意したファイルは忘れずに、アバターのVRC Avatar Descriptor > Expressions > Menu & Parameters に登録しておきましょう。
ぶきやぼうぐは そうびしないと いみがないぞ!


手順7.パラメーターの登録 について

次はパラメーターの登録です。

パラメーターについては今回の記事の前半で説明したように、ExpressionParametersと、アニメーターコントローラーの両方に登録する必要が有ります。

前回の記事の手順7では、アニメーターコントローラー → ExpressionParameters の順番に続けて登録しました。

順番はどちらでも構いませんが、大文字小文字スペースなど、必ず同じになるように登録しましょう。

また、パラメーター登録はいつのタイミングでも構いませんが、次の
手順8.Animatorの遷移条件(Transition)の設定
で登録したパラメーターを使う為、それより前に登録する必要が有るのでこのタイミングでの実施しました。

画像43

画像44

まずアニメーターコントローラーのパラメーターというタブを開き、そちらに登録していきます。
前回の記事では "Bool" という型(タイプ)のパラメーターを新規登録し、パラメーターの名前を "Cube ON" に変更しました。

この際、パラメーターの名前は何でも良いのですが、パラメーターのタイプは自分がやりたい事、管理の仕方に応じて自分で考えて決める必要が有ります。

Boolという型は、true/false の2つの状態のみ記録できるパラメーターです。
その為、物の出し入れ(ON/OFF)の2つの状態を記録するにはピッタリなので、今回はこちらを使いました。
このタイミングで、パラメーター "Cube ON" が "true" ならCubeを表示、"false" なら非表示にするぞ、と自分で決めておきます。

・パラメーター余談

他にもFloat、Intなどが有り、Floatは小数点を含む数値、Intは0~255の整数を管理できます。

Intは複数の物を出し入れする時とかに便利です(0は無し、1は刀、2は銃、など)

Floatは小数点以下も含めた "浮動小数点" を管理できるパラメーターですが、VRChat上では スティックで 0~100%を変更できるボタンや十字キーみたいなボタンで使ったり、ちょっと変わった使い方をする事が多いです。
ここでは説明しませんが、そのうち何かのついでで説明するかもしれません。

余談終わり


スクリーンショット (329)

アニメーターコントローラー側にパラメーターを登録したら、続けてExpressionParametersにも同じパラメーターを設定します。

名前は大文字小文字スペースが完全一致するように、Typeは先程アニメーターコントローラー側で決めたのと同じにしてください。

Defaultは、アバター読み込み時の初期状態です。今回は初期状態ではCubeは非表示にしておこうと考えたので、チェックボックスが入っていない状態にしています。

Savedはパラメーターの状態を、VRChat終了時やワールド移動時に保存するかの設定です。
ONの場合は、ワールド移動や再起動でアバターが再読み込みされても、パラメーターの数値は変わりません。
そのため、物の出し入れや服の着替え等のギミックの状態が維持されます。

逆にSavedがOFFの場合は、読み込みなおした時点で初期値に戻ります。

着替えなど持続して欲しいものはON、一発ネタなんかの出しっぱなしになってもなあ、というものはOFF、でいいんじゃないでしょうか。


手順8.Animatorの遷移条件(Transition)の設定 について

スクリーンショット (336)

スクリーンショット (344)

次はアニメーターコントローラー内の矢印部分、Transitionsの設定です。

まずCube OFFから、Cube ONというStateに矢印を伸ばし、上記画像の様な内容に設定しました。

いじった部分としては、

・Has Exit Time
このチェックがONになっていると、アニメーション再生後先に進む、といった動作をします。
この後設定する Conditions が空の場合は、再生後自動で先に進み、Conditions に何か設定が有る場合は、条件を満たした後でもアニメーション再生を待ってから先に進みます。
今回はON/OFFを切り替えたら即時次のStateに進んで欲しいと思う為、チェックを外します。

・Transition Duration(s)
ここに数値が入っていると、前のStateと次のStateの間を徐々に遷移する事になります。
説明が難しいのですが、即時に切り替えたい場合は、こちらも0にしておきます。

・Conditions

スクリーンショット (343)

ここが本命です。
前回の記事では、Cube OFF → Cube ON の間の矢印は、上記内容に設定しました。
これは、前の項番のパラメーターの設定の時に、自分で "Cube ON" が "true" だったらCubeを表示するぞ!と決めたので、その通りに設定しています。

なので、別に決まりは有りません。
実際、少し前までVRChatはBoolが使えなかった為、みんなIntで0は非表示、1は表示としているパターンがメジャーでした。

自分が決めたルール通りにすれば何でも良いので、
「俺は天邪鬼だから、falseで表示、trueで非表示にしたい!」とか、
「私はFloatで0.01なら表示、0.245なら非表示にしたいわ!」とか、
やりたいようにやってかまいません。
後は次の項番でボタンを押すときに、その数値になるよう設定すればいいだけです。


スクリーンショット (350)

スクリーンショット (345)

あとは、反対側のON→OFFの矢印も、先程決めたパラメーターの使い方に従って、"Cube ON" が "false" なら、と設定します。
これで、Cube ON というパラメーターの切り替わりで、ONとOFFのStateを行ったり来たりするようになりました。


手順9.ExpressionsMenuの登録 について

スクリーンショット (406)

ここまでで、アニメーション、それを管理する為のパラメーター&アニメーターコントローラーは用意出来ました。
後は最後に、パラメーター "Cube ON" を変更する為のボタンを作ります。

前回の記事の手順で、ExpressionsMenuに上記のような内容のボタンを作りました。

Name・Iconはメニュー上で何のボタンにするか分かるようにするだけなので、好きな名前、アイコンを使いましょう。

Type はボタンの種類です。
今回使っている Toggle は、押すたびにON/OFFが切り替わるボタンになります。押したらCubeが出て、もう一回押すと消える、との動作にしたいので、今回はこのタイプを使いました。

ExpressionsMenuの初期状態だと、Typeは "Button" になっています。
こちらは押すと暫く(数秒?)すると自動でOFFになるボタンです。
あまり使いどころは思いつきませんが、一回だけ何かしたい物…とかに使えばいいんじゃないでしょうか。

ボタンの種類は他にも以下の様な物が有ります。

Button、Toggle 以外のボタンの種類ですが、簡単に。
・Sub Menu:別のExpressionsMenuのファイルを登録して、階層化
 できます。ボタンが増えてきたら階層化して整理しましょう。
・Two Axis Puppet:十字キーみたいな奴です。
 上下・左右に2種類のパラメータを割り当てられます。
・Four Axis Puppet:十字キーその2です。
 上下左右それぞれに4つのパラメータを割り当てられます。
・Radial Puppet:スティックでぐるぐるっと0~100%を選択できるリング状
 のボタンです。色や長さなんかの数値を変えるのとかに使います。


そして最後が、Parameter です。

画像53

Parameterの欄には、Toggle・Buttonのタイプの場合は、そのボタンを押したときに変化させたいパラメーターを登録します。

今回は、Cubeの出し入れを判定する "Cube ON" を登録しました。

Boolというタイプのパラメーターについては、先程も言った通り "true","false"の2択しか無く、ボタンを押したときは "true" になると決まっています。
押したら "false" になるようには出来ません。(たぶん)

ボタンを押してOFFにした場合は、"false" になります。
これで、ボタンがONならCubeが出る・OFFなら消える、の仕組みが全て完成しました。

※他のボタンも基本は同じなんですが、多少分かりにくい部分が有ります。今回は説明を割愛します。


スクリーンショット (407)

スクリーンショット (408)

尚、Intのパラメーターをボタンに登録した場合は、上記の様に Value という欄が出てきます。
ボタンを押すと、登録したパラメーターがValueの数値に変更されます。

ボタンをOFFにした場合は、Intの場合は0になります。
ExpressionParametersのDefaultで初期値が設定出来ますが、あくまでも初期値であって、ボタンOFF時は0になるようです。ご注意ください。


また、ExpressionsMenu内で同じパラメーターを複数登録した場合は、どれか一つのボタンしか押せません。(排他制御)

スクリーンショット (409)

例えば、武器を出す制御に "Weapon" というパラメーターを使う事にして、1なら剣、2なら銃を出すぞ!と決めて上記の様なボタンを作ったとします。

その場合、"Sword" のボタンを押すと "Weapon" は1になりますが、その状態で "Gun" のボタンを押すと、最初に押していた "Sword" のボタンは自動でOFFになり、"Weapon" の値が2に変更されます。その逆もしかり。
同じ数値を1にするよ!と2にするよ!は同時には無理ですからね…

VRChat上で同時にONにするつもりがない物は、上記の使い方がむしろ向いています。(同じ手に銃と剣を持たせる場合とか)

逆に、右手に剣・左手に銃、など同時に表示したい物を同じパラメーターで管理しようとする場合は注意が必要です。
その場合はそれぞれ違うパラメーターで管理するか、1なら剣!2なら銃!3ならどっちも!と3パターンのアニメーションを作成するか、のどちらかになります。


長くなりましたが、前回の物の出し入れの記事についての解説記事はこれで終了です。お疲れさまでした。

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