/**
* Copyright(c) Live2D Inc. All rights reserved.
*
* Use of this source code is governed by the Live2D Open Software license
* that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
*/
using UnityEngine;
using UnityEngine.Animations;
using UnityEngine.Playables;
namespace Live2D.Cubism.Framework.Motion
{
///
/// Cubism motion state.
///
public class CubismMotionState
{
#region Variable
///
/// Cubism motion state clip.
///
public AnimationClip Clip { get; private set; }
///
/// Animation clip mixer.
///
public AnimationMixerPlayable ClipMixer { get; private set; }
///
/// Animation clip playable.
///
public AnimationClipPlayable ClipPlayable { get; private set; }
#endregion
///
/// Create motion state.
///
/// Playable graph.
/// Animation clip.
/// Animation is loop.
/// Animation speed.
public static CubismMotionState CreateCubismMotionState(PlayableGraph playableGraph, AnimationClip clip, bool isLoop = true, float speed = 1.0f)
{
var ret = new CubismMotionState();
ret.Clip = clip;
// Create animation clip mixer.
ret.ClipMixer = AnimationMixerPlayable.Create(playableGraph, 2);
ret.ClipMixer.SetSpeed(speed);
// Connect AnimationClip Playable
ret.ClipPlayable = AnimationClipPlayable.Create(playableGraph, ret.Clip);
if(!isLoop)
{
ret.ClipPlayable.SetDuration(clip.length - 0.0001f);
}
ret.ClipMixer.ConnectInput(0, ret.ClipPlayable, 0);
ret.ClipMixer.SetInputWeight(0, 1.0f);
return ret;
}
///
/// Connect motion state clip mixer.
///
/// .
public void ConnectClipMixer(AnimationMixerPlayable clipMixer)
{
var lastInput = ClipMixer.GetInputCount() - 1;
#if UNITY_2018_2_OR_NEWER
ClipMixer.DisconnectInput(lastInput);
#else
ClipMixer.GetGraph().Disconnect(ClipMixer, lastInput);
#endif
ClipMixer.ConnectInput(lastInput, clipMixer, 0);
ClipMixer.SetInputWeight(lastInput, 1.0f);
}
}
}