CubismUpdateController

最終更新: 2020年10月21日

概要

CubismUpdateControllerをPrefabにアタッチすることで、Cubism SDK for Unityの各コンポーネントの実行順を制御することができます。

OW方式では各コンポーネントの実行順序が重要となるため、CubismUpdateControllerを使用して仕様に沿うことが必須となります。
実行順の制御が不要などでCubismUpdateControllerを使用しない場合、コンポーネントの実行順はUnity側で決められるため、実行順によってはExpressionなどの機能が正しく処理されないことがあります。

ユーザが独自に作成したコンポーネントの実行順を制御するには、そのコンポーネントにICubismUpdateableを実装します。

ICubismUpdateableの実装

実行順の制御対象となるコンポーネントにてICubismUpdateableインターフェイスを継承します。

CubismUpdateControllerがアタッチされていない場合、OnLateUpdateの処理は実行されないため、以下のスニペットではそのコンポーネント単独でも動作するようにしています。

public sealed class CubismRenderController : MonoBehaviour, ICubismUpdatable
{
    public bool HasUpdateController { get; set; }
  
    public bool NeedsUpdateOnEditing
    {
        get { return true; }
    }
  
    public int ExecutionOrder
    {
        // このコンポーネントの実行順序
        get { return CubismUpdateExecutionOrder.CubismRenderController; }
    }
  
    public void OnLateUpdate()
    {
        if(HasUpdateController)
        {
            // LateUpdateの処理を実装
        }
    }
  
  
    private void OnEnable()
    {
        // CubismUpdateControllerがアタッチされているか
        HasUpdateController = (GetComponent<CubismUpdateController>() != null);
    }
  
    private void LateUpdate()
    {
        if(!HasUpdateController)
        {
            // CubismUpdateControllerがアタッチされていない場合、自身のLateUpdateから処理を行う。
            OnLateUpdate();
        }
    }
}
public sealed class CubismEyeBlinkController : MonoBehaviour, ICubismUpdatable
{
    public bool HasUpdateController { get; set; }
  
    public bool NeedsUpdateOnEditing
    {
        get { return false; }
    }
  
    public int ExecutionOrder
    {
        // このコンポーネントの実行順序を返す。
        get { return CubismUpdateExecutionOrder.CubismEyeBlinkController; }
    }
  
    public void OnLateUpdate()
    {
        // LateUpdateの処理を実装
    }
  
  
    private void OnEnable()
    {
        // CubismUpdateControllerがアタッチされているか
        HasUpdateController = (GetComponent<CubismUpdateController>() != null);
    }
  
    private void LateUpdate()
    {
        if(!HasUpdateController)
        {
            // CubismUpdateControllerがアタッチされていない場合、自身のLateUpdateから処理を行う。
            OnLateUpdate();
        }
    }
}
  • HasUpdateController
    • PrefabにCubismUpdateControllerがアタッチされているかを設定します。
  • NeedsUpdateOnEditing
    • Unityでシーンが非実行中にも更新を行う必要があるかを返します。
      CubismUpdateControllerはエディターモードでも実行されるので、そのコンポーネントが非実行中にも更新する必要がない場合はfalseを返します。
  • ExecutionOrder
    • そのコンポーネントの実行順を返します。
      この値が小さいコンポーネントほど先に呼び出されます。
      Cubism SDK for Unity の各コンポーネントの実行順序は CubismUpdateExecutoinOrder に定義されています。
    •  ユーザが実行順序を制御するコンポーネントを追加した場合、CubismUpdateExecutoinOrderの定義を参考にして、ここで返す値でどのタイミングで呼び出されるかを注意してください。
      • 例(独自のコンポーネントをCubismLookControllerとCubismPhysicsControllerの間のタイミングで呼び出したい場合):
        • CubismLookControllerは700、CubismPhysicsControllerは800が設定されるため、独自のコンポーネントは750を返すよう設定します。
  • OnLateUpdate()
    • CubismUpdateControllerによって実行順序を制御され呼び出される関数です。
      そのコンポーネントが行う更新処理を記述します。

実行中にコンポーネントを追加、削除する場合の注意

CubismUpdateControllerが実行順を制御するコンポーネントは、OnEnable()のタイミングで行います。
すべてのコンポーネントがあらかじめPrefabにアタッチされている場合は問題ありませんが、シーン実行中、動的にコンポーネントを追加または削除した場合、明示的にCubismUpdateController.Refresh() を呼び出して読み込み直す必要があります。

gameObject.AddComponent<MyComponent1>();

var component = gameObject.GetComponent<MyComponent2>();
DestroyImmediate(component);

// CubismUpdateControllerに制御するコンポーネントを再読み込みさせる
var updateController = gameObject.GetComponent<CubismUpdateController>();
updateController.Refresh();
この記事はお役に立ちましたか?
はいいいえ
この記事に関するご意見・
ご要望をお聞かせください。