🌊

Unity アニメーション メモ

2024/02/21に公開

メモしたのを書きなぐります

・2D Animation
Live2Dなどの機能をUnityEditor上でできる
参照サイト

・Animation Rigging
Unityエディター上で簡単なアニメーション作成できる
参照サイト

・対象の回転や移動や向きを簡単に追従するコンポーネント
参照サイト

・Sequences
TimeLineで使用すると便利なやつ
参照サイト

・Unity プロジェクトでモデルをアニメーションとうまく連動させるためのいくつかのガイドラインがあります。
 ①モデリング
1.整った構造 のトポロジーにする
一般的には、モデルの頂点や三角形がアニメーション中にどのように歪むかを考慮する必要があります。優れたトポロジーであれば、メッシュを歪ませることなくモデルを動かすことができます。
2.3DCGツール上でのメッシュのスケールとUnity上でのスケールを確認する
3.ビルド中に、モデルをクリーンアップする
可能であれば、穴を塞ぎ、頂点を結合し、隠れた面を削除します。
これはスキニング、特に自動スキニング処理を容易にします。
4.キャラクターに足がある場合は、メッシュを調節してキャラクターの足がモデルのローカルの原点または “アンカーポイント” に立つようにします
キャラクターのアンカーポイントが直接床についている場合は、このようにするとずっと簡単に歩かせることができます。
5.キャラクターが二足歩行する場合は、できるだけ T ポーズ でモデル化します。
これにより、必要な場所 (例えば、脇の下) でポリゴンを細かく調整することができます。これにより、リグをメッシュの内側に配置しやすくなります。
 ②リギング
Humanoidの場合、スケルトンには特定の要件があります。
1.最低でも 15 のボーンが必要
スケルトンには、少なくとも必要なボーンが配置されている必要があります。
2.アバターにマッチングさせるチャンスを向上させるためには、ボーンに身体の部位を表す名前を付けます。
例えば、“LeftArm” と “RightForearm” のような名は、ボーンが何を制御するかを明確に示すことができます。
3.ジョイント/ボーンの階層は、作成しているキャラクターの自然な構造に従う必要があります。
腕と足がペアになっている場合、一貫した名前の命名規則に従います (例えば、左腕の場合は “arm_L”、右腕の場合は “arm_R”)。

Genericの場合は、モデルをインポートする際に ルートノード として指定できるボーンがスケルトンに含まれていることです。これにより、モデルの重心が効果的に定義されます。
 ③スキニング
1.リグにシンプルなアニメーションを作成するか、スキニングのテストとして使用できるアニメーションデータをインポートします。
これにより、動いているときにスキニングの見え方が適切か素早く判断することができます。
2.スキニングソリューションをインクリメントに編集し、改良します。
3.パフォーマンス上の理由から、ソフトバインドを使用する場合はインフルエンスの数を最大 4 つに制限
Unity がデフォルトでサポートする最大数です。
メッシュが 4 つ以上のインフルエンスを使用する場合は、以下のオプションのいずれかを選択します。
UnityのSkin Weightsを調整する。または、
モデルを Maya からエクスポートする前に、Bake Deformer ツール (Mayaのトップメニューから Skin > Bake Deformers to Skin Weights) を使用して、デフォーメーションジョイントをベイク処理します。
参照サイト

・ヒューマノイドアニメーションを含むモデルのインポートについて
モデリングソフトで作成したヒューマノイドアニメーションを、Unityにインポートする際に必要なことを述べていく。
参照サイト
 ①Animation Type を Humanoid に設定し、アバターを作成する
