diff --git a/Editor/Animation/AnimationDatabase.cs b/Editor/Animation/AnimationDatabase.cs index 4f5c8647..f85f1177 100644 --- a/Editor/Animation/AnimationDatabase.cs +++ b/Editor/Animation/AnimationDatabase.cs @@ -84,6 +84,9 @@ namespace nadena.dev.modular_avatar.animation private List _clipCommitActions = new List(); private List _clips = new List(); +#if MA_VRCSDK3_AVATARS_3_5_2_OR_NEWER + private HashSet _playAudios = new HashSet(); +#endif private Dictionary> _pathToClip = null; @@ -174,6 +177,16 @@ namespace nadena.dev.modular_avatar.animation if (processClip == null) processClip = (_) => { }; +#if MA_VRCSDK3_AVATARS_3_5_2_OR_NEWER + foreach (var behavior in state.behaviours) + { + if (behavior is VRCAnimatorPlayAudio playAudio) + { + _playAudios.Add(playAudio); + } + } +#endif + if (state.motion == null) return; var clipHolder = RegisterMotion(state.motion, state, processClip, _originalToHolder); @@ -190,6 +203,16 @@ namespace nadena.dev.modular_avatar.animation } } +#if MA_VRCSDK3_AVATARS_3_5_2_OR_NEWER + internal void ForeachPlayAudio(Action processPlayAudio) + { + foreach (var playAudioHolder in _playAudios) + { + processPlayAudio(playAudioHolder); + } + } +#endif + /// /// Returns a list of clips which touched the given _original_ path. This path is subject to basepath remapping, /// but not object movement remapping. diff --git a/Editor/Animation/AnimatorCombiner.cs b/Editor/Animation/AnimatorCombiner.cs index 12bf9c59..23647280 100644 --- a/Editor/Animation/AnimatorCombiner.cs +++ b/Editor/Animation/AnimatorCombiner.cs @@ -496,7 +496,7 @@ namespace nadena.dev.modular_avatar.animation for (int i = 0; i < overrideBehaviors.Length; i++) { overrideBehaviors[i] = _deepClone.DoClone(overrideBehaviors[i]); - AdjustBehavior(overrideBehaviors[i]); + AdjustBehavior(overrideBehaviors[i], basePath); } newLayer.SetOverrideBehaviours((AnimatorState)_cloneMap[state], overrideBehaviors); @@ -578,7 +578,7 @@ namespace nadena.dev.modular_avatar.animation { foreach (var behavior in state.behaviours) { - AdjustBehavior(behavior); + AdjustBehavior(behavior, basePath); } } @@ -586,7 +586,7 @@ namespace nadena.dev.modular_avatar.animation return asm; } - private void AdjustBehavior(StateMachineBehaviour behavior) + private void AdjustBehavior(StateMachineBehaviour behavior, string basePath) { #if MA_VRCSDK3_AVATARS switch (behavior) @@ -598,6 +598,16 @@ namespace nadena.dev.modular_avatar.animation layerControl.layer += _controllerBaseLayer; break; } +#if MA_VRCSDK3_AVATARS_3_5_2_OR_NEWER + case VRCAnimatorPlayAudio playAudio: + { + if (!string.IsNullOrEmpty(playAudio.SourcePath) && !string.IsNullOrEmpty(basePath) && !playAudio.SourcePath.StartsWith(basePath)) + { + playAudio.SourcePath = $"{basePath}/{playAudio.SourcePath}"; + } + break; + } +#endif } #endif } diff --git a/Editor/Animation/PathMappings.cs b/Editor/Animation/PathMappings.cs index b44f570f..3e80c66a 100644 --- a/Editor/Animation/PathMappings.cs +++ b/Editor/Animation/PathMappings.cs @@ -8,6 +8,9 @@ using nadena.dev.ndmf.util; using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; +#if MA_VRCSDK3_AVATARS_3_5_2_OR_NEWER +using VRC.SDK3.Avatars.Components; +#endif #endregion @@ -274,6 +277,14 @@ namespace nadena.dev.modular_avatar.animation return newClip; } +#if MA_VRCSDK3_AVATARS_3_5_2_OR_NEWER + private VRCAnimatorPlayAudio ApplyMappingsToPlayAudio(VRCAnimatorPlayAudio audio) + { + audio.SourcePath = MapPath(audio.SourcePath, true); + return audio; + } +#endif + internal void OnDeactivate(BuildContext context) { Dictionary clipCache = new Dictionary(); @@ -286,6 +297,13 @@ namespace nadena.dev.modular_avatar.animation } }); +#if MA_VRCSDK3_AVATARS_3_5_2_OR_NEWER + _animationDatabase.ForeachPlayAudio(playAudio => + { + ApplyMappingsToPlayAudio(playAudio); + }); +#endif + foreach (var listener in context.AvatarRootObject.GetComponentsInChildren()) { listener.OnCommitObjectRenames(context, this); diff --git a/Editor/nadena.dev.modular-avatar.core.editor.asmdef b/Editor/nadena.dev.modular-avatar.core.editor.asmdef index d84a270d..76a60059 100644 --- a/Editor/nadena.dev.modular-avatar.core.editor.asmdef +++ b/Editor/nadena.dev.modular-avatar.core.editor.asmdef @@ -43,6 +43,11 @@ "name": "com.vrchat.avatars", "expression": "", "define": "MA_VRCSDK3_AVATARS" + }, + { + "name": "com.vrchat.avatars", + "expression": "3.5.2", + "define": "MA_VRCSDK3_AVATARS_3_5_2_OR_NEWER" } ], "noEngineReferences": false