「Live2D Unity 文档翻译」控制您自己的组件的执行顺序
本文翻译自: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。

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 将会根据此脚本更新调用过程。
