Unityのアニメーションに関する便利なTIPSをまとめました。
MayaからのインポートやBlendShape、アニメーション管理など実用的な内容を紹介します。
Maya(HumanIK)で作成したキャラをUnityへインポートする方法
MayaからUnityへキャラクターをコンバートするやり方の紹介です。
準備
- Unityとサイズを合わせるためWorking Unitsをmeter(メートル)に設定
- パースカメラのゆがみを抑えるため、persp → FocalLengthを80に設定
- Rigging → Skeleton → HumanIK → Skeletonを押してHumanIKの骨を表示(これに合わせるとUnityでもちょうどいい大きさでコンバートされる)
モデリング
- 骨の位置をあたりにして、頭部は8面のSphere、体は8面のCylinder、手足は6面のCylinderのプリミティブを並べる
- オブジェクトをつないで適当に人型を作成(手の部分は親指と人差し指、その他の3つに分ける)
- Mesh → Cleanupをかけてモデルを整理

セットアップ
モデルと骨を選択して、Rigging → Skin → Bind Skinを押します。設定はBind methodをGeodesic Voxel、Max Influencesを2にします。
コンバート
- File → Optimize Scene Sizeをかけて余計なノードを消す
- File → Send To Unity → AllでUnityのAssetへ出力
Unityでの設定
- Projectウィンドウで出力したFBXを選択
- Rig → Animation TypeをHumanoidに変更してConfigureボタンを押す
- ボーンが正しくセットされているかチェック

HumanIK調整時の注意点
- シーンを開くと消したはずの骨が再生される → 指の骨のチェック(定義)を外さないと消えない
- シーンを開くとモデルの形状が壊れる → 骨を修正するときにPivotで移動しないと骨が元の位置に戻ろうとしてメッシュの形も崩れる
- コントローラーを追加すると形状が壊れる → 一からやり直した方が早い

BlendShapeをUnityへインポートする方法
フェイシャル(表情アニメーション)用のBlendShapeをUnityへコンバートする方法です。
Maya側の設定
- ベースとターゲットのモデルを作成
- BlendShapeのウィンドウを開いて、ターゲット、最後にベースを選択してEdit → Create BlendShape
- ベースだけを選択して、File → Send To Unity → SelectでUnityのAssetへ出力(ターゲットのモデルは含めなくてもよい)

Unity側の確認
- ベースオブジェクトを選択して、Skinned Mesh Renderer → BlendShapeのターゲットを確認
- 数値を100にするとターゲットの形状が完全に反映される

1つのFBXに複数のアニメーションを管理する方法
Unityちゃんのように1つのFBXに複数のアニメーションを管理する方法です。
メリット
- 1データで作業したほうが、作業効率やアニメーションの一貫性の確認がしやすい
- 1データなのでUnityへのコンバートコストが良い
- Unityでデータ管理しやすい
Maya側
- 複数のアニメーションを付ける。それぞれの開始と終わりのフレームをメモ
- 必要であればBake Animationにチェックを入れてFBXをExport
Unity側
- FBXを選択し、Clipsの+ボタンを押す
- フレーム数と命名を入力

アニメーションデータを個別に出力したい場合
- FBX内のアニメーションを選択してCtrl+D(複製)
- Animデータがコピーされるので別名に命名を変更する
アニメーションのリンク切れを1発で直すスクリプト
Prefab内のデータを整理していて、アニメーションデータが黄色文字(missing)になった時に使えます。
使い方
- スクリプトをAssets/Editor/ReplaceMissingAnimationCurve.csへ格納
- Unityを起動してAssets → ReplaceAnimatorMissingPathを選択
- ウィンドウでAnimatorを選択してApplyボタンを押す
参考:http://tsubakit1.hateblo.jp/entry/2016/01/26/015331
作成したアニメーションが正しく動かない時の確認箇所
Maya等で作成したアニメーションがUnityで正しく動かない(ループなど)時に確認する場所です。
FBX Import Setting
FBXを選択して、AnimationタブのResample CurvesとAnim.CompressionをOFFにします。

Mecanim
Mecanimの矢印つなぎ部分を選択して、Exit Timeを1、Transition Duration(s)を0にします。

コントローラーの中にアニメーションデータを入れる方法
AnimationController(.controller)の中にAnimationClip(.anim)のデータを入れる方法です。
すでにあるアニメーションデータを入れる場合
- コントローラーの中に入れたいアニメーションデータをコピペする
- Animatorウィンドウを開いてアニメーションデータを再アサインする
新規で作成する場合は下記が便利です。
参考:http://tsubakit1.hateblo.jp/entry/2015/02/03/232316
ドアのPivot(回転軸)の設定と表示方法
3DソフトでオブジェクトのPivot(回転軸)を設定してからインポートすればよいですが、Unityだけでさくっと作りたい時の方法です。
回転軸の設定
- 回転させたい平面を作成
- 空のGameObjectを作成し、Vキーを押しながら回転させたい場所へスナップ
- 平面をGameObjectの子にする
回転軸の表示
GameObjectに下記のスクリプトをアタッチします。
using UnityEngine;
public class Gizmo : MonoBehaviour
{
public float gizmoSize = 0.75f;
public Color gizmoColor = Color.yellow;
void OnDrawGizmos()
{
Gizmos.color = gizmoColor;
Gizmos.DrawWireSphere(transform.position, gizmoSize);
}
}参考:https://www.youtube.com/watch?v=itIh8PYGP7w
単純なアニメーションをスクリプト化する方法
回転などの単純なアニメーションはスクリプトで実装すると軽量です。
using UnityEngine;
public class Rotator : MonoBehaviour
{
[SerializeField]
private Vector3 angle;
void Update()
{
transform.Rotate(angle * Time.deltaTime);
}
}ポイント:
- 回転したいオブジェクトにスクリプトをアタッチ
[SerializeField]を使うとInspectorで値を調整できるのでデザイナーが扱いやすい- コードサイズは191B程度と軽量
まとめ
- HumanIK:MayaからUnityへキャラクターをコンバート
- BlendShape:フェイシャルアニメーション用に使用
- 複数アニメーション管理:1つのFBXでClipsを分割
- リンク切れ修正:エディタスクリプトで一発解決
- アニメーション問題:Resample CurvesとAnim.CompressionをOFFに
- Pivot設定:空のGameObjectを親にしてスナップ
- スクリプト化:単純なアニメーションは軽量なスクリプトで実装
