private void OnPropertyGUI(Rect position, SerializedProperty property, GUIContent label) { Rect lower; Rect buttonRect = new Rect(); var scene = property.FindPropertyRelative("_sceneAsset")?.objectReferenceValue; if (scene == null) { // Update values cause the build index could've changed property.FindPropertyRelative("_sceneName").stringValue = ""; property.FindPropertyRelative("_scenePath").stringValue = ""; property.FindPropertyRelative("_buildIndex").intValue = -1; } position = IMGUIUtils.SnipRectV(position, EditorGUIUtility.singleLineHeight, out lower, 2f); if (HasValidBuildIndex(property)) { if (scene != null) { // Update values cause the build index could've changed property.FindPropertyRelative("_sceneName").stringValue = scene.name; property.FindPropertyRelative("_scenePath").stringValue = AssetDatabase.GetAssetPath(scene); property.FindPropertyRelative("_buildIndex").intValue = SceneUtility.GetBuildIndexByScenePath( property.FindPropertyRelative("_scenePath").stringValue ); } } else { position = IMGUIUtils.SnipRectH(position, position.width - 70, out buttonRect, 6f); property.FindPropertyRelative("_buildIndex").intValue = -1; } SceneAsset sceneAsset = scene as SceneAsset; position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); EditorGUI.BeginChangeCheck(); scene = EditorGUI.ObjectField(position, scene, typeof(SceneAsset), false); if (EditorGUI.EndChangeCheck()) { property.FindPropertyRelative("_sceneAsset").objectReferenceValue = scene; sceneAsset = scene as SceneAsset; if (sceneAsset != null) { property.FindPropertyRelative("_sceneName").stringValue = scene.name; property.FindPropertyRelative("_scenePath").stringValue = AssetDatabase.GetAssetPath(scene); property.FindPropertyRelative("_buildIndex").intValue = SceneUtility.GetBuildIndexByScenePath( property.FindPropertyRelative("_scenePath").stringValue ); } } if (property.FindPropertyRelative("_buildIndex").intValue != -1) { return; } if (scene != null && scene is SceneAsset) { EditorGUI.HelpBox(lower, "Scene is not added in the build settings", MessageType.Warning); if (GUI.Button(buttonRect, "Fix Now")) { AddSceneToBuildSettings(sceneAsset); } } }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { if (property.serializedObject.isEditingMultipleObjects) { EditorGUI.PropertyField(position, property, label, true); return; } EditorGUI.BeginProperty(position, label, property); DrawerData drawerData = GetDrawerData(property.propertyPath); var isCreatingSO = drawerData.UserClickedToCreateAtom && property.objectReferenceValue == null; var restWidth = drawerData.UserClickedToCreateAtom ? 50 : 58; var gutter = drawerData.UserClickedToCreateAtom ? 2f : 6f; Rect restRect = new Rect(); Rect warningRect = new Rect(); if (drawerData.WarningText.Length > 0) { position = IMGUIUtils.SnipRectV(position, EditorGUIUtility.singleLineHeight, out warningRect, 2f); } if (property.objectReferenceValue == null) { position = IMGUIUtils.SnipRectH(position, position.width - restWidth, out restRect, gutter); } var defaultGUIColor = GUI.color; GUI.color = isCreatingSO ? Color.yellow : defaultGUIColor; position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), isCreatingSO && label != GUIContent.none ? new GUIContent("Name of New Atom") : label); GUI.color = defaultGUIColor; var indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; GUI.SetNextControlName(NAMING_FIELD_CONTROL_NAME); drawerData.NameOfNewAtom = EditorGUI.TextField(isCreatingSO ? position : Rect.zero, drawerData.NameOfNewAtom); if (!isCreatingSO) { EditorGUI.BeginChangeCheck(); var obj = EditorGUI.ObjectField(position, property.objectReferenceValue, typeof(T), false); if (EditorGUI.EndChangeCheck()) { property.objectReferenceValue = obj; } } if (property.objectReferenceValue == null) { if (isCreatingSO) { var buttonWidth = 24; Rect secondButtonRect; Rect firstButtonRect = IMGUIUtils.SnipRectH(restRect, restRect.width - buttonWidth, out secondButtonRect, gutter); if (GUI.Button(firstButtonRect, "✓") || (Event.current.keyCode == KeyCode.Return && GUI.GetNameOfFocusedControl() == NAMING_FIELD_CONTROL_NAME)) { if (drawerData.NameOfNewAtom.Length > 0) { try { string path = AssetDatabase.GetAssetPath(property.serializedObject.targetObject); path = path == "" ? "Assets/" : Path.GetDirectoryName(path) + "/"; // Create asset T so = ScriptableObject.CreateInstance <T>(); AssetDatabase.CreateAsset(so, path + drawerData.NameOfNewAtom + ".asset"); AssetDatabase.SaveAssets(); // Assign the newly created SO property.objectReferenceValue = so; } catch { Debug.LogError("Not able to create Atom"); } drawerData.UserClickedToCreateAtom = false; drawerData.WarningText = ""; } else { drawerData.WarningText = "Name of new Atom must be specified!"; EditorGUI.FocusTextInControl(NAMING_FIELD_CONTROL_NAME); } } if (GUI.Button(secondButtonRect, "✗") || (Event.current.keyCode == KeyCode.Escape && GUI.GetNameOfFocusedControl() == NAMING_FIELD_CONTROL_NAME)) { drawerData.UserClickedToCreateAtom = false; drawerData.WarningText = ""; } if (drawerData.WarningText.Length > 0) { EditorGUI.HelpBox(warningRect, drawerData.WarningText, MessageType.Warning); } } else { if (GUI.Button(restRect, "Create")) { drawerData.NameOfNewAtom = ""; drawerData.UserClickedToCreateAtom = true; EditorGUI.FocusTextInControl(NAMING_FIELD_CONTROL_NAME); } } } EditorGUI.indentLevel = indent; EditorGUI.EndProperty(); }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { if (property.serializedObject.isEditingMultipleObjects) { EditorGUI.PropertyField(position, property, label, true); return; } EditorGUI.BeginProperty(position, label, property); DrawerData drawerData = GetDrawerData(property.propertyPath); var isCreatingSO = drawerData.UserClickedToCreateAtom && property.objectReferenceValue == null; var restWidth = drawerData.UserClickedToCreateAtom ? 50 : 58; var gutter = drawerData.UserClickedToCreateAtom ? 2f : 6f; Rect restRect = new Rect(); Rect warningRect = new Rect(); if (drawerData.WarningText.Length > 0) { position = IMGUIUtils.SnipRectV(position, EditorGUIUtility.singleLineHeight, out warningRect, 2f); } if (property.objectReferenceValue == null) { position = IMGUIUtils.SnipRectH(position, position.width - restWidth, out restRect, gutter); } var defaultGUIColor = GUI.color; GUI.color = isCreatingSO ? Color.yellow : defaultGUIColor; position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), isCreatingSO ? new GUIContent("Name of New Atom") : label); GUI.color = defaultGUIColor; var indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; if (isCreatingSO) { drawerData.NameOfNewAtom = EditorGUI.TextField(position, drawerData.NameOfNewAtom); } else { property.objectReferenceValue = EditorGUI.ObjectField(position, property.objectReferenceValue, typeof(T), false); } if (property.objectReferenceValue == null) { if (isCreatingSO) { var buttonWidth = 24; Rect secondButtonRect; Rect firstButtonRect = IMGUIUtils.SnipRectH(restRect, restRect.width - buttonWidth, out secondButtonRect, gutter); if (GUI.Button(firstButtonRect, "✓")) { if (drawerData.NameOfNewAtom.Length > 0) { try { // Create asset T so = ScriptableObject.CreateInstance <T>(); AssetDatabase.CreateAsset(so, "Assets/" + drawerData.NameOfNewAtom + ".asset"); AssetDatabase.SaveAssets(); // Assign the newly created SO property.objectReferenceValue = so; } catch { Debug.LogError("Not able to create Atom"); } drawerData.UserClickedToCreateAtom = false; drawerData.WarningText = ""; } else { drawerData.WarningText = "Name of new Atom must be specified!"; } } if (GUI.Button(secondButtonRect, "✗")) { drawerData.UserClickedToCreateAtom = false; drawerData.WarningText = ""; } if (drawerData.WarningText.Length > 0) { EditorGUI.HelpBox(warningRect, drawerData.WarningText, MessageType.Warning); } } else { if (GUI.Button(restRect, "Create")) { drawerData.NameOfNewAtom = ""; drawerData.UserClickedToCreateAtom = true; } } } EditorGUI.indentLevel = indent; EditorGUI.EndProperty(); }