独自のコンポーネントの実行順を制御させる
最終更新: 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によって呼び出されます。