Expression

最終更新: 2020年1月30日

概要

Expressionは、現在のパラメータの値に対して、表情用のパラメータの値を加算または乗算して設定することができる、Cubismの表情モーションを扱う機能です。
Unity標準のモーション再生機能であるAnimatorでは、レイヤーに設定できるブレンドモードに乗算(Multiply)が無いため、表現することが出来ません。

表情機能の設定ファイルは.exp3.json形式で書き出されます。
表情の仕組みにつきましては こちら をそれぞれご覧ください。

Expressionを利用するには、あらかじめPrefabに UpdateControllerの設定 と ParameterStoreの設定 を行う必要があります。

該当のチュートリアル記事は こちら をご覧ください。

表情モーションを再生するには以下の手順を行います。

  1. [.exp3.asset]を作成
  2. [.expressionList.asset]を作成し、[.exp3.asset]を追加
  3. 表情モーションを再生
  4. 表情モーションの計算と適用

[.exp3.asset]を作成

[.exp3.asset]は、[exp3.json]からコンバートしたScriptableObjectのアセットです。
[.exp3.asset]を変更した場合、正常な動作を保証できません。

[exp.json]を[.exp3.asset]にコンバートするには以下の処理を行います。

  1. [exp.json]をパース
  2. CubismExpressionData作成
  3. [.exp3.asset]作成

[exp.json]をパース

[exp3.json]のパースは CubismExp3Json.LoadFrom(string exp3Json) または CubismExp3Json.LoadFrom(TextAsset exp3JsonAsset) を使います。

CubismExpressionData作成

CubismExpressionDataは、パースされた.exp3.jsonの情報を記録するクラスで、以下のデータを保持しています。

フィールド説明
Typestringjsonファイルの種類。.exp3.jsonの場合は “Live2D Expression” が設定される。
FadeInTimefloat表情がフェードインするまでの時間。値の単位は秒。
FadeOutTimefloat表情がフェードアウトするまでの時間。値の単位は秒。
ParametersSerializableExpressionParameter[]表情を適用するパラメータのID、適用する値、計算方式。

[.exp3.asset]の新規作成には CubismExpressionData.CreateInstance(CubismExp3Json json) を使います。
[.exp3.asset]を上書きするには CubismExpressionData.CreateInstance(CubismExpressionData expressionData, CubismExp3Json json) を使います。

  • CubismExp3Json json:CubismExp3Jsonは[exp3.json]をパースしたデータ。
  • CubismExpressionData expressionData:上書き対象となるCubismExpressionData。

[.exp3.asset]作成

[.exp3.asset]の作成はAssetDatabase.CreateAssetを使用して以下のように作成します。

// 新規作成する場合
expressionData = CubismExpressionData.CreateInstance(ExpressionJson);
AssetDatabase.CreateAsset(expressionData, AssetPath.Replace(".exp3.json", ".exp3.asset"));
 
// 既に作成されたアセットを更新の場合
expressionData = CubismExpressionData.CreateInstance(oldExpressionData, ExpressionJson);
EditorUtility.CopySerialized(expressionData, oldExpressionData);
expressionData = oldExpressionData;
 
// Unityのデータベースを更新
EditorUtility.SetDirty(expressionData);

この処理は CubismExpression3JsonImporter.Import() で行っています。

※ ランタイムの場合、CubismExpressionDataを.asset化する必要はありません。

[.expressionList.asset]を作成し、[.exp3.asset]を追加

[.expressionList.asset]は、モデル毎の[.exp3.asset]の参照をリスト化したアセットです。
これはCubismExpressionControllerでCurrentExpressionIndexから再生する表情モーションを取得するために使用します。
[.exp3.asset]リストの順番は[exp3.json]のインポート順で追加されます。

この項目の処理は CubismExpression3JsonImporter.Import() で行っています。

[.expressionList.asset]を作成

[.expressionList.asset]はモデルのプレハブと同じ階層に作成しています。

// 既存のexpressionListを取得
var expressionList = AssetDatabase.LoadAssetAtPath<CubismExpressionList>(expressionListPath);
 
