CubismUpdateController (Cocos Creator)

最終更新: 2023年3月14日

概述

通过将CubismUpdateController附加到Prefab,您可以控制Cubism SDK for Cocos Creator各组件的执行顺序。

由于各组件的执行顺序在OW方法中很重要,因此必须使用CubismUpdateController并遵守规格。
如果因为不需要控制执行顺序而不使用CubismUpdateController,则组件的执行顺序由Cocos Creator侧决定,根据执行顺序,可能无法正确处理Expression等功能。

要控制用户创建的组件的执行顺序,请在该组件上实装ICubismUpdateable。

ICubismUpdateable的实装

在执行顺序的控制对象组件中继承ICubismUpdateable接口。

如果未附加CubismUpdateController,则不会执行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
    • 设置CubismUpdateController是否附加到Prefab。
  • needsUpdateOnEditing
    • 返回当场景不在Cocos Creator中运行时是否需要进行更新。
      CubismUpdateController也在Editor模式下运行,因此如果组件没有运行并且不需要更新,则会返回false。
  • executionOrder
    • 返回该组件的执行顺序。
      这个值越小,则越早被调用。
      Cubism SDK for Cocos Creator的各组件的执行顺序在CubismUpdateExecutionOrder中定义。
  • 如果用户追加了控制执行顺序的组件,请参考CubismUpdateExecutoinOrder的定义,并注意何时使用此处返回的值进行调用。
    • 示例(如果您想在CubismLookController和CubismPhysicsController之间的时间调用自己的组件):
      • CubismLookController设置为700、CubismPhysicsController设置为800,因此将您自己的组件设置为返回750。
  • onLateUpdate()
    • 通过CubismUpdateController控制执行顺序来调用的函数。
      描述该组件执行的更新处理。

执行过程中追加或删除组件时的注意事项

CubismUpdateController控制执行顺序的组件在onEnable()的时机执行。
如果所有组件都预先附加到Prefab上则没有问题,但是如果在场景运行时动态追加或删除组件,则必须显式调用CubismUpdateController.refresh()进行重新导入。

this.addComponent(MyComponent1);

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

let updateController = this.getComponent(CubismUpdateController);
updateController.refresh();
请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。