Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea45f7ef1a | ||
|
|
836adc8b60 | ||
|
|
e16115d9a9 | ||
|
|
399b721f4a | ||
|
|
84f7f1d089 | ||
|
|
2abc34b61d | ||
|
|
cfc6c5a9d6 | ||
|
|
c87904fbbb | ||
|
|
114bea608b | ||
|
|
6c16ef567a |
@@ -30,5 +30,3 @@ Assembly-CSharp-Editor.csproj
|
|||||||
cfe-project.sln.DotSettings.user
|
cfe-project.sln.DotSettings.user
|
||||||
VRC.SDKBase.Editor.BuildPipeline.csproj
|
VRC.SDKBase.Editor.BuildPipeline.csproj
|
||||||
VRC.SDKBase.Editor.ShaderStripping.csproj
|
VRC.SDKBase.Editor.ShaderStripping.csproj
|
||||||
LICENSE.meta
|
|
||||||
README.md.meta
|
|
||||||
|
|||||||
@@ -523,6 +523,20 @@ 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.<br/>
|
||||||
|
/// 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.<br/>
|
||||||
|
/// Added in 1.3.0.
|
||||||
|
public BlendTree NewBlendTreeAsRaw(string name)
|
||||||
|
{
|
||||||
|
return AacInternals.NewBlendTreeAsRaw(_configuration, name);
|
||||||
|
}
|
||||||
|
|
||||||
/// Create a new clip which animates a dummy transform for a specific duration specified in an unit (Frames or Seconds).
|
/// Create a new clip which animates a dummy transform for a specific duration specified in an unit (Frames or Seconds).
|
||||||
public AacFlClip DummyClipLasting(float numberOf, AacFlUnit unit)
|
public AacFlClip DummyClipLasting(float numberOf, AacFlUnit unit)
|
||||||
{
|
{
|
||||||
@@ -628,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
|
||||||
|
|||||||
@@ -23,16 +23,19 @@ namespace AnimatorAsCode.V1
|
|||||||
|
|
||||||
public void SaveAsPersistenceRequired(Object objectToAdd)
|
public void SaveAsPersistenceRequired(Object objectToAdd)
|
||||||
{
|
{
|
||||||
|
if (_configuration.AssetContainer == null) return;
|
||||||
if (_configuration.ContainerMode != AacConfiguration.Container.Never) AssetDatabase.AddObjectToAsset(objectToAdd, _configuration.AssetContainer);
|
if (_configuration.ContainerMode != AacConfiguration.Container.Never) AssetDatabase.AddObjectToAsset(objectToAdd, _configuration.AssetContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveAsRegular(Object objectToAdd)
|
public void SaveAsRegular(Object objectToAdd)
|
||||||
{
|
{
|
||||||
|
if (_configuration.AssetContainer == null) return;
|
||||||
if (_configuration.ContainerMode == AacConfiguration.Container.Everything) AssetDatabase.AddObjectToAsset(objectToAdd, _configuration.AssetContainer);
|
if (_configuration.ContainerMode == AacConfiguration.Container.Everything) AssetDatabase.AddObjectToAsset(objectToAdd, _configuration.AssetContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearPreviousAssets()
|
public void ClearPreviousAssets()
|
||||||
{
|
{
|
||||||
|
if (_configuration.AssetContainer == null) return;
|
||||||
var allSubAssets = AssetDatabase.LoadAllAssetsAtPath(AssetDatabase.GetAssetPath(_configuration.AssetContainer));
|
var allSubAssets = AssetDatabase.LoadAllAssetsAtPath(AssetDatabase.GetAssetPath(_configuration.AssetContainer));
|
||||||
foreach (var subAsset in allSubAssets)
|
foreach (var subAsset in allSubAssets)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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:
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c04d39cdc2e2392a5b51bfa466760178
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "dev.hai-vr.animator-as-code.v1",
|
"name": "dev.hai-vr.animator-as-code.v1",
|
||||||
"displayName": "Animator As Code V1",
|
"displayName": "Animator As Code V1",
|
||||||
"version": "1.1.0",
|
"version": "1.3.0-alpha.1",
|
||||||
"unity": "2019.4",
|
"unity": "2019.4",
|
||||||
"description": "Base Animator As Code library. This library only requires Unity.",
|
"description": "Base Animator As Code library. This library only requires Unity.",
|
||||||
"vrchatVersion" : "2022.1.1",
|
"vrchatVersion" : "2022.1.1",
|
||||||
|
|||||||
@@ -17,9 +17,7 @@ Initially created by **[@hai-vr](https://github.com/hai-vr)**,
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
If you are using Animator As Code in VRChat, install using the VRChat Creator Companion or ALCOM. Instructions are available in [this page](https://docs.hai-vr.dev/docs/products/animator-as-code/install).
|
Instructions to install are available in [this page](https://docs.hai-vr.dev/docs/products/animator-as-code/install).
|
||||||
|
|
||||||
Otherwise, if you are **not** using VRChat, install it through the [Releases](https://github.com/hai-vr/av3-animator-as-code/releases).
|
|
||||||
|
|
||||||
### Documentation
|
### Documentation
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user