Skip to content

Latest commit

 

History

History
195 lines (122 loc) · 5.72 KB

关于更新模型参数.md

File metadata and controls

195 lines (122 loc) · 5.72 KB

「Live2D Unity 文档翻译」关于更新模型参数

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

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