using UnityEngine; using UnityEditor; using UnityEditor.SceneManagement; // Sci-Fi Ship Controller. Copyright (c) 2018-2021 SCSM Pty Ltd. All rights reserved. namespace SciFiShipController { [CustomEditor(typeof(SSCProximity))] public class SSCProximityEditor : Editor { #region Static Strings #endregion #region Custom Editor private variables //private SSCProximity sscProximity; private bool isStylesInitialised = false; private bool isSceneModified = false; // Formatting and style variables private string labelText; private GUIStyle labelFieldRichText; private GUIStyle headingFieldRichText; private GUIStyle helpBoxRichText; private GUIStyle buttonCompact; private GUIStyle foldoutStyleNoLabel; //private Color separatorColor = new Color(); private float defaultEditorLabelWidth = 0f; private float defaultEditorFieldWidth = 0f; #endregion #region GUIContent - Headers private readonly static GUIContent headerContent = new GUIContent("This module enables you call methods when something enters or exits the trigger area"); #endregion #region GUIContent - General private readonly static GUIContent initialiseOnStartContent = new GUIContent("Initialise on Start", "If enabled, Initialise() will be called as soon as Start() runs. This should be disabled if you want to control when the SCC Proximity is enabled through code."); private readonly static GUIContent tagsContent = new GUIContent("Unity Tags", "Array of Unity Tags for objects that affect this collider area. If none are provided, all objects can affect this area. NOTE: All tags MUST exist."); private readonly static GUIContent onEnterMethodsContent = new GUIContent("On Enter Methods", "Methods that get called when a collider enters the trigger area"); private readonly static GUIContent onExitMethodsContent = new GUIContent("On Exit Methods", "Methods that get called when a collider exits the trigger area"); #endregion #region Serialized Properties - General private SerializedProperty initialiseOnStartProp; private SerializedProperty tagsProp; private SerializedProperty onEnterMethodsProp; private SerializedProperty onExitMethodsProp; #endregion #region Events public void OnEnable() { //sscProximity = (SSCProximity)target; defaultEditorLabelWidth = 175f; defaultEditorFieldWidth = EditorGUIUtility.fieldWidth; //separatorColor = EditorGUIUtility.isProSkin ? new Color(0.2f, 0.2f, 0.2f, 2f) : Color.grey; #region Find Properties - General initialiseOnStartProp = serializedObject.FindProperty("initialiseOnStart"); tagsProp = serializedObject.FindProperty("tags"); onEnterMethodsProp = serializedObject.FindProperty("onEnterMethods"); onExitMethodsProp = serializedObject.FindProperty("onExitMethods"); #endregion #region Find Buttons #endregion } #endregion #region Public Static Methods // Add a menu item so that a SSCProximity can be created via the GameObject > 3D Object menu [MenuItem("GameObject/3D Object/Sci-Fi Ship Controller/SSC Proximity (Sphere)")] public static SSCProximity CreateProximitySphere() { SSCProximity sscProximity = null; // Create a new gameobject GameObject proximityObj = new GameObject("SSCProximity (Sphere)"); if (proximityObj != null) { SphereCollider proximityCollider = proximityObj.AddComponent(); if (proximityCollider != null) { proximityCollider.isTrigger = true; sscProximity = proximityObj.AddComponent(); #if UNITY_EDITOR if (sscProximity == null) { Debug.LogWarning("ERROR: SSCProximity.CreateProximitySphere could not add SSCProximity component to " + proximityObj.name); } #endif } #if UNITY_EDITOR else { Debug.LogWarning("ERROR: SSCProximity.CreateProximitySphere could not add a sphere collider to " + proximityObj.name); } #endif } return sscProximity; } // Add a menu item so that a SSCProximity can be created via the GameObject > 3D Object menu [MenuItem("GameObject/3D Object/Sci-Fi Ship Controller/SSC Proximity (Box)")] public static SSCProximity CreateProximityBox() { SSCProximity sscProximity = null; // Create a new gameobject GameObject proximityObj = new GameObject("SSCProximity (Box)"); if (proximityObj != null) { BoxCollider proximityCollider = proximityObj.AddComponent(); if (proximityCollider != null) { proximityCollider.isTrigger = true; sscProximity = proximityObj.AddComponent(); #if UNITY_EDITOR if (sscProximity == null) { Debug.LogWarning("ERROR: SSCProximity.CreateProximityBox could not add SSCProximity component to " + proximityObj.name); } #endif } #if UNITY_EDITOR else { Debug.LogWarning("ERROR: SSCProximity.CreateProximityBox could not add a box collider to " + proximityObj.name); } #endif } return sscProximity; } #endregion #region OnInspectorGUI // This function overides what is normally seen in the inspector window // This allows stuff like buttons to be drawn there public override void OnInspectorGUI() { //DrawDefaultInspector(); #region Initialise EditorGUIUtility.labelWidth = defaultEditorLabelWidth; EditorGUIUtility.fieldWidth = defaultEditorFieldWidth; isSceneModified = false; #endregion #region Configure Buttons and Styles // Set up rich text GUIStyles if (!isStylesInitialised) { helpBoxRichText = new GUIStyle("HelpBox"); helpBoxRichText.richText = true; labelFieldRichText = new GUIStyle("Label"); labelFieldRichText.richText = true; headingFieldRichText = new GUIStyle(UnityEditor.EditorStyles.miniLabel); headingFieldRichText.richText = true; headingFieldRichText.normal.textColor = helpBoxRichText.normal.textColor; // Overide default styles EditorStyles.foldout.fontStyle = FontStyle.Bold; // When using a no-label foldout, don't forget to set the global // EditorGUIUtility.fieldWidth to a small value like 15, then back // to the original afterward. foldoutStyleNoLabel = new GUIStyle(EditorStyles.foldout); foldoutStyleNoLabel.fixedWidth = 0.01f; buttonCompact = new GUIStyle("Button"); buttonCompact.fontSize = 10; isStylesInitialised = true; } #endregion // Read in all the properties serializedObject.Update(); #region Header Info and Buttons EditorGUILayout.LabelField(headerContent, helpBoxRichText); #endregion #region General Settings GUILayout.BeginVertical("HelpBox"); EditorGUILayout.PropertyField(initialiseOnStartProp, initialiseOnStartContent); SSCEditorHelper.DrawArray(tagsProp, tagsContent, defaultEditorLabelWidth, "Tag"); GUILayoutUtility.GetRect(1f, 2f); EditorGUILayout.PropertyField(onEnterMethodsProp, onEnterMethodsContent); EditorGUILayout.PropertyField(onExitMethodsProp, onExitMethodsContent); GUILayout.EndVertical(); #endregion // Apply property changes serializedObject.ApplyModifiedProperties(); #region Mark Scene Dirty if required if (isSceneModified && !Application.isPlaying) { isSceneModified = false; EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); } #endregion } #endregion } }