From d019a5e0ceef655666b4ac103f95ee6cf43730d2 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Fri, 7 Aug 2020 14:50:11 +0900 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E4=BD=93=E3=81=97=E3=81=A6=E7=B6=99?= =?UTF-8?q?=E6=89=BF=E3=81=97=E3=81=AA=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UniVRM/Editor/CustomScriptableWizard.cs | 1 - .../UniVRM/Editor/Format/VRMExporterWizard.cs | 249 +++++++++++++++++- 2 files changed, 245 insertions(+), 5 deletions(-) diff --git a/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs b/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs index 2a84c6189..83045cc32 100644 --- a/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs +++ b/Assets/VRM/UniVRM/Editor/CustomScriptableWizard.cs @@ -6,7 +6,6 @@ using System; using System.Linq; using System.Reflection; using UnityEditor; -// using UnityEditor; using UnityEngine; using uei = UnityEngine.Internal; diff --git a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs index d3f7b5803..60340d3ae 100644 --- a/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs +++ b/Assets/VRM/UniVRM/Editor/Format/VRMExporterWizard.cs @@ -1,13 +1,254 @@ -using System.IO; +using System; +using System.IO; +using System.Linq; +using System.Reflection; using System.Text; using UnityEditor; using UnityEngine; - +using uei = UnityEngine.Internal; namespace VRM { - public class VRMExporterWizard : CustomScriptableWizard + /// + /// エクスポートダイアログ + /// + public class VRMExporterWizard : 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 : VRMExporterWizard + { + return DisplayWizard(title, "Create", ""); + } + + ///*listonly* + public static T DisplayWizard(string title, string createButtonName) where T : VRMExporterWizard + { + return DisplayWizard(title, createButtonName, ""); + } + + ///*listonly* + public static T DisplayWizard(string title, string createButtonName, string otherButtonName) where T : VRMExporterWizard + { + return (T)DisplayWizard(title, typeof(T), createButtonName, otherButtonName); + } + + [uei.ExcludeFromDocsAttribute] + public static VRMExporterWizard DisplayWizard(string title, Type klass, string createButtonName) + { + string otherButtonName = ""; + return DisplayWizard(title, klass, createButtonName, otherButtonName); + } + + [uei.ExcludeFromDocsAttribute] + public static VRMExporterWizard DisplayWizard(string title, Type klass) + { + string otherButtonName = ""; + string createButtonName = "Create"; + return DisplayWizard(title, klass, createButtonName, otherButtonName); + } + + // Creates a wizard. + public static VRMExporterWizard DisplayWizard(string title, Type klass, [uei.DefaultValueAttribute("\"Create\"")] string createButtonName, [uei.DefaultValueAttribute("\"\"")] string otherButtonName) + { + VRMExporterWizard wizard = CreateInstance(klass) as VRMExporterWizard; + 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; } + } + const string EXTENSION = ".vrm"; VRMMeta m_meta; @@ -18,7 +259,7 @@ namespace VRM public static void CreateWizard() { - var wiz = CustomScriptableWizard.DisplayWizard( + var wiz = VRMExporterWizard.DisplayWizard( "VRM Exporter", "Export"); var go = Selection.activeObject as GameObject;