Help us understand the problem. What is going on with this article?

[VRChat]初学者向けAnimatorの使い方

はじめに

スクリプトが使用できないVRChatでギミックを作る際にAnimatorが重要となってくるので
VRChatでの使用を目的としたAnimatorの使い方についてまとめることにしました。
初学者を対象としてギミック作成に必要な基本的な部分をメインで書いていきます。

内容量が多いですが、大事なポイントは太字で強調しているので
そこを中心に見ていただけるといいかと思います。

Unity 5.6.3p1
VRCSDK-2018.10.15.18.21_Public

Animatorとは

Animatorコンポーネントの公式マニュアル

Mecanim のアニメーションシステムをコントロールするためのインターフェースです。
(Unity公式マニュアルより)

簡単にいればUnityでアニメーションを管理するものです。

似たものにAnimationコンポーネントもありますが、
これは旧アニメーションシステムとして現在では非推奨になっています。
VRChatでもアバターでは2018.3.2バージョンからレガシーアニメーションが廃止され、使えなくなりました。
(ワールドでは現在でもAnimationコンポーネントおよびLegacyAnimationは使用可能です)

VRChatでできたこと

  • ガイスター(ボードゲーム)


  • カウンタ


  • 変形する武器


Animator Controller

.controllerのファイル

AnimatorではAnimator Controllerを使って複数のAnimationを管理します。
Animator ControllerではAnimationの切り替えの順番や切り換える条件など様々な設定ができます。
各Animationでオブジェクトの状態(主にパラメータの値)を表現し、
トリガーでAnimationを切り替えていくことでオブジェクトの状態を変化させるといったイメージです。

AnimatorController

例えば, Animation1ではCubeオブジェクトが横向きに回転してるとします。
それがプレイヤーのある行動(OnInteractなど)がトリガーとなってAnimation2に切り替わると縦向きに回転するようになるというように特定のトリガーによってCubeオブジェクトの状態を変化させることができます。イメージ動画

Animation Parameter

Animation ParameterはAnimator ControllerでAnimationの切り替えを行う際などに使うパラメータです。
パラメータには実数型(Float), 整数型(Int), 真偽値(Bool), トリガー(Trigger)の4つの種類があります。

Parameters

AnimatorControllerでAnimation間に
「このパラメータが4.5より大きくなったら」や「このパラメータがtrueになったら」
というような条件を事前に設定しておいて、パラメータを変化させて条件が満たされればAnimationが切り替わります。
Transition

Animator Controllerは.controllerという拡張子のファイルで管理され,
Projectタブで「右クリック>Create>AnimatorController」や
AnimationファイルをHierarchyのオブジェクトのD&Dすることなどで作ることができます。
createanimatorcontroller

編集はAnimatorウィンドウでおこないます。
上部のメニューからWindow>Animatorでウィンドウを表示できます

また、各AnimationはAnimatorウィンドウにD&Dすることで追加されます。
その際にそのAnimationに対応したオレンジや灰色の四角が出てきます。
animation_add.png

TransitionsとConditions

AnimatorでAnimationの切り替えをおこなうときの設定に必要な項目の一部です。
Animation間をつなぐ矢印を選択すると以下の図のようにInspectorに表示されます。
transition_inspector.png
Animatorで設定していくために重要なTransitionsとCondirionsについて説明します。

Transitions

image.png
どのAnimationからどのAnimationに切り換えるかを設定します
Animatorウィンドウの中でAnimation間に引かれている矢印1つにつきこれが1項目存在します。
(上図では矢印を1つ設定したので項目が1つ表示されています。)

矢印は切り替え前のAnimationに対応するオレンジや灰色の四角を右クリックして
MakeTransitionを選択することで出てきます。
そのあと、切り替え後のAnimationに対応するオレンジや灰色の四角をクリックすると矢印で繋がれます。
image.png

同じAnimation間に複数の矢印を引くと以下の図のようになります。
(下図ではAnimation1からAnimation2に向かった矢印を2つ設定しました)
transitions.png
矢印1つにつきConditionsで切り替える条件を設定できます。
どれかの矢印の条件が満たされた場合に切り替わるので複数矢印を設定してORのように設定するときに使えます。

Animation1からAnimation2に向かう矢印を2つ設定した場合Transitionsは2項目になります。
image.png
項目(矢印)ごとに条件を設定でき、それぞれの項目を選択するとConditionsの表示が項目に対応した条件に切り替わります。
image.png

この場合はAnimation1を再生しているときに
「boolがtrueまたはfloatが0より大きな値になったら」 Animation1からAnimation2に切り替わります

Conditions

image.png
Animationを切り替える条件を設定します。
その矢印の方向に切り替わるときに設定する条件1つにつき1項目存在します
(上図では条件を1つだけ設定しています)

+を押すことで条件を増やすことができ、
Conditionsに条件が複数設定されている場合、その分だけ項目が表示されます
(下図では条件を2つ設定して2つ項目が表示されています)
conditions_multi.png
すべての条件が満たされた場合に切り替わるのでANDのように設定するときに使えます。

この場合はAnimation1を再生しているときに
「boolがtrueかつfloatが0より大きな値になったら」 Animation1からAnimation2に切り替わります

その他

詳しくはこちらの記事に書いてあるので、特に重要なHasExitTimeのみ解説します

Has Exit Time
image.png
チェックをいれると条件が満たされても実行中のAnimationが終わる(最後のフレームにいく)まで切り替わるのを待ちます
Conditionsに条件を設定する場合には基本的にチェックを外しておいていいと思います

ワールドで使う

VRCSDKに含まれるVRC_TriggerコンポーネントからAnimatorに対して以下のようなActionをおこなえます。

  • AnimationBool
  • AnimationFloat
  • AnimationInt
  • AnimationIntAdd
  • AnimationIntSubtract
  • AnimationIntMultiply
  • AnimationIntDivide
  • AnimationTrigger

各ActionはActionsの右下の+ > Basic Events > 各Actionで追加できます
animatorfloat.png

どのActionもこんな感じの設定項目です。
* Receivers : 変化させるParameterを持つAnimatorを設定します
* Variable : 変化させるParameter名を設定します(手打ちなので入力ミス注意)
* Value/Operation : Variableに設定したParameterに対して計算するときに使う値を設定します

AnimationBool

AnimationBoolはAnimationStateの管理に真偽値(True/False(0/1のほうが分かりやすいかも))を使う方式です。
animationbool.png

Receiversに設定されたAnimatorのboolというParameterをOperationの値に変更します
OperationをToggleにした場合、現在のboolの値の反対の値に変更します(true->false, false->true)

状態が2つのときに使います
* ドアの開け閉め(空いている状態をtrue, 閉まっている状態をfalse)

AnimationFloat

AnimationFloatはAnimationStateの管理に実数型(0.0とか0.5とか2.3とか)を使う方式です。
animatorfloat.png

Receiversに設定されたAnimatorのfloatというParameterにValueの値を入力します

単純に状態管理として使う場合は同じことがAnimationIntやAnimationBoolでできるため、そちらを使ったほうがいいです。

限定的にfloatのパラメータを用いることでComponentの値を動的に変化させられるので
それを利用したスライダーがつくられています(TPCスライダー改)

AnimationInt系

AnimationIntはAnimationStateの管理に整数型(0とか2とか10とか)を使う方式です。
AnimationIntAdd/Substract/Multiply/DivideはそれぞれIntのパラメータをあらかじめ設定しておいた値で四則演算することができます。
animatorint.png

  • AnimationInt
    Receiversに設定されたAnimatorのintというParameterにValueの値を入力します
  • AnimationIntAdd
    Receiversに設定されたAnimatorのintというParameterにValueの値を足します
  • AnimationIntSubtract
    Receiversに設定されたAnimatorのintというParameterからValueの値を引きます
  • AnimationIntMultiply
    Receiversに設定されたAnimatorのintというParameterにValueの値をかけます
  • AnimationIntDivide
    Receiversに設定されたAnimatorのintというParameterをValueの値で割ります

