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
    • 设置CubismUpdateController是否附加到Prefab。
  • NeedsUpdateOnEditing
    • 返回当场景不在Unity中运行时是否需要进行更新。
      CubismUpdateController也在Editor模式下运行,因此如果组件没有运行并且不需要更新,则会返回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();
关于本报道,敬请提出您的意见及要求。