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