独自のコンポーネントの実行順を制御させる

最終更新: 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によって呼び出されます。

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