From b1b27a87cbaa381436c382b1c0560d9b9d095320 Mon Sep 17 00:00:00 2001 From: lilxyzw Date: Thu, 19 Sep 2024 02:48:28 +0900 Subject: [PATCH] fix: MenuInstaller does not support cloning (#1173) --- Editor/MenuInstallHook.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Editor/MenuInstallHook.cs b/Editor/MenuInstallHook.cs index 2d1efd81..4d285ae7 100644 --- a/Editor/MenuInstallHook.cs +++ b/Editor/MenuInstallHook.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; using nadena.dev.modular_avatar.core.editor.menu; +using nadena.dev.ndmf; using UnityEditor; using UnityEngine; using VRC.SDK3.Avatars.Components; @@ -45,6 +46,26 @@ namespace nadena.dev.modular_avatar.core.editor avatar.expressionsMenu = menu; context.ClonedMenus[menu] = menu; } + else + { + IEnumerable GetMenus(VRCExpressionsMenu menu) + { + if (!menu) yield break; + foreach (var m in menu.controls + .Where(control => control.type == VRCExpressionsMenu.Control.ControlType.SubMenu) + .SelectMany(control => GetMenus(control.subMenu))) + yield return m; + yield return menu; + } + var currentMenus = GetMenus(avatar.expressionsMenu) + .ToDictionary(menu => ObjectRegistry.GetReference(menu), menu => menu); + foreach (var menuInstaller in menuInstallers) + { + var reference = ObjectRegistry.GetReference(menuInstaller.installTargetMenu); + if (currentMenus.ContainsKey(reference)) + menuInstaller.installTargetMenu = currentMenus[reference]; + } + } _rootMenu = avatar.expressionsMenu; var virtualMenu = VirtualMenu.ForAvatar(avatar, context);