표정·포즈 전환

업데이트: 2020/01/30

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

여기는 Unity의 Mecanim을 이용하여 표정 변화·복장 변화를 하기 위한 설명 페이지입니다.

개요

Cubism 2.1에서는 표정을 바꾸기 위해 expression.json, Pose.json이 있었지만 Cubism 3에서 폐지되었습니다.
Cubims 3 이후의 Cubism SDK for Unity에서는 Unity의 기능인 Mecanim을 이용해, 이를 대신하는 구현이 가능하게 되어 있습니다.
표정과 복장은 모두 Animator에서 만든 BlendTree의 값을 스크립트에서 조작하여 표현합니다.

상세

Cubism 2.1에서는 expression.json, Pose.json이 있었지만 Cubism 3에서 폐지되었습니다.
그 때문에 표정·복장의 변화는 Unity의 기능인 Mecanim를 이용해 실시합니다.

이번에는 모델에 애니메이션을 적용시킨 상태에서 표정을 전환합니다.
모델에 애니메이션 시키기까지는 「애니메이션 재생」을 참조하세요.

여기에서는 AnimatorController의 레이어 이름을 “Motion”으로 변경합니다.

이 상태에서 Animator 창의 Layers에 새 레이어를 만듭니다.
빨간색 테두리의 + 버튼을 눌러 새 레이어를 만들고 이름을 “Expression”으로 합니다.

그런 다음 Expression 레이어를 선택한 상태에서 “오른쪽 클릭”→”Create State”→”From New Blend Tree”를 선택하여 새 BlendTree를 추가합니다.

추가 후 BlendTree를 더블 클릭하여 BlendTree 편집 화면으로 이동합니다.

BlendTree 클릭 후 Inspector 창에서 Motion의 + 버튼을 누른 다음 “Add Motion Field”를 누릅니다.
그러면 블렌드하기 위한 모션을 추가하는 항목이 나타납니다.
이번에는 두 가지 표정을 혼합하기 때문에 다시 “Add Motion Field”를 눌러 모션 항목을 늘립니다.

그 후 다음과 같이 두 가지 표정을 적용합니다.

이 Expression 레이어의 Weight와 내부의 Blend를 스크립트상에서 변경합니다.
새로 C# 스크립트를 만들고 이름을 “BlendExpression.cs”로 지정합니다.

using UnityEngine;

public class BlendExpression : MonoBehaviour
{
    private Animator _blendTree;
    private int _expressionIndex;

    [SerializeField, Range(0f, 1f)]
    public float Blending = 0f;

    [SerializeField, Range(0f, 1f)]
    public float ExpressionWeight = 1f;

    void Start()
    {
        _blendTree = GetComponent<Animator>();

        _expressionIndex = _blendTree.GetLayerIndex("Expression");
    }

    void Update()
    {
        //Fail getting animator.
        if (_blendTree == null)
        {
            return;
        }


        //Setting Blend Param and Weights.
        _blendTree.SetFloat("Blend", Blending);

        if (_expressionIndex != -1)
            _blendTree.SetLayerWeight(_expressionIndex, ExpressionWeight);

    }
}

코드를 기술한 후 koharu를 선택하고 “Add Component”에서 “BlendExpression”을 검색하여 스크립트를 추가합니다.
이제 스크립트에서 표정을 전환할 수 있습니다.

“ExpressionWeight”는 Animator의 Layers에 작성한 레이어의 Weight에 적용합니다.

또한 BlendTree의 Weight를 얻고 스크립트에서 수치를 변경하여 복장을 변경할 수 있습니다.

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