From 108df78f06ab43ff96df0d417c1ca2c5fb29728b Mon Sep 17 00:00:00 2001 From: bd_ Date: Sat, 17 Sep 2022 09:52:59 -0700 Subject: [PATCH] Support absolute referenced animator merging (#22) also fix a bug where only one animator per layer could be merged, oops. --- .../Editor/MergeAnimatorProcessor.cs | 40 +++++++++++-------- .../Runtime/ModularAvatarMergeAnimator.cs | 7 ++++ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/Packages/net.fushizen.modular-avatar/Editor/MergeAnimatorProcessor.cs b/Packages/net.fushizen.modular-avatar/Editor/MergeAnimatorProcessor.cs index ee727795..d67b62ae 100644 --- a/Packages/net.fushizen.modular-avatar/Editor/MergeAnimatorProcessor.cs +++ b/Packages/net.fushizen.modular-avatar/Editor/MergeAnimatorProcessor.cs @@ -27,37 +27,49 @@ using UnityEditor; using UnityEditor.Animations; using UnityEngine; using VRC.SDK3.Avatars.Components; -using VRC.SDKBase.Editor.BuildPipeline; namespace net.fushizen.modular_avatar.core.editor { internal class MergeAnimatorProcessor { - private const string SAMPLE_PATH_PACKAGE = "Packages/com.vrchat.avatars/Samples/AV3 Demo Assets/Animation/Controllers"; + private const string SAMPLE_PATH_PACKAGE = + "Packages/com.vrchat.avatars/Samples/AV3 Demo Assets/Animation/Controllers"; + private const string SAMPLE_PATH_LEGACY = "Assets/VRCSDK/Examples3/Animation/Controllers"; - + private Dictionary defaultControllers_ = new Dictionary(); - + Dictionary mergeSessions = new Dictionary(); - + internal void OnPreprocessAvatar(GameObject avatarGameObject) { defaultControllers_.Clear(); mergeSessions.Clear(); - + var descriptor = avatarGameObject.GetComponent(); InitSessions(descriptor.baseAnimationLayers); InitSessions(descriptor.specialAnimationLayers); - + var toMerge = avatarGameObject.transform.GetComponentsInChildren(true); foreach (var merge in toMerge) { if (merge.animator == null) continue; + string basePath; + if (merge.pathMode == MergeAnimatorPathMode.Relative) + { + var relativePath = RuntimeUtil.RelativePath(avatarGameObject, merge.gameObject); + basePath = relativePath != "" ? relativePath + "/" : ""; + } + else + { + basePath = ""; + } + if (!mergeSessions.TryGetValue(merge.layerType, out var session)) { session = new AnimatorCombiner(); @@ -66,13 +78,10 @@ namespace net.fushizen.modular_avatar.core.editor { session.AddController("", defaultControllers_[merge.layerType]); } - var relativePath = RuntimeUtil.RelativePath(avatarGameObject, merge.gameObject); - mergeSessions[merge.layerType].AddController( - relativePath != "" ? relativePath + "/" : "", - (AnimatorController) merge.animator - ); } + mergeSessions[merge.layerType].AddController(basePath, (AnimatorController) merge.animator); + if (merge.deleteAttachedAnimator) { var animator = merge.GetComponent(); @@ -95,7 +104,7 @@ namespace net.fushizen.modular_avatar.core.editor if (mergeSessions.TryGetValue(layers[i].type, out var session)) { layers[i].isDefault = false; - layers[i].animatorController = session.Finish(); + layers[i].animatorController = session.Finish(); } } @@ -108,12 +117,11 @@ namespace net.fushizen.modular_avatar.core.editor { var controller = ResolveLayerController(layer); if (controller == null) controller = new AnimatorController(); - + defaultControllers_[layer.type] = controller; } } - - + private static AnimatorController ResolveLayerController(VRCAvatarDescriptor.CustomAnimLayer layer) { diff --git a/Packages/net.fushizen.modular-avatar/Runtime/ModularAvatarMergeAnimator.cs b/Packages/net.fushizen.modular-avatar/Runtime/ModularAvatarMergeAnimator.cs index cc39412d..714dfc61 100644 --- a/Packages/net.fushizen.modular-avatar/Runtime/ModularAvatarMergeAnimator.cs +++ b/Packages/net.fushizen.modular-avatar/Runtime/ModularAvatarMergeAnimator.cs @@ -27,10 +27,17 @@ using VRC.SDK3.Avatars.Components; namespace net.fushizen.modular_avatar.core { + public enum MergeAnimatorPathMode + { + Relative, + Absolute + } + public class ModularAvatarMergeAnimator : AvatarTagComponent { public RuntimeAnimatorController animator; public VRCAvatarDescriptor.AnimLayerType layerType; public bool deleteAttachedAnimator; + public MergeAnimatorPathMode pathMode = MergeAnimatorPathMode.Relative; } } \ No newline at end of file