CubismUpdateController (Cocos Creator)

最終更新: 2023年3月14日

概要

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

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

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

ICubismUpdateableの実装

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@ccclass('CubismEyeBlinkController')
export default class CubismEyeBlinkController extends Component implements ICubismUpdatable {
...
/** Model has update controller component. */
@property({ type: CCFloat, visible: false, serializable: false })
private _hasUpdateController: boolean = false;
public get hasUpdateController(): boolean {
return this._hasUpdateController;
}
public set hasUpdateController(value: boolean) {
this._hasUpdateController = value;
}
/** Refreshes controller. Call this method after adding and/or removing <see cref="CubismEyeBlinkParameter"/>s. */
public refresh(): void {
...
// Get cubism update controller.
this.hasUpdateController = this.getComponent(CubismUpdateController) != null;
}
/** Called by cubism update controller. Order to invoke OnLateUpdate. */
public get executionOrder(): number {
return CubismUpdateExecutionOrder.CUBISM_EYE_BLINK_CONTROLLER;
}
/** Called by cubism update controller. Needs to invoke OnLateUpdate on Editing. */
public get needsUpdateOnEditing(): boolean {
return false;
}
/** Called by cubism update controller. Updates controller. */
public onLateUpdate(): void {
// LateUpdateの処理を実装
}
/** Called by Cocos Creator. Makes sure cache is initialized. */
protected start(): void {
// Initialize cache.
this.refresh();
}
/** Called by Cocos Creator. */
protected lateUpdate(): void {
if (!this.hasUpdateController) {
// CubismUpdateControllerがアタッチされていない場合、自身のLateUpdateから処理を行う。
this.onLateUpdate();
}
}
...
}
@ccclass('CubismEyeBlinkController') export default class CubismEyeBlinkController extends Component implements ICubismUpdatable { ... /** Model has update controller component. */ @property({ type: CCFloat, visible: false, serializable: false }) private _hasUpdateController: boolean = false; public get hasUpdateController(): boolean { return this._hasUpdateController; } public set hasUpdateController(value: boolean) { this._hasUpdateController = value; } /** Refreshes controller. Call this method after adding and/or removing <see cref="CubismEyeBlinkParameter"/>s. */ public refresh(): void { ... // Get cubism update controller. this.hasUpdateController = this.getComponent(CubismUpdateController) != null; } /** Called by cubism update controller. Order to invoke OnLateUpdate. */ public get executionOrder(): number { return CubismUpdateExecutionOrder.CUBISM_EYE_BLINK_CONTROLLER; } /** Called by cubism update controller. Needs to invoke OnLateUpdate on Editing. */ public get needsUpdateOnEditing(): boolean { return false; } /** Called by cubism update controller. Updates controller. */ public onLateUpdate(): void { // LateUpdateの処理を実装 } /** Called by Cocos Creator. Makes sure cache is initialized. */ protected start(): void { // Initialize cache. this.refresh(); } /** Called by Cocos Creator. */ protected lateUpdate(): void { if (!this.hasUpdateController) { // CubismUpdateControllerがアタッチされていない場合、自身のLateUpdateから処理を行う。 this.onLateUpdate(); } } ... }
@ccclass('CubismEyeBlinkController')
export default class CubismEyeBlinkController extends Component implements ICubismUpdatable {
  ...

  /** Model has update controller component. */
  @property({ type: CCFloat, visible: false, serializable: false })
  private _hasUpdateController: boolean = false;
  public get hasUpdateController(): boolean {
    return this._hasUpdateController;
  }
  public set hasUpdateController(value: boolean) {
    this._hasUpdateController = value;
  }

  /** Refreshes controller. Call this method after adding and/or removing <see cref="CubismEyeBlinkParameter"/>s. */
  public refresh(): void {
    ...

    // Get cubism update controller.
    this.hasUpdateController = this.getComponent(CubismUpdateController) != null;
  }

  /** Called by cubism update controller. Order to invoke OnLateUpdate. */
  public get executionOrder(): number {
    return CubismUpdateExecutionOrder.CUBISM_EYE_BLINK_CONTROLLER;
  }

  /** Called by cubism update controller. Needs to invoke OnLateUpdate on Editing. */
  public get needsUpdateOnEditing(): boolean {
    return false;
  }

  /** Called by cubism update controller. Updates controller. */
  public onLateUpdate(): void {
    // LateUpdateの処理を実装
  }

  /** Called by Cocos Creator. Makes sure cache is initialized. */
  protected start(): void {
    // Initialize cache.
    this.refresh();
  }

  /** Called by Cocos Creator. */
  protected lateUpdate(): void {
    if (!this.hasUpdateController) {
      // CubismUpdateControllerがアタッチされていない場合、自身のLateUpdateから処理を行う。
      this.onLateUpdate();
    }
  }

  ...

}
  • hasUpdateController
    • PrefabにCubismUpdateControllerがアタッチされているかを設定します。
  • needsUpdateOnEditing
    • Cocos Creatorでシーンが非実行中にも更新を行う必要があるかを返します。
      CubismUpdateControllerはエディターモードでも実行されるので、そのコンポーネントが非実行中にも更新する必要がない場合はfalseを返します。
  • executionOrder
    • そのコンポーネントの実行順を返します。
      この値が小さいコンポーネントほど先に呼び出されます。
      Cubism SDK for Cocos Creatorの各コンポーネントの実行順序は CubismUpdateExecutionOrder に定義されています。
  • ユーザが実行順序を制御するコンポーネントを追加した場合、CubismUpdateExecutoinOrderの定義を参考にして、ここで返す値でどのタイミングで呼び出されるかを注意してください。
    • 例(独自のコンポーネントをCubismLookControllerとCubismPhysicsControllerの間のタイミングで呼び出したい場合):
      • CubismLookControllerは700、CubismPhysicsControllerは800が設定されるため、独自のコンポーネントは750を返すよう設定します。
  • onLateUpdate()
    • CubismUpdateControllerによって実行順序を制御され呼び出される関数です。
      そのコンポーネントが行う更新処理を記述します。

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
this.addComponent(MyComponent1);
let component = this.getComponent(MyComponent2);
component.destroy();
let updateController = this.getComponent(CubismUpdateController);
updateController.refresh();
this.addComponent(MyComponent1); let component = this.getComponent(MyComponent2); component.destroy(); let updateController = this.getComponent(CubismUpdateController); updateController.refresh();
this.addComponent(MyComponent1);

let component = this.getComponent(MyComponent2);
component.destroy();

let updateController = this.getComponent(CubismUpdateController);
updateController.refresh();
この記事はお役に立ちましたか?
はいいいえ
この記事に関するご意見・
ご要望をお聞かせください。