「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,还可以控制特定于用户的组件的执行顺序。

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

  1. public class CubismExampleController : MonoBehaviour
  2. {
  3. private void Start()
  4. {
  5. // 处理 CubismExampleController 的初始化
  6. }
  7. private void LateUpdate()
  8. {
  9. // 处理 CubismExampleController 的更新
  10. }
  11. }

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

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

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

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

img

2. 在组件中实现 ICubismUpdatable

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

CubismUpdateController 在运行时获取实现了 ICubismUpdatable 的组件,并控制其执行顺序。

  1. public class CubismExampleController : MonoBehaviour, ICubismUpdatable
  2. {
  3. // Scene 没有运行时是否控制执行顺序
  4. public bool NeedsUpdateOnEditing
  5. {
  6. get { return false; }
  7. }
  8. // 该组件的执行顺序
  9. public int ExecutionOrder
  10. {
  11. get { return 0; }
  12. }
  13. // 更新执行受控制顺序的函数
  14. public void OnLateUpdate()
  15. {
  16. }
  17. // 执行顺序是否在控制下
  18. public bool HasUpdateController { get; set; }
  19. private void Start()
  20. {
  21. // 处理 CubismExampleController 的初期化
  22. }
  23. private void LateUpdate()
  24. {
  25. // 处理 CubismExampleController 的更新
  26. }
  27. }

此处实现的 ICubismUpdatable 接口如下。

  1. namespace Live2D.Cubism.Framework
  2. {
  3. /// <summary>
  4. /// Cubism update interface.
  5. /// </summary>
  6. public interface ICubismUpdatable
  7. {
  8. int ExecutionOrder { get; }
  9. bool NeedsUpdateOnEditing { get; }
  10. bool HasUpdateController { get; set; }
  11. void OnLateUpdate();
  12. }
  13. }

ExecutionOrder 是确定此组件的执行顺序的值。

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

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

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

  1. public static class CubismUpdateExecutionOrder
  2. {
  3. public static readonly int CubismFadeController = 100;
  4. public static readonly int CubismPoseController = 200;
  5. public static readonly int CubismExpressionController = 300;
  6. public static readonly int CubismEyeBlinkController = 400;
  7. public static readonly int CubismMouthController = 500;
  8. public static readonly int CubismHarmonicMotionController = 600;
  9. public static readonly int CubismLookController = 700;
  10. public static readonly int CubismPhysicsController = 800;
  11. public static readonly int CubismRenderController = 10000;
  12. public static readonly int CubismMaskController = 10100;

3. 使组件与 CubismUpdateController 兼容

如下修改 CubismExampleController

  1. public class CubismExampleController : MonoBehaviour, ICubismUpdatable
  2. {
  3. // Scene 没有运行时是否控制执行顺序
  4. public bool NeedsUpdateOnEditing
  5. {
  6. get { return false; }
  7. }
  8. // 该组件的执行顺序
  9. public int ExecutionOrder
  10. {
  11. get { return 150; }
  12. }
  13. // 更新执行受控制顺序的函数
  14. public void OnLateUpdate()
  15. {
  16. // CubismExampleControllerの更新処理
  17. }
  18. // 执行顺序是否在控制下
  19. public bool HasUpdateController { get; set; }
  20. private void Start()
  21. {
  22. // 处理 CubismExampleController 的初期化
  23. // 检查 CubismUpdateController是否已附加到模型预制件(Prefab)
  24. HasUpdateController = (GetComponent<CubismUpdateController>() != null);
  25. }
  26. private void LateUpdate()
  27. {
  28. // 如果未附加 CubismUpdateController,则从 CubismExampleController 本身的事件函数执行更新。
  29. if (!HasUpdateController)
  30. {
  31. OnLateUpdate();
  32. }
  33. }
  34. }

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

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

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