diff --git a/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/Aac.cs b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/Aac.cs index 17e6bcd..f690d4b 100644 --- a/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/Aac.cs +++ b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/Aac.cs @@ -523,13 +523,15 @@ namespace AnimatorAsCode.V1 return new AacFlClip(_configuration, clip); } - /// Create a new BlendTree asset with a name. However, the name is only used as a suffix for the asset. The asset is generated into the container. + /// Create a new BlendTree asset with a name. However, the name is only used as a suffix for the asset. The asset is generated into the container.
+ /// Added in 1.3.0. public AacFlNonInitializedBlendTree NewBlendTree(string name) { return new AacFlNonInitializedBlendTree(AacInternals.NewBlendTreeAsRaw(_configuration, name)); } - /// Create a new BlendTree asset with a name and returns a native BlendTree object. However, the name is only used as a suffix for the asset. The asset is generated into the container. You may use NewBlendTree() instead to obtain a fluent interface. + /// Create a new BlendTree asset with a name and returns a native BlendTree object. However, the name is only used as a suffix for the asset. The asset is generated into the container. You may use NewBlendTree() instead to obtain a fluent interface.
+ /// Added in 1.3.0. public BlendTree NewBlendTreeAsRaw(string name) { return AacInternals.NewBlendTreeAsRaw(_configuration, name); @@ -640,6 +642,13 @@ namespace AnimatorAsCode.V1 { return new AacFlNoAnimator(); } + + /// Returns a new AacFlModification instance, granting you access to this destructive modification API. You will need to reuse this object throughout.
+ /// Added in 1.3.0. + public AacFlModification Modification() + { + return new AacFlModification(_configuration, this); + } } public class AacFlNoAnimator diff --git a/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlModification.cs b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlModification.cs new file mode 100644 index 0000000..f878c8f --- /dev/null +++ b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlModification.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.Animations; +using Object = UnityEngine.Object; +using UnityEngine; + +// ReSharper disable once CheckNamespace +namespace AnimatorAsCode.V1 +{ + public class AacFlModification + { + private readonly AacConfiguration _configuration; + private readonly AacFlBase _base; + + private readonly HashSet _objects = new(); + + internal AacFlModification(AacConfiguration configuration, AacFlBase originalBase) + { + _configuration = configuration; + _base = originalBase; + } + + /// Immediately removes all layers and all parameters from the given AnimatorController, and returns a AacFlController that will edit the given AnimatorController.
+ /// This AnimatorController instance is memorized in the current AacFlModification instance memory.
+ /// Note: The AnimatorController class is editor-only, so they can't be referenced inside scene components or asset objects. If you have a RuntimeAnimatorController instance, you should cast it to AnimatorController. + public AacFlController ResetAnimatorController(AnimatorController controllerToReset) + { + _objects.Add(controllerToReset); + + Internal_ClearAnimatorController(controllerToReset); + + return new AacFlController(_configuration, controllerToReset, _base); + } + + /// Immediately removes all curves on the clip, and returns a AacFlClip that will edit the given AnimationClip.
+ /// This does not reset any other attribute of the clip (e.g., is looping, etc.).
+ /// This AnimationClip instance is memorized in the current AacFlModification instance memory. + public AacFlClip ResetClip(AnimationClip clipToReset) + { + _objects.Add(clipToReset); + + clipToReset.ClearCurves(); + + return new AacFlClip(_configuration, clipToReset); + } + + /// Immediately clears the list of children in the given BlendTree, sets the parameters to empty strings, and returns a AacFlNonInitializedBlendTree that will edit the given BlendTree.
+ /// This does not reset any other attribute of the blend tree (e.g., automatic thresholds, etc.).
+ /// This BlendTree instance is memorized in the current AacFlModification instance memory.
+ /// Note: The BlendTree class is editor-only, so they can't be referenced inside scene components or asset objects. If you have a Motion instance that is a BlendTree instance, you should cast it to BlendTree. + public AacFlNonInitializedBlendTree ResetBlendTree(BlendTree blendTreeToReset) + { + _objects.Add(blendTreeToReset); + + blendTreeToReset.children = Array.Empty(); + blendTreeToReset.blendParameter = ""; + blendTreeToReset.blendParameterY = ""; + + return new AacFlNonInitializedBlendTree(blendTreeToReset); + } + + /// Immediately removes all layers and all parameters from the given AnimatorController.
+ /// This AnimatorController instance is memorized in the current AacFlModification instance memory.
+ /// Note: The AnimatorController class is editor-only, so they can't be referenced inside scene components or asset objects. If you have a RuntimeAnimatorController instance, you should cast it to AnimatorController. + public AacFlModification ClearAnimatorController(AnimatorController controllerToReset) + { + _objects.Add(controllerToReset); + + Internal_ClearAnimatorController(controllerToReset); + + return this; + } + + /// Returns a AacFlController that will edit the given AnimatorController. This does not reset the AnimatorController.
+ /// This AnimatorController instance is memorized in the current AacFlModification instance memory.
+ /// Note: The AnimatorController class is editor-only, so they can't be referenced inside scene components or asset objects. If you have a RuntimeAnimatorController instance, you should cast it to AnimatorController. + public AacFlController EditAnimatorController(AnimatorController controllerToReset) + { + _objects.Add(controllerToReset); + + return new AacFlController(_configuration, controllerToReset, _base); + } + + /// Calls `EditorUtility.SetDirty(...)` on every single AnimatorController, AnimationClip, and BlendTree asset instances previously memorized by this AacFlModification instance. + public void SetDirtyAll() + { + foreach (var obj in _objects) + { + EditorUtility.SetDirty(obj); + } + } + + private static void Internal_ClearAnimatorController(AnimatorController controllerToReset) + { + while (controllerToReset.layers.Length > 0) + { + controllerToReset.RemoveLayer(0); + } + + var parameters = controllerToReset.parameters; + for (var i = parameters.Length - 1; i >= 0; i--) + { + controllerToReset.RemoveParameter(i); + } + } + } +} \ No newline at end of file diff --git a/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlModification.cs.meta b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlModification.cs.meta new file mode 100644 index 0000000..9d2d3b5 --- /dev/null +++ b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlModification.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27af4c404c051cf48bc07b175b4afda7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: