こんにちは、y_a_s_です。

Live2DモデルのモーションをMecanimで管理できないかな~って考えてたら、無理矢理なやり方を思いついたので試してみました。


※プログラムの話もしますが、プログラミングわからない人でも扱えるように書いてます。
(Mecanim自体プログラミングの知識が必要なものですが、アニメーションつけるところまではデザイ
ナーさんが絡むので)
 

Mecanimについて:
詳しくは Unity公式のマニュアル をご覧ください。
要はUnityに搭載されているアニメーション機能だそうです。
ちなみに、既に Live2DのモーションをMecanim制御するやり方 はありますが、
今回はもう一歩踏み込んで、mtnも使わないやり方でやってみます。冒頭に書いたとおり無理矢理ですが。
  
 
環境:
・OS:実行環境はWindows7 Professional SP1(Macでも問題なし)
Unity:Unity 5.2. (無料版でも4.X系列でも問題なし)
SDK:Live2D SDK for Unity 2.1.01_1 (2.0でも大丈夫)
 

Live2DモデルをMecanimで制御する手順:
1. SDK付属のサンプルプロジェクト「Simple」を開きます。
(/sample/Simple/Assets/Scene/Sample.unity)
2015-12-05_17h01_54



2. Scripts/SimpleModel をダブルクリックして開きます。
ちょっとだけプログラム触りますが、難しくはないはずです。
2015-12-05_17h03_04
2015-12-05_16h52_08



3.SampleModel に、モデルのパラメータIDを変数名にしたpublicなfloat型の変数を必要な分だけ用意します。
ついでにそのパラメータの初期値で初期化しておきましょう。
[例]
public class SimpleModel : MonoBehaviour 
{
public TextAsset mocFile ;
public Texture2D[] textureFiles ;
private Live2DModelUnity live2DModel;
private Matrix4x4 live2DCanvasPos;
 
// 追加部分 
public float PARAM_ANGLE_X = 0 ; 
public float PARAM_ANGLE_Y = 0 ; 
public float PARAM_ANGLE_Z = 0 ; 
/*
*/
void Start()
パラメータIDや初期値はModelerから確認できます。
モデルはマニュアルのサンプル「ハル」を使ってます。

・プログラミングわからない人向け:
以下の[ParamID]をパラメータIDに、[default]をそのパラメータの初期値に置き換えたものを
書いていってください。
0.1みたいに小数点以下がある数値の場合は、0.1f というように後ろに半角の f をつけてください。
public float [ParamID] = [default] ; 



4.Update()内で、3で設定した数値をLive2Dのモデルのパラメータに反映させます。
    void Update()
    {
        if (live2DModel == null) return;
        live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);

        if (!Application.isPlaying)
        {
            live2DModel.update();
            return;
        }

        // ここは不要
        //double t = (UtSystem.getUserTimeMSec() / 1000.0) * 2 * Math.PI;
        //live2DModel.setParamFloat("PARAM_ANGLE_X", (float)(30 * Math.Sin(t / 3.0)));

        live2DModel.setParamFloat("PARAM_ANGLE_X", PARAM_ANGLE_X);
        live2DModel.setParamFloat("PARAM_ANGLE_Y", PARAM_ANGLE_Y);
        live2DModel.setParamFloat("PARAM_ANGLE_Z", PARAM_ANGLE_Z);
/*
 */ 
        
        live2DModel.update();
    }

・プログラミングわからない人向け:
以下の[パラメータID]をパラメータIDに置き換えて、パラメータの分だけ追加してください。
live2DModel.setParamFloat("[パラメータID]", [パラメータID]);


プログラムの話はここで終わりです。
ここからはUnity上での操作になります。



5.ProjectビューでCreate > Animator Controllerをクリックします。
2015-12-05_17h05_28
 2015-12-05_17h06_21



6.HierarchyビューでモデルのGameObjectを選択し、Inspectorビュー下部からAdd Component > Miscelaneous > Animatorをクリックします。
2015-12-05_17h07_49
2015-12-05_17h08_02
2015-12-05_17h08_27



 
7.続けてInspectorビュー上でAnimatorのControllerという項目に、5で作成したAnimator Controllerをドラッグアンドドロップします。
2015-12-05_17h09_58



8.ProjectビューでCreate > Animation をクリックして、AnimationClipを作成します。
これでLive2Dのアニメーションを制御するのが今回の目的です。 
2015-12-05_17h10_55
2015-12-05_17h11_11


 
9.Animator ControllerをダブルクリックしてAnimatorビューを表示します。
 2015-12-05_17h12_39

10.開かれたAnimatorビューに、8で作成したAnimationClipをドラッグアンドドロップします。
2015-12-05_17h14_21

 

11.モデルを選択した状態でAnimationビューを開きます。
AnimatorビューとAnimationビューは別物なので注意してください。
2015-12-05_17h19_10
2015-12-05_17h20_01

 

12.Add Property から、2で書いた変数を片っ端から(若しくは必要な分だけ)追加(+をクリック)します。
モデルを選択していないと何も表示されないので注意してください。
2015-12-05_17h21_03
2015-12-05_17h22_07



13.Animationビューでキーを打ったりカーブエディタでカーブを制御したりしてアニメーションで好きなようにアニメーションを作成します。
2015-12-05_17h31_10

 

mecanim


 
あとは7~11を好きなだけ繰り返すと、あとはMecanimで管理ができるようになります。


さらにもう一歩踏み込んだTips(プログラミングできる人向けの話):
この方式でなら、実はmtnからAnimationClipも作れます。
mtnは実はテキストファイルなので、中身をパースして、パラメータごとにAnimationCurveを作って
AnnimationClipを作成するとイケます。


利点:
・修正するときAnimatorまで戻らなくていい
・モーションのブレンドが可能
・モーションの途中でイベントを発行できる(途中で音声を再生等)


注意:
このやり方の欠点として、AssetBundleにはスクリプトを含められないので、
 アプリケーション自体にスクリプトを含めておかなくてはいけません。
また、AnimationClipで制御してるのはモデルのパラメータではなくfloat値なので、
 当然反転はできません。


以上です。
慌てて書いたので、わからないことなどありましたらコメントまでお願いします。



明日は三度naotaroさんです。