「Live2D Unity 文档翻译」关于更新模型参数

本文翻译自:https://docs.live2d.com/cubism-sdk-tutorials/about-parameterupdating-of-model/

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

[最后更新日期: 2019/09/04] 译者注:这是这个日文原文的更新日期

本节介绍更新模型附加参数的方法和注意事项。

摘要

在 Cubism 2.1 for Unity 中更新参数时,必须在使用 .setParamFloat()等更改参数之后通过调用 .update()来更新参数。

在 Cubism 3 和更高版本的 Cubism SDK for Unity 中,是通过附加到 ToModel() 生成的 GameObject 的脚本自动进行的更新。

此外,可以从另一个脚本以 parameter.value = value; 的形式进行参数更新。

请注意,必须使用 Unity 事件函数执行顺序中的 LateUpdate() 更新参数。

另外,如果在 ScriptExecutionOrder 中设置了脚本调用顺序,也要小心。

细节

Cubism 2.1 SDK for Unity 的更新方法

Cubism 2.1 SDK for Unity 中进行参数更新

  1. void Update()
  2. {
  3. live2DModel.setParamFloat("参数ID", 値);
  4. live2DModel.update();
  5. }

我们不得不调用方法来更新它。

例如:

  1. void Update()
  2. {
  3. double timeSec = Time.time;
  4. double t = timeSec * 2 * Math.PI;
  5. // 呼吸
  6. live2DModel.setParamFloat(breath, (float)(0.5f + 0.5f * Math.Sin(t / 3.2345)), 1);
  7. // 更新参数值
  8. live2DModel.update();
  9. }

就是这样。

如何使用 Cubism 3 或更高版本的 Cubism SDK for Unity 进行更新

Cubism 3 和更高版本的 Cubism SDK for Unity 会通过附加到生成的 Prefab 的 CubismRenderController.cs 自动更新。

可以通过把要更改的值应用于参数来更新模型。

要将值应用于参数,请编写如下。

  1. void LateUpdate()
  2. {
  3. parameter = model.Parameters[index];
  4. parameter.Value = value;
  5. }

具体示例如下:

  1. using UnityEngine;
  2. using Live2D.Cubism.Core;
  3. using Live2D.Cubism.Framework;
  4. public class ParameterLateUpdate : MonoBehaviour
  5. {
  6. private CubismModel _model;
  7. private float _t;
  8. private void Start()
  9. {
  10. _model = this.FindCubismModel();
  11. }
  12. private void LateUpdate()
  13. {
  14. _t += (Time.deltaTime * 4f);
  15. var value = Mathf.Sin(_t) * 30f;
  16. var parameter = _model.Parameters[2];
  17. parameter.Value = value;
  18. }
  19. }

这是下面的GIF中使用的代码。

model.Paramters [index] 的下标为 “ 2”,但是由于 koharu 的 PARAM_ANGLE_Z 参数为第二个(从0开始),因此被下标为 “ 2”。

img

请注意,使用 Cubism 3 或更高版本的 Unity Cubism SDK 从脚本更新参数时,需要使用 LateUpdate() 函数。

因为在 update() 之后才会处理 Unity 动画。所以,如果您在 Update()中更改参数的值,它将被动画覆盖。

为避免这种情况,您需要使用 LateUpdate() 更新参数,该方法在动画处理完成后被调用。

以下 GIF 是一个场景,该场景通过动画的模型上的脚本来操纵 PARAM_ANGLE_Z 的值。

您可以看到左侧的模型通过 Update() 更新参数的值,他的更新的值被覆盖,而右侧的模型通过 LateUpdate() 更新参数的值。

img

Tips1:

因为 GIF 中的示例是通过覆盖的形式来更新的参数。

所以,这个从脚本被更新的参数处于未应用动画运动的状态。(译注:意思是这个直接覆盖了动画里的值,属于直接屏蔽了动画里原来对这个值的设定,完全由代码接管,如果要结合原来的动画,参考下文)

如果要将参数与动画结合使用,则需要使用 Live2D.Cubism.Framework 中包含的 CubismParameterBlendMode 更改混合模式。共有三种混合模式。

  • Override…覆盖参数并更新
  • Additive…参数相加并更新
  • Multiply…参数相乘并更新

请使用适合您需求的混合模式。

下面是一个代码示例。

  1. void LateUpdate()
  2. {
  3. parameter = model.Paramters[参数下标];
  4. // 覆盖
  5. parameter.BlendToValue(CubismParameterBlendMode.Override, 値) ;
  6. // 相加
  7. parameter.BlendToValue(CubismParameterBlendMode.Additive, 値) ;
  8. // 相乘
  9. parameter.BlendToValue(CubismParameterBlendMode.Multiply, 値) ;
  10. }

Tips2:

您不仅可以可以通过 Cubism 3 之后的 Cubism SDK for Unity 中 update 方法中描述的方法来获取模型参数,而且还可以通过以下方法来获取特定参数。

这是使用 Live2D.Cubism.Core 中包含的 FindById() 获取参数 ID 的代码。

  1. using UnityEngine;
  2. using Live2D.Cubism.Core;
  3. using Live2D.Cubism.Framework;
  4. public class ParameterLateUpdate : MonoBehaviour
  5. {
  6. private CubismModel _model;
  7. private CubismParameter _paramAngleZ;
  8. [SerializeField]
  9. public string ParameterID = "PARAM_ANGLE_Z";
  10. private void Start()
  11. {
  12. _model = this.FindCubismModel();
  13. _paramAngleZ = _model.Parameters.FindById(ParameterID);
  14. }
  15. }

通过将带有此代码的脚本附加到模型的根目录,可以获取指定的参数(ParameterID)。

Tips3:

要注意的另一点是,如果使用 ScriptExecutionOrder 更改了脚本的执行顺序,也需要小心。

根据脚本的执行顺序,参数的更新时间可能会更改,并且参数的更新可能不会成功。