fix: MenuInstaller does not support cloning (#1173)

This commit is contained in:
lilxyzw 2024-09-19 02:48:28 +09:00
parent c11a76642c
commit b1b27a87cb

View File

@ -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<VRCExpressionsMenu> 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);