(PACKAGING) Move all examples to a separate repository

This commit is contained in:
Haï~
2023-10-02 04:53:27 +02:00
parent 2b2ec1e27c
commit c4d5cba7f0
29 changed files with 0 additions and 50761 deletions
-114
View File
@@ -1,114 +0,0 @@
#if UNITY_EDITOR
using System;
using AnimatorAsCode.V1;
using AnimatorAsCode.V1.VRCDestructiveWorkflow;
using UnityEditor;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using AnimatorController = UnityEditor.Animations.AnimatorController;
namespace AnimatorAsCodeFramework.Examples
{
public static class AacExample
{
public static TemplateGenOptions Options()
{
return TemplateGenOptions.Defaults();
}
public struct TemplateGenOptions
{
public static TemplateGenOptions Defaults()
{
return new TemplateGenOptions()
{
WriteDefaults = false
};
}
public TemplateGenOptions WriteDefaultsOff()
{
WriteDefaults = false;
return this;
}
public TemplateGenOptions WriteDefaultsOn()
{
WriteDefaults = true;
return this;
}
public bool WriteDefaults;
}
public static void InspectorTemplate(Editor editor, SerializedObject serializedObj, string propName, Action createFn, Action removeFnOptional = null)
{
var prop = serializedObj.FindProperty(propName);
if (prop.stringValue.Trim() == "")
{
prop.stringValue = GUID.Generate().ToString();
serializedObj.ApplyModifiedProperties();
}
editor.DrawDefaultInspector();
if (GUILayout.Button("Create"))
{
createFn.Invoke();
}
if (removeFnOptional != null && GUILayout.Button("Remove"))
{
removeFnOptional.Invoke();
}
}
/// <summary>
/// Creates an AAC base with default options (write defaults OFF). This function is provided as an example on how to invoke AAC internals.
/// </summary>
/// <param name="systemName">Prefix for layer names</param>
/// <param name="avatar">Playable layers of this avatar to modify</param>
/// <param name="assetContainer">Animation assets will be generated as sub-assets of that asset container</param>
/// <param name="assetKey">Animation assets will be generated with this name in order to clean up previously generated assets of the same system</param>
/// <param name="options">Some options, such as whether Write Defaults is ON or OFF</param>
/// <returns>The AAC base.</returns>
public static AacFlBase AnimatorAsCode(string systemName, VRCAvatarDescriptor avatar, AnimatorController assetContainer, string assetKey)
{
return AnimatorAsCode(systemName, avatar, assetContainer, assetKey, TemplateGenOptions.Defaults());
}
/// <summary>
/// Creates an AAC base. This function is provided as an example on how to invoke AAC internals.
/// </summary>
/// <param name="systemName">Prefix for layer names</param>
/// <param name="avatar">Playable layers of this avatar to modify</param>
/// <param name="assetContainer">Animation assets will be generated as sub-assets of that asset container</param>
/// <param name="assetKey">Animation assets will be generated with this name in order to clean up previously generated assets of the same system</param>
/// <param name="options">Some options, such as whether Write Defaults is ON or OFF</param>
/// <returns>The AAC base.</returns>
public static AacFlBase AnimatorAsCode(string systemName, VRCAvatarDescriptor avatar, AnimatorController assetContainer, string assetKey, TemplateGenOptions options)
{
var aac = AacV1.Create(new AacConfiguration
{
SystemName = systemName,
// In the examples, we consider the avatar to be also the animator root.
// You can set the animator root to be different than the avatar descriptor,
// if you want to apply an animator to a different avatar without redefining
// all of the game object references which were relative to the original avatar.
AnimatorRoot = avatar.transform,
// DefaultValueRoot is currently unused in AAC. It is added here preemptively
// in order to define an avatar root to sample default values from.
// The intent is to allow animators to be created with Write Defaults OFF,
// but mimicking the behaviour of Write Defaults ON by automatically
// sampling the default value from the scene relative to the transform
// defined in DefaultValueRoot.
DefaultValueRoot = avatar.transform,
AssetContainer = assetContainer,
AssetKey = assetKey,
DefaultsProvider = new AacDefaultsProvider(writeDefaults: options.WriteDefaults)
}.WithAvatarDescriptor(avatar));
aac.ClearPreviousAssets();
return aac;
}
}
}
#endif
-3
View File
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: b6c6740568e64846b6b18720f7315ca4
timeCreated: 1645751901
File diff suppressed because it is too large Load Diff
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: bbcd8ae9108f27f44aacfe48a78785d4
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
-92
View File
@@ -1,92 +0,0 @@
fileFormatVersion: 2
guid: e5874b9d3baa9584c88aae7527592af0
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 11
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 1
seamlessCubemap: 1
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 2
aniso: 0
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 2
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
applyGammaDecoding: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 100
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 3aab8cb479c1da147b4fec0a8fe34236
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:
-77
View File
@@ -1,77 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AacExampleMaterial
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.698
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 0.48689637, g: 0.11609437, b: 0.037962936, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c3542dfecd687604fb8d0b0e6a5a6318
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
-56
View File
@@ -1,56 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -340790334, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name: AacExampleMenu
m_EditorClassIdentifier:
controls:
- name: Item
icon: {fileID: 0}
type: 102
parameter:
name: EnableItem
value: 1
style: 0
subMenu: {fileID: 0}
subParameters: []
labels: []
- name: Accesories
icon: {fileID: 0}
type: 102
parameter:
name: EnableAccessories
value: 1
style: 0
subMenu: {fileID: 0}
subParameters: []
labels: []
- name: Thing
icon: {fileID: 0}
type: 102
parameter:
name: AccessoryThing
value: 1
style: 0
subMenu: {fileID: 0}
subParameters: []
labels: []
- name: Wedge Amount
icon: {fileID: 0}
type: 203
parameter:
name:
value: 1
style: 0
subMenu: {fileID: 0}
subParameters:
- name: WedgeAmount
labels: []
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: cde459092e0783540b3837521d750413
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
-31
View File
@@ -1,31 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -1506855854, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name: AacExampleParams
m_EditorClassIdentifier:
parameters:
- name: EnableItem
valueType: 2
saved: 1
defaultValue: 0
- name: EnableAccessories
valueType: 2
saved: 1
defaultValue: 0
- name: AccessoryThing
valueType: 2
saved: 1
defaultValue: 0
- name: WedgeAmount
valueType: 1
saved: 1
defaultValue: 0
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 599b4ef18dd7b2b41ae63050dc68cf49
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
-102
View File
@@ -1,102 +0,0 @@
fileFormatVersion: 2
guid: 63527d990aefbfd4889bdd854f8389e2
ModelImporter:
serializedVersion: 19301
internalIDToNameTable: []
externalObjects:
- first:
type: UnityEngine:Material
assembly: UnityEngine.CoreModule
name: Material.001
second: {fileID: 2100000, guid: c3542dfecd687604fb8d0b0e6a5a6318, type: 2}
materials:
materialImportMode: 1
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
motionNodeName:
rigImportErrors:
rigImportWarnings:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 1
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVPackMargin: 4
useFileScale: 1
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 1
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
-70
View File
@@ -1,70 +0,0 @@
#if UNITY_EDITOR
using AnimatorAsCode.V1.VRCDestructiveWorkflow;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using UnityEditor;
using UnityEditor.Animations;
namespace AnimatorAsCodeFramework.Examples
{
public class GenExample0_ToggleGo : MonoBehaviour
{
public VRCAvatarDescriptor avatar;
public AnimatorController assetContainer;
public string assetKey;
public GameObject item;
}
[CustomEditor(typeof(GenExample0_ToggleGo), true)]
public class GenExample0_ToggleGoEditor : Editor
{
private const string SystemName = "Example 0";
public override void OnInspectorGUI()
{
AacExample.InspectorTemplate(this, serializedObject, "assetKey", Create, Remove);
}
private void Create()
{
var my = (GenExample0_ToggleGo) target;
// The avatar is used here:
// - to find the FX playable layer animator, where a new layer will be created.
// - to resolve the relative animation path to the item.
// The generated animation files are stored in the asset container.
var aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey, AacExample.Options().WriteDefaultsOff());
// Create a layer in the FX animator.
// Additional layers can be created in the FX animator (see later in the manual).
var fx = aac.CreateMainFxLayer();
// The first created state is the default one connected to the "Entry" node.
// States are automatically placed on the grid (see later in the manual).
var hidden = fx.NewState("Hidden")
// Animation assets are generated as sub-assets of the asset container.
// The animation path to my.skinnedMesh is relative to my.avatar
.WithAnimation(aac.NewClip().Toggling(my.item, false));
var shown = fx.NewState("Shown")
.WithAnimation(aac.NewClip().Toggling(my.item, true));
// Creates a Bool parameter in the FX layer.
// Parameters are added to the Animator if a parameter with the same name
// does not exist yet.
var itemParam = fx.BoolParameter("EnableItem");
// Transitions are created with a set of default values
// That can be changed in the Generator settings (see later in the manual).
hidden.TransitionsTo(shown).When(itemParam.IsTrue());
shown.TransitionsTo(hidden).When(itemParam.IsFalse());
}
private void Remove()
{
var my = (GenExample0_ToggleGo) target;
var aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
aac.RemoveAllMainLayers();
}
}
}
#endif
-3
View File
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: be5bb2bad8914be8a6a86373d48e4574
timeCreated: 1645746140
-78
View File
@@ -1,78 +0,0 @@
#if UNITY_EDITOR
using AnimatorAsCode.V1.VRCDestructiveWorkflow;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using UnityEditor;
using UnityEditor.Animations;
namespace AnimatorAsCodeFramework.Examples
{
public class GenExample1_ToggleSmr : MonoBehaviour
{
public VRCAvatarDescriptor avatar;
public AnimatorController assetContainer;
public string assetKey;
public SkinnedMeshRenderer skinnedMesh;
}
[CustomEditor(typeof(GenExample1_ToggleSmr), true)]
public class GenExample1_ToggleSmrEditor : Editor
{
private const string SystemName = "Example 1";
public override void OnInspectorGUI()
{
AacExample.InspectorTemplate(this, serializedObject, "assetKey", Create, Remove);
}
private void Create()
{
var my = (GenExample1_ToggleSmr) target;
var aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
var fx = aac.CreateMainFxLayer();
var hidden = fx.NewState("Hidden")
// The runtime type of my.skinnedMesh is used within the animation.
// In this case, the "SkinnedMeshRenderer" component is disabled.
.WithAnimation(aac.NewClip().TogglingComponent(my.skinnedMesh, false));
var shown = fx.NewState("Shown")
.WithAnimation(aac.NewClip().TogglingComponent(my.skinnedMesh, true));
// This creates two Bool parameters in the animator.
// The resulting value can be used in conditions.
var accessoriesParams = fx.BoolParameters("EnableAccessories", "AccessoryThing");
// The following line creates one transition.
// The conditions are "EnableAccessories is true" and "AccessoryThing is true"
hidden.TransitionsTo(shown).When(accessoriesParams.AreTrue());
// The following line creates two transitions:
// - The first transition is "EnableAccessories is false"
// - The second transition is "AccessoryThing is false"
shown.TransitionsTo(hidden).When(accessoriesParams.IsAnyFalse());
if (false)
{
// Alternatively, you can use the long way:
var enableAccessoriesParam = fx.BoolParameter("EnableAccessories");
var thingParam = fx.BoolParameter("ThingParam");
hidden.TransitionsTo(shown).When(enableAccessoriesParam.IsTrue()).And(thingParam.IsTrue());
// - The first transition:
shown.TransitionsTo(hidden).When(enableAccessoriesParam.IsFalse())
// - The second transition:
.Or().When(thingParam.IsFalse());
}
}
private void Remove()
{
var my = (GenExample1_ToggleSmr) target;
var aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
aac.RemoveAllMainLayers();
}
}
}
#endif
-3
View File
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: ea8b0c32e2e54e4883f5b113609cb670
timeCreated: 1645744548
-57
View File
@@ -1,57 +0,0 @@
#if UNITY_EDITOR
using AnimatorAsCode.V1.VRCDestructiveWorkflow;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using UnityEditor;
using UnityEditor.Animations;
namespace AnimatorAsCodeFramework.Examples
{
public class GenExample2_Animate : MonoBehaviour
{
public VRCAvatarDescriptor avatar;
public AnimatorController assetContainer;
public string assetKey;
public SkinnedMeshRenderer wedgeMesh;
}
[CustomEditor(typeof(GenExample2_Animate), true)]
public class GenExample1_BlushEditor : Editor
{
private const string SystemName = "Example 2";
public override void OnInspectorGUI()
{
AacExample.InspectorTemplate(this, serializedObject, "assetKey", Create, Remove);
}
private void Create()
{
var my = (GenExample2_Animate) target;
var aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
var fx = aac.CreateMainFxLayer();
fx.NewState("Motion")
.WithAnimation(aac.NewClip().Animating(clip =>
{
clip.Animates(my.wedgeMesh, "blendShape.Wedge").WithFrameCountUnit(keyframes =>
keyframes.Easing(0, 100f).Easing(28, 0).Easing(29, 0).Easing(30, 0).Easing(31, 0).Easing(32, 0).Easing(60, 100f)
);
clip.Animates(my.wedgeMesh, "material._Metallic").WithFrameCountUnit(keyframes =>
keyframes.Constant(0, 1f).Constant(28, 0).Constant(60, 0)
);
}))
.MotionTime(fx.FloatParameter("WedgeAmount"));
}
private void Remove()
{
var my = (GenExample2_Animate) target;
var aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
aac.RemoveAllMainLayers();
}
}
}
#endif
-3
View File
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: b09d955c545f45428d3c5cfb9b214117
timeCreated: 1645746969
-145
View File
@@ -1,145 +0,0 @@
#if UNITY_EDITOR
using System.Linq;
using AnimatorAsCode.V1;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using UnityEditor;
using UnityEditor.Animations;
using AnimatorAsCode.V1.VRCDestructiveWorkflow;
using AnimatorAsCode.V1.VRC;
namespace AnimatorAsCodeFramework.Examples
{
public class GenExample3_Gesturing : MonoBehaviour
{
public VRCAvatarDescriptor avatar;
public AnimatorController assetContainer;
public string assetKey;
public SkinnedMeshRenderer iconMesh;
}
[CustomEditor(typeof(GenExample3_Gesturing), true)]
public class GenExample3_GesturingEditor : Editor
{
private const string SystemName = "Example 3";
private GenExample3_Gesturing my;
private AacFlBase aac;
public override void OnInspectorGUI()
{
AacExample.InspectorTemplate(this, serializedObject, "assetKey", Create, Remove);
}
private void Create()
{
my = (GenExample3_Gesturing) target;
aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
CreateMainLayer();
CreateSupportingLayer();
}
private void Remove()
{
var my = (GenExample3_Gesturing) target;
var aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
aac.RemoveAllMainLayers();
aac.RemoveAllSupportingLayers("Detection");
}
private void CreateMainLayer()
{
var layer = aac.CreateMainFxLayer();
var dirtyCheckParameter = layer.BoolParameter("AAC_INTERNAL_GesturingIcon_DirtyCheck");
// ### Create states
var lackOfChangeDetected = layer.NewState("Animate To NoChange")
.WithAnimation(IconAppears());
// By default, states have an animation that animates a dummy object for 1 frame.
var noChange = layer.NewState("NoChange", 1, 0).RightOf();
var changeDetected = layer.NewState("Animate To Changing").Under()
.WithAnimation(IconDisappears());
// This creates a clip that animates a dummy object for 1.5f seconds.
var changing = layer.NewState("Changing", 0, 1).LeftOf()
.WithAnimation(aac.DummyClipLasting(1.5f, AacFlUnit.Seconds));
// When this state is entered, the parameter is driven to the value of false.
var stillChanging = layer.NewState("Still Changing", 0, 2).Under()
.Drives(dirtyCheckParameter, false);
// ------
// ### Create transitions
lackOfChangeDetected.TransitionsTo(changeDetected).AfterAnimationIsAtLeastAtPercent(0.7f).When(dirtyCheckParameter.IsTrue());
// The transition duration is 30% of the animation duration.
lackOfChangeDetected.TransitionsTo(noChange).AfterAnimationFinishes().WithTransitionDurationPercent(0.3f);
noChange.TransitionsTo(changeDetected).When(dirtyCheckParameter.IsTrue());
// By using AfterAnimationFinishes, the transition will trigger after the animation
// for the icon appearing finishes.
changeDetected.TransitionsTo(changing).AfterAnimationFinishes();
changing.TransitionsTo(stillChanging).When(dirtyCheckParameter.IsTrue());
// By using AfterAnimationFinishes, the transition will trigger after 1.5 seconds,
// which is the length of the animation in Changing.
changing.TransitionsTo(lackOfChangeDetected).AfterAnimationFinishes();
// The transition will immediately happen upon entering, by using Exit time set to 0.
stillChanging.AutomaticallyMovesTo(changing);
}
private void CreateSupportingLayer()
{
// Create an additional FX layer.
var layer = aac.CreateSupportingFxLayer("Detection");
var reevaluating = layer.NewState("Reevaluating", -1, 0);
foreach (var left in Enumerable.Range(0, 8))
{
foreach (var right in Enumerable.Range(0, 8))
{
var state = layer.NewState($"Gesture {left} {right}", left, right)
// When this state is entered, the parameter is driven to the value of true.
.Drives(layer.BoolParameter("AAC_INTERNAL_GesturingIcon_DirtyCheck"), true);
reevaluating.TransitionsTo(state)
// Use ".Av3" to access VRChat standard parameters.
// Accessing these parameters will create the corresponding parameter in the animator.
.When(layer.Av3().GestureLeft.IsEqualTo(left))
.And(layer.Av3().GestureRight.IsEqualTo(right));
state.TransitionsTo(reevaluating)
.When(layer.Av3().GestureLeft.IsNotEqualTo(left))
.Or()
.When(layer.Av3().GestureRight.IsNotEqualTo(right));
}
}
}
private AacFlClip IconAppears()
{
return aac.NewClip().Animating(clip =>
{
clip.Animates(my.iconMesh, "blendShape.Wedge")
.WithFrameCountUnit(keyframes => keyframes.Easing(0, 0f).Easing(10, 100f));
});
}
private AacFlClip IconDisappears()
{
return aac.NewClip().Animating(clip =>
{
clip.Animates(my.iconMesh, "blendShape.Wedge")
.WithFrameCountUnit(keyframes => keyframes.Easing(0f, 100f).Easing(10, 0f));
});
}
}
}
#endif
-3
View File
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: a0bd105e311c440ca03e6f6c46f830fc
timeCreated: 1645755767
@@ -1,55 +0,0 @@
#if UNITY_EDITOR
using AnimatorAsCode.V1;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using UnityEditor;
using UnityEditor.Animations;
namespace AnimatorAsCodeFramework.Examples
{
public class GenExample4_NonDestructiveWorkflow : MonoBehaviour
{
public VRCAvatarDescriptor avatar;
public AnimatorController assetContainer;
public string assetKey;
public SkinnedMeshRenderer iconMesh;
}
[CustomEditor(typeof(GenExample4_NonDestructiveWorkflow), true)]
public class GenExample4_NonDestructiveWorkflowEditor : Editor
{
private const string SystemName = "Example 3";
private GenExample4_NonDestructiveWorkflow my;
private AacFlBase aac;
public override void OnInspectorGUI()
{
AacExample.InspectorTemplate(this, serializedObject, "assetKey", Create, Remove);
}
private void Create()
{
my = (GenExample4_NonDestructiveWorkflow) target;
aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
CreateMainLayer();
}
private void Remove()
{
// AacExample.AnimatorAsCode invokes ClearPreviousAssets.
// This will cause the generated controller to be removed.
AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
}
private void CreateMainLayer()
{
// TODO
// var fx = aac.NewAnimatorController();
// var layer = fx.CreateLayer();
// ...
}
}
}
#endif
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: e6458c1a918843d6b2a91932ddf9d0a5
timeCreated: 1693750693
@@ -1,55 +0,0 @@
#if UNITY_EDITOR
using AnimatorAsCode.V1.VRCDestructiveWorkflow;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using UnityEditor;
using UnityEditor.Animations;
namespace AnimatorAsCodeFramework.Examples
{
public class GenExampleManual_PlacingStates : MonoBehaviour
{
public VRCAvatarDescriptor avatar;
public AnimatorController assetContainer;
public string assetKey;
}
[CustomEditor(typeof(GenExampleManual_PlacingStates), true)]
public class GenExampleManual_PlacingStatesEditor : Editor
{
private const string SystemName = "Example Manual - Placing States";
public override void OnInspectorGUI()
{
AacExample.InspectorTemplate(this, serializedObject, "assetKey", Create, Remove);
}
private void Create()
{
var my = (GenExampleManual_PlacingStates) target;
var aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
var fx = aac.CreateMainFxLayer();
var init = fx.NewState("Init"); // This is the first state. By default it is at (0, 0)
var a = fx.NewState("A"); // This will be placed under Init.
var b = fx.NewState("B"); // This will be placed under A.
var c = fx.NewState("C").RightOf(a); // This will be placed right of A.
var d = fx.NewState("D"); // This will be placed under C.
var e = fx.NewState("E").RightOf(); // This will be placed right of D.
var alternate = fx.NewState("Alternate").Over(c); // This will be placed over C.
// This will be placed relative to Alternate: 2 blocks over, and 1 to the right.
var reset = fx.NewState("Reset").Shift(alternate, 1, -2);
}
private void Remove()
{
var my = (GenExampleManual_PlacingStates) target;
var aac = AacExample.AnimatorAsCode(SystemName, my.avatar, my.assetContainer, my.assetKey);
aac.RemoveAllMainLayers();
}
}
}
#endif
@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: f4c992e0dc0e4f74a36f386346991dbc
timeCreated: 1645800049