CG・映像デザイナー技術ブログ

【Unity】便利!アニメーションに関するTIPS8選

eyecatch-unity-animation

本記事ではアニメーションに関する便利なTIPSを紹介いたします。

この記事の著者
CGブロガー すいみん

CGブロガー

すいみん

Suimin

プロフィール

某美大の油絵科を卒業後、大手CG映像プロダクションに入社。
その後ゲーム業界に転職。
現在は技術系のCGデザイナーをしています。 書籍:Unity デザイナーズ・バイブル
プロフィール詳細はこちら

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

作成したキャラをMayaからUnityへコンバートするやり方の紹介です。

準備

  1. Unityとサイズを合わせる為 Working Unitsをmeter(メートル)に。
  2. パースカメラのゆがみを抑えるため、persp>FocalLength を80に
  3. Rigging>Skelton>HumanIK>Skeltonを押して、HumanIKの骨を表示させます。(これに合わせるとUnityでもちょうどいい大きさでコンバートされます。)

モデリング

  1. 骨の位置をあたりにして、頭部は8面のSphere、体は8面のCylinder、手足は6面のCylinderのプリミティブを並べます。
  2. オブジェクトをつないで、適当に人型を作成します。
    一番複雑な手の部分は、銃などの武器を持つことを想定して、親指と人差し指、その他の3つに分けます。
  3. ひたすらモデルをいじってそれなりに人型ができて来たら、そのままHumanIKのプロモーションだとつまらないので、バランス見直します。
    (プロモーションの変更に合わせて骨の位置も変更するところでしたが、忘れてました。)
  4. Mesh>Cleanupをかけて、モデルを整理します。最終的に△650ポリゴン以下になりました。
    (久しぶりなので、ここまで1時間強かかってしまいました。)

セットアップ

  1. モデルと骨を選択して、Rigging>Skin>Bind Skinを押します。設定はBind methodはGeodesic Voxel、Max Influences 2にします。

    ※ 本来であれば、Tポーズではなく腕を45度傾けたリラックスポーズにしてモデルを修正したり、丁寧にスキニングしたり、コントローラーをつけたりするべきですが、あくまでコンバートの検証なのでカットします。

コンバート

  1. File>Optimize Scene Sizeをかけます。ごみノードが邪魔をして、モデルの形状が壊れてしまうので余計なノードを消します。
  2. File>Send To Unity>AllでUnityのAssetへ出力します。
    (専用のメニューがあるので安心です。)

Unityでの設定

  1. Projectウインドウで出力したfbxを選択します。
    Rig>Animation TypeをHumanoidに変更して、Configureボタンを押します。
  2. ボーンが正しくセットされているかなどチェックします。
    ちなみにMusclesタブを選択するとポーズをとるようです。(※スキニングはちゃんとしてないモデルです)

補足

HumanIKの調整時、いろいろ問題が起きたのでメモ

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

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

BlendShapeをUnityへコンバートするやり方

はじめに

フェイシャル(表情アニメーション)用の検証
手短に。

Maya

  1. ベースとターゲットのモデル作成
  2. BlendShapeのウインドウを開いて、 ターゲット、最後にベースを選択してEdit>Create BlendShape。

    ※作成後、ベースモデルのヒストリーのBlendShapeがあることを確認。

  3. ベースだけを選択して、File>Send To Unity>SelectでUnityのAssetへ出力します。

    ※ターゲットのモデルは含めなくてもよい。

Unity

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

1つのFBXに複数のアニメーションを管理するやり方

はじめに

Unityちゃんで1つのFBXに複数のアニメーションを管理していたので、同じことを試してみました。

メリットを考えるとしたら

  • 1データで作業したほうが、作業効率やアニメーションの一貫性の確認などしやすい。
  • 1データなのでUnityへのコンバートコストが良い
  • Unityでデータ管理しやすい
    です。

Maya

  1. 複数のアニメーションを付ける。それぞれの開始と終わりのフレームをメモ。
  2. 必要であれば、BakeAnimationにチェックをいれて、FBXをExport。

Unity

  1. FBXを選択、Clipsの+ボタンを押す
  2. フレーム数と命名を入力

備考

アニメーションデータを個別に出力したい時

  1. FBX内のアニメーションを選択して、Ctrl+D(複製)
  2. Animデータがコピーされるので、別名に命名を変更する。

アニメーションのリンク切れを1発で直すスクリプト

Prefab内のデータを整理していて、付随しているアニメーションデータが黄色文字(missing)なった時に

テラシュールブログさんのスクリプトで1発で解決したのでメモ。

ReplaceMissingAnimationCurve.cs

参考 【Unity】AnimationClipのMissingなパスを見つけて解決しやすくするエディタ拡張 - テラシュールブログテラシュールブログ

使い方

  • スクリプトを Assets>Editor>ReplaceMissingAnimationCurve.csへ格納
  • Unityを起動して、Assets>ReplaceAnimatorMissingPathを選択してウインドウを起動、Animatorを選択してApplyボタンを押すだけ。

これでリンク切れを恐れずデータ整理できる気がします。

作成したアニメーションが正しく動かない時に確認する場所について

MAYA等で作成したアニメーションが、Unityで正しく動かない(ループなど)時に確認する場所についてのメモです。

FBX Import Setting

FBXを選択して、AnimationタブのResample CurvesAnim.CompressionOFFにします。

Mecanim

メカニムの矢印つなぎ部分を選択して、Exit Time1Transition Duration(s)0にします。

コントローラーの中にアニメーションデータを入れるやり方

AnimationController(.controller)の中にAnimationClip(.anim)のデータを入れるやり方

コントローラーの中にアニメーションデータを入れるやり方

「.anim」のコードを「.controller」のコードの中にコピペすれば、アニメーションデータを格納することができます。

新規で作成するときはテラシュールブログのスクリプトが便利です。

参考 UnityのAnimatorControllerにAnimationClipを内蔵するテラシュールブログ

すでにあるアニメーションデータを入れる場合

  1. コントローラーの中に入れたいアニメーションデータをコピペします。

    ちなみにコピペで下記のコードは複数できてしまいますが、一つだけも良いようです。
    (※冒頭の行にいれること)

    %YAML 1.1
    %TAG !u! tag:unity3d.com,2011:

  2. Animatorウインドウを開いて、アニメーションデータの再アサインします。

ドアのPivot(回転軸)の設定と表示する方法

3DソフトでオブジェクトのPivot(回転軸)を設定してからインポートすればよいですが、Unityだけでさくっと作りたい時に。

回転軸の設定

  1. 回転させたい平面を作成
  2. 空のGameObjectを作成、Vキーを押しながら回転させたい場所へスナップ。
  3. 平面をGameObjectの子にする

回転軸の表示

  1. GameObjectに下記のスクリプトをアタッチ
using UnityEngine;
using System.Collections;
public class Gizmo : MonoBehaviour {
public float gizmoSize = .75f;
public Color gizmoColor = Color.yellow;
void OnDrawGizmos(){
Gizmos.color = gizmoColor;
Gizmos.DrawWireSphere(transform.position, gizmoSize);
}
}

単純なアニメーションをスクリプト化する方法

回転アニメーションスクリプト

・回転したいオブジェクトに下記のようなコードをアタッチ
・入力したい値は[SerializeField]としておくとInspectorで調整できるので、デザイナーが扱いやすい。
・コードのサイズは191B程度と軽量

using UnityEngine;
using System.Collections;

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

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

以上、すいみん(@cg_method)でした!