使渐变有效并循环播放动态(CubismMotionController)
最終更新: 2020年2月7日
概述
使用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);
}
}
这样就完成了设置。
如果您在这种状态下播放场景,动态将渐变并循环播放。
