Add Modification API:

- The Modification API is designed specifically for the creation and distribution of modular prefabs, where a developer generates assets on their machine and distributes those generated assets to their users.
  - Add AacFlModification class.
  - Add (AacFlBase).Modification() which returns a AacFlModification.
This commit is contained in:
Haï~
2025-08-16 05:32:12 +02:00
parent 399b721f4a
commit e16115d9a9
3 changed files with 130 additions and 2 deletions
@@ -523,13 +523,15 @@ namespace AnimatorAsCode.V1
return new AacFlClip(_configuration, clip); 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.<br/>
/// Added in 1.3.0.
public AacFlNonInitializedBlendTree NewBlendTree(string name) public AacFlNonInitializedBlendTree NewBlendTree(string name)
{ {
return new AacFlNonInitializedBlendTree(AacInternals.NewBlendTreeAsRaw(_configuration, 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.<br/>
/// Added in 1.3.0.
public BlendTree NewBlendTreeAsRaw(string name) public BlendTree NewBlendTreeAsRaw(string name)
{ {
return AacInternals.NewBlendTreeAsRaw(_configuration, name); return AacInternals.NewBlendTreeAsRaw(_configuration, name);
@@ -640,6 +642,13 @@ namespace AnimatorAsCode.V1
{ {
return new AacFlNoAnimator(); return new AacFlNoAnimator();
} }
/// Returns a new AacFlModification instance, granting you access to this destructive modification API. You will need to reuse this object throughout.<br/>
/// Added in 1.3.0.
public AacFlModification Modification()
{
return new AacFlModification(_configuration, this);
}
} }
public class AacFlNoAnimator public class AacFlNoAnimator
@@ -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<Object> _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.<br/>
/// This AnimatorController instance is memorized in the current AacFlModification instance memory.<br/>
/// 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.<br/>
/// This does not reset any other attribute of the clip (e.g., is looping, etc.).<br/>
/// 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.<br/>
/// This does not reset any other attribute of the blend tree (e.g., automatic thresholds, etc.).<br/>
/// This BlendTree instance is memorized in the current AacFlModification instance memory.<br/>
/// 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<ChildMotion>();
blendTreeToReset.blendParameter = "";
blendTreeToReset.blendParameterY = "";
return new AacFlNonInitializedBlendTree(blendTreeToReset);
}
/// Immediately removes all layers and all parameters from the given AnimatorController.<br/>
/// This AnimatorController instance is memorized in the current AacFlModification instance memory.<br/>
/// 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.<br/>
/// This AnimatorController instance is memorized in the current AacFlModification instance memory.<br/>
/// 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);
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 27af4c404c051cf48bc07b175b4afda7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: