using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace VRM { [CustomEditor(typeof(VRMMeta))] public class VRMMetaEditor : Editor { //VRMMeta m_target; SerializedProperty m_ScriptProp; SerializedProperty m_VRMMetaObjectProp; SerializedProperty VRMMetaObjectProp { get { return m_VRMMetaObjectProp; } set { if (m_VRMMetaObjectProp == value) return; m_VRMMetaObjectProp = value; // get props Debug.Log("clear"); m_propMap.Clear(); } } Dictionary m_propMap = new Dictionary(); void InitMap(SerializedObject so) { if (VRMMetaObjectProp == null) return; //if (m_propMap.Count > 0) return; m_propMap.Clear(); for (var it = so.GetIterator(); it.NextVisible(true);) { if (it.name == "m_Script") continue; //Debug.LogFormat("{0}", it.name); m_propMap.Add(it.name, so.FindProperty(it.name)); } } private void OnEnable() { //m_target = (VRMMeta)target; m_ScriptProp = serializedObject.FindProperty("m_Script"); m_VRMMetaObjectProp = serializedObject.FindProperty("Meta"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(m_ScriptProp, true); EditorGUILayout.PropertyField(m_VRMMetaObjectProp, true); serializedObject.ApplyModifiedProperties(); EditorGUILayout.Space(); #if true if (m_VRMMetaObjectProp.objectReferenceValue != null) { VRMMetaObjectGUI(new SerializedObject(m_VRMMetaObjectProp.objectReferenceValue)); } #else if(m_target!=null && m_target.Meta != null) { VRMMetaObjectGUI(new SerializedObject(m_target.Meta)); } #endif } bool m_foldoutInfo = true; bool m_foldoutPersmission=true; bool m_foldoutDistribution=true; void VRMMetaObjectGUI(SerializedObject so) { InitMap(so); if (m_propMap == null || m_propMap.Count==0) return; so.Update(); m_foldoutInfo = EditorGUILayout.Foldout(m_foldoutInfo, "Information"); if (m_foldoutInfo) { EditorGUILayout.PropertyField(m_propMap["Title"]); EditorGUILayout.PropertyField(m_propMap["Version"]); EditorGUILayout.PropertyField(m_propMap["Author"]); EditorGUILayout.PropertyField(m_propMap["ContactInformation"]); EditorGUILayout.PropertyField(m_propMap["Reference"]); var thumbnail = m_propMap["Thumbnail"]; thumbnail.objectReferenceValue = TextureField("", (Texture2D)thumbnail.objectReferenceValue, 100); } m_foldoutPersmission = EditorGUILayout.Foldout(m_foldoutPersmission, "Personation / Characterization Permission"); if (m_foldoutPersmission) { EditorGUILayout.PropertyField(m_propMap["AllowedUser"], new GUIContent("A person who can perform with this avatar"), false); EditorGUILayout.PropertyField(m_propMap["ViolentUssage"], new GUIContent("Violent acts using this avatar")); EditorGUILayout.PropertyField(m_propMap["SexualUssage"], new GUIContent("Sexuality acts using this avatar")); EditorGUILayout.PropertyField(m_propMap["CommercialUssage"], new GUIContent("For commercial use")); EditorGUILayout.PropertyField(m_propMap["OtherPermissionUrl"], new GUIContent("Other License Url")); } m_foldoutDistribution = EditorGUILayout.Foldout(m_foldoutDistribution, "Redistribution / Modifications License"); if (m_foldoutDistribution) { var licenseType = m_propMap["LicenseType"]; EditorGUILayout.PropertyField(licenseType); if ((LicenseType)licenseType.intValue == LicenseType.Other) { EditorGUILayout.PropertyField(m_propMap["OtherLicenseUrl"]); } } so.ApplyModifiedProperties(); } private static Texture2D TextureField(string name, Texture2D texture, int size) { GUILayout.BeginHorizontal(); var style = new GUIStyle(GUI.skin.label); style.alignment = TextAnchor.UpperCenter; //style.fixedWidth = size; GUILayout.Label(name, style); var result = (Texture2D)EditorGUILayout.ObjectField(texture, typeof(Texture2D), false, GUILayout.Width(size), GUILayout.Height(size)); GUILayout.EndVertical(); return result; } } }