モデルのパラメータ更新について
最終更新: 2019年9月4日
ここでは、モデルに付けられているパラメータの更新についての方法と注意点の説明になっています。
概要
Cubism 2.1 for Unityでのパラメータ更新では.setParamFloat()等でパラメータを変更した後、.update()を呼び出し、パラメータを更新する必要がありました。
Cubism 3以降のバージョンのCubism SDK for UnityではToModel()で生成されたGameObjectにアタッチされたスクリプトから自動的に更新が行われています。
加えてパラメータの更新は別スクリプト上からparameter.value = 値;のような形で更新することができます。
注意点として、パラメータの更新はUnityのイベント関数実行順からLateUpdate()を用いて行う必要があります。
また、ScriptExecutionOrderでスクリプトの呼び出し順を設定している場合でも同様に注意が必要です。
詳細
Cubism 2.1 SDK for Unityでの更新方法
Cubism 2.1 SDK for Unity でのパラメータ更新では
void Update()
{
	live2DModel.setParamFloat("パラメータID", 値);
	
	live2DModel.update();
}
というような形でメソッドを呼び出して更新を行う必要がありました。
具体的には、
void Update()
{
    double timeSec = Time.time;
    double t = timeSec * 2 * Math.PI;
    // 呼吸
    live2DModel.setParamFloat(breath, (float)(0.5f + 0.5f * Math.Sin(t / 3.2345)), 1);
    // パラメータの値を更新
    live2DModel.update();
}
というような形になります。
Cubism 3 以降のバージョンのCubism SDK for Unity での更新方法
Cubism 3 以降のバージョンのCubism SDK for Unityでは生成されたPrefabにアタッチされているCubismRenderController.csを通して自動的に更新が行われています。
これを利用して、アニメーションによって変更される値をパラメータに適用することで描画の更新を行うことができます。
値をパラメータに適用するには以下のような記述になります。
void LateUpdate()
{
	parameter = model.Parameters[index];
	
	parameter.Value = value;
}
具体的な記述例としては
using UnityEngine;
using Live2D.Cubism.Core;
using Live2D.Cubism.Framework;
public class ParameterLateUpdate : MonoBehaviour
{
    private CubismModel _model;
    private float _t;
    private void Start()
    {
        _model = this.FindCubismModel();
    }
    private void LateUpdate()
    {
        _t += (Time.deltaTime * 4f);
        var value = Mathf.Sin(_t) * 30f;
        var parameter = _model.Parameters[2];
        parameter.Value = value;
    }
}
という形になります。
これは、後述のGIFに使われているコードになっています。
model.Parameters[インデックス]の数値が“2”になっていますが、これはkoharuのパラメータのPARAM_ANGLE_Zが2番目(0開始)なので“2”と記述しています。

注意点として、Cubism 3 以降のCubism SDK for Unityを用いスクリプト上からパラメータを更新する場合はLateUpdate()を用いる必要があります。
UnityのアニメーションはUpdate()の後に処理されます。そのため、Update()内でパラメータの値を変更するとアニメーションに上書きされてしまいます。
これを回避するには、アニメーションの処理が終わった後に呼び出されるLateUpdate()を用いて、パラメータの更新をする必要があります。
以下のGIFは、アニメーションを再生しているモデルに、PARAM_ANGLE_Zの値をスクリプトから操作しているSceneです。
左のモデルはUpdate()から、右はLateUpdate()からパラメータの値を操作しており、左は値の変更が上書きされてしまっているのが見て取れます。

Tips1
例に上げているGIFですが、これはアニメーションのパラメータを上書きして設定を行っています。 そのため、スクリプトから更新をしているパラメータはアニメーションの動きが適用されていない状態になっています。
もし、アニメーションと掛け合わせてパラメータを使いたい場合にはLive2D.Cubism.Frameworkに含まれているCubismParameterBlendModeでブレンドモードを変更する必要があります。ブレンドモードは3種類あります。
- Override…パラメータを上書きして更新します
 - Additive…パラメータを加算して更新します
 - Multiply…パラメータを乗算して更新します
 
ぜひ、用途に合わせたブレンドモードをご利用ください。
以下はコード例になっています。
Tips2
Cubism 3 以降の Cubism SDK for Unityでの更新方法で記述した方法でもモデルのパラメータは取得できますが、以下の方法でも特定のパラメータを取得することができます。
これはLive2D.Cubism.Coreに含まれているFindById()を用いることでParameterIDを取得するコードです。
このコードが書かれたスクリプトを、モデルのルートにアタッチすることで指定したパラメータ(ParameterID)を取得することができます。
Tips3
その他注意点として、ScriptExecutionOrderでスクリプトの実行順を変えている場合も注意が必要になります。
スクリプトの実行順によっては、パラメータの更新タイミングが変わり、パラメータの更新がうまくいかない場合が出てきます。