关于模型参数更新

最終更新: 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…正片叠底参数并更新

请使用适合您需要的混合模式。
下面是代码示例。

void LateUpdate()
{
parameter = model.Parameters[索引];
// 覆盖
parameter.BlendToValue(CubismParameterBlendMode.Override, 值) ;
// 加算
parameter.BlendToValue(CubismParameterBlendMode.Additive, 值) ;
// 正片叠底
parameter.BlendToValue(CubismParameterBlendMode.Multiply, 值) ;
}
void LateUpdate() { parameter = model.Parameters[索引]]; // 覆盖 parameter.BlendToValue(CubismParameterBlendMode.Override, 值) ; // 加算 parameter.BlendToValue(CubismParameterBlendMode.Additive, 值) ; // 正片叠底 parameter.BlendToValue(CubismParameterBlendMode.Multiply, 值) ; }
Tips2

您也可以通过Cubism3或更高版本的Cubism SDK for Unity中的更新方法所描述的方法获取模型参数,但您也可以通过以下方法获取特定参数。

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

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

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。