VRChatパブリックログ

VRChatでの体験を紹介します

Unityのアニメーションの基礎知識【VRChat技術情報】

意外と基本的な情報がないのでまとめ

今回、アニメーションを使ったちょっとした仕組みを作ろうとしたのですが、自分自身アニメーションに関して基本的なことを理解していないで使っていたので引っかかる事が何度かありました。そこで、自分が知っている限りのアニメーションの基礎的な部分について、特にVRChatのアバターなどに使う知識としてまとめます。(ワールドは未着手なのでよくわかりません)

アニメーション(.anim)ってどんなもの?

実行開始からの経過時間に従って、実行元のオブジェクト以下に置かれているオブジェクトのコンポーネントのパラメーターを変化させることでアニメーションを実現するもの。です。

コンポーネント側が対応さえしていれば様々なパラメーターを自由に変化させることができます。実行順のタイムテーブルが作れるということなので、自作スクリプトが制限されているVRChatでは、単純なプログラムとして利用していることも多いです。

ここで気を付けないといけないことは、相対アドレス的な参照方法であること。アニメーションファイルを編集した後に、そのアニメーションで変化させる予定だったオブジェクトの位置や名前が変化すると、リンク切れを起こして動作しなくなります。アニメーションが配置される場所が変わればなおさらです。

これを逆手に取ると、相対アドレス的な参照方法なので、アニメーションを配置したオブジェクト以下の構造(少なくともアニメーションで変化させる項目について)が同じならば、アニメーションは問題なく動作するので、工夫すれば使い回しが可能ということです。

(よく、アバターに表情実装するチュートリアル記事で、アバターのコピーを作成してそちらにアニメーションを配置した上でアニメーションを編集、編集したものをコピー元のアバターに実装。という工程が紹介されていますが、それはアニメーションが相対アドレス的な参照方法であることを利用しています)

アニメーションには二種類ある

アニメーションファイルは、同じ.anim形式でも二つの種類があります。レガシーアニメーションと新しいアニメーション、あるいは単なる”アニメーション”です。

単なる”アニメーション”のほうはVRChatで利用する5.6.3p1バージョンのスタンダードなアニメーション形式です。レガシーアニメーションは古いバージョンで利用されていた形式のアニメーション形式です。

公式マニュアルには、後方互換性(古いプロジェクトを再編集しやすくする)のためにレガシーアニメーションを残してあると書いてありますが、実情としては新しいアニメーションの処理が複雑なために、単純なアニメーションをするオブジェクトの実装にはオーバースペックで編集も煩雑だったため、編集と実装が簡単なレガシーアニメーションを残してあるということのようです。

あたらしい方の”アニメーション”

あたらしい方のアニメーションは当たり前ながら現行バージョンの推奨形式です。レガシーより変化させられるパラメータの種類が多いですし、なによりアニメーションとアニメーションを混ぜ合わせることができます。VRChatのアバターに使われているアニメーションはすべてこちらのアニメーションですが、VRコントローラーで手を動かしたりハンドサインを出したりということが、体全体のアニメーション(例えばIDLEとか)を実行するのと同時に行えているのも新しいアニメーションの機能です。

f:id:mekokka:20180903204825p:plain

新しいアニメーションはAnimatorコンポーネントで扱います。というと少し正確ではありません。Animatorコンポーネントで扱うAnimator Controllerで扱います。

f:id:mekokka:20180903210903p:plain

Unityわからん状態でこんな画面に迷い込んだ事はないでしょうか?これがAnimator Controllerの編集画面です。この中で参照されているのが新しい方のアニメーションで、この画面でアニメーションの実行順やアニメーション同士のブレンドを行います。これについての詳細はまだ自分自身はっきり理解していないので省きます。Animator Controllerについては自作スクリプトを実装できないVRChatの都合上縛りがかなりきついです。また、アバターのルート(一番上の階層)に設置されているAnimatorの内容はアップロード時にVRChat標準のアバター用Animator Controllerに置き換えられるので、アバターに配置されているAnimatorのAnimator Controllerを編集しても意味はありません。逆に考えて、サムネイル撮影用のアニメーションを作成して配置してもアップロード後のアバターには影響はないとも言えます。

新しいアニメーションの欠点、というかVRChatで利用する場合のみの欠点ですが、アニメーションでAnimatorコンポーネントを停止する命令が作れないことが上げられます。AnimatorでVRChatにアニメーションを実装すると、ずっとアニメーションを実行し続けて制御が効かない状態になります。一方、ループするだけで制御する必要のないアニメーションの実装には安定性含めてAnimatorの方が優れています。

レガシーアニメーション

レガシーアニメーションは現行バージョンの非推奨形式のアニメーションです。新しいアニメーションより表現の幅が狭く、単純な独立したアニメーションしか表現できません。(ブレンド等に非対応)

Unityの右クリックメニューのCreate作成によって作成されるAnimationファイルは最初はあたらしい方の”アニメーション”形式です。

f:id:mekokka:20180910213810p:plain

Animationファイルを選択した状態でInspectorタブの右上の「三」の記号の部分をクリックすると出てくるメニューよりDebugモードを選択、するとInspectorウィンドウが変化し、表示される項目が変化するのですが、そこの画面の上のほうにLegacyという項目があり、ここにチェックを入れるとLegacy形式のAnimationファイルとして扱われるようになります。

レガシーアニメーションはあたらしい方の”アニメーション”より使えるパラメータが少なかったりします(たとえばマテリアルの書き換えができない)が、とくにここでコンバートは行われず、使用不能なパラメータは自動的に無視されるようになります。つまりレガシーアニメーション化することで、アニメーションの挙動が変わる場合があることに注意してください。

f:id:mekokka:20180903223107p:plain

 レガシーアニメーションはAnimationコンポーネントで扱います。Animationコンポーネントはレガシーアニメーション専用のコンポーネントで、あたらしい方の”アニメーション”を扱うことはできません。逆に、Animatiorはレガシーアニメーションは扱えません。これらのコンポーネントにアニメーションをD&Dできない場合、アニメーションの形式あたらしい方/レガシーの設定が間違っている場合があるので確認すれば解決するかも知れません。

VRChatでレガシーアニメーションを使いたい場合は、多くの場合このAnimationコンポーネントを利用したい場合と同義となります。Animationコンポーネントのオンオフはアニメーションで制御可能です。たとえば自動まばたきなどをAnimationコンポーネントで実装するのは、再生と停止状態をアニメーションで制御できるからです。

部分的なアニメーションを追加する場合の注意点

AnimatorコンポーネントとAnimationコンポーネントは一つのオブジェクトに一つずつしか設置できません。その関係上、一つのアバターで複数のアニメーションを別々のアニメーションファイルを使って実装しようとする場合、アバターのルート(一番上の階層)より下の適当な位置にAnimator/Animationコンポーネントを設置する必要があります。このとき、アニメーションが相対アドレス的な参照であることに注意してください、アバターのルートで再生する用途で作成したアニメーションはルートより下のオブジェクトに直接持ってきた場合、ほとんどの場合正常に機能しません。