using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using RPGCreationKit; namespace RPGCreationKit { /// /// Custom editor for Goto class, just for hide/show fields dinamically /// [CustomEditor(typeof(Goto))] public class GotoEditor : Editor { public MonoScript[] allResultScripts; public override void OnInspectorGUI() { EditorGUILayout.Space(); EditorGUILayout.Space(); var main = target as Goto; if (allResultScripts == null) allResultScripts = NodesHelper.GetAllResultScripts(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("OnEnter Result Script:"); var onEnterResultScript = serializedObject.FindProperty("onEnterResultScript"); string onEnterResultScriptMenuValue = string.IsNullOrEmpty(onEnterResultScript.stringValue) ? "-None-" : onEnterResultScript.stringValue; if (GUILayout.Button(new GUIContent(onEnterResultScriptMenuValue, onEnterResultScriptMenuValue))) { // create the menu and add items to it GenericMenu menu = new GenericMenu(); menu.AddDisabledItem(new GUIContent("Result Scripts")); menu.AddSeparator(""); menu.AddItem(new GUIContent("None"), false, Callback, new ScriptElementData(onEnterResultScript, "")); for (int i = 0; i < allResultScripts.Length; i++) { menu.AddItem(new GUIContent(allResultScripts[i].name), (allResultScripts[i].GetClass().Namespace + "." + allResultScripts[i].name) == onEnterResultScriptMenuValue, Callback, new ScriptElementData(onEnterResultScript, allResultScripts[i].GetClass().Namespace + "." + allResultScripts[i].name)); } menu.ShowAsContext(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(10); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("OnEnter Result Script:"); var onExitResultScript = serializedObject.FindProperty("onExitResultScript"); string onExitResultScriptMenuValue = string.IsNullOrEmpty(onExitResultScript.stringValue) ? "-None-" : onExitResultScript.stringValue; if (GUILayout.Button(new GUIContent(onExitResultScriptMenuValue, onExitResultScriptMenuValue))) { // create the menu and add items to it GenericMenu menu = new GenericMenu(); menu.AddDisabledItem(new GUIContent("Result Scripts")); menu.AddSeparator(""); menu.AddItem(new GUIContent("None"), false, Callback, new ScriptElementData(onExitResultScript, "")); for (int i = 0; i < allResultScripts.Length; i++) { menu.AddItem(new GUIContent(allResultScripts[i].name), (allResultScripts[i].GetClass().Namespace + "." + allResultScripts[i].name) == onExitResultScriptMenuValue, Callback, new ScriptElementData(onExitResultScript, allResultScripts[i].GetClass().Namespace + "." + allResultScripts[i].name)); } menu.ShowAsContext(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(10); var onEnterEvents = serializedObject.FindProperty("onEnterEvents"); var onExitEvents = serializedObject.FindProperty("onExitEvents"); var collisionTarget = serializedObject.FindProperty("collisionTarget"); var npcs = serializedObject.FindProperty("NPCs"); var OnEnterDelayActivation = serializedObject.FindProperty("OnEnterDelayActivation"); var OnExitDelayActivation = serializedObject.FindProperty("OnExitDelayActivation"); var OnEnterAlreadyTriggered = serializedObject.FindProperty("OnEnterAlreadyTriggered"); var OnExitAlreadyTriggered = serializedObject.FindProperty("OnExitAlreadyTriggered"); var AllowMultipleOnEnterTriggering = serializedObject.FindProperty("AllowMultipleOnEnterTriggering"); var AllowMultipleOnExitTriggering = serializedObject.FindProperty("AllowMultipleOnExitTriggering"); var DestroyAfterOnEnter = serializedObject.FindProperty("DestroyAfterOnEnter"); var DestroyDelayOnEnter = serializedObject.FindProperty("DestroyDelayOnEnter"); var DestroyAfterOnExit = serializedObject.FindProperty("DestroyAfterOnExit"); var DestroyDelayOnExit = serializedObject.FindProperty("DestroyDelayOnExit"); var triggerGameObject = serializedObject.FindProperty("TriggerGameObject"); EditorGUILayout.LabelField("OnTriggerEnter Events:", EditorStyles.boldLabel); EditorGUILayout.PropertyField(onEnterEvents, true); EditorGUILayout.Space(); EditorGUILayout.PropertyField(OnEnterDelayActivation, true); EditorGUILayout.PropertyField(AllowMultipleOnEnterTriggering, true); EditorGUILayout.PropertyField(DestroyAfterOnEnter, true); if(DestroyAfterOnEnter.boolValue) EditorGUILayout.PropertyField(DestroyDelayOnEnter, true); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.LabelField("OnTriggerExit Events:", EditorStyles.boldLabel); EditorGUILayout.PropertyField(onExitEvents, true); EditorGUILayout.Space(); EditorGUILayout.PropertyField(OnExitDelayActivation, true); EditorGUILayout.PropertyField(AllowMultipleOnExitTriggering, true); EditorGUILayout.PropertyField(DestroyAfterOnExit, true); if (DestroyAfterOnExit.boolValue) EditorGUILayout.PropertyField(DestroyDelayOnExit, true); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.PropertyField(collisionTarget, true); EditorGUILayout.Space(); EditorGUILayout.Space(); switch (main.collisionTarget) { case CollisionTargets.Player: break; case CollisionTargets.NPCs: case CollisionTargets.PlayerAndNpcs: EditorGUILayout.PropertyField(npcs, true); break; case CollisionTargets.TriggerGameObject: EditorGUILayout.PropertyField(triggerGameObject); break; } serializedObject.ApplyModifiedProperties(); } public static MonoScript[] GetScriptAssetsOfType() { MonoScript[] scripts = (MonoScript[])Object.FindObjectsOfTypeIncludingAssets(typeof(MonoScript)); List result = new List(); foreach (MonoScript m in scripts) { if (m.GetClass() != null && m.GetClass().IsSubclassOf(typeof(T)) && m.GetType() != typeof(Shader)) { result.Add(m); } } return result.ToArray(); } void Callback(object obj) { ScriptElementData questScriptData = (ScriptElementData)obj; questScriptData.property.stringValue = questScriptData.value; questScriptData.property.serializedObject.ApplyModifiedProperties(); } } }