TimelineRecordingContextualResponder.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using UnityEditorInternal;
  2. using UnityEngine;
  3. using UnityEngine.Playables;
  4. using UnityEngine.Timeline;
  5. namespace UnityEditor.Timeline
  6. {
  7. class TimelineRecordingContextualResponder : IAnimationContextualResponder
  8. {
  9. public WindowState state { get; internal set; }
  10. public TimelineRecordingContextualResponder(WindowState _state)
  11. {
  12. state = _state;
  13. }
  14. //Unsupported stuff
  15. public bool HasAnyCandidates() { return false; }
  16. public bool HasAnyCurves() {return false; }
  17. public void AddCandidateKeys() {}
  18. public void AddAnimatedKeys() {}
  19. public bool IsAnimatable(PropertyModification[] modifications)
  20. {
  21. // search playable assets
  22. for (int i = 0; i < modifications.Length; i++)
  23. {
  24. var iAsset = modifications[i].target as IPlayableAsset;
  25. if (iAsset != null)
  26. {
  27. var curvesOwner = AnimatedParameterUtility.ToCurvesOwner(iAsset, state.editSequence.asset);
  28. if (curvesOwner != null && curvesOwner.HasAnyAnimatableParameters() && curvesOwner.IsParameterAnimatable(modifications[i].propertyPath))
  29. return true;
  30. }
  31. }
  32. // search recordable game objects
  33. foreach (var gameObject in TimelineRecording.GetRecordableGameObjects(state))
  34. {
  35. for (int i = 0; i < modifications.Length; ++i)
  36. {
  37. var modification = modifications[i];
  38. if (AnimationWindowUtility.PropertyIsAnimatable(modification.target, modification.propertyPath, gameObject))
  39. return true;
  40. }
  41. }
  42. return false;
  43. }
  44. public bool IsEditable(Object targetObject)
  45. {
  46. return true; // i.e. all animatable properties are editable
  47. }
  48. public bool KeyExists(PropertyModification[] modifications)
  49. {
  50. if (modifications.Length == 0 || modifications[0].target == null)
  51. return false;
  52. return TimelineRecording.HasKey(modifications, modifications[0].target, state);
  53. }
  54. public bool CandidateExists(PropertyModification[] modifications)
  55. {
  56. return true;
  57. }
  58. public bool CurveExists(PropertyModification[] modifications)
  59. {
  60. if (modifications.Length == 0 || modifications[0].target == null)
  61. return false;
  62. return TimelineRecording.HasCurve(modifications, modifications[0].target, state);
  63. }
  64. public void AddKey(PropertyModification[] modifications)
  65. {
  66. TimelineRecording.AddKey(modifications, state);
  67. state.Refresh();
  68. }
  69. public void RemoveKey(PropertyModification[] modifications)
  70. {
  71. if (modifications.Length == 0)
  72. return;
  73. var target = modifications[0].target;
  74. if (target == null)
  75. return;
  76. TimelineRecording.RemoveKey(modifications[0].target, modifications, state);
  77. var curvesOwner = target as ICurvesOwner;
  78. if (curvesOwner != null)
  79. curvesOwner.SanitizeCurvesData();
  80. state.Refresh();
  81. }
  82. public void RemoveCurve(PropertyModification[] modifications)
  83. {
  84. if (modifications.Length == 0)
  85. return;
  86. var target = modifications[0].target;
  87. if (target == null)
  88. return;
  89. TimelineRecording.RemoveCurve(target, modifications, state);
  90. var curvesOwner = target as ICurvesOwner;
  91. if (curvesOwner != null)
  92. curvesOwner.SanitizeCurvesData();
  93. state.Refresh();
  94. }
  95. public void GoToNextKeyframe(PropertyModification[] modifications)
  96. {
  97. if (modifications.Length == 0 || modifications[0].target == null)
  98. return;
  99. TimelineRecording.NextKey(modifications[0].target, modifications, state);
  100. state.Refresh();
  101. }
  102. public void GoToPreviousKeyframe(PropertyModification[] modifications)
  103. {
  104. TimelineRecording.PrevKey(modifications[0].target, modifications, state);
  105. state.Refresh();
  106. }
  107. }
  108. }