모델 파라미터 업데이트 정보

업데이트: 2019/09/04

이 페이지는 Cubism 4.2 이하의 구 버전용입니다. 최신 페이지는 여기

여기에서는 모델에 붙어 있는 파라미터의 업데이트에 대한 방법과 주의점을 설명합니다.

개요

Cubism 2.1 for Unity에서의 파라미터 업데이트에서는 .setParamFloat() 등으로 파라미터를 변경한 후 .update()를 호출해 파라미터를 업데이트할 필요가 있었습니다.
Cubism 3 이후 버전의 Cubism SDK for Unity에서는 ToModel()로 생성된 GameObject에 연결된 스크립트에서 자동으로 업데이트가 이루어지고 있습니다.

게다가 파라미터의 업데이트는 다른 스크립트상에서 parameter.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.Parameters[인덱스]의 수치가 “2”로 되어 있는데, 이것은 koharu의 파라미터의 PARAM_ANGLE_Z가 2번째(0 개시)이므로 “2”라고 기술하고 있습니다.

주의점으로서 Cubism 3 이후의 Cubism SDK for Unity를 사용해 스크립트상에서 파라미터를 업데이트하는 경우는 LateUpdate()를 이용할 필요가 있습니다.
Unity 애니메이션은 Update() 후에 처리됩니다. 따라서 Update() 내에서 파라미터의 값을 변경하면 애니메이션에 덮어쓰기되어 버립니다.
이것을 회피하려면, 애니메이션의 처리가 끝난 후에 호출되는 LateUpdate()를 사용해 파라미터의 업데이트를 할 필요가 있습니다.

아래의 GIF는 애니메이션을 재생하는 모델에서 PARAM_ANGLE_Z의 값을 스크립트로 조작하는 Scene입니다.
왼쪽의 모델은 Update()로, 오른쪽은 LateUpdate()로 파라미터의 값을 조작하고 있으며 왼쪽은 값의 변경이 덮어쓰기되어 버리는 것을 볼 수 있습니다.

Tips1

예로 든 GIF는 애니메이션의 파라미터를 덮어 쓰고 설정을 수행했습니다. 그 때문에, 스크립트로부터 업데이트를 하고 있는 파라미터는 애니메이션의 움직임이 적용되어 있지 않은 상태가 되어 있습니다.

애니메이션과 함께 파라미터를 사용하려면 Live2D.Cubism.Framework에 포함된 CubismParameterBlendMode에서 블렌드 모드를 변경해야 합니다. 블렌드 모드는 3종류가 있습니다.

  • 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

Cubism 3 이후의 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로 스크립트의 실행 순서를 바꾼 경우에도 주의가 필요합니다.
스크립트의 실행 순서에 따라서는 파라미터의 업데이트 타이밍이 바뀌어, 파라미터의 업데이트가 잘 되지 않는 경우가 생깁니다.

이 기사가 도움이 되었나요?
아니요
이 기사에 관한 의견 및 요청사항을 보내 주시기 바랍니다.