CubismUpdateController (Cocos Creator)

업데이트: 2023/03/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
    • 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()를 호출해 다시 읽어들여야 합니다.

this.addComponent(MyComponent1);

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

let updateController = this.getComponent(CubismUpdateController);
updateController.refresh();
이 기사가 도움이 되었나요?
아니요
이 기사에 관한 의견 및 요청사항을 보내 주시기 바랍니다.