控制自己组件的执行顺序

最終更新: 2020年1月22日

本节说明为用户自己的组件控制其他Cubism组件的执行顺序的步骤。
以下说明以追加到已执行[SDK载入~置入模型]的项目为前提。

概述

Cubism SDK for Unity的Original Workflow组件中有限制执行顺序的项目。

在Cubism SDK for Unity中,可以通过CubismUpdateController进行控制,上述组件的执行顺序据此进行控制。
CubismUpdateController控制的组件是附加到Cubism模型Prefab根中的组件。

通过使用CubismUpdateController,还可以控制用户自己组件的执行顺序。

本节以设置以下组件的执行顺序控制的步骤为例进行说明。

public class CubismExampleController : MonoBehaviour
{
    private void Start()
    {
        // CubismExampleController的原始化处理
    }
    
    private void LateUpdate()
    {
        // CubismExampleController的更新处理
    }
}

1. 将组件附加到Prefab

将CubismExampleController附加到置入Hierarchy的Prefab根的GameObject。
如果Prefab尚未以OW格式载入,则还要附加CubismUpdateController。

2. 在组件中实装ICubismUpdatable

在控制执行顺序的组件上实装ICubismUpdatable接口。

CubismUpdateController在执行时获取实装ICubismUpdatable的组件并控制它们的执行顺序。

public class CubismExampleController : MonoBehaviour, ICubismUpdatable
{
    // Scene不执行时是否控制执行顺序
    public bool NeedsUpdateOnEditing
    {
        get { return false; }
    }
    
    // 该组件的执行顺序
    public int ExecutionOrder
    {
        get { return 0; }
    }
    
    // 控制执行顺序的更新函数
    public void OnLateUpdate()
    {
    }
    
    // 执行顺序是否受控
    public bool HasUpdateController { get; set; }
    
    
    private void Start()
    {
        // CubismExampleController的原始化处理
    }
    
    private void LateUpdate()
    {
        // CubismExampleController的更新处理
    }
}

这里实装的ICubismUpdatable接口如下。

namespace Live2D.Cubism.Framework
{
    /// <summary>
    /// Cubism update interface.
    /// </summary>
    public interface ICubismUpdatable
    {
        int ExecutionOrder { get; }
        bool NeedsUpdateOnEditing { get; }
        bool HasUpdateController { get; set; }
        void OnLateUpdate();
    }
}

ExecutionOrder是决定该组件执行顺序的值。
这个值越小,则相比其他组件被调用得越早。
在CubismUpdateExecutionOrder中描述了为SDK中包含的组件设置的值。

HasUpdateController是当实装ICubismUpdatable的组件未附加到CubismUpdateController时,从Unity的Event函数调用的标志。

    public static class CubismUpdateExecutionOrder
    {
        public static readonly int CubismFadeController = 100;
        public static readonly int CubismPoseController = 200;
        public static readonly int CubismExpressionController = 300;
        public static readonly int CubismEyeBlinkController = 400;
        public static readonly int CubismMouthController = 500;
        public static readonly int CubismHarmonicMotionController = 600;
        public static readonly int CubismLookController = 700;
        public static readonly int CubismPhysicsController = 800;
        public static readonly int CubismRenderController = 10000;
        public static readonly int CubismMaskController = 10100;

3. 使组件与CubismUpdateController兼容

修改CubismExampleController如下。

public class CubismExampleController : MonoBehaviour, ICubismUpdatable
{
    // Scene不执行时是否控制执行顺序
    public bool NeedsUpdateOnEditing
    {
        get { return false; }
    }
    
    // 该组件的执行顺序
    public int ExecutionOrder
    {
        get { return 150; }
    }
    
    // 控制执行顺序的更新函数
    public void OnLateUpdate()
    {
        // CubismExampleController的更新处理
    }
    
    // 执行顺序是否受控
    public bool HasUpdateController { get; set; }
    
    
    private void Start()
    {
        // CubismExampleController的原始化处理
        
        // 检查CubismUpdateController是否附加到模型的Prefab
        HasUpdateController = (GetComponent<CubismUpdateController>() != null);
    }
    
    private void LateUpdate()
    {
        // 如果CubismUpdateController没有附加,则从CubismExampleController本身的Event函数执行更新处理
        if (!HasUpdateController)
        {
            OnLateUpdate();
        }
    }
}

将LateUpdate()执行的更新处理移动到CubismUpdateController调用的OnLateUpdate()中。

这样就完成了控制执行顺序的设置。
当您将此脚本附加到Cubism模型的Prefab并执行场景时,CubismUpdateController将调用此脚本的更新处理。

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。