「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 中进行参数更新
void Update(){live2DModel.setParamFloat("参数ID", 値);live2DModel.update();}
我们不得不调用方法来更新它。
例如:
void Update(){double timeSec = Time.time;double t = timeSec * 2 * Math.PI;// 呼吸live2DModel.setParamFloat(breath, (float)(0.5f + 0.5f * Math.Sin(t / 3.2345)), 1);// 更新参数值live2DModel.update();}
就是这样。
如何使用 Cubism 3 或更高版本的 Cubism SDK for Unity 进行更新
Cubism 3 和更高版本的 Cubism SDK for Unity 会通过附加到生成的 Prefab 的 CubismRenderController.cs 自动更新。
可以通过把要更改的值应用于参数来更新模型。
要将值应用于参数,请编写如下。
void LateUpdate(){parameter = model.Parameters[index];parameter.Value = value;}
具体示例如下:
using UnityEngine;using Live2D.Cubism.Core;using Live2D.Cubism.Framework;public class ParameterLateUpdate : MonoBehaviour{private CubismModel _model;private float _t;private void Start(){_model = this.FindCubismModel();}private void LateUpdate(){_t += (Time.deltaTime * 4f);var value = Mathf.Sin(_t) * 30f;var parameter = _model.Parameters[2];parameter.Value = value;}}
这是下面的GIF中使用的代码。
model.Paramters [index] 的下标为 “ 2”,但是由于 koharu 的 PARAM_ANGLE_Z 参数为第二个(从0开始),因此被下标为 “ 2”。

请注意,使用 Cubism 3 或更高版本的 Unity Cubism SDK 从脚本更新参数时,需要使用 LateUpdate() 函数。
因为在 update() 之后才会处理 Unity 动画。所以,如果您在 Update()中更改参数的值,它将被动画覆盖。
为避免这种情况,您需要使用 LateUpdate() 更新参数,该方法在动画处理完成后被调用。
以下 GIF 是一个场景,该场景通过动画的模型上的脚本来操纵 PARAM_ANGLE_Z 的值。
您可以看到左侧的模型通过 Update() 更新参数的值,他的更新的值被覆盖,而右侧的模型通过 LateUpdate() 更新参数的值。

Tips1:
因为 GIF 中的示例是通过覆盖的形式来更新的参数。
所以,这个从脚本被更新的参数处于未应用动画运动的状态。(译注:意思是这个直接覆盖了动画里的值,属于直接屏蔽了动画里原来对这个值的设定,完全由代码接管,如果要结合原来的动画,参考下文)
如果要将参数与动画结合使用,则需要使用 Live2D.Cubism.Framework 中包含的 CubismParameterBlendMode 更改混合模式。共有三种混合模式。
- Override…覆盖参数并更新
- Additive…参数相加并更新
- Multiply…参数相乘并更新
请使用适合您需求的混合模式。
下面是一个代码示例。
void LateUpdate(){parameter = model.Paramters[参数下标];// 覆盖parameter.BlendToValue(CubismParameterBlendMode.Override, 値) ;// 相加parameter.BlendToValue(CubismParameterBlendMode.Additive, 値) ;// 相乘parameter.BlendToValue(CubismParameterBlendMode.Multiply, 値) ;}
Tips2:
您不仅可以可以通过 Cubism 3 之后的 Cubism SDK for Unity 中 update 方法中描述的方法来获取模型参数,而且还可以通过以下方法来获取特定参数。
这是使用 Live2D.Cubism.Core 中包含的 FindById() 获取参数 ID 的代码。
using UnityEngine;using Live2D.Cubism.Core;using Live2D.Cubism.Framework;public class ParameterLateUpdate : MonoBehaviour{private CubismModel _model;private CubismParameter _paramAngleZ;[SerializeField]public string ParameterID = "PARAM_ANGLE_Z";private void Start(){_model = this.FindCubismModel();_paramAngleZ = _model.Parameters.FindById(ParameterID);}}
通过将带有此代码的脚本附加到模型的根目录,可以获取指定的参数(ParameterID)。
Tips3:
要注意的另一点是,如果使用 ScriptExecutionOrder 更改了脚本的执行顺序,也需要小心。
根据脚本的执行顺序,参数的更新时间可能会更改,并且参数的更新可能不会成功。
