关于模型参数更新
最終更新: 2019年9月4日
这里说明了更新附加到模型的参数的方法和注意事项。
概述
在Cubism 2.1 for Unity的参数更新中,需要在使用setParamFloat()等变更参数后调用.update()来更新参数。
Cubism3或更高版本的Cubism SDK for Unity会自动从附加到由ToModel()生成的GameObject的脚本进行更新。
此外,参数可以从另一个脚本以parameter.value = 值;的形式更新。
请注意,必须按照Unity的Event函数执行顺序使用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进行更新
Cubism3或更高版本的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.Parameters[索引]的数值是“2”,但是这被描述为“2”,因为koharu的参数的PARAM_ANGLE_Z是第二个(从0开始)。

需要注意的是,如果您使用Cubism3或更高版本的Cubism SDK for Unity,并从脚本更新参数,则需要使用LateUpdate()。
Unity动画在Update()之后处理。因此,如果在Update()中改变参数的值,就会被动画覆盖。
为避免这种情况,您需要使用在动画处理结束后调用的LateUpdate()更新参数。
下面的GIF是一个Scene,它从播放动画的模型上的脚本中操作PARAM_ANGLE_Z的值。
可以看到左边的模型是从Update()中操作参数值,右边的模型是从LateUpdate()中操作参数值,左边的模型是被值变更覆盖的。

Tips1
示例中显示的GIF是通过覆盖动画的参数来设置的。 因此,从脚本更新的参数处于未应用动画动作的状态。
如果要结合动画使用参数,则需要使用Live2D.Cubism.Framework中包含的CubismParameterBlendMode变更混合模式。共有三种混合模式。
- Override…覆盖参数并更新
- Additive…加算参数并更新
- Multiply…正片叠底参数并更新
请使用适合您需要的混合模式。
下面是代码示例。
Tips2
您也可以通过Cubism3或更高版本的Cubism SDK for Unity中的更新方法所描述的方法获取模型参数,但您也可以通过以下方法获取特定参数。
这是使用Live2D.Cubism.Core中包含的FindById()获取ParameterID的代码。
您可以通过将带有此代码的脚本附加到模型的根目录,以获取指定的参数(ParameterID)。
Tips3
另外需要注意的是,在使用ScriptExecutionOrder更改脚本执行顺序时也需要小心。
根据脚本的执行顺序,参数更新时机可能会发生变化,可能会导致参数更新不成功。