登录后台

页面导航

本文编写于 1225 天前,最后修改于 1225 天前,其中某些信息可能已经过时。

本文翻译自:https://docs.live2d.com/cubism-sdk-tutorials/using-update-controller/

译者注:注意!这并不是一篇严谨的翻译,本人并不是翻译行业从业者,也根本不会日文。官网的中文翻译会连带代码一起翻译,而且还不如机翻日文,官网的英语翻译版本有的语法很奇怪,看起来也是机翻。本文主要来自日文机翻,然后再结合实际开发经验调整到通顺,修改不该翻译的东西并润色。

[最后更新日期: 2020/01/22] 译者注:这是这个日文原文的更新日期

本节介绍了控制其他Cubism组件对您自己的组件的执行顺序的过程。

假设在项目中已经实现 [导入 SDK-放置模型 ] 。

概要

Cubism SDK for Unity 的某些 Original Workflow 组件以有限的顺序执行。

在 Unity 的 Cubism SDK 中,可以使用 CubismUpdateController 对其进行控制,该控件控制上述组件的执行顺序。

由 CubismUpdateController 控制的组件是连接到 Cubism 模型中 Prefab 根目录的组件。

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

本节以设置以下组件的执行顺序控制为例。

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

1.将组件附加到 Prefab(预制件)

CubismExampleController 附加到 Hierarchy/层级Prefab 根目录的 GameObject 上。

(译注:就是在 Prefab 上附加 CubismExampleController )

如果未以 OW 格式导入Prefab,还请附加 CubismUpdateController

img

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 是确定此组件的执行顺序的值。

该值越小,调用它的时间就越早。

SDK 自带的组件设置的值在 CubismUpdateExecutionOrder 中进行了描述

HasUpdateController 是在加载的 ICubismUpdatable 组件没有附加在 CubismUpdateController 的情况下为了调用 Unity 的事件函数而存在的 Flag。

    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 本身的事件函数执行更新。
        if (!HasUpdateController)
        {
            OnLateUpdate();
        }
    }
}

LateUpdate() 调用时机移至 CubismUpdateController 调用的 OnLateUpdate() 中。

这样就完成了用于控制执行顺序的设置

当您将此脚本附加到 Cubism 模型的 Prefab 并运行 Scene 时,CubismUpdateController 将会根据此脚本更新调用过程。