Expression
最終更新: 2020年1月30日
概要
Expressionは、現在のパラメータの値に対して、表情用のパラメータの値を加算または乗算して設定することができる、Cubismの表情モーションを扱う機能です。
Unity標準のモーション再生機能であるAnimatorでは、レイヤーに設定できるブレンドモードに乗算(Multiply)が無いため、表現することが出来ません。
表情機能の設定ファイルは.exp3.json形式で書き出されます。
表情の仕組みにつきましては こちら をそれぞれご覧ください。
Expressionを利用するには、あらかじめPrefabに UpdateControllerの設定 と ParameterStoreの設定 を行う必要があります。
該当のチュートリアル記事は こちら をご覧ください。
表情モーションを再生するには以下の手順を行います。
- [.exp3.asset]を作成
- [.expressionList.asset]を作成し、[.exp3.asset]を追加
- 表情モーションを再生
- 表情モーションの計算と適用
[.exp3.asset]を作成
[.exp3.asset]は、[exp3.json]からコンバートしたScriptableObjectのアセットです。
[.exp3.asset]を変更した場合、正常な動作を保証できません。
[exp.json]を[.exp3.asset]にコンバートするには以下の処理を行います。
- [exp.json]をパース
- CubismExpressionData作成
- [.exp3.asset]作成
[exp.json]をパース
[exp3.json]のパースは CubismExp3Json.LoadFrom(string exp3Json) または CubismExp3Json.LoadFrom(TextAsset exp3JsonAsset) を使います。
CubismExpressionData作成
CubismExpressionDataは、パースされた.exp3.jsonの情報を記録するクラスで、以下のデータを保持しています。
フィールド | 型 | 説明 |
Type | string | jsonファイルの種類。.exp3.jsonの場合は “Live2D Expression” が設定される。 |
FadeInTime | float | 表情がフェードインするまでの時間。値の単位は秒。 |
FadeOutTime | float | 表情がフェードアウトするまでの時間。値の単位は秒。 |
Parameters | SerializableExpressionParameter[] | 表情を適用するパラメータの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に再生する表情モーションのインデックスを設定することにより、表情モーションを再生・変更することが出来ます。
表情モーションの再生は以下の処理を行っています。
- 再生中の表情モーションの終了タイムを設定
- 新しい表情モーションを初期化し、表情モーションの再生リストに追加
再生中の表情モーションの終了タイムを設定
再生中の表情モーション存在する場合、再生中の表情モーションが終了するように終了時間を設定します。
// 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は、以下の情報を保持しています。
フィールド | 型 | 説明 |
Type | string | jsonファイルの種類。.exp3.jsonの場合は “Live2D Expression” が設定される。 |
FadeInTime | float | 表情がフェードインするまでの時間。値の単位は秒。 |
FadeOutTime | float | 表情がフェードアウトするまでの時間。値の単位は秒。 |
Weight | float | 表情のウェイト。値の範囲は0から1。 |
ExpressionUserTime | float | 表情の再生が開始してからの経過時間。値の単位は秒。 |
ExpressionEndTime | float | 表情の再生が終了する時間。値の単位は秒。 |
Destinations | CubismParameter[] | 表情が適用するパラメータの配列。 |
Value | float[] | 表情がパラメータに適用する値。要素数と並び順はDestinationsと同一。 |
Blend | CubismParameterBlendMode[] | 表情がパラメータに適用する計算方式。要素数と並び順は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()の前で適用した場合、表情で適用した結果が保存されてしまうため、表情用のパラメータの値が無限に加算または乗算されます。