using UnityEditor;
using System.Collections.Generic;
using UnityEngine;
// Sci-Fi Ship Controller. Copyright (c) 2018-2023 SCSM Pty Ltd. All rights reserved.
namespace SciFiShipController
{
[CustomEditor(typeof(ShipWarpModule))]
public class ShipWarpModuleEditor : Editor
{
#region Custom Editor protected variables
// These are visible to inherited classes
protected ShipWarpModule shipWarpModule;
protected bool isStylesInitialised = false;
protected bool isSceneModified = false;
protected string labelText;
protected GUIStyle labelFieldRichText;
protected GUIStyle headingFieldRichText;
protected GUIStyle helpBoxRichText;
protected GUIStyle buttonCompact;
protected GUIStyle foldoutStyleNoLabel;
protected GUIStyle toggleCompactButtonStyleNormal = null; // Small Toggle button. e.g. G(izmo) on/off
protected GUIStyle toggleCompactButtonStyleToggled = null;
protected Color separatorColor = new Color();
protected float defaultEditorLabelWidth = 0f;
protected float defaultEditorFieldWidth = 0f;
protected bool isDebuggingEnabled = false;
protected int cameraSettingsDeletePos = -1;
#endregion
#region SceneView Variables
#endregion
#region Static Strings
#endregion
#region GUIContent - Headers
private readonly static GUIContent headerContent = new GUIContent("A warp drive-like effect that works with a Ship Control Module, Ship Camera Module, and particle systems. Place on its own gameobject in the scene.");
private readonly static GUIContent[] tabTexts = { new GUIContent("General"), new GUIContent("Ship"), new GUIContent("Camera"), new GUIContent("FX"), new GUIContent("Events") };
#endregion
#region GUIContent - General
protected 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 component is enabled through code.");
protected readonly static GUIContent allowCustomInputsContent = new GUIContent(" Allow Custom Inputs", "Allow the user of Custom Player inputs during warp");
protected readonly static GUIContent offsetFromShipContent = new GUIContent(" Offset from Ship", "The offset, in local space, from warp fx is from the position of the ship");
protected readonly static GUIContent maxWarpDurationContent = new GUIContent(" Max Warp Duration", "If greater than zero, the time, in seconds, that warp will automatically disengage.");
protected readonly static GUIContent nightSkyColourContent = new GUIContent(" Night Sky Colour", "The colour of the night sky");
protected readonly static GUIContent envAmbientSourceContent = new GUIContent(" Ambient Source", "The source of the ambient light. Colour, Gradient or Skybox.");
protected readonly static GUIContent overrideAmbientColourContent = new GUIContent(" Override Ambient Colour", "By default the ambient sky colour will be set to the Night Sky Colour");
protected readonly static GUIContent ambientSkyColourContent = new GUIContent(" Ambient Sky Colour", "If overriding the ambient colour, this is the ambient sky colour");
#endregion
#region GUIContent - Ship
protected readonly static GUIContent shipControlModuleContent = new GUIContent(" Ship Control Module", "The module from the scene used to control the player ship.");
protected readonly static GUIContent shipForwardThrustContent = new GUIContent(" Forward Thrust", "The amount of proportional thrust to apply to forward thrusters when warp is engaged.");
protected readonly static GUIContent maxShakeStrengthContent = new GUIContent(" Max Shake Strength", "The maximum strength of the ship shake. Smaller numbers are better.");
protected readonly static GUIContent maxShakeDurationContent = new GUIContent(" Max Shake Duration", "The maximum duration, in seconds. the ship will shake per incident.");
protected readonly static GUIContent minShakeIntervalContent = new GUIContent(" Min Shake Interval", "The minimum interval, in seconds, between ship shake incidents.");
protected readonly static GUIContent maxShakeIntervalContent = new GUIContent(" Max Shake Interval", "The maximum interval, in seconds, between ship shake incidents.");
protected readonly static GUIContent maxShipPitchDownContent = new GUIContent(" Max Pitch Down", "The maximum angle, in degrees, the ship can pitch down.");
protected readonly static GUIContent maxShipPitchUpContent = new GUIContent(" Max Pitch Up", "The maximum angle, in degrees, the ship can pitch up.");
protected readonly static GUIContent maxShipPitchDurationContent = new GUIContent(" Max Pitch Duration", "The maximum time, in seconds, the ship will take to pitch up and down.");
protected readonly static GUIContent shipPitchCurveContent = new GUIContent(" Pitch Curve", "The curve used to evaluate the amount of pitch over the pitch duration of each pitch incident.");
protected readonly static GUIContent maxShipRollAngleContent = new GUIContent(" Max Roll Angle", "The maximum angle, in degrees, the ship can roll left or right.");
protected readonly static GUIContent maxShipRollDurationContent = new GUIContent(" Max Roll Duration", "The maximum time, in seconds, the ship will take to roll from left to right.");
protected readonly static GUIContent shipRollCurveContent = new GUIContent(" Roll Curve", "The curve used to evaluate the amount of roll over the roll duration of each roll incident.");
#endregion
#region GUIContent - Camera
protected readonly static GUIContent shipCameraModuleContent = new GUIContent(" Ship Camera Module", "The module used to control the player ship camera");
protected readonly static GUIContent isApplyCameraSettingsOnEngageContent = new GUIContent(" Apply Settings on Engage", "If there are optional camera settings configured, apply the first one when warp is engaged.");
protected readonly static GUIContent cameraSettingsContent = new GUIContent(" Optional Camera Settings");
#endregion
#region GUIContent - FX
protected readonly static GUIContent innerParticleSystemContent = new GUIContent(" Inner Particle System", "The child particle system used to generate the inner or centre particles for the FX");
protected readonly static GUIContent outerParticleSystemContent = new GUIContent(" Outer Particle System", "The child particle system used to generate the outer particles for the FX");
protected readonly static GUIContent isSoundFXPausedContent = new GUIContent(" Pause Sound FX", "Are the sound effects currently paused. New new sounds will play until it is unpaused.");
protected readonly static GUIContent sscSoundFXSetContent = new GUIContent(" Sound FX Set", "A set of SoundFX that are randomly selected while warp is engaged.");
protected readonly static GUIContent maxSoundIntervalContent = new GUIContent(" Max Sound Interval", "The maximum interval, in seconds, between sound fx when warp is engaged.");
protected readonly static GUIContent soundFXOffsetContent = new GUIContent(" Sound FX Offset", "The local space relative offset from the ship used when instantiating Sound FX.");
protected readonly static GUIContent isSoundIntervalRandomisedContent = new GUIContent(" Randomise Sound Volume", "Is the volume randomised between 50 percent of the EffectsModule default volume, and the default volume?");
#endregion
#region GUIContent - Events
protected readonly static GUIContent onChangeCameraSettingsContent = new GUIContent("On Change Camera Settings");
protected readonly static GUIContent onPreEngageWarpContent = new GUIContent("On Pre Engage Warp");
protected readonly static GUIContent onPostEngageWarpContent = new GUIContent("On Post Engage Warp");
protected readonly static GUIContent onPreDisengageWarpContent = new GUIContent("On Pre Disengage Warp");
protected readonly static GUIContent onPostDisengageWarpContent = new GUIContent("On Post Disengage Warp");
#endregion
#region GUIContent - Debug
private readonly static GUIContent debugModeContent = new GUIContent(" Debug Mode", "Use this to display the data about the ShipWarpModule component at runtime in the editor.");
//private readonly static GUIContent debugNotSetContent = new GUIContent("-", "not set");
private readonly static GUIContent debugIsInitialisedContent = new GUIContent(" Is Initialised?");
private readonly static GUIContent debugIsWarpEngagedContent = new GUIContent(" Is Warp Engaged?");
private readonly static GUIContent debugCurrentCameraSettingsIndexContent = new GUIContent(" Camera Settings");
#endregion
#region Serialized Properties - General
protected SerializedProperty selectedTabIntProp;
protected SerializedProperty initialiseOnStartProp;
protected SerializedProperty allowCustomInputsProp;
protected SerializedProperty offsetFromShipProp;
protected SerializedProperty maxWarpDurationProp;
protected SerializedProperty nightSkyColourProp;
protected SerializedProperty envAmbientSourceProp;
protected SerializedProperty overrideAmbientColourProp;
protected SerializedProperty ambientSkyColourProp;
#endregion
#region Serialized Properties - Ship
protected SerializedProperty shipControlModuleProp;
protected SerializedProperty shipForwardThrustProp;
protected SerializedProperty maxShakeStrengthProp;
protected SerializedProperty maxShakeDurationProp;
protected SerializedProperty minShakeIntervalProp;
protected SerializedProperty maxShakeIntervalProp;
protected SerializedProperty maxShipPitchDownProp;
protected SerializedProperty maxShipPitchUpProp;
protected SerializedProperty maxShipPitchDurationProp;
protected SerializedProperty shipPitchCurveProp;
protected SerializedProperty maxShipRollAngleProp;
protected SerializedProperty maxShipRollDurationProp;
protected SerializedProperty shipRollCurveProp;
#endregion
#region Serialized Properties - Camera
protected SerializedProperty shipCameraModuleProp;
protected SerializedProperty isApplyCameraSettingsOnEngageProp;
protected SerializedProperty shipCameraSettingsListProp;
protected SerializedProperty shipCameraSettingsProp;
#endregion
#region Serialized Properties - FX
protected SerializedProperty innerParticleSystemProp;
protected SerializedProperty outerParticleSystemProp;
protected SerializedProperty isSoundFXPausedProp;
protected SerializedProperty sscSoundFXSetProp;
protected SerializedProperty maxSoundIntervalProp;
protected SerializedProperty soundFXOffsetProp;
protected SerializedProperty isSoundIntervalRandomisedProp;
#endregion
#region Serialized Properties - Events
protected SerializedProperty onChangeCameraSettingsProp;
protected SerializedProperty onPreEngageWarpProp;
protected SerializedProperty onPostEngageWarpProp;
protected SerializedProperty onPreDisengageWarpProp;
protected SerializedProperty onPostDisengageWarpProp;
#endregion
#region Events
protected virtual void OnEnable()
{
shipWarpModule = (ShipWarpModule)target;
defaultEditorLabelWidth = 185f;
defaultEditorFieldWidth = EditorGUIUtility.fieldWidth;
separatorColor = EditorGUIUtility.isProSkin ? new Color(0.2f, 0.2f, 0.2f, 2f) : Color.grey;
// Reset GUIStyles
isStylesInitialised = false;
toggleCompactButtonStyleNormal = null;
toggleCompactButtonStyleToggled = null;
foldoutStyleNoLabel = null;
#region Find Properties - General
selectedTabIntProp = serializedObject.FindProperty("selectedTabInt");
initialiseOnStartProp = serializedObject.FindProperty("initialiseOnStart");
allowCustomInputsProp = serializedObject.FindProperty("allowCustomInputs");
offsetFromShipProp = serializedObject.FindProperty("offsetFromShip");
maxWarpDurationProp = serializedObject.FindProperty("maxWarpDuration");
nightSkyColourProp = serializedObject.FindProperty("nightSkyColour");
envAmbientSourceProp = serializedObject.FindProperty("envAmbientSource");
overrideAmbientColourProp = serializedObject.FindProperty("overrideAmbientColour");
ambientSkyColourProp = serializedObject.FindProperty("ambientSkyColour");
#endregion
#region Find Properties - Ship
shipControlModuleProp = serializedObject.FindProperty("shipControlModule");
shipForwardThrustProp = serializedObject.FindProperty("shipForwardThrust");
maxShakeStrengthProp = serializedObject.FindProperty("maxShakeStrength");
maxShakeDurationProp = serializedObject.FindProperty("maxShakeDuration");
minShakeIntervalProp = serializedObject.FindProperty("minShakeInterval");
maxShakeIntervalProp = serializedObject.FindProperty("maxShakeInterval");
maxShipPitchDownProp = serializedObject.FindProperty("maxShipPitchDown");
maxShipPitchUpProp = serializedObject.FindProperty("maxShipPitchUp");
maxShipPitchDurationProp = serializedObject.FindProperty("maxShipPitchDuration");
shipPitchCurveProp = serializedObject.FindProperty("shipPitchCurve");
maxShipRollAngleProp = serializedObject.FindProperty("maxShipRollAngle");
maxShipRollDurationProp = serializedObject.FindProperty("maxShipRollDuration");
shipRollCurveProp = serializedObject.FindProperty("shipRollCurve");
#endregion
#region Find Properties - Camera
shipCameraModuleProp = serializedObject.FindProperty("shipCameraModule");
isApplyCameraSettingsOnEngageProp = serializedObject.FindProperty("isApplyCameraSettingsOnEngage");
shipCameraSettingsListProp = serializedObject.FindProperty("shipCameraSettingsList");
#endregion
#region Find Properties - FX
innerParticleSystemProp = serializedObject.FindProperty("innerParticleSystem");
outerParticleSystemProp = serializedObject.FindProperty("outerParticleSystem");
isSoundFXPausedProp = serializedObject.FindProperty("isSoundFXPaused");
sscSoundFXSetProp = serializedObject.FindProperty("sscSoundFXSet");
maxSoundIntervalProp = serializedObject.FindProperty("maxSoundInterval");
soundFXOffsetProp = serializedObject.FindProperty("soundFXOffset");
isSoundIntervalRandomisedProp = serializedObject.FindProperty("isSoundIntervalRandomised");
#endregion
#region Find Properties - Events
onChangeCameraSettingsProp = serializedObject.FindProperty("onChangeCameraSettings");
onPreEngageWarpProp = serializedObject.FindProperty("onPreEngageWarp");
onPostEngageWarpProp = serializedObject.FindProperty("onPostEngageWarp");
onPreDisengageWarpProp = serializedObject.FindProperty("onPreDisengageWarp");
onPostDisengageWarpProp = serializedObject.FindProperty("onPostDisengageWarp");
#endregion
}
#endregion
#region Private and Protected Methods
///
/// Set up the buttons and styles used in OnInspectorGUI.
/// Call this near the top of OnInspectorGUI.
///
protected void ConfigureButtonsAndStyles()
{
// 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;
// Create a new button or else will effect the Button style for other buttons too
toggleCompactButtonStyleNormal = new GUIStyle("Button");
toggleCompactButtonStyleToggled = new GUIStyle(toggleCompactButtonStyleNormal);
toggleCompactButtonStyleNormal.fontStyle = FontStyle.Normal;
toggleCompactButtonStyleToggled.fontStyle = FontStyle.Bold;
toggleCompactButtonStyleToggled.normal.background = toggleCompactButtonStyleToggled.active.background;
isStylesInitialised = true;
}
}
///
/// Draw enable or disable debugging in the inspector
///
protected void DrawDebugToggle()
{
isDebuggingEnabled = EditorGUILayout.Toggle(SSCEditorHelper.debugModeIndent1Content, isDebuggingEnabled);
}
#endregion
#region Protected Virtual Methods
///
/// This function overides what is normally seen in the inspector window
/// This allows stuff like buttons to be drawn there
///
protected virtual void DrawBaseInspector()
{
#region Initialise
shipWarpModule.allowRepaint = false;
EditorGUIUtility.labelWidth = defaultEditorLabelWidth;
EditorGUIUtility.fieldWidth = defaultEditorFieldWidth;
isSceneModified = false;
#endregion
ConfigureButtonsAndStyles();
// Read in all the properties
serializedObject.Update();
#region Headers and Info Buttons
SSCEditorHelper.SSCVersionHeader(labelFieldRichText);
EditorGUILayout.LabelField(headerContent, helpBoxRichText);
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
SSCEditorHelper.DrawSSCGetHelpButtons(buttonCompact);
DrawToolBar(tabTexts);
EditorGUILayout.EndVertical();
#endregion
SSCEditorHelper.InTechPreview(false);
EditorGUILayout.BeginVertical("HelpBox");
#region General Settings
if (selectedTabIntProp.intValue == 0)
{
EditorGUILayout.PropertyField(initialiseOnStartProp, initialiseOnStartContent);
EditorGUILayout.PropertyField(allowCustomInputsProp, allowCustomInputsContent);
EditorGUILayout.PropertyField(offsetFromShipProp, offsetFromShipContent);
EditorGUILayout.PropertyField(maxWarpDurationProp, maxWarpDurationContent);
EditorGUILayout.PropertyField(nightSkyColourProp, nightSkyColourContent);
EditorGUILayout.PropertyField(envAmbientSourceProp, envAmbientSourceContent);
EditorGUILayout.PropertyField(overrideAmbientColourProp, overrideAmbientColourContent);
EditorGUILayout.PropertyField(ambientSkyColourProp, ambientSkyColourContent);
}
#endregion
#region Ship Settings
else if (selectedTabIntProp.intValue == 1)
{
DrawShipSettings();
}
#endregion
#region Camera Settings
else if (selectedTabIntProp.intValue == 2)
{
DrawCameraSettings();
}
#endregion
#region FX Settings
else if (selectedTabIntProp.intValue == 3)
{
DrawParticleSettings();
DrawSoundFXSettings();
}
#endregion
#region Event Settings
else if (selectedTabIntProp.intValue == 4)
{
DrawEventSettings();
}
#endregion
EditorGUILayout.EndVertical();
// Apply property changes
serializedObject.ApplyModifiedProperties();
shipWarpModule.allowRepaint = true;
#region Debug Mode
DrawDebugSettings();
#endregion
}
///
/// Draw the event settings in the inspector
///
protected virtual void DrawEventSettings()
{
EditorGUILayout.PropertyField(onChangeCameraSettingsProp, onChangeCameraSettingsContent);
EditorGUILayout.PropertyField(onPreEngageWarpProp, onPreEngageWarpContent);
EditorGUILayout.PropertyField(onPostEngageWarpProp, onPostEngageWarpContent);
EditorGUILayout.PropertyField(onPreDisengageWarpProp, onPreDisengageWarpContent);
EditorGUILayout.PropertyField(onPostDisengageWarpProp, onPostDisengageWarpContent);
}
///
/// Draw the settings for the particle systems in the inspector
///
protected virtual void DrawParticleSettings()
{
EditorGUILayout.PropertyField(innerParticleSystemProp, innerParticleSystemContent);
EditorGUILayout.PropertyField(outerParticleSystemProp, outerParticleSystemContent);
}
///
/// Draw the settings for the camera in the inspector
///
protected virtual void DrawCameraSettings()
{
EditorGUILayout.PropertyField(shipCameraModuleProp, shipCameraModuleContent);
EditorGUILayout.PropertyField(isApplyCameraSettingsOnEngageProp, isApplyCameraSettingsOnEngageContent);
cameraSettingsDeletePos = -1;
int numCamSettings = shipCameraSettingsListProp.arraySize;
#region Add or Remove Camera Settings
SSCEditorHelper.DrawSSCHorizontalGap(4f);
GUILayout.BeginHorizontal();
EditorGUILayout.LabelField(cameraSettingsContent);
if (GUILayout.Button("+", GUILayout.MaxWidth(30f)))
{
shipCameraSettingsListProp.arraySize++;
numCamSettings = shipCameraSettingsListProp.arraySize;
}
if (GUILayout.Button("-", GUILayout.MaxWidth(30f)))
{
if (numCamSettings > 0) { cameraSettingsDeletePos = shipCameraSettingsListProp.arraySize - 1; }
}
GUILayout.EndHorizontal();
#endregion
#region Camera Settings List
for (int csIdx = 0; csIdx < numCamSettings; csIdx++)
{
shipCameraSettingsProp = shipCameraSettingsListProp.GetArrayElementAtIndex(csIdx);
if (shipCameraSettingsProp != null)
{
GUILayout.BeginHorizontal();
EditorGUILayout.LabelField(" " + (csIdx + 1).ToString("00") + ".", GUILayout.Width(25f));
EditorGUILayout.PropertyField(shipCameraSettingsProp, GUIContent.none);
if (GUILayout.Button("X", buttonCompact, GUILayout.MaxWidth(20f))) { cameraSettingsDeletePos = csIdx; }
GUILayout.EndHorizontal();
}
}
#endregion
#region Delete Camera Settings
if (cameraSettingsDeletePos >= 0)
{
shipCameraSettingsListProp.DeleteArrayElementAtIndex(cameraSettingsDeletePos);
cameraSettingsDeletePos = -1;
serializedObject.ApplyModifiedProperties();
// In U2019.4+ avoid: EndLayoutGroup: BeginLayoutGroup must be called first.
GUIUtility.ExitGUI();
}
#endregion
}
protected virtual void DrawDebugSettings()
{
// NOTE: This is NOT performance optimised - can create GC issues and other performance overhead.
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
isDebuggingEnabled = EditorGUILayout.Toggle(debugModeContent, isDebuggingEnabled);
if (isDebuggingEnabled && shipWarpModule != null)
{
#region Debugging - General
SSCEditorHelper.PerformanceImpact();
float rightLabelWidth = 150f;
bool isWarpInitialised = shipWarpModule.IsInitialised;
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(debugIsInitialisedContent, labelFieldRichText, GUILayout.Width(defaultEditorLabelWidth - 3f));
EditorGUILayout.LabelField(isWarpInitialised ? "Yes" : "No", GUILayout.MaxWidth(rightLabelWidth));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(debugIsWarpEngagedContent, labelFieldRichText, GUILayout.Width(defaultEditorLabelWidth - 3f));
EditorGUILayout.LabelField(shipWarpModule.IsWarpEngaged ? "Yes" : "No", GUILayout.MaxWidth(rightLabelWidth));
EditorGUILayout.EndHorizontal();
#endregion
#region Debugging - Camera
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(debugCurrentCameraSettingsIndexContent, labelFieldRichText, GUILayout.Width(defaultEditorLabelWidth - 3f));
EditorGUILayout.LabelField(shipWarpModule.CurrentCameraSettingsIndex < 0 ? "Not Set" : (shipWarpModule.CurrentCameraSettingsIndex+1).ToString("00"), GUILayout.MaxWidth(rightLabelWidth));
EditorGUILayout.EndHorizontal();
#endregion
}
EditorGUILayout.EndVertical();
}
///
/// Draw the settings for the ship in the inspector
///
protected virtual void DrawShipSettings()
{
EditorGUILayout.PropertyField(shipControlModuleProp, shipControlModuleContent);
#region Thrusters
EditorGUILayout.PropertyField(shipForwardThrustProp, shipForwardThrustContent);
#endregion
#region Shake
SSCEditorHelper.DrawUILine(separatorColor, 2, 6);
EditorGUILayout.PropertyField(maxShakeStrengthProp, maxShakeStrengthContent);
EditorGUILayout.PropertyField(maxShakeDurationProp, maxShakeDurationContent);
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(minShakeIntervalProp, minShakeIntervalContent);
if (EditorGUI.EndChangeCheck() && maxShakeIntervalProp.floatValue < minShakeIntervalProp.floatValue)
{
maxShakeIntervalProp.floatValue = minShakeIntervalProp.floatValue;
}
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(maxShakeIntervalProp, maxShakeIntervalContent);
if (EditorGUI.EndChangeCheck() && maxShakeIntervalProp.floatValue < minShakeIntervalProp.floatValue)
{
minShakeIntervalProp.floatValue = maxShakeIntervalProp.floatValue;
}
#endregion
#region Pitch
SSCEditorHelper.DrawUILine(separatorColor, 2, 6);
EditorGUILayout.PropertyField(maxShipPitchDownProp, maxShipPitchDownContent);
EditorGUILayout.PropertyField(maxShipPitchUpProp, maxShipPitchUpContent);
EditorGUILayout.PropertyField(maxShipPitchDurationProp, maxShipPitchDurationContent);
GUILayout.BeginHorizontal();
EditorGUILayout.LabelField(shipPitchCurveContent, GUILayout.Width(defaultEditorLabelWidth - 24f));
if (GUILayout.Button(SSCEditorHelper.btnResetContent, buttonCompact, GUILayout.Width(20f)))
{
Undo.RecordObject(shipWarpModule, "Reset Pitch Curve");
serializedObject.ApplyModifiedProperties();
shipWarpModule.SetShipPitchCurve(ShipWarpModule.GetDefaultPitchCurve());
serializedObject.Update();
}
EditorGUILayout.PropertyField(shipPitchCurveProp, GUIContent.none);
GUILayout.EndVertical();
#endregion
#region Roll
SSCEditorHelper.DrawUILine(separatorColor, 2, 6);
EditorGUILayout.PropertyField(maxShipRollAngleProp, maxShipRollAngleContent);
EditorGUILayout.PropertyField(maxShipRollDurationProp, maxShipRollDurationContent);
GUILayout.BeginHorizontal();
EditorGUILayout.LabelField(shipRollCurveContent, GUILayout.Width(defaultEditorLabelWidth - 24f));
if (GUILayout.Button(SSCEditorHelper.btnResetContent, buttonCompact, GUILayout.Width(20f)))
{
serializedObject.ApplyModifiedProperties();
Undo.RecordObject(shipWarpModule, "Reset Roll Curve");
shipWarpModule.SetShipRollCurve(ShipWarpModule.GetDefaultRollCurve());
serializedObject.Update();
}
EditorGUILayout.PropertyField(shipRollCurveProp, GUIContent.none);
#endregion
GUILayout.EndHorizontal();
}
///
/// Draw the settings for sound fx in the inspector
///
protected virtual void DrawSoundFXSettings()
{
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(isSoundFXPausedProp, isSoundFXPausedContent);
if (EditorGUI.EndChangeCheck() && Application.isPlaying)
{
serializedObject.ApplyModifiedProperties();
if (isSoundFXPausedProp.boolValue) { shipWarpModule.PauseSoundFX(); }
else { shipWarpModule.UnpauseSoundFX(); }
serializedObject.Update();
}
EditorGUILayout.PropertyField(sscSoundFXSetProp, sscSoundFXSetContent);
EditorGUILayout.PropertyField(maxSoundIntervalProp, maxSoundIntervalContent);
EditorGUILayout.PropertyField(soundFXOffsetProp, soundFXOffsetContent);
EditorGUILayout.PropertyField(isSoundIntervalRandomisedProp, isSoundIntervalRandomisedContent);
}
///
/// Draw the toolbar using the supplied array of tab text.
///
///
protected virtual void DrawToolBar(GUIContent[] tabGUIContent)
{
int prevTab = selectedTabIntProp.intValue;
// Show a toolbar to allow the user to switch between viewing different areas
selectedTabIntProp.intValue = GUILayout.Toolbar(selectedTabIntProp.intValue, tabGUIContent);
// When switching tabs, disable focus on previous control
if (prevTab != selectedTabIntProp.intValue) { GUI.FocusControl(null); }
}
#endregion
#region OnInspectorGUI
public override void OnInspectorGUI()
{
DrawBaseInspector();
}
#endregion
}
}