From 2fa86728233d2a8facc0766d762f4804e35f2db3 Mon Sep 17 00:00:00 2001 From: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> Date: Mon, 14 Oct 2024 02:37:00 +0900 Subject: [PATCH] chore: use InitializeOnLoadMethod instead of reflection to get boneNamePattern from Editor Assembly --- Editor/HeuristicBoneMapper.cs | 6 ++++++ Runtime/ModularAvatarMergeArmature.cs | 21 +++------------------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Editor/HeuristicBoneMapper.cs b/Editor/HeuristicBoneMapper.cs index 5679045a..3b11051f 100644 --- a/Editor/HeuristicBoneMapper.cs +++ b/Editor/HeuristicBoneMapper.cs @@ -243,6 +243,12 @@ namespace nadena.dev.modular_avatar.core.editor internal static readonly ImmutableDictionary> NameToBoneMap; internal static readonly ImmutableDictionary> BoneToNameMap; + [InitializeOnLoadMethod] + private static void InsertboneNamePatternsToRuntime() + { + ModularAvatarMergeArmature.boneNamePatterns = boneNamePatterns; + } + static HeuristicBoneMapper() { var pat_end_side = new Regex(@"[_\.]([LR])$"); diff --git a/Runtime/ModularAvatarMergeArmature.cs b/Runtime/ModularAvatarMergeArmature.cs index 445ae685..7f7c3225 100644 --- a/Runtime/ModularAvatarMergeArmature.cs +++ b/Runtime/ModularAvatarMergeArmature.cs @@ -61,6 +61,9 @@ namespace nadena.dev.modular_avatar.core public bool mangleNames = true; + // Inserted from HeuristicBoneMapper(Editor Assembly) with InitializeOnLoadMethod + // We use raw `boneNamePatterns` instead of `BoneToNameMap` because BoneToNameMap requires matching with normalized bone name, but normalizing makes raw prefix/suffix unavailable. + internal static string[][] boneNamePatterns; private ArmatureLockController _lockController; internal Transform MapBone(Transform bone) @@ -200,21 +203,6 @@ namespace nadena.dev.modular_avatar.core } } - private static class InferWithHeuristic - { - internal static Type HeuristicBoneMapper; - static InferWithHeuristic() - { - foreach(var assembly in AppDomain.CurrentDomain.GetAssemblies()) - { - HeuristicBoneMapper = assembly.GetType("nadena.dev.modular_avatar.core.editor.HeuristicBoneMapper"); - if (HeuristicBoneMapper != null) return; - } - if (HeuristicBoneMapper == null) - throw new InvalidOperationException("HeuristicBoneMapper not found"); - } - } - public void InferPrefixSuffix() { // We only infer if targeting the armature (below the Hips bone) @@ -233,9 +221,6 @@ namespace nadena.dev.modular_avatar.core var mergeName = transform.GetChild(0).name; var isInferred = false; - // We use raw `boneNamePatterns` instead of `BoneToNameMap` because BoneToNameMap requires matching with normalized bone name, but normalizing makes raw prefix/suffix unavailable. - string[][] boneNamePatterns = (string[][])InferWithHeuristic.HeuristicBoneMapper.GetField("boneNamePatterns", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static).GetValue(null); - foreach (var hipNameCandidate in boneNamePatterns[(int)HumanBodyBones.Hips]) { var prefixLength = mergeName.IndexOf(hipNameCandidate, StringComparison.InvariantCultureIgnoreCase);