登录后台

页面导航

本文编写于 1260 天前,最后修改于 1259 天前,其中某些信息可能已经过时。

本文翻译自: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”。

img

请注意,使用 Cubism 3 或更高版本的 Unity Cubism SDK 从脚本更新参数时,需要使用 LateUpdate() 函数。

因为在 update() 之后才会处理 Unity 动画。所以,如果您在 Update()中更改参数的值,它将被动画的值覆盖。

为避免这种情况,您需要在 LateUpdate() 更新参数,该方法在动画处理完成后被调用。

以下 GIF 是一个场景,该场景通过动画模型上的脚本来操纵 PARAM_ANGLE_Z 的值。

您可以看到左侧的模型通过 Update() 更新参数值的,他的更新的值被覆盖,而右侧的模型通过 LateUpdate() 更新参数值的。

img

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 更改了脚本的执行顺序,也需要小心。

根据脚本的执行顺序,参数的更新时间可能会更改,并且参数的更新可能不会成功。

已有 2 条评论