独自のコンポーネントの実行順を制御させる
最終更新: 2020年1月22日
ここでは、ユーザ独自のコンポーネントに対して、他のCubismのコンポーネント同士の実行順を制御する手順を説明します。
以下は[SDKのインポート~モデルを配置]をおこなったプロジェクトに追加することを前提とした説明です。
概要
Cubism SDK for UnityのOriginal Workflowのコンポーネントの中には、実行される順序に制限があるものがあります。
Cubism SDK for Unityでは、CubismUpdateControllerを用いることで制御することができ、上記のコンポーネントはこれによって実行順が制御されます。
CubismUpdateControllerが制御するコンポーネントは、CubismモデルのPrefabのルートにアタッチされたコンポーネントになります。
CubismUpdateControllerを用いれば、ユーザ独自のコンポーネントも同様に実行順を制御することが可能です。
ここでは例として以下のコンポーネントに対して実行順の制御を設定する手順を説明します。
public class CubismExampleController : MonoBehaviour
{
private void Start()
{
// CubismExampleControllerの初期化処理
}
private void LateUpdate()
{
// CubismExampleControllerの更新処理
}
}
1. Prefabにコンポーネントをアタッチ
Hierarchyに配置されたPrefabのルートのGameObjectに、CubismExampleControllerをアタッチします。
また、PrefabがOW形式でインポートされていない場合、CubismUpdateControllerもアタッチします。

2. コンポーネントにICubismUpdatableを実装
実行順を制御するコンポーネントにICubismUpdatableインターフェースを実装します。
CubismUpdateControllerは実行時にICubismUpdatableを実装したコンポーネントを取得し、それらの実行順を制御します。
public class CubismExampleController : MonoBehaviour, ICubismUpdatable
{
// Sceneの非実行中に実行順の制御を行うか
public bool NeedsUpdateOnEditing
{
get { return false; }
}
// このコンポーネントの実行順
public int ExecutionOrder
{
get { return 0; }
}
// 実行順序が制御されるアップデート関数
public void OnLateUpdate()
{
}
// 実行順が制御されているか
public bool HasUpdateController { get; set; }
private void Start()
{
// CubismExampleControllerの初期化処理
}
private void LateUpdate()
{
// CubismExampleControllerの更新処理
}
}
ここで実装したICubismUpdatableインターフェースは以下のようになっています。
namespace Live2D.Cubism.Framework
{
/// <summary>
/// Cubism update interface.
/// </summary>
public interface ICubismUpdatable
{
int ExecutionOrder { get; }
bool NeedsUpdateOnEditing { get; }
bool HasUpdateController { get; set; }
void OnLateUpdate();
}
}
ExecutionOrderは、このコンポーネントの実行順を決める値になります。
この値が小さいほど他のコンポーネントよりも先に呼ばれます。
SDK同梱のコンポーネントに設定される値はCubismUpdateExecutionOrderに記述されています。
HasUpdateControllerは、ICubismUpdatableを実装したコンポーネントがCubismUpdateControllerのアタッチされていない場合、Unityのイベント関数から呼び出すようにするためのフラグです。
public static class CubismUpdateExecutionOrder
{
public static readonly int CubismFadeController = 100;
public static readonly int CubismPoseController = 200;
public static readonly int CubismExpressionController = 300;
public static readonly int CubismEyeBlinkController = 400;
public static readonly int CubismMouthController = 500;
public static readonly int CubismHarmonicMotionController = 600;
public static readonly int CubismLookController = 700;
public static readonly int CubismPhysicsController = 800;
public static readonly int CubismRenderController = 10000;
public static readonly int CubismMaskController = 10100;
3. コンポーネントをCubismUpdateControllerに対応させる
CubismExampleControllerを以下のように修正します。
public class CubismExampleController : MonoBehaviour, ICubismUpdatable
{
// Sceneの非実行中に実行順の制御を行うか
public bool NeedsUpdateOnEditing
{
get { return false; }
}
// このコンポーネントの実行順
public int ExecutionOrder
{
get { return 150; }
}
// 実行順序が制御されるアップデート関数
public void OnLateUpdate()
{
// CubismExampleControllerの更新処理
}
// 実行順が制御されているか
public bool HasUpdateController { get; set; }
private void Start()
{
// CubismExampleControllerの初期化処理
// モデルのPrefabにCubismUpdateControllerがアタッチされているかをチェック
HasUpdateController = (GetComponent<CubismUpdateController>() != null);
}
private void LateUpdate()
{
// CubismUpdateControllerがアタッチされていない場合、CubismExampleController自身のイベント関数から更新処理を行う
if (!HasUpdateController)
{
OnLateUpdate();
}
}
}
LateUpdate()で行っていた更新処理を、CubismUpdateControllerが呼び出すOnLateUpdate()に移します。
以上で実行順を制御させる設定は終了です。
このスクリプトをCubismモデルのPrefabにアタッチしてシーンを実行すると、このスクリプトの更新処理がCubismUpdateControllerによって呼び出されます。