Avatar3.0の基本構造のメモ書き(2)Playable Layer
VRChatで2020年8月に登場したAvatar3.0追加機能の基本構造のメモ書き。私自身も忘れそうだから(笑)
「メモ書き(1)メニュー作成」の続き。
基本的な考え方
1、メニューなどを使って!変数値を何らかの方法で変化させ
2、変数の値別にAnimatorで状態遷移を規定し
3、状態ごとにAnimationを起動する
なんのこっちゃと思うかもしれませんが、とりあえずそういうものだと思っておいてください。
1、メニューなどを使って!変数値を何らかの方法で変化させ
これは上述の前の記事参照です。
2、変数の値別にAnimatorで状態遷移を規定し
まず初期設定(Animatorを作る)
VRCAvatarDescriptorの下の方にある上記部分「Playable Layersの8枠」Base(Base, Additive, Gesture, Action, FX)/Special(Sitting, TPose, IKPose)に「Animator」を設定します。
Animatorはゼロから作っても良いのですが、せっかくなのでサンプルをコピーした方が楽です。
サンプルの場所「Assets > VRCSDK > Example3 > Animation > Controllers」
サンプルが多すぎてどれを使えば良いかよくわかりませんw
名前から、Playable Layersの8枠のどこに当てはめるのか?を推察できます。
・vrc_AvatarV3ActionLayer.controller ⇒ Actionだ!
・vrc_AvatarV3FaceLayer.controller ⇒ ?
・vrc_AvatarV3HandsLayer.controller ⇒ ?
正直よくわからものもの多いのですが、どこに入れても、一応動くっぽいです。何も入れない場合は、サンプルに記述された挙動が自動設定されるっぽいですね。
私の場合、とりあえず「FX」でハンドサイン入れて、物の出し入れしてます。vrc_AvatarV3HandsLayer.controllerをコピーしてFXに適用してます。
Playable Layersの8枠の定義
公式ドキュメントを見てください。
基本は「FX以外」と「FX」に分類されるようです。
「FX以外」はTransform(Position, Rotation, Scale)を変化させるアニメーションを入れる場合に使うようです。
「FX」はTransform以外、例えば「物体の出し入れ」などはこちらに入れるようです。私はハンドサインで表情が変わるのもFXに入れてます(Transform変更ではないので)。
何が正しいのかよく分からないのですが動けばとりあえずそれで良いかとw
なお、Specialの方はよくわかりません。アバターのサイズ変更をするためにScaleを変えるだけだとうまくいきません。ViewPointを変更しないと視点と動きがおかしくなりますが、ViewPointはどうも普通に変更するだけだと反映されないらしく、T-Poseのレイヤーを使って「特殊な工夫」がひつようらしいです…がViewPointの変更はうまくいっていません。
さてAnimatorの設定をしましょう
Animatorを作って「Playable Layersの8枠のどこかにAnimatorを設定した」後の話です。
ここから先はどちらかというと「Unityの機能の話」になるので、Unityの教科書で勉強したほうが良いかもしれません。
1)レイヤーを追加
自分独自の実装は「+」(目のアイコンの下のやつ)を押してレイヤーを追加してそこに記述します。(レイヤーというのは、上図だと「AllParts」「Left Hand」「Right Hand」が相当します)
大事なこと!Weightを1にして!
各レイヤの右端にある「*」マークとクリックすると、上のようなダイアログボックスが出てきますが「Weight=1」にしていないと動かないのでご注意を。(初期だと0になっているので「あれ?動かない?なんで?」となります。最後にテストするまで気づきません。)
2)状態遷移図を書く
右クリックして「Create State⇒Empty」で箱が出てきます。これが「状態」です。「状態」の中に「アニメーション(Animation)」を設定します(状態を選択したときに右に出てくる「Inspector」の中の「Motion」にAnimationを設定する。Animationは後で作り方を紹介。)。
そして「状態」をいくつか作って、それらを矢印の線で結びます。これが「状態遷移図」です。
「矢印の線」は、矢印のFromとなる状態となる状態で右クリックをすると「Make Transition」で線が出てくるので、つなぎたい先の状態にD&Dします。
「矢印の線」をクリックすると、右のInspectorに以下のような画面が出てくるので、「Conditions」(条件)の部分に「変数の値がどうなった時に遷移させるのか」を記述します。
しかし条件を記述する前に「変数」定義が必要です。変数を定義してください。Layersの右のタブ「Parameters」をクリックすると変数を定義できます。こちらも「+」(目のアイコンの下の+)をクリックすると、変数名を入れる箱が出てきます。(なお右の数字は「初期値」です。通常0にすることが多いです。)
さて、戻って「矢印の線」をクリックしてください。以下の画面が出てきます。以下の例だと「CollierJump(変数名)」「Equals」(等しい)「1」となったら遷移するという意味合いです。英語順で表記しているので「CollierJump Greater 1」(If "ColliderJump" is "Greater" than "1")とすると「ColliderJumpが1より大きいときに」という意味になります。
なおここで使う「変数名」は「前の記事で紹介したメニューで設定したParams」と「一字一句同じ名前」にすれば、メニューで変更した値によって、状態遷移を起こすことができます。(変数名はコピーするとよいです。)
なんとなく気づいたと思いますが「この状態遷移図の設計」がメンドクサイですよね。がんばるしかないです。
3、状態ごとにAnimationを起動する
Animationを作る
最後にAnimationを作ってください。Animator画面からは一旦離れます。普通にAnimationを作る話になります
Assetsで右クリックして「Create」⇒「Animation」を選択。分かりやすい名前を付ける。例)bakuten(バク転の場合)
このbakutenを、記録したいアバターにD&Dする。
Window⇒Animation⇒Animationを開く
開いた直後の状態だとグレーアウトして何も設定できない状態のはずなので、左のアバターのオブジェクトを選択(左クリック)。次に、Animation画面の以下のプルダウンの場所に「bakuten」が出てくるはずなのでそれを選択すると「Animationを設定可能(記録可能)」な状態になる。
たぶんこんな空っぽの状態で、左上は「bakuten」が登録された状態なので「赤丸」を押すとAnimationの記録が始まります。
そうすると、下のキョンシーのようなポーズになってしまうのですが気にせず、このまま、上下左右・回転などしてください。
こんな感じで記録されます(記録されるのは「白い縦線のある場所」)。記録されるとひし形マークがつきます。
とりあえず私は、0:00で上に飛び上がる、0:20で後ろ向きに180度回転、0:40で更に180度回転、1:00で0:00の位置に戻るようにしました。1:00は0:00のひし形を左クリックしてCtrl+Cでコピーして、白い線を1:00に持ってきてCtrl+Vで貼り付けられます。(これでバク転っぽくなるはず…)
再生(三角)ボタンを押すと動きが確認できます。
これでとりあえずAnimationできたということで(笑)
AnimationをAnimatorに設定する
状態遷移図の状態のMotionにAnimationを設定しましょう。
Any StateからBakutenへの状態遷移は「VelocityZ」>=2(m/s)としました。このVelocityZは定義済み変数で、前向き速度が2m/sになったらバク転を始めるムーブとなります。(それなりに前向きに速く歩いたら自動でバク転を始める)
この辺りのVelocityなどの定義済み変数はこちらにあります。
気になること
「色変え」ってどうやるの?
私も実は正しいやり方/効率的なやり方が良く分かりませんが、これもAnimationで切り替えます。
1、画像編集ツール(gimp、photoshop、ペイントブラシ等)でバリエーションを作っておく
2、Animationの記録を行う(この記録状態で、BodyのMaterialを張り替えます。そうすると張り替えるAnimationになります。)
色ごとにColor0~Color8までAnimationのバリエーション作りました。
こんな感じでBody(顔)とbody2(体)のマテリアルを切り替えるアニメーションができます。(※Bodyとbody2になっているのはここで使ったシャムシール君の場合。他のアバターではもっと多くあるかもしれません。)
そしてFXに設定したAnimatorの中で、Color0からColor8までの状態遷移を定義し、それぞれのColor0~8のMotionに上記で作ったAnimationを入れていきます。
状態遷移はColorという変数(フラグ)を使って、Color=0のときはColor0状態へ、Color=1のときはColor1に遷移という設定にしました。
このColorの値は、Expression Menu/Expression Parameterの中で操作できるようにしてあります。(※Active Avatarを正しく選択してください。正しく選択しないと「Parameter」が空になります。)
作ってみて思ったけど簡単ではない
私も普段Unityを使って仕事をしているわけではないので、使ってみて思ったのは、あまり簡単ではないですね(笑)わりと時間もかかりそうです。
時間があるときに、気が向いたら使ってみると良さそうです。
他にも、人をワープさせる仕組みを作っている人もいましたけど、Animationを使ってどうやっているのだろうと到底想像もできません。いろんなUnityマジックがありそうですが、ぜひいろいろ試してみてください。
State Behaviorsというのを使うともっと細かい制御は可能
ですが私も読み解けていないです。
ViewPointの変更のためには「Animator Temporary Pose Space」を使う必要があるそうです。サイズ変更のときに必要そうですね。
もうちょっと読み解いてみます。
ひら吉でした。
サポートいただいてどうもありがとうございます! これからもVRの情報を収集発信したいと思います!