使渐变有效并循环播放动态(CubismMotionController)

最終更新: 2020年2月7日

此页面适用于Cubism 4.2及更早版本的旧版本。 点击此处查看最新页面

概述

使用Cubism Viewer for OW循环播放动态时,如果选中“循环播放时淡入”,则当动态从结尾返回到开头时,将发生Cubism动态渐变和参数渐变。
参考:“动态设置

但是,如果您将true传递给Cubism SDK for Unity的CubismMotionController.PlayAnimation()的参数isLoop并循环播放动态,则从结尾返回到开头时不会发生渐变。

您可以使用存在于CubismMotionController中并在退出动态播放时调用的回调,并通过从回调中再次播放相同的动态来生成渐变并循环动态。

要进行上述设置,请按照以下步骤为例。

  • 将CubismMotionController附加到模型
  • 创建执行循环播放处理的脚本

以下说明以针对已执行[SDK载入]的项目进行为前提。

将CubismMotionController附加到模型

将CubismMotionController附加到作为置入场景的Cubism的Prefab根的GameObject。

如果已附加,则无需再次附加。
此时,如果附加了使用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视窗将要循环播放的AnimationClip设置为CubismMotionLoopPlayer.Animation。

如果您使用上述设置播放场景,动态将循环播放,但在循环过程中不会出现渐变。

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,而是在退出动态播放时重新播放相同的动态。
如果将true传递给CubismMotionController.PlayAnimation()的isLoop,则不会调用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);
    }
}

这样就完成了设置。

如果您在这种状态下播放场景,动态将渐变并循环播放。

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。