Apply ボタンをクリックすると、Unity は既存のボーン構造をアバターのボーン構造にマッチしようとする。
また、アバターは、Avatar Definition のCreate From This Model とCopy from Other Avatarで変更することができる。
Create From This Modelはモデルに基づいてアバターを作成し、
Copy from Other Avatarは別のモデルに設定されたアバターを使用する。
Copy from Other Avatarが存在する理由は、毎回Humanoid に設定し、マッピングが成功したか確認するのは手間がかかるので、すでに作成されたアバターを使用することでこの事象を解消している。(参照サイト参照サイト
 ②アバターのマッピングが成功したか確認し、成功していなければ修正する
モデリングソフトで作成したヒューマノイドアニメーションを、Unity上でアニメーションさせるにはマッピングというUnity上で動かせるような作業が必要である。
マッピングが成功すると、Configure メニューの横にチェックマークが表示され、アバターのサブアセットをモデルアセットに加えます。

アバターを作成できない場合は、Configure ボタンの横に X が表示され、アバターのサブアセットはプロジェクトビューに表示されません。

アバターはアニメーションシステムの重要な一面であるため、モデル に適切にアバターを設定することが重要です。
このような理由で、自動的なアバター作成が成功したかどうかにかかわらず、アバターが有効で適切に設定されていることを常に確認 する必要があります。
ボーンがマッチする場合は、Mapping タブは緑色で表示され、そうでない場合は赤で表示されます。

また、アバターにうまくマッチングさせるには、ボーンに身体の部位を表す名前を付けます。例えば、“LeftArm” と “RightForearm” のような名は、ボーンが何を制御するかを明確に表しています。
もし、モデルが有効なマッチを探せない場合は、Unity が内部で行うのと似た手順を手動で行います。
1.Avatar ウィンドウの下部にある Mapping メニューから Clear を選択し、Unity が試みたマッピングをリセットします。

2.Avatar ウィンドウの下部にある Pose メニューから Sample Bind-pose を選択して、モデルの最初のモデリングポーズを近似します。

3.Mapping > Automap を選択して、最初のポーズからボーンマッピングを行ないます。
4.Pose > Enforce T-Pose を選択し、T ポーズ を適用して、モデルを必要な T ポーズに戻します。
また、ボーンの 割り当ては正しいにもかかわらず、キャラクターが正しいポーズでない場合は、“Character not in T-Pose” というメッセージが表示されます。Pose メニューから Enforce T-Pose を選択することで解決できます。それでもポーズが正しくない場合は、他のボーンを手動で回転させて T ポーズに収めることができます。
 ③マッピングが終了したら、任意で Muscles & Settings でアバターのマッスル設定を調整
Muscles & Settings タブを使ってキャラクターの動きの範囲を調整し、自然に見えるようにキャラクターを変形させ、目に見えるアーティファクトやキャラクター自体と重なることを避けます。
一応こちらを参考にして試してみたが、マッスル値変更してみたが反映されなかった。やり方が間違っている?
 ④任意で、ボーンマッピングしたアバターへ保存でき、それをロードして流用できる
やり方は、こちらを参照
 ⑤アバターマスク(Avatar Mask)
アバターマスクを行えばクリップ中のアニメーションデータの一部を破棄できるので、オブジェクトやキャラクターを部分的に動かすことができます。
1.インポート時にアバターマスク使用
https://youtu.be/xW8keAcN8n4
ランタイムに比べて、アニメーションデータを削除して、ビルドから除くことができ、ファイルサイズやメモリ使用量を小さくできるため、インポート時にマスキングすることが好ましいと言えます。また、アニメーションデータがランタイムにブレンドされるより少なくなるので、より高速な処理ができます。
2.ランタイムのマスク
https://youtu.be/heyDtwMflHk
参照サイト
 ⑥Animation タブで Import Animationを有効にする
これをオンにすると、作成したアニメーションを使用できる
 ⑦fbxファイルに複数のアニメーションがある場合、特定のアニメーションを分けれる。
https://youtu.be/f0oaFu1JRaI
一方で、一つ一つのアニメーションが入ったfbxファイルもインポートして、アニメーションで利用できる。

参照サイト参照サイト
 ⑧fbxファイルに定義されているアニメーションクリップごとに、個別に設定を行える。
詳しい内容は、後述にて取り上げる
1.ポーズとルートの Transform を変更
(Root Transform Rotation、Root Transform Position)
参考サイト
2.アニメーションのループの最適化
(loop match)
参考サイト
3.ヒューマノイドスケルトンの両側にアニメーションをミラーする
(Mirror)
4.他のアイテムのタイミングをアニメーション化するために カーブをクリップに加えます
(Curves)
参考サイト
5.アニメーションに合わせて特定のアクションを発生させるために イベントをクリップに追加
(Events)
参考サイト
6.アクションを実行する 別のルートモーションノードを選択
( Root Motion Node )
参考サイト
7.クリップのインポートに関する Unity からのメッセージ
(Import Message)
参考サイト

・ヒューマノイド以外 (汎用) のアニメーションを含むモデルのインポートについて
マッピングするボーンは 1 つだけなので、汎用設定では、Humanoid Avatar ウィンドウ を使用しません。その結果、ヒューマノイド以外のモデルのファイルを Unity にインポートする準備は、ヒューマノイドモデルの場合よりも少ないステップで済みます。
インポート方法は、上のヒューマノイドの手順とほぼ似ている。
差分があるとしたら、Animation Type を Generic にすることくらい。
参考サイト

・Root node
Animation typeがGenericで、Avatar DefinitionがCreate From This Model のみ表示される。
公式ドキュメントには以下のようにかかれている。

ジェネリックアニメーション では、ヒューマノイドアニメーションのようなアバターを使用しません。スケルトンは任意であるため、どのボーンが Root node (ルートノード) かを指定する必要があります。 ルートノードを使うと、ジェネリックモデルのアニメーションクリップ間で一貫性を確立し、適当な位置に作成されていない アニメーションの間をブレンドします

Genericのモデルを使用する場合は、Root nodeを指定した方が良さそう。
一応、どんなものか確認してみた。
DragonSoulEater、Root_Pelvis、Root_Pelvisの各パーツのボーンが指定できることが分かる。

・アバターマスク(Avatar Mask)のTransformでGenericの特定のアニメーションを制御する
HumanoidでないGenericのアニメーション制御する場合は、アバターマスク(Avatar Mask)のTransformで制御する。
https://youtu.be/RnA9o3hd7pA
またマスク利用すると、パフォーマンスがよくなる。

マスクを使用することの利点は、アクティブではないボディパーツがそれに関連付けられたアニメーションカーブを必要としないため、メモリのオーバーヘッドを減少させやすいことです。さらに、未使用のアニメーションカーブは再生中に計算する必要がないため、アニメーションによるCPUオーバーヘッドを削減しやすくなります。

参照サイト参照サイト

・ヒューマンテンプレートで変えて、ボーンを変える

https://youtu.be/be3YV3nNIUE
参照サイト

・Import Constraints
3DCGツールで設定したコンストレイントをUnityで反映させる。
Unity は以下のタイプの Constraint コンポーネントをサポートします。

・Aim: コンストレインされたゲームオブジェクトを、紐づけられたゲームオブジェクトを向くように回転します。
・Look At: コンストレインされたゲームオブジェクトを、紐づけられたゲームオブジェクトを向くように回転します (簡略化された Aim Constraint)。 
・Parent: コンストレインされたゲームオブジェクトを、紐づけられたゲームオブジェクトに連動させて移動、回転します。
・Position: コンストレインされたゲームオブジェクトを、紐づけられたゲームオブジェクトと連動させて移動します。
・Rotation: コンストレインされたゲームオブジェクトを、紐づけられたゲームオブジェクトと連動させて回転します。
・Scale: コンストレインされたゲームオブジェクトを、紐づけられたゲームオブジェクトと連動させてスケールします。

参照サイト

・Import Animation
このアセットからアニメーションをインポートする。
Import Animationオン

Import Animationオフ

参照サイト

・Bake Animations
IK やリアルタイムな計算で作成されたアニメーションをベイク
Autodesk® Maya®、Autodesk® 3dsMax®、Cinema 4D ファイルのみに使用可能。
サンプルのアニメーションがないのが検証できてないので正直よくわからない。
参照サイト

・Resample Curves
オンにすると、FBXに含まれるオイラー値をクォータオニオンに変換する。
Unityはクォータオニオンで回転を扱うので通常はオンが好ましいが、アニメーションおかしい場合は、オフにして見るといいかもしれない。
ただ、オフにするとランタイムでクォータオニオンで変換する処理が走るので負荷が高くなるので注意
参照サイト参照サイト参照サイト

・Animated Custom Properties
カスタムのユーザープロパティとして指定した FBX プロパティをすべてインポートする。
3DCGツール使えないので参照サイトを参考にすると良い。
3DCGでカスタムプロパティがあるので、それをUnityでインポートし、その値を使用してランタイムで特定のメッシュに色を変えたりできる。
[参照サイト]https://docs.unity3d.com/ja/2018.4/Manual/class-AnimationClip.html)、参照サイト

・Remove Constants Scale Curves
公式ドキュメントにも、インターネットで検索しても出てこない。

・Loop Time
アニメーションをループさせる
参照サイト

・Loop Pose
ループ再生した際に生じるループの不自然さを回避する。
分かりやすい例は、参照サイトを参照。
参照サイト参照サイト

・Cycle Offset
アニメーションが始まるときのアニメーションの開始モーションを指定できる
https://youtu.be/5ynjNwnVNUU
参照サイト

・Root Transform RotationのBake into Pose
チェックすると、ルートモーションの回転を無効にする。
分かりやすい例は、参照サイトを参照したほうが早い。
参照サイト、[参照サイト](https://docs.unity3d.com/ja/2022.2/Manual/class-AnimationClip.html

・Root Transform RotationのBased Upon
Originalは、
ファイル内のアニメーションの向きを基準に回転する。
Body Orientationは、
ボディの前方ベクトルを基準に回転する。
(ボディの前方ベクトルがよくわからない)
参照サイト参照サイト参照サイト

・Root Transform RotationのOffset
アニメーション開始時の向きををoffsetで調整する
https://youtu.be/VhWmi4Zh8V0
参照サイト

・Root Transform Position (Y)のBake into Pose
チェックすると、ルートモーションのY軸移動を無効にする。
チェックしている場合はy軸の基準点は変化しません。チェックなしの場合はy軸の基準点と一緒に高さも変化する。
動画だと、チェックしている場合は上にy軸に動いているように見えるが基準点の高さは変化していない。
ループアニメーションだとチェックしている場合、アニメーション終わると初期の位置に戻る。
また、高さが変化するアニメーション(ジャンプ等)を制御する際はチェックを外しておくといい。というのは仮にコライダーがついていた場合、思わぬあたり判定が発生してしまう恐れがあるため。
https://youtu.be/By2NorzmlqM
参照サイト参照サイト参照サイト

・Root Transform Position (Y)のBased Upon(at Start)
Originalは、
y軸の基準点をファイル内のアニメーションにする。
Center of Massは、
y軸の基準点をモデルの重心にする。
Feetは、
y軸の基準点をモデルの足元にする。
https://youtu.be/wPxJQLF761U
参照サイト参照サイト参照サイト

・Root Transform Position (Y)のOffset
アニメーション開始時のy軸をoffsetで調整する
https://youtu.be/1OCBZOxAO8Q
参照サイト

・Root Transform Position (XZ)のBake into Pose
チェックすると、ルートモーションのXZ軸移動を無効にする。
Root Transform Position (Y)のBake into Poseと同じ。
チェックしている場合はXZ軸の基準点は変化しません。チェックなしの場合はXZ軸の基準点と一緒に高さも変化する。
ループアニメーションだとチェックしている場合、アニメーション終わると初期の位置に戻る。
参照サイト参照サイト参照サイト

・Root Transform Position (XZ)のBased Upon
Root Transform Position (Y)のBased Upon(at Start)と同じ
参照サイト参照サイト参照サイト

・Mirror
アニメーションを反転する。
https://youtu.be/eJqjYplW27Y
参照サイト

・Additive Reference Pose
よくわからない。
参照サイト参照サイト

・Curves

Curvesで設定した値を、AnimatorのParameterで設定しスクリプトから取得できる。
以下ソースである

using UnityEngine;

public class AnimationCurveTest2 : MonoBehaviour
{
    public Animator animator;

    void Update()
    {
      float a = animator.GetFloat("TestCurve");
      Debug.Log(a);
    }
}

動画はこちらである。
この値を利用して、パーティクルシステムの放出速度を制御し、冷たい空気中で白い息を吐いているように見せることができる。
https://youtu.be/-y1k9DBLAGM
参照サイト参照サイト

・Events

アニメーションの任意のフレームにメソッドを呼び出すことができる。
その際、int、folat、string、ゲームオブジェクトをメソッドの引数に渡せる。
以下がスクリプトである。
なお、このメソッドは、実験してみたところ一つのメソッドしか実行できない・・

using UnityEngine;

public class EventTestScript : MonoBehaviour
{

	void EventTest()
	{
		Debug.Log("引数なし");
	}

	void EventTest(float a)
	{
		Debug.Log(a);
	}

	void EventTest(int b)
	{
		Debug.Log(b);
	}

	void EventTest(string c)
	{
		Debug.Log(c);
	}

	void EventTest(GameObject d)
	{
		Instantiate(d);
	}
}

動画はこちらである。
https://youtu.be/luJ1EkqGkT4
参照サイト参照サイト

・Mask

アニメーションの一部をなくすことができる。
処理負荷の面でも、ファイルサイズとメモリを小さくすることができます。また、ランタイムにブレンドするアニメーションデータが少ないため、処理速度が向上します。
実際のそうなるかは上でやっているため割愛
参照サイト参照サイト

・Root Motion Node
ルートモーションの設定。
Noneは、
Bake into Poseとかの設定が表示され、回転はルートモーション無効、Y軸移動はルートモーション有効などの設定が個別にできる。
Root Transformは、
全てのルートモーションを無効にする。
rootはよくわからん。
参照サイト参照サイト参照サイト

・ Generate Retargeting Quality Repor
これを有効にすると、リターゲティングの問題に関するより具体的な情報を確認できます。

・Default bone length found in this file is different from the one found in the source avatar. (このファイルに含まれるデフォルトのボーンの長さが、ソースアバターのものと一致しません。)
・Inbetween bone default rotation found in this file is different from the one found in the source avatar. (このファイルに含まれるボーンとボーンの間の回転が、ソースアバターのものと異なります。)
・Source avatar hierarchy doesn’t match one found in this model. (ソースアバターの階層が、このモデルに含まれるものと一致しません。)
・This animation has translation animation that will be discarded.
・Humanoid animation has inbetween transforms and rotation that will be discarded. (ヒューマノイドのアニメーションに含まれる中間にあるトランスフォームと回転は破棄されます。)
This animation has scale animation that will be discarded.

参照サイト

・アニメーション分かりやすく複数に分ける方法

詳しく参照サイトを参照
その際Preserve Hierarchyをオンにしないとアニメーションが壊れる。
参照サイト

・回転の補間
Animationで、回転の補間を設定できる項目がある
以下画像の、Euler AnglesとEuler Angles (Quaternion)とQuaternion である。

①Euler AnglesとEuler Angles (Quaternion)
360度も大きい角度を指定した場合、ちゃんとその角度まで回転する
下の動画だと390度まで指定した場合、390度まで回転しているのが分かる。
https://youtu.be/0L-XmMMOtCM
Euler Angles (Quaternion) とEuler Anglesの違いについて述べる。
Euler Angles (Quaternion) は、情報がクォータニオン曲線にベイクされます。この方法はより多くのメモリを使用しますが、実行時間は若干速くなります。
②Quaternion
360度も大きい角度を指定した場合、最短距離で回転させる。
下の動画のように390度まで指定した場合、30度の回転しているのが分かる。
https://youtu.be/IFzHh8iTvic
参照サイト

・Resample Curves
Resample Curvesはオイラー形式のアニメーションをクォータニオン形式に変換する設定。
有効にするとそれが可能。
Mayaなどで作成したオイラー形式のアニメーションを作成した場合、この設定を有効にするとMayaなどで作成したアニメーションとUnityで再生したアニメーションが一致しない場合がある。
その場合、この設定を無効にする。
参照サイト参照サイト参照サイト

・AnimationのAdd Property

AnimationのAdd Propertyでそのオブジェクトにアタッチされているコンポーネントやスクリプトを調整できる。
実際にやってみる。
https://youtu.be/RdzSFRhmozc
参照サイト

・Animationのプレビューモードとレコードモード

Animationのプレビューモードは、手動でキーを追加する。
レコードモードは、対象の値を変更すること自動でキーを作成してくれる。
https://youtu.be/t5ICU08dvVs
参照サイト

・AnimationのCurvesモード

AnimationのCurvesモードを使用すると、グラフ上でアニメーションを作成できる。
https://youtu.be/xxb17FsvcJ8
参照サイト

・Animationの子オブジェクトのアニメーション
Animator Controllerがアタッチされているオブジェクトの子オブジェクトにも、Animationでアニメーションを編集できる。
https://youtu.be/6in_9lzLVZc
参照サイト

・Animation Events
Animationで、任意のフレームでイベント関数を実行できる。
引数は、引数なし、int、float、String、GameObjectを指定できる。
https://youtu.be/yE1bZrXDg5Y
参照サイト

・Animator ControllerのParameters
Animator ControllerのParametersを使用して、ステートマシンの遷移が可能。
以下ソースコードである。

using UnityEngine;

public class TestScript : MonoBehaviour
{
    Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    //Update は各フレームに 1 度ずつ呼び出されます
    void Update()
    {
        if (Input.GetKey(KeyCode.A)) {
            animator.SetFloat("New Float", 2);
        }

        if (Input.GetKey(KeyCode.B))
        {
            animator.SetInteger("New Int", 1);
        }

        if (Input.GetKey(KeyCode.C)){
            animator.SetBool("New Bool", true);
        }

        if (Input.GetKey(KeyCode.D))
        {
            animator.SetTrigger("New Trigger");
        }

    }

}

実際やってみた動画である。
https://youtu.be/CGTiVOwtkHY
参照サイト

・Animator ControllerのState Machine Behaviour
State Machine Behaviourを使用すると、ステートマシーンが変わったときなどにイベント関数として呼べる。
以下ソースコードである。

using UnityEngine;

public class StateMachineBehaviourSample : StateMachineBehaviour
{
	//状態が変わった時に実行
	public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
	{
		Debug.Log("OnStateEnterを実行");
	}

	//状態が終わる時に実行
	public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
	{
		Debug.Log("OnStateExitを実行");
	}

	//毎フレーム実行(※最初と最後のフレームを除く)
	public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
	{
    	Debug.Log("OnStateUpdateを実行");
	}

}

実際に試してみた動画である。
https://youtu.be/_JSm9C44wXc
参照サイト参照サイト

・Animator Controllerのサブステートマシン
サブステートマシンは、複数のステートマシーンをまとめる機能である。
以下のNew StateMachine 0がサブステートマシンである。

以下がNew StateMachine 0の中身である。

参照サイト

・Animation Layers
Animation Layersを使用するとAvatarMaskの部位ごとに別々のアニメーションを適用させたり、合成できる。
主に赤枠の箇所を設定することで実現できる。

■BlendingがOverride
Overrideを使用すると、AvatarMaskで指定した部位を他のモーションに差し替えることができる。
https://youtu.be/ARUqniTAcQM
■BlendingがAdditive
Additiveを使用すると、レイヤーごとのアニメーションを合成できる
https://youtu.be/KsSu4sNR_mc
■Layersの一番上のレイヤーがベースのレイヤーで、もし下のレイヤーのWeigthが0の場合、一番上のレイヤーのアニメーションが適用される。
参照サイト参照サイト

・ステートマシンのMuteとSolo

Muteにするとそのステートマシーンに遷移しない。
Soloにするとそのステートマシーンに遷移できる。
https://youtu.be/k0npg6l13Bs
参照サイト

・ターゲットマッチング
ターゲットマッチングは、アニメーションの指定タイミングでゲームオブジェクトの位置及び回転が到達するように調整するものである。
https://youtu.be/UxJEisZUqyU
ソースコードや詳細は参照サイトを参照。
参照サイト参照サイト参照サイト

・IK
IKは子ボーンから親ボーンへとアニメーションが変化する技術
これを利用すると、はしごを掴む手のアニメーションなどを作成することなくスクリプトから簡単に制御できる。
実際にIKを試した動画。
https://youtu.be/u9k_4Ux9mDI
手すりに手が近づくと手のアニメーションが変わっていることが分かる。
これはスクリプトからIKを制御しているため実現できていることである。

実際のソースコードはこちら。

using UnityEngine;

[RequireComponent(typeof(Animator))] 

public class IKControl : MonoBehaviour {

	protected Animator animator;			// Animator

	public bool ikActive = false;			// IKのON/OFF
	public Transform rightHandObj = null;	// 右手の目標位置
	public Transform lookObj = null;		// 注視点の位置

	private float	ikWeight = 0f;			// IKをON/OFFする時に滑らかにつながるように

	void Start () 
	{
		// Animatorを取得
		animator = GetComponent<Animator>();
	}

	// IKPassにチェックを入れたことで呼ばれるようになる関数
	void OnAnimatorIK()
	{
		// Animatorが取得できたなら
		if(animator) {

			// IKが有効なら
			if(ikActive) {

				// 滑らかにつながるようにカウントアップ
				if (ikWeight < 1.0f)
				{
					ikWeight += Time.deltaTime;
					if (ikWeight > 1.0f)
					{
						ikWeight = 1.0f;
					}
				}
			}

			// IKが無効なら
			else {          
				// 滑らかにつながるようにカウントダウン
				if (ikWeight > 0.0f)
				{
					ikWeight -= Time.deltaTime;
					if (ikWeight < 0.0f)
					{
						ikWeight = 0.0f;
					}
				}

			}

			// 注視点
			if(lookObj != null) {
				// IKの適用度
				animator.SetLookAtWeight(ikWeight);

				// 適用度を反映(位置)
				animator.SetLookAtPosition(lookObj.position);
			}    

			// 右手
			if(rightHandObj != null) {
				// 位置のIK適用度
				animator.SetIKPositionWeight(AvatarIKGoal.RightHand,ikWeight);
				// 回転のIK適用度
				animator.SetIKRotationWeight(AvatarIKGoal.RightHand,ikWeight);  

				// 適用度を反映(位置) ※手すりにつかまって移動(ただしZ方向限定)
				Vector3 pos = rightHandObj.position;
				pos.z = transform.position.z;
				animator.SetIKPosition(AvatarIKGoal.RightHand,pos);

				// 適用度を反映(回転)
				animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation);
			}    
		}
	}    
		

	void OnTriggerEnter(Collider collider)
	{
		if (rightHandObj)
		{
			// 手すりに触れたなら
			if (collider.name == rightHandObj.name)
			{
				ikActive = true;	// IKを有効
			}
		}
	}

	void OnTriggerExit(Collider collider)
	{
		if (rightHandObj)
		{
			// 手すりから離れたなら
			if (collider.name == rightHandObj.name)
			{
				ikActive = false;	// IKを無効s
			}
		}
	}

}

サンプルプロジェクトは、参照サイトからダウンロード可能。
参照サイト参照サイト

・ブレンドツリー(Blend Tree)
ブレンドツリー(Blend Tree)は、一つのステートマシーンで複数のアニメーションを指定した値に応じてアニメーションをブレンドして不自然なく切り替えていくもの。
実際にやってみた動画である。
https://youtu.be/bUoQ4quO1Gw
Blend Treeをクリックすると下記の設定項目が出てくるが、これも紹介していく。

■Blend Type
Blendする方法変える。
若干癖があるのでこちらを参照。
■Parameter
AnimatorControllerのParametersのFloatを指定でき、この値によってアニメーションが切り替わっていく
■Threshold
アニメーションが切り替わる閾値。
Parameterの値と比較され、アニメーションが切り替わっていく。
■時計のアイコン
アニメーションの速さを指定できる
■体のアイコン
アニメーションをミラーにできる。
■Automate Thresholds
よくわからない。
■Homogeneous Speed
よくわからない。
■Adjust Time Scale
よくわからない。
参照サイト

・ブレンドシェイプ(BlendShape)をスクリプトから制御
実際のソースコードはこちら。

using UnityEngine;

public class TestScript : MonoBehaviour
{
    private SkinnedMeshRenderer skinnedMeshRenderer;
    private int index;


    void Start()
    {
        skinnedMeshRenderer = this.GetComponent<SkinnedMeshRenderer>();
        //アニメーションさせたい箇所を指定
        index = skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex("head_eyeCloseR1");

    }

    void Update()
    {

        if (Input.GetKey(KeyCode.A))
        {
           // BlendShape のウェイトを設定
           skinnedMeshRenderer.SetBlendShapeWeight(index, 100);
        }

        if (Input.GetKey(KeyCode.B))
        {
            // BlendShape のウェイトを設定
            skinnedMeshRenderer.SetBlendShapeWeight(index, 0);
        }
    }

}

試してみた動画
https://youtu.be/juEjdX6XUp8
参照サイト参照サイト

・Animator Override Controller
Animator Override Controllerは、オーバライドしたAnimator Controllerのステートマシーンを同じにしつつ、個別のアニメーションを設定できる。
実際にやってみた。
https://youtu.be/Ptb15Wy5RQ0
参照サイト

・ヒューマノイドアニメーションのリターゲティング
参照サイト

・Animator コンポーネントのApply Root Motion
ルートモーションを適用させるかどうか。
有効だとルートモーション適用。
無効だとスクリプトから制御。
https://youtu.be/dJ3Vc4k_PU0
参照サイト

・Animator コンポーネントのUpdate Mode
Animator が更新されるタイミングと、それに使用されるタイムスケールを選択できます。
■Normal
Animator は Update の呼び出しと同期して更新され、アニメーターの速度は現在のタイムスケールと一致します。タイムスケールが遅くなると、アニメーションもそれに合わせて遅くなります。
■Animate Physics
Animator は FixedUpdate の呼び出しに同期して (物理システムと同時に) 更新されます。物理インタラクションのあるオブジェクトのモーションをアニメーション化する場合に、このモードを使う必要があります(例えば、リジッドボディオブジェクトを押すキャラクターなど)。
■Unscaled Time
Animator は Update の呼び出しと同期して更新されますが、Animator の速度は現在のタイムスケールを無視して常に 100% の速度でアニメーション化します。SE やゲームの一時停止用に異なるタイムスケールを使用しつつ GUI システムを通常速度でアニメーション化する場合に便利です。
参照サイト

・Animation Statesの項目

■Speed
アニメーションの速度を変えれる。
■Multiplier
Speedに乗算される。
(ParametersのFloatの値)
■Motion Time
アニメーションの任意のフレームを指定できる。
https://youtu.be/qcFZlNNuNpw
■Mirror
アニメーションをミラーにできる。
なお、ParametersのBooleanの値によってMirrorを変更できる。
■Cycle Offset
上で紹介しているので割愛。
ParametersのFloatの値で調整可能
■Foot IK
足元にIKを適用する。
https://youtu.be/IXQRP6CsCNk
Foot IK無効の場合だと、地面に足がぴたりとくっついていないことが分かる。
Foot IK有効だと、地面に足がぴたりとくっついていることが分かる。
■Write Defaults
よくわからない。
参照サイト

・Any State
Any Stateはどのステートマシーンからでも、対象のステートマシーンに遷移できるもの

実際にやってみる。
https://youtu.be/fiB4ocJy-Ec
参照サイト

・Animation Transitionの項目
以下の項目を記載していく

■Has Exit Time
無効にすると、Conditionsの条件を満たしたときアニメーションが即座に切り替わる。
有効だと、Conditionsの条件を満たしてもSettingsで設定した値によって次のアニメーションに遷移する。
下記画像でいうと、有効の場合赤枠の箇所で次のアニメーションに遷移するが、無効はConditionsの条件を満たしたとき即座に遷移する。

■Exit Time
次のアニメーションが切り替わる箇所を指摘できる。
■Transition Duration
遷移元のアニメーションと遷移先のアニメーションのブレンドする時間を指定する。
https://youtu.be/oOOse9b5y7A
上の動画で見ると、ブレンド時間が長いと遷移先のアニメーションのブレンド率が高くなっていることが分かる。
■Fixed Duration
遷移元のアニメーションと遷移先のアニメーションのブレンドする時間の単位を設定できる。
有効だと、Transition Durationで指定した秒数でTransition Durationが決定。
無効だと遷移前のアニメーションの割合でTransition Durationが決定。
例えば、0.2の場合を考える。
有効だとTransition Durationが0.2秒
無効だと、遷移元のアニメーションの20%の秒数がTransition Durationになる。
■Transition Offset
遷移先のアニメーションの開始時点でずらせる。
■Interruption Source と Ordered Interruption
遷移の割り込みを制御できる。
実際にやってみたが割り込みできなかった。やり方がわるい?
参照サイト

・Playable API
Playable APIを使用すればAnimationControllerを量産する事無くアニメーションを再生、動的なアニメーションの追加、そしてアニメーション同士をブレンドする事ができる。
IDOLY PRIDEでも使用されている。
一旦は後回し。
参照サイト参照サイト参照サイト参照サイト

Discussion