/** * 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); } } }