CubismMotionState.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /**
  2. * Copyright(c) Live2D Inc. All rights reserved.
  3. *
  4. * Use of this source code is governed by the Live2D Open Software license
  5. * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
  6. */
  7. using UnityEngine;
  8. using UnityEngine.Animations;
  9. using UnityEngine.Playables;
  10. namespace Live2D.Cubism.Framework.Motion
  11. {
  12. /// <summary>
  13. /// Cubism motion state.
  14. /// </summary>
  15. public class CubismMotionState
  16. {
  17. #region Variable
  18. /// <summary>
  19. /// Cubism motion state clip.
  20. /// </summary>
  21. public AnimationClip Clip { get; private set; }
  22. /// <summary>
  23. /// Animation clip mixer.
  24. /// </summary>
  25. public AnimationMixerPlayable ClipMixer { get; private set; }
  26. /// <summary>
  27. /// Animation clip playable.
  28. /// </summary>
  29. public AnimationClipPlayable ClipPlayable { get; private set; }
  30. #endregion
  31. /// <summary>
  32. /// Create motion state.
  33. /// </summary>
  34. /// <param name="playableGraph">Playable graph.</param>
  35. /// <param name="clip">Animation clip.</param>
  36. /// <param name="isLoop">Animation is loop.</param>
  37. /// <param name="speed">Animation speed.</param>
  38. public static CubismMotionState CreateCubismMotionState(PlayableGraph playableGraph, AnimationClip clip, bool isLoop = true, float speed = 1.0f)
  39. {
  40. var ret = new CubismMotionState();
  41. ret.Clip = clip;
  42. // Create animation clip mixer.
  43. ret.ClipMixer = AnimationMixerPlayable.Create(playableGraph, 2);
  44. ret.ClipMixer.SetSpeed(speed);
  45. // Connect AnimationClip Playable
  46. ret.ClipPlayable = AnimationClipPlayable.Create(playableGraph, ret.Clip);
  47. if(!isLoop)
  48. {
  49. ret.ClipPlayable.SetDuration(clip.length - 0.0001f);
  50. }
  51. ret.ClipMixer.ConnectInput(0, ret.ClipPlayable, 0);
  52. ret.ClipMixer.SetInputWeight(0, 1.0f);
  53. return ret;
  54. }
  55. /// <summary>
  56. /// Connect motion state clip mixer.
  57. /// </summary>
  58. /// <param name="clipMixer">.</param>
  59. public void ConnectClipMixer(AnimationMixerPlayable clipMixer)
  60. {
  61. var lastInput = ClipMixer.GetInputCount() - 1;
  62. #if UNITY_2018_2_OR_NEWER
  63. ClipMixer.DisconnectInput(lastInput);
  64. #else
  65. ClipMixer.GetGraph().Disconnect(ClipMixer, lastInput);
  66. #endif
  67. ClipMixer.ConnectInput(lastInput, clipMixer, 0);
  68. ClipMixer.SetInputWeight(lastInput, 1.0f);
  69. }
  70. }
  71. }