使渐变有效并循环播放动态(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); } }
这样就完成了设置。
如果您在这种状态下播放场景,动态将渐变并循环播放。