关于模型参数更新
最終更新: 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更改脚本执行顺序时也需要小心。
根据脚本的执行顺序,参数更新时机可能会发生变化,可能会导致参数更新不成功。