本文翻译自: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 中进行参数更新
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 会通过附加到生成的 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
更改了脚本的执行顺序,也需要小心。
根据脚本的执行顺序,参数的更新时间可能会更改,并且参数的更新可能不会成功。