From 582b109a821cfb295672444a1e5a32e3e9aa051a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=C3=AF=7E?= Date: Mon, 24 Jun 2024 23:58:37 +0200 Subject: [PATCH] Accomodate new VRCAnimatorPlayAudio requirements: - Nodes need to know the Animator Root, so that relative paths can be resolved during the creation of State behaviours (i.e. Relative path of an AudioSource). - Nodes need to have the ability to create a New Behaviour, even if one already exists. --- .../V1/Editor/Aac.cs | 12 ++++++----- .../V1/Editor/AacAnimatorNode.cs | 11 +++++++++- .../V1/Editor/AacFlStates.cs | 20 ++++++++++++++----- .../package.json | 2 +- 4 files changed, 33 insertions(+), 12 deletions(-) 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 b2394ef..4ffd3fc 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 @@ -527,7 +527,7 @@ namespace AnimatorAsCode.V1 /// NON-PUBLIC: Internal use only so that destructive workflow can access this. Maybe this can be improved public AacFlLayer InternalDoCreateLayer(AnimatorController animator, string layerName) { - var ag = new AacAnimatorGenerator(animator, CreateEmptyClip().Clip, _configuration.DefaultsProvider); + var ag = new AacAnimatorGenerator(animator, CreateEmptyClip().Clip, _configuration.DefaultsProvider, _configuration.AnimatorRoot); var machine = ag.CreateOrClearLayerAtSameIndex(layerName, 1f); return new AacFlLayer(animator, _configuration, machine, layerName); @@ -535,7 +535,7 @@ namespace AnimatorAsCode.V1 internal AacFlLayer DoCreateLayerWithoutDeleting(AnimatorController animator, string layerName) { - var ag = new AacAnimatorGenerator(animator, CreateEmptyClip().Clip, _configuration.DefaultsProvider); + var ag = new AacAnimatorGenerator(animator, CreateEmptyClip().Clip, _configuration.DefaultsProvider, _configuration.AnimatorRoot); var machine = ag.CreateOrClearLayerAtSameIndex(layerName, 1f, null, false); return new AacFlLayer(animator, _configuration, machine, layerName); @@ -693,12 +693,14 @@ namespace AnimatorAsCode.V1 private readonly AnimatorController _animatorController; private readonly AnimationClip _emptyClip; private readonly IAacDefaultsProvider _defaultsProvider; + private readonly Transform _animatorRoot; - internal AacAnimatorGenerator(AnimatorController animatorController, AnimationClip emptyClip, IAacDefaultsProvider defaultsProvider) + internal AacAnimatorGenerator(AnimatorController animatorController, AnimationClip emptyClip, IAacDefaultsProvider defaultsProvider, Transform animatorRoot) { _animatorController = animatorController; _emptyClip = emptyClip; _defaultsProvider = defaultsProvider; + _animatorRoot = animatorRoot; } internal void CreateParamsAsNeeded(params AacFlParameter[] parameters) @@ -755,7 +757,7 @@ namespace AnimatorAsCode.V1 } var layer = TryGetLayer(layerName); - var machinist = new AacFlStateMachine(layer.stateMachine, _emptyClip, new AacBackingAnimator(this), _defaultsProvider); + var machinist = new AacFlStateMachine(layer.stateMachine, _emptyClip, new AacBackingAnimator(this), _defaultsProvider, _animatorRoot); return machinist .WithAnyStatePosition(0, 7) .WithEntryPosition(0, -1) @@ -790,7 +792,7 @@ namespace AnimatorAsCode.V1 _animatorController.layers = layers; var layer = TryGetLayer(layerName); - var machinist = new AacFlStateMachine(layer.stateMachine, _emptyClip, new AacBackingAnimator(this), _defaultsProvider); + var machinist = new AacFlStateMachine(layer.stateMachine, _emptyClip, new AacBackingAnimator(this), _defaultsProvider, _animatorRoot); _defaultsProvider.ConfigureStateMachine(layer.stateMachine); return machinist; } diff --git a/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacAnimatorNode.cs b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacAnimatorNode.cs index 61dc9bf..e885504 100644 --- a/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacAnimatorNode.cs +++ b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacAnimatorNode.cs @@ -13,11 +13,13 @@ namespace AnimatorAsCode.V1 { protected readonly AacFlStateMachine ParentMachine; protected readonly IAacDefaultsProvider DefaultsProvider; + protected readonly Transform AnimatorRoot; - protected AacAnimatorNode(AacFlStateMachine parentMachine, IAacDefaultsProvider defaultsProvider) + protected AacAnimatorNode(AacFlStateMachine parentMachine, IAacDefaultsProvider defaultsProvider, Transform animatorRoot) { ParentMachine = parentMachine; DefaultsProvider = defaultsProvider; + AnimatorRoot = animatorRoot; } public TNode LeftOf(AacAnimatorNode otherNode) => MoveNextTo(otherNode, -1, 0); @@ -60,6 +62,13 @@ namespace AnimatorAsCode.V1 return (TNode) this; } + public string ResolveRelativePath(Transform item) + { + return AacInternals.ResolveRelativePath(AnimatorRoot, item); + } + public abstract TBehaviour EnsureBehaviour() where TBehaviour : StateMachineBehaviour; + + public abstract TBehaviour CreateNewBehaviour() where TBehaviour : StateMachineBehaviour; } } diff --git a/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlStates.cs b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlStates.cs index a9de3c9..b7e05ca 100644 --- a/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlStates.cs +++ b/Packages/dev.hai-vr.animator-as-code.v1/V1/Editor/AacFlStates.cs @@ -121,8 +121,8 @@ namespace AnimatorAsCode.V1 private readonly HashSet _stateNames; - internal AacFlStateMachine(AnimatorStateMachine machine, AnimationClip emptyClip, AacBackingAnimator backingAnimator, IAacDefaultsProvider defaultsProvider, AacFlStateMachine parent = null) - : base(parent, defaultsProvider) + internal AacFlStateMachine(AnimatorStateMachine machine, AnimationClip emptyClip, AacBackingAnimator backingAnimator, IAacDefaultsProvider defaultsProvider, Transform animatorRoot, AacFlStateMachine parent = null) + : base(parent, defaultsProvider, animatorRoot) { Machine = machine; _emptyClip = emptyClip; @@ -151,7 +151,7 @@ namespace AnimatorAsCode.V1 public AacFlStateMachine NewSubStateMachine(string name, int x, int y) { var stateMachine = AacInternals.NoUndo(Machine, () => Machine.AddStateMachine(EnsureNameIsDeduplicated(name), GridPosition(x, y))); - var aacMachine = new AacFlStateMachine(stateMachine, _emptyClip, _backingAnimator, DefaultsProvider, this); + var aacMachine = new AacFlStateMachine(stateMachine, _emptyClip, _backingAnimator, DefaultsProvider, AnimatorRoot, this); _defaultsProvider.ConfigureStateMachine(stateMachine); _childNodes.Add(aacMachine); return aacMachine; @@ -191,7 +191,7 @@ namespace AnimatorAsCode.V1 { var state = AacInternals.NoUndo(Machine, () => Machine.AddState(EnsureNameIsDeduplicated(name), GridPosition(x, y))); DefaultsProvider.ConfigureState(state, _emptyClip); - var aacState = new AacFlState(state, this, DefaultsProvider); + var aacState = new AacFlState(state, this, DefaultsProvider, AnimatorRoot); _childNodes.Add(aacState); return aacState; @@ -331,6 +331,11 @@ namespace AnimatorAsCode.V1 return AacInternals.NoUndo(Machine, () => Machine.AddStateMachineBehaviour()); } + + public override TBehaviour CreateNewBehaviour() + { + return AacInternals.NoUndo(Machine, () => Machine.AddStateMachineBehaviour()); + } } public class AacFlState : AacAnimatorNode @@ -338,7 +343,7 @@ namespace AnimatorAsCode.V1 public readonly AnimatorState State; private readonly AnimatorStateMachine _machine; - public AacFlState(AnimatorState state, AacFlStateMachine parentMachine, IAacDefaultsProvider defaultsProvider) : base(parentMachine, defaultsProvider) + public AacFlState(AnimatorState state, AacFlStateMachine parentMachine, IAacDefaultsProvider defaultsProvider, Transform animatorRoot) : base(parentMachine, defaultsProvider, animatorRoot) { State = state; _machine = parentMachine.Machine; @@ -482,6 +487,11 @@ namespace AnimatorAsCode.V1 return AacInternals.NoUndo(State, () => State.AddStateMachineBehaviour()); } + + public override TBehaviour CreateNewBehaviour() + { + return AacInternals.NoUndo(State, () => State.AddStateMachineBehaviour()); + } } public class AacFlTransition : AacFlNewTransitionContinuation diff --git a/Packages/dev.hai-vr.animator-as-code.v1/package.json b/Packages/dev.hai-vr.animator-as-code.v1/package.json index 9a84ea2..ab3601c 100644 --- a/Packages/dev.hai-vr.animator-as-code.v1/package.json +++ b/Packages/dev.hai-vr.animator-as-code.v1/package.json @@ -1,7 +1,7 @@ { "name": "dev.hai-vr.animator-as-code.v1", "displayName": "Animator As Code (Alpha)", - "version": "1.0.9940", + "version": "1.0.9941-alpha.1", "unity": "2019.4", "description": "Base Animator As Code library. This library only requires Unity.", "vrchatVersion" : "2022.1.1",