mirror of
https://github.com/bdunderscore/modular-avatar.git
synced 2025-05-10 13:19:01 +08:00
add menu serialization logic
This commit is contained in:
parent
0bc1c6c88e
commit
19e42f3422
@ -3,6 +3,7 @@ using nadena.dev.modular_avatar.core;
|
|||||||
using nadena.dev.modular_avatar.core.editor.menu;
|
using nadena.dev.modular_avatar.core.editor.menu;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
|
using UnityEditor.VersionControl;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using VRC.SDK3.Avatars.ScriptableObjects;
|
using VRC.SDK3.Avatars.ScriptableObjects;
|
||||||
|
|
||||||
@ -470,6 +471,59 @@ namespace modular_avatar_tests.VirtualMenuTests
|
|||||||
AssertControlEquals(menu_b.controls[0], rootNode.Controls[0]);
|
AssertControlEquals(menu_b.controls[0], rootNode.Controls[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestSerializeMenu()
|
||||||
|
{
|
||||||
|
var menu_a = Create<VRCExpressionsMenu>("test");
|
||||||
|
var menu_b = Create<VRCExpressionsMenu>("test2");
|
||||||
|
var menu_c = Create<VRCExpressionsMenu>("test3");
|
||||||
|
|
||||||
|
menu_a.controls = new List<VRCExpressionsMenu.Control>()
|
||||||
|
{
|
||||||
|
GenerateTestControl(),
|
||||||
|
GenerateTestSubmenu(menu_b),
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_b.controls = new List<VRCExpressionsMenu.Control>()
|
||||||
|
{
|
||||||
|
GenerateTestControl(),
|
||||||
|
GenerateTestSubmenu(menu_c),
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_c.controls = new List<VRCExpressionsMenu.Control>()
|
||||||
|
{
|
||||||
|
GenerateTestSubmenu(menu_a),
|
||||||
|
};
|
||||||
|
|
||||||
|
var virtualMenu = new VirtualMenu(menu_a);
|
||||||
|
virtualMenu.FreezeMenu();
|
||||||
|
|
||||||
|
var assetSet = new HashSet<UnityEngine.Object>();
|
||||||
|
var serialized = virtualMenu.SerializeMenu(obj => assetSet.Add(obj));
|
||||||
|
|
||||||
|
Assert.AreEqual(3, assetSet.Count);
|
||||||
|
Assert.AreEqual(2, serialized.controls.Count);
|
||||||
|
|
||||||
|
AssertControlEquals(menu_a.controls[0], serialized.controls[0]);
|
||||||
|
AssertControlEquals(menu_a.controls[1], serialized.controls[1]);
|
||||||
|
|
||||||
|
var serialized_b = serialized.controls[1].subMenu;
|
||||||
|
Assert.AreEqual(2, serialized_b.controls.Count);
|
||||||
|
|
||||||
|
AssertControlEquals(menu_b.controls[0], serialized_b.controls[0]);
|
||||||
|
AssertControlEquals(menu_b.controls[1], serialized_b.controls[1]);
|
||||||
|
|
||||||
|
var serialized_c = serialized_b.controls[1].subMenu;
|
||||||
|
Assert.AreEqual(1, serialized_c.controls.Count);
|
||||||
|
|
||||||
|
AssertControlEquals(menu_c.controls[0], serialized_c.controls[0]);
|
||||||
|
|
||||||
|
Assert.True(assetSet.Contains(serialized));
|
||||||
|
Assert.True(assetSet.Contains(serialized_b));
|
||||||
|
Assert.True(assetSet.Contains(serialized_c));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ModularAvatarMenuInstaller CreateInstaller(string name)
|
ModularAvatarMenuInstaller CreateInstaller(string name)
|
||||||
{
|
{
|
||||||
GameObject obj = new GameObject();
|
GameObject obj = new GameObject();
|
||||||
|
@ -174,6 +174,45 @@ namespace nadena.dev.modular_avatar.core.editor.menu
|
|||||||
ResolveNode(RootMenuKey);
|
ResolveNode(RootMenuKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal VRCExpressionsMenu SerializeMenu(Action<UnityEngine.Object> SaveAsset)
|
||||||
|
{
|
||||||
|
Dictionary<object, VRCExpressionsMenu> serializedMenus = new Dictionary<object, VRCExpressionsMenu>();
|
||||||
|
|
||||||
|
return Serialize(RootMenuKey);
|
||||||
|
|
||||||
|
VRCExpressionsMenu Serialize(object menuKey)
|
||||||
|
{
|
||||||
|
if (menuKey == null) return null;
|
||||||
|
if (serializedMenus.TryGetValue(menuKey, out var menu)) return menu;
|
||||||
|
if (!_resolvedMenu.TryGetValue(menuKey, out var node)) return null;
|
||||||
|
|
||||||
|
menu = ScriptableObject.CreateInstance<VRCExpressionsMenu>();
|
||||||
|
serializedMenus[menuKey] = menu;
|
||||||
|
menu.controls = node.Controls.Select(c =>
|
||||||
|
{
|
||||||
|
var control = new VRCExpressionsMenu.Control();
|
||||||
|
control.name = c.name;
|
||||||
|
control.type = c.type;
|
||||||
|
control.parameter = new VRCExpressionsMenu.Control.Parameter() {name = c.parameter.name};
|
||||||
|
control.value = c.value;
|
||||||
|
control.icon = c.icon;
|
||||||
|
control.style = c.style;
|
||||||
|
control.labels = c.labels.ToArray();
|
||||||
|
control.subParameters = c.subParameters.Select(p => new VRCExpressionsMenu.Control.Parameter()
|
||||||
|
{
|
||||||
|
name = p.name
|
||||||
|
}).ToArray();
|
||||||
|
control.subMenu = Serialize(c.SubmenuNode?.NodeKey);
|
||||||
|
|
||||||
|
return control;
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
|
SaveAsset(menu);
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private HashSet<object> _sourceTrace = null;
|
private HashSet<object> _sourceTrace = null;
|
||||||
|
|
||||||
private MenuNode ResolveNode(object nodeKey)
|
private MenuNode ResolveNode(object nodeKey)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user