From adae26ecd0dab83684fdd5cb844dfda27e33a446 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 20 Jul 2020 19:38:49 +0900 Subject: [PATCH] =?UTF-8?q?ScriptableWizard=E3=82=92=E3=82=AB=E3=82=B9?= =?UTF-8?q?=E3=82=BF=E3=83=9E=E3=82=A4=E3=82=BA=E3=81=99=E3=82=8B=E3=81=B9?= =?UTF-8?q?=E3=81=8F=E3=80=81CustomScriptableWizard=E3=82=92=E5=B0=8E?= =?UTF-8?q?=E5=85=A5(UnityCsReference=E3=81=AEScriptableWizard.cs=E3=82=92?= =?UTF-8?q?=E3=83=99=E3=83=BC=E3=82=B9=E3=81=AB=E5=8D=98=E7=B4=94=E5=8C=96?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=82=82=E3=81=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UniVRM/Editor/CustomScriptableWizard.cs | 253 ++++++++++++++++++ .../Editor/CustomScriptableWizard.cs.meta | 11 + .../UniVRM/Editor/Format/VRMExporterWizard.cs | 4 +- 3 files changed, 266 insertions(+), 2 deletions(-) create mode 100644 Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs create mode 100644 Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs.meta diff --git a/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs b/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs new file mode 100644 index 000000000..2a84c6189 --- /dev/null +++ b/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs @@ -0,0 +1,253 @@ +// Unity C# reference source +// Copyright (c) Unity Technologies. For terms of use, see +// https://unity3d.com/legal/licenses/Unity_Reference_Only_License + +using System; +using System.Linq; +using System.Reflection; +using UnityEditor; +// using UnityEditor; +using UnityEngine; +using uei = UnityEngine.Internal; + +namespace VRM +{ + // Derive from this class to create an editor wizard. + public class CustomScriptableWizard : EditorWindow + { + Editor m_Inspector; + + private string m_HelpString = ""; + private string m_ErrorString = ""; + private bool m_IsValid = true; + private Vector2 m_ScrollPosition; + private string m_CreateButton = "Create"; + private string m_OtherButton = ""; + + private void OnDestroy() + { + UnityEditor.Editor.DestroyImmediate(m_Inspector); + } + + private void InvokeWizardUpdate() + { + const BindingFlags kInstanceInvokeFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy; + MethodInfo method = GetType().GetMethod("OnWizardUpdate", kInstanceInvokeFlags); + if (method != null) + method.Invoke(this, null); + } + + private class Styles + { + public static string errorText = "Wizard Error"; + public static string box = "Wizard Box"; + } + + public delegate Vector2 BeginVerticalScrollViewFunc(Vector2 scrollPosition, bool alwaysShowVertical, GUIStyle verticalScrollbar, GUIStyle background, params GUILayoutOption[] options); + static BeginVerticalScrollViewFunc s_func; + static BeginVerticalScrollViewFunc BeginVerticalScrollView + { + get + { + if (s_func is null) + { + var methods = typeof(EditorGUILayout).GetMethods(BindingFlags.Static | BindingFlags.NonPublic).Where(x => x.Name == "BeginVerticalScrollView").ToArray(); + var method = methods.First(x => x.GetParameters()[1].ParameterType == typeof(bool)); + s_func = (BeginVerticalScrollViewFunc)method.CreateDelegate(typeof(BeginVerticalScrollViewFunc)); + } + return s_func; + } + } + + + //@TODO: Force repaint if scripts recompile + private void OnGUI() + { + EditorGUIUtility.labelWidth = 150; + GUILayout.Label(m_HelpString, EditorStyles.wordWrappedLabel, GUILayout.ExpandHeight(true)); + + // Render contents using Generic Inspector GUI + m_ScrollPosition = BeginVerticalScrollView(m_ScrollPosition, false, GUI.skin.verticalScrollbar, "OL Box"); + GUIUtility.GetControlID(645789, FocusType.Passive); + bool modified = DrawWizardGUI(); + EditorGUILayout.EndScrollView(); + + // Create and Other Buttons + GUILayout.BeginVertical(); + if (m_ErrorString != string.Empty) + GUILayout.Label(m_ErrorString, Styles.errorText, GUILayout.MinHeight(32)); + else + GUILayout.Label(string.Empty, GUILayout.MinHeight(32)); + GUILayout.FlexibleSpace(); + + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUI.enabled = m_IsValid; + + const BindingFlags kInstanceInvokeFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy; + if (m_OtherButton != "" && GUILayout.Button(m_OtherButton, GUILayout.MinWidth(100))) + { + MethodInfo method = GetType().GetMethod("OnWizardOtherButton", kInstanceInvokeFlags); + if (method != null) + { + method.Invoke(this, null); + GUIUtility.ExitGUI(); + } + else + Debug.LogError("OnWizardOtherButton has not been implemented in script"); + } + + if (m_CreateButton != "" && GUILayout.Button(m_CreateButton, GUILayout.MinWidth(100))) + { + MethodInfo method = GetType().GetMethod("OnWizardCreate", kInstanceInvokeFlags); + if (method != null) + method.Invoke(this, null); + else + Debug.LogError("OnWizardCreate has not been implemented in script"); + Close(); + GUIUtility.ExitGUI(); + } + GUI.enabled = true; + + GUILayout.EndHorizontal(); + GUILayout.EndVertical(); + if (modified) + InvokeWizardUpdate(); + + GUILayout.Space(8); + } + + protected virtual bool DrawWizardGUI() + { + if (m_Inspector == null) + { + m_Inspector = Editor.CreateEditor(this); + } + m_Inspector.OnInspectorGUI(); + return true; + } + + // Creates a wizard. + public static T DisplayWizard(string title) where T : CustomScriptableWizard + { + return DisplayWizard(title, "Create", ""); + } + + ///*listonly* + public static T DisplayWizard(string title, string createButtonName) where T : CustomScriptableWizard + { + return DisplayWizard(title, createButtonName, ""); + } + + ///*listonly* + public static T DisplayWizard(string title, string createButtonName, string otherButtonName) where T : CustomScriptableWizard + { + return (T)DisplayWizard(title, typeof(T), createButtonName, otherButtonName); + } + + [uei.ExcludeFromDocsAttribute] + public static CustomScriptableWizard DisplayWizard(string title, Type klass, string createButtonName) + { + string otherButtonName = ""; + return DisplayWizard(title, klass, createButtonName, otherButtonName); + } + + [uei.ExcludeFromDocsAttribute] + public static CustomScriptableWizard DisplayWizard(string title, Type klass) + { + string otherButtonName = ""; + string createButtonName = "Create"; + return DisplayWizard(title, klass, createButtonName, otherButtonName); + } + + // Creates a wizard. + public static CustomScriptableWizard DisplayWizard(string title, Type klass, [uei.DefaultValueAttribute("\"Create\"")] string createButtonName, [uei.DefaultValueAttribute("\"\"")] string otherButtonName) + { + CustomScriptableWizard wizard = CreateInstance(klass) as CustomScriptableWizard; + wizard.m_CreateButton = createButtonName; + wizard.m_OtherButton = otherButtonName; + wizard.titleContent = new GUIContent(title); + if (wizard != null) + { + wizard.InvokeWizardUpdate(); + wizard.ShowUtility(); + } + return wizard; + } + + // // Magic Methods + + // // This is called when the wizard is opened or whenever the user changes something in the wizard. + // void OnWizardUpdate(); + + // // This is called when the user clicks on the Create button. + // void OnWizardCreate(); + + // Allows you to set the help text of the wizard. + public string helpString + { + get { return m_HelpString; } + set + { + var newString = value ?? string.Empty; + if (m_HelpString != newString) + { + m_HelpString = newString; + Repaint(); + } + } + } + + // Allows you to set the error text of the wizard. + public string errorString + { + get { return m_ErrorString; } + set + { + var newString = value ?? string.Empty; + if (m_ErrorString != newString) + { + m_ErrorString = newString; + Repaint(); + } + } + } + + // Allows you to set the create button text of the wizard. + public string createButtonName + { + get { return m_CreateButton; } + set + { + var newString = value ?? string.Empty; + if (m_CreateButton != newString) + { + m_CreateButton = newString; + Repaint(); + } + } + } + + // Allows you to set the other button text of the wizard. + public string otherButtonName + { + get { return m_OtherButton; } + set + { + var newString = value ?? string.Empty; + if (m_OtherButton != newString) + { + m_OtherButton = newString; + Repaint(); + } + } + } + + // Allows you to enable and disable the wizard create button, so that the user can not click it. + public bool isValid + { + get { return m_IsValid; } + set { m_IsValid = value; } + } + } +} diff --git a/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs.meta b/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs.meta new file mode 100644 index 000000000..45882814d --- /dev/null +++ b/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c18c8a8a304985b4180418b42e544ac5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs index 90b1faa12..d3f7b5803 100644 --- a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs +++ b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs @@ -6,7 +6,7 @@ using UnityEngine; namespace VRM { - public class VRMExporterWizard : ScriptableWizard + public class VRMExporterWizard : CustomScriptableWizard { const string EXTENSION = ".vrm"; @@ -18,7 +18,7 @@ namespace VRM public static void CreateWizard() { - var wiz = ScriptableWizard.DisplayWizard( + var wiz = CustomScriptableWizard.DisplayWizard( "VRM Exporter", "Export"); var go = Selection.activeObject as GameObject;