// アセット作成
AssetDatabase.CreateAsset(expressionList, expressionListPath);

※ ランタイムの場合、CubismExpressionListを.asset化する必要はありません。

[.exp3.asset]を追加

[.expressionList.asset]に[.exp3.asset]を追加するには、以下のように行っています。

// 新規追加時
expressionIndex = expressionList.CubismExpressionObjects.Length;
Array.Resize(ref expressionList.CubismExpressionObjects, expressionIndex + 1);
expressionList.CubismExpressionObjects[expressionIndex] = expressionData;
 
// 既に設定されている要素を更新
expressionList.CubismExpressionObjects[expressionIndex] = expressionData;
 
// Unityのデータベースを更新
EditorUtility.SetDirty(expressionList);

表情モーションを再生

CubismExpressionController.CurrentExpressionIndexに再生する表情モーションのインデックスを設定することにより、表情モーションを再生・変更することが出来ます。

表情モーションの再生は以下の処理を行っています。

  1. 再生中の表情モーションの終了タイムを設定
  2. 新しい表情モーションを初期化し、表情モーションの再生リストに追加

再生中の表情モーションの終了タイムを設定

再生中の表情モーション存在する場合、再生中の表情モーションが終了するように終了時間を設定します。

// Set last expression end time
if(_playingExpressions.Count > 0)
{
    var playingExpression = _playingExpressions[_playingExpressions.Count - 1];
    playingExpression.ExpressionEndTime = playingExpression.ExpressionUserTime + playingExpression.FadeOutTime;
    _playingExpressions[_playingExpressions.Count - 1] = playingExpression;
}

この処理は CubismExpressionController.StartExpression() で行っています。

新しい表情モーションを初期化し、表情モーションの再生リストに追加する

表情モーションの再生情報を持つCubismPlayingExpressionを作成します。

CubismPlayingExpressionは、以下の情報を保持しています。

フィールド説明
Typestringjsonファイルの種類。.exp3.jsonの場合は “Live2D Expression” が設定される。
FadeInTimefloat表情がフェードインするまでの時間。値の単位は秒。
FadeOutTimefloat表情がフェードアウトするまでの時間。値の単位は秒。
Weightfloat表情のウェイト。値の範囲は0から1。
ExpressionUserTimefloat表情の再生が開始してからの経過時間。値の単位は秒。
ExpressionEndTimefloat表情の再生が終了する時間。値の単位は秒。
DestinationsCubismParameter[]表情が適用するパラメータの配列。
Valuefloat[]表情がパラメータに適用する値。要素数と並び順はDestinationsと同一。
BlendCubismParameterBlendMode[]表情がパラメータに適用する計算方式。要素数と並び順はDestinationsと同一。設定される計算方式はOverride, Additive, Multiply。

CubismPlayingExpressionは CubismPlayingExpression.Create(CubismModel model, CubismExpressionData expressionData) を使用して作成することができます。

  • CubismModel model:表情モーションを再生するモデル。
  • CubismExpressionData expressionData:再生する表情モーションの[exp3.asset]データ。

作成した表情モーションは、以下のように再生リストに追加します。

// 再生表情を作成
var palyingExpression = CubismPlayingExpression.Create(_model, ExpressionsList.CubismExpressionObjects[CurrentExpressionIndex]);
 
// 表情再生リストに追加
_playingExpressions.Add(palyingExpression);

この処理は CubismExpressionController.StartExpression() で行っています。

表情モーションの計算と適用

表情の計算と適用はCubismExpressionController.OnLateUpdate()から呼び出されます。

※ 表情の適用はParameterStore.SaveParameters()の後に行う必要があります。
Expressionは、現在の値に対して毎フレーム新たに表情用の値を適用する機能です。
ParameterStore.SaveParameters()の前で適用した場合、表情で適用した結果が保存されてしまうため、表情用のパラメータの値が無限に加算または乗算されます。

この記事はお役に立ちましたか?
はいいいえ
この記事に関するご意見・
ご要望をお聞かせください。