페이드를 유효화하여 모션을 반복 재생(CubismMotionController)

업데이트: 2020/02/07

개요

Cubism Viewer for OW에서 모션을 루프 재생할 때, 「루프 재생 시의 페이드 인」에 체크가 되어 있었을 경우 모션이 종단으로부터 선두로 돌아올 때에 Cubism의 모션 페이드, 파라미터 페이드가 발생합니다.
참고: 「모션 설정

그러나 Cubism SDK for Unity의 CubismMotionController.PlayAnimation()의 인수 isLoop에 true를 전달하여 모션을 루프 재생하는 경우 종단으로부터 선두로 돌아올 때에 페이드는 발생하지 않습니다.

CubismMotionController에 존재하는 모션 재생 종료 시에 호출되는 콜백을 이용해, 콜백에서 같은 모션을 새롭게 재생시키는 것으로 페이드를 발생시켜 모션을 루프시킬 수 있습니다.

위의 설정을 하려면, 예를 들면 다음 절차를 실시하십시오.

  • 모델에 CubismMotionController를 연결
  • 루프 재생 처리를 수행하는 스크립트 생성

다음은 「SDK 가져오기」를 수행한 프로젝트에 대해 수행하는 것을 전제로 설명합니다.

모델에 CubismMotionController를 연결

Scene에 배치한 Cubism의 Prefab의 루트가 되는 GameObject에 CubismMotionController를 연결합니다.

이미 연결되어 있으면 새로 연결할 필요가 없습니다.
이때 CubismMotionController를 사용하여 모션을 재생하는 컴포넌트가 연결되어 있는 경우 다음 설정과의 간섭에 주의하십시오.

또한 CubismFadeController.CubismFadeMotion에 루프 재생할 AnimationClip의 ID가 등록된 .fadeMotionList를 설정합니다.

루프 재생 처리를 수행하는 스크립트 생성

Project 창에서 C# 스크립트를 만듭니다.

여기에서는 이름을 「CubismMotionLoopPlayer」라고 합니다.

작성한 스크립트를 Prefab의 CubismMotionController와 동일한 계층에 연결합니다.

작성한 스크립트를 텍스트 에디터에서 열고 기술 내용을 다음과 같이 다시 작성합니다.

using UnityEngine;
using Live2D.Cubism.Framework.Motion;

public class CubismMotionLoopPlayer : MonoBehaviour
{
    / 루프 재생시킬 AnimationClip
    [SerializeField]
    public AnimationClip Animation;

    private CubismMotionController _motionController;


    private void Start()
    {
        _motionController = GetComponent<CubismMotionController>();
        
        
        // 모션 루프 재생
        _motionController.PlayAnimation(Animation);
    }
}

Scene에서 Prefab을 선택 상태로 설정하여 Inspector 창에서 CubismMotionLoopPlayer.Animation에 루프 재생할 AnimationClip을 설정합니다.

이상의 설정을 한 상태에서 장면을 재생하면 모션이 루프 재생되지만 루프 시에 페이드가 발생하지 않습니다.

CubismMotionController는 모션 재생이 끝날 때 호출할 콜백을 등록하는 기능이 구현되어 있습니다.

    public class CubismMotionController : MonoBehaviour
    {
        #region Action

        /// <summary>
        /// Action animation end handler.
        /// </summary>
        [SerializeField]
        public Action<float> AnimationEndHandler;

        /// <summary>
        /// Action OnAnimationEnd.
        /// </summary>
        private void OnAnimationEnd(int layerIndex, float instanceId)
        {
            _motionPriorities[layerIndex] = CubismMotionPriority.PriorityNone;

            if (AnimationEndHandler != null)
            {
                AnimationEndHandler(instanceId);
            }
        }

        #endregion
        
        ...

이것을 이용해, 전술한 CubismMotionLoopPlayer를 직접 루프 재생시키지 않고 모션 재생 종료 시에 새롭게 같은 모션을 재생하도록 수정합니다.
CubismMotionController.PlayAnimation()의 isLoop에 true를 전달하고 있는 경우 CubismMotionController.AnimationEndHandler의 콜백은 호출되지 않습니다.

using UnityEngine;
using Live2D.Cubism.Framework.Motion;

public class CubismMotionLoopPlayer : MonoBehaviour
{
    // 루프 재생시킬 AnimationClip
    [SerializeField]
    public AnimationClip Animation;

    private CubismMotionController _motionController;


    private void Start()
    {
        _motionController = GetComponent<CubismMotionController>();
        
        
        // CubismMotionController 핸들러에 콜백 함수 등록
        _motionController.AnimationEndHandler += OnAnimationEnded;
        
        
        // 처음에만 직접 모션을 재생시킨다
        OnAnimationEnded(0);
    }


    // 모션이 재생 종료되었을 때의 콜백
    private void OnAnimationEnded(float instanceId)
    {
        // 모션 재생(루프 재생은 무효)
        _motionController.PlayAnimation(Animation, isLoop:false);
    }
}

이상으로 설정이 완료됩니다.

이 상태에서 장면을 재생하면 모션이 페이드하면서 루프 재생됩니다.

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