Amazonで商品を見るセール会場へ

Unity│便利!アニメーションに関するTIPS 8選

Unityのアニメーション制作や管理に役立つTIPSをまとめました。

MayaからのFBX・BlendShapeの取り込み、クリップの管理、再生不具合の確認など8項目を紹介します。

画像と外部エディタ拡張には旧バージョンの例を含みます。

現行Maya・Unityでの一連の操作や実機動作は未検証のため、作業用コピーで確認してください。

目次

Maya(HumanIK)で作成したキャラクターをUnityへインポートする方法

MayaのHumanIKでセットアップしたキャラクターをUnityへコンバートする手順です。

準備

  1. MayaのWorking UnitsとFBXの単位を確認する。meterへの変更は必須ではなく、UnityのConvert Units・Scale Factorと組み合わせて、既知の寸法が意図した大きさになるか確認する
  2. perspカメラのFocal Lengthは作業しやすい値にする。80は過去の作例での値であり、FBXの尺度やインポートの成立条件ではない
  3. HumanIKで骨格とCharacter Definitionを作成する。作例ではCreate Skeletonを使うが、生成された骨格に合わせるだけではUnityでの寸法は保証されない

モデリング

  1. 作例では骨の位置を目安に、頭部は8分割のSphere、胴体は8分割のCylinder、手足は6分割のCylinderなどを配置する。分割数はモデルに応じて選ぶ
  2. オブジェクト同士を結合して人型を作成する(指は親指、人差し指、残り3本のまとまりなどに簡略化して分ける)
  3. Mesh → Cleanupを実行して不要なジオメトリを整理する
モデリング結果

セットアップ

メッシュと骨(スケルトン)を選択し、Rigging → Skin → Bind Skinのオプションを開きます。

この作例はBind MethodをGeodesic Voxel、Max Influencesを2にした例です。

2は必須値ではありません。

関節を曲げたときの変形と、Unity側のボーンウェイト設定を確認して決めます。

コンバート

  1. 別名保存してから不要なノードを整理する。Optimize Scene Sizeを使う場合は削除対象を確認し、リグやアニメーションに必要なノードを失わないようにする
  2. 対象のメッシュ・骨をFBXで書き出してAssetsへ取り込む。旧作例はSend to Unity → Allを使用。現行環境でそのメニューがない場合はFBX Exportを使い、リグの拘束を使う動きは必要な範囲をベイクする

Unityでの設定

  1. Projectウィンドウで出力されたFBXモデルを選択する
  2. InspectorのRigタブでAnimation TypeをHumanoidにし、初めてこのモデルのAvatarを作る場合はAvatar DefinitionをCreate From This Modelにする。Apply後にConfigureボタンを押す
  3. ボーンマッピング、必須ボーン、TポーズとAvatarの有効性を確認する。人型リターゲットが不要なモデルではGenericも検討する
UnityでのHumanoid設定

Configureの横に成功を示すチェックが付いても、必須ボーンの対応ができたことを示す段階です。

指などの任意ボーンやTポーズも確認し、実際に関節を曲げて変形を見てください。

作成に失敗した場合はConfigureでボーンの割り当てを確認し、欠けた対応を修正します。

詳細はUnity 6.3 LTSのHumanoidモデルとAvatarの設定を参照してください。

HumanIK調整時の注意点

  • 骨を削除・変更する場合:HumanIKのCharacter Definition、リグ、スキンとの参照関係を先に確認します。過去の作例では指の定義解除を伴う調整を行いましたが、すべての再生成問題に共通する解決策ではありません
  • バインド後に骨を移動する場合:単なるEdit Pivotを必須操作とせず、MayaのMove Skinned Jointsの案内を確認します。バインドポーズとウェイトを保てるか、コピーで検証してください
  • コントロールリグ追加で形状が崩れる場合:定義、ポーズ、拘束、バインド状態を切り分けます。再バインドはウェイトを変えるため、元データを保存し、原因を確認してから行います
HumanIKの問題例
スポンサーリンク

BlendShapeをUnityへインポートする方法

表情(フェイシャル)用などに作成したMayaのBlendShapeをUnityへ反映させる手順です。

Maya側の設定

  1. ベースとなるメッシュと、変形後のターゲットメッシュを作成する
  2. ターゲットメッシュ、ベースメッシュの順に選択し、使用バージョンのBlend Shape作成コマンドで設定する
  3. 変形を確認したベースメッシュをFBX出力する。AnimationとDeformed ModelsのBlend Shapesを有効にする。スキン付きなら必要な骨とSkinsも含め、単なるターゲット形状のオブジェクトと変形データを区別する
MayaでのBlendShape設定

Unity側の確認

  1. モデルのImport SettingsでImport BlendShapesを有効にしてApplyし、シーンへ置いたモデルのSkinned Mesh RendererでBlendShapesを確認する
  2. 通常は0が影響なし、100が完全な影響となる。各シェイプを個別に確認し、他のシェイプやスキニングによる変形と混同しない。公式のBlend Shape手順参照
UnityでのBlendShape確認

1つのFBXに複数のアニメーションをまとめて管理する方法

Unity-Chanのモデルデータのように、1つのFBXファイル内に複数のアニメーションクリップを格納して管理する手順です。

メリット

  • 1つのファイル上で作業できるため、制作効率が上がりアニメーション間の一貫性も確認しやすい
  • FBXファイルが1つにまとまるため、Unityへのインポートやアセット管理の手間を削減できる
  • Unityのプロジェクト内でアセットファイルが散乱せず管理しやすい

Maya側の作業

  1. タイムライン上で複数のアニメーションを続けて作成し、各クリップの開始フレームと終了フレームをメモしておく
  2. 必要に応じてエクスポート設定でBake Animationにチェックを入れ、FBXとして書き出す

Unity側の設定

  1. ProjectウィンドウでFBXを選択し、InspectorのAnimationタブでImport Animationを有効にする。Clipsリストの「+」ボタンを押す
  2. クリップ名を入力し、Start/Endにメモしたフレーム範囲を指定してApplyを押す。取り込み後のプレビューで、開始・終了姿勢と動きを確認する
Clipsの設定

アニメーションデータを個別の.animファイルとして切り出したい場合

  1. ProjectウィンドウでFBXを展開し、含まれているAnimationClipを選択してCtrl+Dを押す(アセットの複製)
  2. 独立した.animファイルとして複製し、名前を付けて参照を割り当てる。元FBXを再インポートしても複製したクリップは自動更新されない点に注意する

アニメーションのMissing(リンク切れ)を一括修復するスクリプト

階層・名前の変更で切れたアニメーションカーブのパスを置換する旧エディタ拡張です。

配布コードは数値カーブを対象とし、Spriteなどのオブジェクト参照カーブは処理しません。

通常のAnimatorControllerを前提にし、未設定やOverride Controllerの扱い、クリップの書き込み可否も事前確認が必要です。

使い方

  1. 対象クリップとControllerを退避し、参照先記事の配布コードをAssets/Editor/ReplaceMissingAnimationCurve.csに保存する。現行Unityでのコンパイル・動作は作業用コピーで確認する
  2. UnityメニューのAssets → ReplaceAnimatorMissingPathを選択してウィンドウを開く
  3. Animatorを指定し、一覧と実際の階層を比較する。old Pathに置換元、replace pathに置換先を入力し、空の置換元や意図しない部分一致がないことを確認してApplyする。変更後に全対象クリップを再生確認する

参考:http://tsubakit1.hateblo.jp/entry/2016/01/26/015331

作成したアニメーションが意図通りに再生されない場合のチェックポイント

Maya等から読み込んだアニメーションでループや補間が正しく動かない場合に確認すべき設定項目です。

FBX Import Settingsの圧縮設定

FBXのAnimationタブで、補間が元データと違う場合はResample Curvesの有無を比較します。

この項目はEulerカーブがある場合に表示されます。

圧縮による差が疑わしい場合だけAnim. Compressionを一時的にOffにして比較し、原因が分かれば誤差許容値を調整します。

Offは容量・実行時メモリや性能への影響があるため、一律の推奨設定ではありません。

ループ問題はStart/End、Loop Time、Loop Poseも確認します。

公式のAnimation設定参照。

FBX Import Setting

Animator Controller(遷移設定)

遷移矢印を選び、Has Exit Time、Conditions、Transition Durationを目的に合わせて確認します。

Exit Timeの1は1秒ではなく正規化時間の1周期、Durationの0はブレンドなしです。

最後まで再生して切り替える場合の比較には使えますが、途中で切り替えたい動作や滑らかなブレンドには適しません。

Has Exit TimeとConditionsを併用すると、Exit Timeに達した後にConditionsが評価されます。

複数の条件を指定した場合は、すべてを満たす必要があります。

公式の遷移設定参照。

Mecanimの設定

Transition Durationの単位は、Fixed Durationのチェックで変わります。

有効なら秒、無効なら遷移元ステートの長さに対する割合です。

たとえば遷移元が2秒で速度1の場合、Durationが0.25なら、有効時は0.25秒、無効時は0.5秒相当になります。

同じ数値なのにブレンド時間が違うときは、Fixed Durationと遷移元の長さを先に確認してください。

ここで補足したAvatar、Import Animation、遷移設定は、2026年10月26日にUnity 6.3 LTSの公式資料へ照合しました。

現行Maya・Unityでの操作や、取り込みから再生までの実機確認は行っていません。

Animator Controller内にAnimationClipを直接埋め込む方法

Animator Controller(.controller)アセットの内部にAnimationClip(.anim)をサブアセットとして格納する方法です。

サブアセットとして扱う場合の注意

  1. 通常のドラッグ&ドロップによるステート作成は、クリップへの参照設定です。サブアセット化とは異なります。埋め込みにはAssetDatabase.AddObjectToAssetなどを使うエディタ処理が必要です
  2. 埋め込み用ツールを使う場合はControllerを退避し、格納されたクリップをステートへ割り当てる。埋め込みだけでは再生ステートは設定されません

下記は2015年の拡張例です。

新しいクリップをController内に作るコードで、既存クリップをドラッグするだけで取り込む機能ではありません。

配布コードは古いAllocateAnimatorClipを使うため、現行Unityへそのまま導入できるとは限りません。

参考:http://tsubakit1.hateblo.jp/entry/2015/02/03/232316

ドアなどのピボット(回転軸)をUnity上で設定・表示する方法

通常はDCCツール側でピボット(原点)を合わせてからエクスポートしますが、Unityエディタ内だけで手軽に回転軸を合わせる方法です。

回転軸の設定手順

  1. 回転させたいドアなどのメッシュオブジェクトを配置する
  2. 空のGameObjectを作成し、TransformのPositionを蝶番の位置へ合わせる。正確な座標はDCC側で確認するか、目印のオブジェクトを用意する
  3. ドアのワールド位置を保って空オブジェクトの子にし、親を回転させる。親のScaleは原則1,1,1とし、子のローカル座標と回転方向を確認する

回転軸(ギズモ)の表示

Gizmo.csとして保存し、親に付けます。

SceneビューのGizmosを有効にすると位置を示す球が表示されます。

これは回転軸の向きを描いたり、メッシュの原点を変更したりするコードではありません。

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なしでも実装できます。

以下はローカル軸に対する毎秒の回転量を指定する例です。

Animatorとの性能差は対象数や制御内容によるため、実機のProfilerで比較してください。

using UnityEngine;

public class Rotator : MonoBehaviour
{
    [SerializeField]
    private Vector3 angle;

    void Update()
    {
        transform.Rotate(angle * Time.deltaTime);
    }
}

実装のポイント:

  • Rotator.csとして保存し、回転させるGameObjectに付ける。Angleは初期値が0なので、Yを90にするとローカルY軸まわりに毎秒90度回転する
  • [SerializeField]を付与した変数はInspectorから直接速度などの調整が可能になるため、現場での微調整が容易になります
  • Time.deltaTimeを使うためTime.timeScaleの影響を受けます。同じTransformをAnimatorや物理演算でも動かす場合は制御の競合に注意してください

Unityに関する他のTIPS記事は、下記のまとめリンクから確認できます。

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

この記事で紹介しているコードは、GitHubのMOTOKI-LLC/cg-method-codeにもまとめています。

アニメーションと演出の記事は、ほかにもあります。

スポンサーリンク

まとめ

  • HumanIK連携:FBXの単位、骨格、Avatar、変形を個別に確認する
  • BlendShape:フェイシャル表情用モーフをSkinned Mesh Renderer経由で制御する
  • 複数クリップ管理:1つのFBX内にClipsを分割定義して管理を一元化する
  • リンク切れ修復:エディタ拡張スクリプトを利用してMissingパスを一括置換する
  • 再生の不具合対策:FBXのResample CurvesとAnim. Compressionを見直す
  • ピボット調整:空の親を蝶番の位置に置き、子の位置を保って親を回転させる
  • スクリプト制御:単純な回転をUpdateで実装できる。性能は実測して判断する

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

Unityのおすすめ書籍

開発PCの選び方

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次