状態が複数あるときに使います(各状態と数字を対応させる)
* カウンタ (各桁ごとに状態(Animation)を用意)
* ゲームの進行 (進行状態ごとに状態を用意)

AnimationTrigger

AnimationTriggerはトリガーを発生したということを管理する方式です。
animationtrigger.png

ある行動を実施(OnInteractなど)するごとにAnimationが切り替わっていくというようなときに使えます。

状態を同期させる

Animatorコンポーネントをつけたオブジェクトと同じオブジェクトに
VRC_PickupVRC_ObjectSyncをつけることでAnimationParameterが同期します。
つまり, AnimatorはAnimationParameterによっていまのAnimationを管理しているので
オブジェクトの状態が全プレイヤーで同じになります。

しかし、triggerに関してはトリガーを押したという情報だけなので
triggerを使った機構の場合は後から来た人のことを特に考慮した設計にする必要があります。
image.png
単純にAnimationParameterの同期のために使う場合は
* RigidbodyのisKinematicをfalse
* VRC_PickupのPickupableをfalse
* VRC_ObjectSyncの2つの項目をどちらもfalse
にすると良いでしょう。

アバターで使う

アバターではParameterの値の変更はおこなうことができないので、
時間経過で自動的にAnimationを切り替えていくことになります。

animator_avatar.png
例えば、抜刀時に変形した後に一部分が回転したり動いているような状態を維持する武器アニメーションを設定する場合、
変形アニメーションと状態維持アニメーションを用意してその間を矢印でつなぎます。
HasExitTimeにチェックをいれることで変形後に状態維持するようなアニメーションを用意できます。

状態維持アニメーションが一部回転しつづけるなどのアニメーションを常に実行するために
LoopTimeにチェックをいれておきます。
このInspectorの表示にはAnimationファイルを選択するか、
Animatorウィンドウのオレンジや灰色の四角をダブルクリックすることで切り替えられます。

複雑なギミックを組むとなるとAnimatorの以下の性質を使っていくことになると思います。

  • Animatorがついたオブジェクトを一度disnableにすることでEnableにしたときにEntryからAnimationが開始される
  • Animatorコンポーネントをdisnableにすることでその状態でAnimationが停止する(enableにするとそこから再開する)
    • こちらの記事の"アニメーションからanimatorの動作を停止させる方法"を参考に
  • Write Defalutにチェックをいれると別のAnimationで設定されていて実行中のAnimationで設定されていない値は初期値に戻る

ここらへんは応用的なものなのでここでは詳細な解説は割愛します

最後に

VRCSDKでAnimatorに対してできることを中心に解説していきました。
Animatorでできることは限られていますが、発想次第でも多くのことは実現できると思います。
この記事では基本的な部分を端的に書いているので分かりづらかったり、説明不足な部分があると思います。
そんなときはここで使われている用語で検索したり、下部の参考ページ等を見ることでよりAnimatorと和解できるかと思います。
長々となりましたが、この記事が表現したいことを表現するための手助けになれば幸いです。

本記事は今後も更新して、より分かりやすい記事にしたいと思っているので
質問や間違いの訂正等はコメント欄やTwitterのほうまでぜひ連絡ください。

参考ページ・動画・Prefab

Animatorを使う際に参考になりそうな情報が載ったページや動画、Prefabです。

ページ

動画

Prefab

  • 同期関係の実用例 : hatsucaさんの作成されたギミック集です。Animatorを使った同期ドア、タイマー、銃弾再利用銃が入ってます。
  • 数字表示システムと計算機システム : AnimationIntを使ったブタジエンさん作のシステムです。
  • JetDogs-Prefabs : JetDogs氏の作成されたワールドギミックの詰め合わせ。ワールドで使える基本的なギミックが多く入っています。PrefabによってはStandardAssetsやFinalIKが必要なものがあります。
  • Null Space : ナルさんが作成されたワールドギミックの詰め合わせ。AnimatorだけでなくStandardAssetsも多く使用しており、非常に高度な内容です
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした