【unity】VRCアバターのジャンプモーションの作成・変更

https://twitter.com/It__was__rainy/status/1370037437024456706?s=20

上記ツイートのようなジャンプモーションの作成・変更についてのまとめです。記事の内容はある程度unityの操作や仕組みを理解している人向けですが、VRC_AvaterDiscriptorに突っ込むだけでとりあえず動かせるサンプル(※低クオリティ)も用意していますので、上の動画まんまでもいいという方は使ってみてください。自分で設定したいという人でも一応参考になるかと思います。

 

 

 1.LocomotionLayerの複製

ジャンプモーションを制御しているレイヤーを複製しておきましょう。ロコモーションレイヤーはステートマシンが入れ子状になっていて、ジャンプ時に関係するモーションは【JumpAndFall】内の【SmallHop】と【ShortFall】のステートに入っています(前者が上昇、後者が下降)。【LongFall】は高い場所から長く落ちるときのモーションです、たぶん。

 

f:id:It__was__rainy:20210312021644p:plainf:id:It__was__rainy:20210312021711p:plain

 

 2.ジャンプモーションの作成・変更

ではモーションを変更する手順ですが、『単純にジャンプ時のモーションを変えたい』だけであれば、【SmallHop】(こだわりがあればShortFallにも)に好きなモーションを入れればOKです。あ、アニメーションのループは解除しておきましょう。ループ状態だと上昇と下降の繋ぎ目がバタバタします。

・・・といって終わりたいところですが、ジャンプの挙動に少々癖があるので、ただ飛び上がるモーションをいれればよいというわけでもなさそうです(少なくとも私は結構苦戦しました)。ジャンプの時間はかなり短いので、飛び上がるまでの「溜め」が長いモーションだと見栄えがよろしくありません(私の設定が下手なだけという可能性もあります。要検証)。

※【SmallHop】のアニメーションは段差に引っかかるなどした時にも再生されるので、その場で飛び上がることだけを想定したアニメーションだとそういう時に不自然になります。後述のようにデフォルトのステートは残したまま切り替えられるようにすることをおすすめします。(3/13追記)

 

以下、私がいろいろと試してみて「これくらいならちょうどよさそう」と感じたアニメーションの作り方を紹介します。

まずアニメーションの長さですが、後で紹介するサンプルは上昇・下降それぞれ0.2秒(20フレーム)ずつになっています(アニメーションの長さがどれほど滞空時間に影響するのかは未検証ですので情報をお待ちしております・・・)。デフォルトのジャンプに近づけています。

また、キーフレームの打ち方ですが、ジャンプモーションは時間が短すぎるので正直最初と最後だけしっかり作ってあれば問題ないと思います(サンプルは2~3フレームしかキーを打っていません)。

 

・【SmallHop】のアニメーション

0フレーム目に最初の立ち姿勢を打ちます。こだわりがなければSDKにデフォルトで入っているproxy_stand_stillのコピペでも特に違和感のないモーションができます。

20フレーム目に最高点のポーズを打ちます。理想のポージングを追い求めてください。アバターの高さはRootTのy座標で調整します。

f:id:It__was__rainy:20210312021913p:plainf:id:It__was__rainy:20210312021937p:plain

 

・【ShortFall】のアニメーション

SmallHopができていればこちらは最初と最後のフレームを入れ替えればとりあえず形になります。もちろん着地にこだわってアニメーションを作るもよし。

 

ひと通りキーを打てたらシークバー的なあれを動かしてアニメーションを確認、必要に応じてキーを増やすなど調整しましょう。

さて、アニメーションができたらアニメーションファイルの設定をします。私も詳しくはわかりませんがRootTを使うアニメーションはちゃんと設定しないとRootTの値が反映されません。

ひとまず下の画像のようにしておけば動きます。もしアニメーションファイルのインスペクターにこのような項目がないという場合はサンプルのアニメーションを複製して使ってください。

f:id:It__was__rainy:20210312022140p:plain

 

 ここまで設定できたらあとはステートに放り込んでおけばジャンプモーションの変更は完了です。

手の動きをつけたければトラッキングコントールをanimationに設定してきましょう。

※【SmallHop】【ShortFall】のトラッキングコントールをanimationにした場合、【Standing】のステートにもトラッキングコントールを追加し、animationにした部分をtrackingに設定してください。特定の挙動時にトラッキングが切れたままになります。(3/12追記)

 

 3.ジャンプモーションの切り替え

ここまでジャンプモーションの変更について紹介してきましたが、新しく変数を設定すればオブジェクトのオンオフと同様にジャンプモーションをexpressionmenuで切り替えることができます。

まずは新しくInt型変数を設定しましょう(2つだけの切り替えならboolでOK)。

下の画像のようにステートを追加して、遷移条件は既存のものと同様に設定しておきます(赤が上昇”SmallHop”、青が下降”ShortFall”のステートと同様です。矢印がごちゃごちゃしていますがひとつずつ丁寧に見比べていきましょう)。

f:id:It__was__rainy:20210312022819j:plain

 

あとはstandingからの遷移条件に先ほど設定した変数を追加すればOKです。

 

f:id:It__was__rainy:20210312023258j:plainf:id:It__was__rainy:20210312023318j:plain


expressionparametersに変数を追加してexpressionmenuの設定もしましょう。このあたりの詳細な説明は割愛します。parametersとmenuは設定済みのものをサンプルに入れているのでわからなければ参考にしてください。

 

長くなりましたが以上でジャンプモーションの設定はすべて終了です。お疲れ様でした。

 サンプルアニメーションの入ったunitypackageはこちらからどうぞ↓

VRC用ジャンプアニメーションサンプル - 雨宿り - BOOTH