Unityのアニメーション制作や管理に役立つTIPSをまとめました。
Mayaからのモデルやアニメーションのインポート、BlendShapeの設定、データ管理まで実用的な手順を解説します。
Maya(HumanIK)で作成したキャラクターをUnityへインポートする方法
MayaのHumanIKでセットアップしたキャラクターをUnityへコンバートする手順です。
準備
- Unityとスケールを合わせるため、MayaのWorking Unitsをmeter(メートル)に設定する
- パースカメラの歪みを抑えるため、perspカメラのFocal Lengthを80に設定する
- RiggingメニューからSkeleton → HumanIKを選択し、HumanIKウィンドウのCreate Skeletonで骨格を表示する(この骨格サイズに合わせることで、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プロジェクトのAssetsフォルダ内へFBXを出力する
Unityでの設定
- Projectウィンドウで出力されたFBXモデルを選択する
- InspectorのRigタブでAnimation TypeをHumanoidに変更し、Apply後にConfigureボタンを押す
- ボーンマッピングが正しく割り当てられているか確認する

HumanIK調整時の注意点
- シーンを開き直すと削除したはずの骨が復活する場合:HumanIKのCharacter Definitionで該当する指の割り当て(定義)を解除してから削除する必要があります
- シーンを開くとメッシュの形状が崩れる場合:骨の位置を修正する際はピボット移動(Edit Pivot)を行わないと、初期ポーズへ復帰する際に骨の位置がずれて形状破綻の原因になります
- コントロールリグを追加した際にメッシュが崩れる場合:スケルトン定義とバインドの状態を見直し、崩れが大きいときは定義やバインドを一からやり直すのが確実です

BlendShapeをUnityへインポートする方法
表情(フェイシャル)用などに作成したMayaのBlendShapeをUnityへ反映させる手順です。
Maya側の設定
- ベースとなるメッシュと、変形後のターゲットメッシュを作成する
- ターゲットメッシュ、ベースメッシュの順に選択し、Deform → Blend Shape(またはEdit → Create BlendShape)を実行する
- ベースメッシュのみを選択し、File → Send to Unity → SelectionでUnityのAssetsフォルダへ出力する(ターゲットメッシュを含める必要はありません)

Unity側の確認
- インポートしたモデルのSkinned Mesh Rendererコンポーネント内にあるBlendShapesプロパティを確認する
- スライダーの数値を100にすると、ターゲットの形状が完全に反映される

1つのFBXに複数のアニメーションをまとめて管理する方法
Unity-Chanのモデルデータのように、1つのFBXファイル内に複数のアニメーションクリップを格納して管理する手順です。
メリット
- 1つのファイル上で作業できるため、制作効率が上がりアニメーション間の一貫性も確認しやすい
- FBXファイルが1つにまとまるため、Unityへのインポートやアセット管理の手間を削減できる
- Unityのプロジェクト内でアセットファイルが散乱せず管理しやすい
Maya側の作業
- タイムライン上で複数のアニメーションを続けて作成し、各クリップの開始フレームと終了フレームをメモしておく
- 必要に応じてエクスポート設定でBake Animationにチェックを入れ、FBXとして書き出す
Unity側の設定
- ProjectウィンドウでFBXを選択し、InspectorのAnimationタブにあるClipsリストの「+」ボタンを押す
- クリップ名を入力し、Start/Endにメモしたフレーム範囲を指定してApplyを押す

アニメーションデータを個別の.animファイルとして切り出したい場合
- ProjectウィンドウでFBXを展開し、含まれているAnimationClipを選択してCtrl+Dを押す(アセットの複製)
- 独立した.animファイルとして複製されるため、任意のファイル名に変更して使用する
アニメーションのMissing(リンク切れ)を一括修復するスクリプト
Prefabの階層や名前を変更したことで、Animationウィンドウ上のプロパティ名が黄色(Missing)になった際に役立ちます。
使い方
- エディタ拡張スクリプトを「Assets/Editor/ReplaceMissingAnimationCurve.cs」として保存する
- UnityメニューのAssets → ReplaceAnimatorMissingPathを選択してウィンドウを開く
- 開いたウィンドウで対象のAnimatorまたはオブジェクトを指定し、Applyボタンを実行する
参考:http://tsubakit1.hateblo.jp/entry/2016/01/26/015331
作成したアニメーションが意図通りに再生されない場合のチェックポイント
Maya等から読み込んだアニメーションでループや補間が正しく動かない場合に確認すべき設定項目です。
FBX Import Settingsの圧縮設定
Projectウィンドウで該当のFBXを選択し、Animationタブ内のResample CurvesおよびAnim. CompressionをOffに設定してApplyを押します。

Animator Controller(遷移設定)
Animatorウィンドウで遷移矢印(Transition)を選択し、InspectorでHas Exit Timeの設定およびExit Timeを1、Transition Durationを0に調整します。

Animator Controller内にAnimationClipを直接埋め込む方法
Animator Controller(.controller)アセットの内部にAnimationClip(.anim)をサブアセットとして格納する方法です。
既存のアニメーションデータを格納する場合
- Controllerアセットの内部に含めたいAnimationClipを複製またはドラッグ&ドロップしてサブアセット化する
- Animatorウィンドウを開き、ステートに該当のアニメーションクリップを再割り当てする
新規作成時に自動で埋め込みたい場合は、下記の拡張スクリプトが便利です。
参考:http://tsubakit1.hateblo.jp/entry/2015/02/03/232316
ドアなどのピボット(回転軸)をUnity上で設定・表示する方法
通常はDCCツール側でピボット(原点)を合わせてからエクスポートしますが、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
単純な定常アニメーションをC#スクリプトで実装する方法
一定速度の回転など単純な動きは、Animatorを使わずスクリプトで制御したほうが負荷を抑えられます。
using UnityEngine;
public class Rotator : MonoBehaviour
{
[SerializeField]
private Vector3 angle;
void Update()
{
transform.Rotate(angle * Time.deltaTime);
}
}実装のポイント:
- 回転させたいGameObjectにスクリプトをアタッチする
[SerializeField]を付与した変数はInspectorから直接速度などの調整が可能になるため、現場での微調整が容易になります- Animatorコンポーネントを介さないためメモリ消費やCPUオーバーヘッドが少なく軽量に動作します
Unityに関する他のTIPS記事は、下記のまとめリンクから確認できます。

文字を手書き風に描画するアニメーションの作成方法はこちらで解説しています。

この記事で紹介しているコードは、GitHubのMOTOKI-LLC/cg-method-codeにもまとめています。
アニメーションと演出の記事は、ほかにもあります。



まとめ
- HumanIK連携:Mayaのスケルトン定義を活用してUnityの人型アバターへ安全にコンバートする
- BlendShape:フェイシャル表情用モーフをSkinned Mesh Renderer経由で制御する
- 複数クリップ管理:1つのFBX内にClipsを分割定義して管理を一元化する
- リンク切れ修復:エディタ拡張スクリプトを利用してMissingパスを一括置換する
- 再生の不具合対策:FBXのResample CurvesとAnim. Compressionを見直す
- ピボット調整:空の親GameObjectを作成しVキースナップで簡易的に回転軸を設定する
- スクリプト制御:単純な回転・移動はUpdateスクリプトで軽量に実装する
