DirectionalAnimationSetEditor.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
  2. #if UNITY_EDITOR
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using UnityEditor;
  7. using UnityEngine;
  8. using Object = UnityEngine.Object;
  9. namespace Animancer.Editor
  10. {
  11. /// <summary>[Editor-Only] A custom Inspector for <see cref="DirectionalAnimationSet"/>s.</summary>
  12. /// https://kybernetik.com.au/animancer/api/Animancer.Editor/DirectionalAnimationSetEditor
  13. [CustomEditor(typeof(DirectionalAnimationSet), true), CanEditMultipleObjects]
  14. public class DirectionalAnimationSetEditor : ScriptableObjectEditor
  15. {
  16. /************************************************************************************************************************/
  17. [MenuItem("CONTEXT/" + nameof(DirectionalAnimationSet) + "/Find Animations")]
  18. private static void FindSimilarAnimations(MenuCommand command)
  19. {
  20. var set = (DirectionalAnimationSet)command.context;
  21. var directory = AssetDatabase.GetAssetPath(set);
  22. directory = Path.GetDirectoryName(directory);
  23. var guids = AssetDatabase.FindAssets(
  24. $"{set.name} t:{nameof(AnimationClip)}",
  25. new string[] { directory });
  26. using (new ModifySerializedField(set, "Find Animations"))
  27. {
  28. for (int i = 0; i < guids.Length; i++)
  29. {
  30. var path = AssetDatabase.GUIDToAssetPath(guids[i]);
  31. var clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(path);
  32. if (clip == null)
  33. continue;
  34. set.SetClipByName(clip);
  35. }
  36. }
  37. }
  38. /************************************************************************************************************************/
  39. [MenuItem(
  40. itemName: Strings.CreateMenuPrefix + "Directional Animation Set/From Selection",
  41. priority = Strings.AssetMenuOrder + 5)]
  42. private static void CreateDirectionalAnimationSet()
  43. {
  44. var nameToAnimations = new Dictionary<string, List<AnimationClip>>();
  45. var selection = Selection.objects;
  46. for (int i = 0; i < selection.Length; i++)
  47. {
  48. var clip = selection[i] as AnimationClip;
  49. if (clip == null)
  50. continue;
  51. var name = clip.name;
  52. for (DirectionalAnimationSet.Direction direction = 0; direction < (DirectionalAnimationSet.Direction)4; direction++)
  53. {
  54. name = name.Replace(direction.ToString(), "");
  55. }
  56. if (!nameToAnimations.TryGetValue(name, out var clips))
  57. {
  58. clips = new();
  59. nameToAnimations.Add(name, clips);
  60. }
  61. clips.Add(clip);
  62. }
  63. if (nameToAnimations.Count == 0)
  64. throw new InvalidOperationException("No clips are selected");
  65. var sets = new List<Object>();
  66. foreach (var nameAndAnimations in nameToAnimations)
  67. {
  68. var set = nameAndAnimations.Value.Count <= 4 ?
  69. CreateInstance<DirectionalAnimationSet>() :
  70. CreateInstance<DirectionalAnimationSet8>();
  71. set.AllowSetClips();
  72. for (int i = 0; i < nameAndAnimations.Value.Count; i++)
  73. {
  74. set.SetClipByName(nameAndAnimations.Value[i]);
  75. }
  76. var path = AssetDatabase.GetAssetPath(nameAndAnimations.Value[0]);
  77. path = $"{Path.GetDirectoryName(path)}/{nameAndAnimations.Key}.asset";
  78. AssetDatabase.CreateAsset(set, path);
  79. sets.Add(set);
  80. }
  81. Selection.objects = sets.ToArray();
  82. }
  83. /************************************************************************************************************************/
  84. [MenuItem("CONTEXT/" + nameof(DirectionalAnimationSet) + "/Toggle Looping")]
  85. private static void ToggleLooping(MenuCommand command)
  86. {
  87. var set = (DirectionalAnimationSet)command.context;
  88. var count = set.ClipCount;
  89. for (int i = 0; i < count; i++)
  90. {
  91. var clip = set.GetClip(i);
  92. if (clip == null)
  93. continue;
  94. var isLooping = !clip.isLooping;
  95. for (i = 0; i < count; i++)
  96. {
  97. clip = set.GetClip(i);
  98. if (clip == null)
  99. continue;
  100. AnimancerEditorUtilities.SetLooping(clip, isLooping);
  101. }
  102. break;
  103. }
  104. }
  105. /************************************************************************************************************************/
  106. }
  107. }
  108. #endif