Inheritance: BaseActions
        public override void Inspector_Body()
        {
            menuScript = target as MenuActions;

            int actionCount = 0;
            foreach(var action in menuScript.actions)
            {
                if (action.ShouldBuild())
                    actionCount += 1;
            }
            if(actionCount > ExpressionsMenu.MAX_CONTROLS)
            {
                EditorGUILayout.HelpBox($"Too many actions are defined, disable or delete until there are only {ExpressionsMenu.MAX_CONTROLS}", MessageType.Error);
            }

            base.Inspector_Body();
        }
        static void BuildExpressionsMenu(MenuActions rootMenu)
        {
            List<MenuActions> menuList = new List<MenuActions>();

            //Create root menu if needed
            if (AvatarDescriptor.expressionsMenu == null)
            {
                AvatarDescriptor.expressionsMenu = ScriptableObject.CreateInstance<ExpressionsMenu>();
                AvatarDescriptor.expressionsMenu.name = "ExpressionsMenu_Root";
                SaveAsset(AvatarDescriptor.expressionsMenu, rootMenu, "Generated");
            }

            //Expressions
            CreateMenu(rootMenu, AvatarDescriptor.expressionsMenu);
            void CreateMenu(MenuActions ourMenu, ExpressionsMenu expressionsMenu)
            {
                //Clear old controls
                List<ExpressionsMenu.Control> oldControls = new List<ExpressionsMenu.Control>();
                oldControls.AddRange(expressionsMenu.controls);
                expressionsMenu.controls.Clear();

                //Create controls from actions
                foreach (var action in ourMenu.actions)
                {
                    if (!action.ShouldBuild())
                        continue;

                    if (action.menuType == MenuAction.MenuType.Button)
                    {
                        //Create control
                        var control = new ExpressionsMenu.Control();
                        control.name = action.name;
                        control.icon = action.icon;
                        control.type = ExpressionsMenu.Control.ControlType.Button;
                        control.parameter = new ExpressionsMenu.Control.Parameter();
                        control.parameter.name = action.parameter;
                        control.value = action.controlValue;
                        expressionsMenu.controls.Add(control);
                    }
                    else if (action.menuType == MenuAction.MenuType.Toggle)
                    {
                        //Create control
                        var control = new ExpressionsMenu.Control();
                        control.name = action.name;
                        control.icon = action.icon;
                        control.type = ExpressionsMenu.Control.ControlType.Toggle;
                        control.parameter = new ExpressionsMenu.Control.Parameter();
                        control.parameter.name = action.parameter;
                        control.value = action.controlValue;
                        expressionsMenu.controls.Add(control);
                    }
                    else if (action.menuType == MenuAction.MenuType.Slider)
                    {
                        //Create control
                        var control = new ExpressionsMenu.Control();
                        control.name = action.name;
                        control.icon = action.icon;
                        control.type = ExpressionsMenu.Control.ControlType.RadialPuppet;
                        control.subParameters = new ExpressionsMenu.Control.Parameter[1];
                        control.subParameters[0] = new ExpressionsMenu.Control.Parameter();
                        control.subParameters[0].name = action.parameter;
                        control.value = action.controlValue;
                        expressionsMenu.controls.Add(control);
                    }
                    else if (action.menuType == MenuAction.MenuType.SubMenu)
                    {
                        //Recover old sub-menu
                        ExpressionsMenu expressionsSubMenu = null;
                        foreach (var controlIter in oldControls)
                        {
                            if (controlIter.name == action.name)
                            {
                                expressionsSubMenu = controlIter.subMenu;
                                break;
                            }
                        }

                        //Create if needed
                        if (expressionsSubMenu == null)
                        {
                            expressionsSubMenu = ScriptableObject.CreateInstance<ExpressionsMenu>();
                            expressionsSubMenu.name = "ExpressionsMenu_" + action.name;
                            SaveAsset(expressionsSubMenu, rootMenu, "Generated");
                        }

                        //Create control
                        var control = new ExpressionsMenu.Control();
                        control.name = action.name;
                        control.icon = action.icon;
                        control.type = ExpressionsMenu.Control.ControlType.SubMenu;
                        control.subMenu = expressionsSubMenu;
                        expressionsMenu.controls.Add(control);

                        //Populate sub-menu
                        CreateMenu(action.subMenu, expressionsSubMenu);
                    }
                    else if (action.menuType == MenuAction.MenuType.PreExisting)
                    {
                        //Recover old control
                        foreach (var controlIter in oldControls)
                        {
                            if (controlIter.name == action.name)
                            {
                                oldControls.Remove(controlIter);
                                expressionsMenu.controls.Add(controlIter);
                                break;
                            }
                        }
                    }
                }

                //Save prefab
                EditorUtility.SetDirty(expressionsMenu);
            }

            //Save all assets
            AssetDatabase.SaveAssets();
        }