rabidus-test/Assets/SCSM/SciFiShipController/Editor/ShipCameraSettingsEditor.cs

395 lines
19 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
// Sci-Fi Ship Controller. Copyright (c) 2018-2023 SCSM Pty Ltd. All rights reserved.
namespace SciFiShipController
{
/// <summary>
/// The inspector editor for scriptable object ShipCameraModule settings.
/// </summary>
[CustomEditor(typeof(ShipCameraSettings))]
public class ShipCameraSettingsEditor : Editor
{
#region Custom Editor private variables
private ShipCameraSettings shipCameraSettings = null;
private bool isStylesInitialised = false;
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 titleContent = new GUIContent("Ship Camera Settings");
private readonly static GUIContent headerContent = new GUIContent("Contains settings for a ShipCameraModule.");
#endregion
#region Serialized Properties - General
private SerializedProperty startOnInitialiseProp;
private SerializedProperty enableOnInitialiseProp;
private SerializedProperty lockToTargetPosProp;
private SerializedProperty lockToTargetRotProp;
private SerializedProperty lockCameraPosProp;
private SerializedProperty targetOffsetCoordinatesProp;
private SerializedProperty cameraRotationModeProp;
private SerializedProperty updateTypeProp;
private SerializedProperty moveSpeedProp;
private SerializedProperty turnSpeedProp;
private SerializedProperty targetProp;
private SerializedProperty targetOffsetProp;
private SerializedProperty targetOffsetDampingProp;
private SerializedProperty dampingMaxPitchOffsetUpProp;
private SerializedProperty dampingMaxPitchOffsetDownProp;
private SerializedProperty dampingPitchRateProp;
private SerializedProperty dampingPitchGravityProp;
private SerializedProperty dampingMaxYawOffsetLeftProp;
private SerializedProperty dampingMaxYawOffsetRightProp;
private SerializedProperty dampingYawRateProp;
private SerializedProperty dampingYawGravityProp;
private SerializedProperty maxShakeStrengthProp;
private SerializedProperty maxShakeDurationProp;
#endregion
#region Serialized Properties - Object Clipping
private SerializedProperty clipObjectsProp;
private SerializedProperty minClipMoveSpeedProp;
private SerializedProperty clipMinDistanceProp;
private SerializedProperty clipMinOffsetXProp;
private SerializedProperty clipMinOffsetYProp;
private SerializedProperty clipObjectMaskProp;
#endregion
#region Serialized Properties - Zoom
private SerializedProperty isZoomEnabledProp;
private SerializedProperty zoomDurationProp;
private SerializedProperty unzoomDelayProp;
private SerializedProperty unzoomedFoVProp;
private SerializedProperty zoomedInFoVProp;
private SerializedProperty zoomedOutFovProp;
private SerializedProperty zoomDampingProp;
#endregion
#region Events
private void OnEnable()
{
shipCameraSettings = (ShipCameraSettings)target;
defaultEditorLabelWidth = 175f;
defaultEditorFieldWidth = EditorGUIUtility.fieldWidth;
separatorColor = EditorGUIUtility.isProSkin ? new Color(0.2f, 0.2f, 0.2f, 2f) : Color.grey;
#region Find Properties
cameraRotationModeProp = serializedObject.FindProperty("cameraRotationMode");
targetOffsetCoordinatesProp = serializedObject.FindProperty("targetOffsetCoordinates");
lockToTargetPosProp = serializedObject.FindProperty("lockToTargetPosition");
lockToTargetRotProp = serializedObject.FindProperty("lockToTargetRotation");
lockCameraPosProp = serializedObject.FindProperty("lockCameraPosition");
moveSpeedProp = serializedObject.FindProperty("moveSpeed");
turnSpeedProp = serializedObject.FindProperty("turnSpeed");
updateTypeProp = serializedObject.FindProperty("updateType");
targetProp = serializedObject.FindProperty("target");
targetOffsetProp = serializedObject.FindProperty("targetOffset");
targetOffsetDampingProp = serializedObject.FindProperty("targetOffsetDamping");
dampingMaxPitchOffsetUpProp = serializedObject.FindProperty("dampingMaxPitchOffsetUp");
dampingMaxPitchOffsetDownProp = serializedObject.FindProperty("dampingMaxPitchOffsetDown");
dampingPitchRateProp = serializedObject.FindProperty("dampingPitchRate");
dampingPitchGravityProp = serializedObject.FindProperty("dampingPitchGravity");
dampingMaxYawOffsetLeftProp = serializedObject.FindProperty("dampingMaxYawOffsetLeft");
dampingMaxYawOffsetRightProp = serializedObject.FindProperty("dampingMaxYawOffsetRight");
dampingYawRateProp = serializedObject.FindProperty("dampingYawRate");
dampingYawGravityProp = serializedObject.FindProperty("dampingYawGravity");
maxShakeStrengthProp = serializedObject.FindProperty("maxShakeStrength");
maxShakeDurationProp = serializedObject.FindProperty("maxShakeDuration");
#endregion
#region Find Properties - Clip Objects
clipObjectsProp = serializedObject.FindProperty("clipObjects");
clipMinDistanceProp = serializedObject.FindProperty("clipMinDistance");
clipMinOffsetXProp = serializedObject.FindProperty("clipMinOffsetX");
clipMinOffsetYProp = serializedObject.FindProperty("clipMinOffsetY");
minClipMoveSpeedProp = serializedObject.FindProperty("minClipMoveSpeed");
clipObjectMaskProp = serializedObject.FindProperty("clipObjectMask");
#endregion
#region Find Properties - Zoom
isZoomEnabledProp = serializedObject.FindProperty("isZoomEnabled");
zoomDurationProp = serializedObject.FindProperty("zoomDuration");
unzoomDelayProp = serializedObject.FindProperty("unzoomDelay");
unzoomedFoVProp = serializedObject.FindProperty("unzoomedFoV");
zoomedInFoVProp = serializedObject.FindProperty("zoomedInFoV");
zoomedOutFovProp = serializedObject.FindProperty("zoomedOutFoV");
zoomDampingProp = serializedObject.FindProperty("zoomDamping");
#endregion
isStylesInitialised = false;
}
#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()
{
#region Initialise
EditorGUIUtility.labelWidth = defaultEditorLabelWidth;
EditorGUIUtility.fieldWidth = defaultEditorFieldWidth;
#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
#region Header Info and Buttons
SSCEditorHelper.SSCVersionHeader(labelFieldRichText);
GUILayout.BeginVertical("HelpBox");
EditorGUILayout.LabelField(titleContent);
EditorGUILayout.LabelField(headerContent, EditorStyles.miniLabel);
GUILayout.EndVertical();
#endregion
// Read in all the properties
serializedObject.Update();
#region General Settings
bool isAimAtTarget = cameraRotationModeProp.intValue == (int)ShipCameraModule.CameraRotationMode.AimAtTarget;
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
if (isAimAtTarget)
{
bool isTargetPosLockorFastMoveSpeed = lockToTargetPosProp.boolValue || moveSpeedProp.floatValue > 10f;
bool isTargetRotLockorFastTurnSpeed = lockToTargetRotProp.boolValue || turnSpeedProp.floatValue > 10f;
bool isLateUpdate = updateTypeProp.intValue == (int)ShipCameraModule.CameraUpdateType.LateUpdate;
if (isLateUpdate)
{
// Don't post Position warning if Lock Camera Position is in use
if (isTargetPosLockorFastMoveSpeed && !(isAimAtTarget && lockCameraPosProp.boolValue))
{
EditorGUILayout.HelpBox(ShipCameraModuleEditor.targetPosMsgSCM, MessageType.Warning);
}
if (isTargetRotLockorFastTurnSpeed)
{
EditorGUILayout.HelpBox(ShipCameraModuleEditor.targetRotMsgSCM, MessageType.Warning);
}
}
}
// Suggest using Target Rotation if user has Aim To Target selected.
if (isAimAtTarget && targetOffsetCoordinatesProp.intValue == (int)ShipCameraModule.TargetOffsetCoordinates.CameraRotation)
{
EditorGUILayout.HelpBox(ShipCameraModuleEditor.aimIncompatibleMsgSCM, MessageType.Warning);
}
EditorGUILayout.PropertyField(targetOffsetCoordinatesProp, ShipCameraModuleEditor.targetOffsetCoordsContentSCM);
if (isAimAtTarget)
{
EditorGUILayout.PropertyField(lockCameraPosProp, ShipCameraModuleEditor.lockCameraPosContentSCM);
}
// Lock to Target Position and offset are not required if the camera position is locked
if (!(isAimAtTarget && lockCameraPosProp.boolValue))
{
EditorGUILayout.PropertyField(targetOffsetProp, ShipCameraModuleEditor.targetOffsetContentSCM);
EditorGUILayout.PropertyField(lockToTargetPosProp, ShipCameraModuleEditor.lockToTargetPosContentSCM);
if (!lockToTargetPosProp.boolValue)
{
EditorGUILayout.PropertyField(moveSpeedProp, ShipCameraModuleEditor.moveSpeedContentSCM);
#region Offset Damping
EditorGUILayout.PropertyField(targetOffsetDampingProp, ShipCameraModuleEditor.targetOffsetDampingContentSCM);
if (targetOffsetDampingProp.boolValue)
{
EditorGUILayout.PropertyField(dampingMaxPitchOffsetUpProp, ShipCameraModuleEditor.dampingMaxPitchOffsetUpContentSCM);
EditorGUILayout.PropertyField(dampingMaxPitchOffsetDownProp, ShipCameraModuleEditor.dampingMaxPitchOffsetDownContentSCM);
EditorGUILayout.PropertyField(dampingPitchRateProp, ShipCameraModuleEditor.dampingPitchRateContentSCM);
EditorGUILayout.PropertyField(dampingPitchGravityProp, ShipCameraModuleEditor.dampingPitchGravityContentSCM);
EditorGUILayout.PropertyField(dampingMaxYawOffsetLeftProp, ShipCameraModuleEditor.dampingMaxYawOffsetLeftContentSCM);
EditorGUILayout.PropertyField(dampingMaxYawOffsetRightProp, ShipCameraModuleEditor.dampingMaxYawOffsetRightContentSCM);
EditorGUILayout.PropertyField(dampingYawRateProp, ShipCameraModuleEditor.dampingYawRateContentSCM);
EditorGUILayout.PropertyField(dampingYawGravityProp, ShipCameraModuleEditor.dampingYawGravityContentSCM);
if (dampingMaxPitchOffsetUpProp.floatValue < targetOffsetProp.vector3Value.y || dampingMaxPitchOffsetDownProp.floatValue > targetOffsetProp.vector3Value.y)
{
EditorGUILayout.HelpBox(ShipCameraModuleEditor.targetDampingPitchMsgSCM, MessageType.Warning);
}
if (dampingMaxYawOffsetRightProp.floatValue < targetOffsetProp.vector3Value.x || dampingMaxYawOffsetLeftProp.floatValue > targetOffsetProp.vector3Value.x)
{
EditorGUILayout.HelpBox(ShipCameraModuleEditor.targetDampingYawMsgSCM, MessageType.Warning);
}
}
#endregion
}
}
EditorGUILayout.PropertyField(lockToTargetRotProp, ShipCameraModuleEditor.lockToTargetRotContentSCM);
if (!lockToTargetRotProp.boolValue)
{
EditorGUILayout.PropertyField(turnSpeedProp, ShipCameraModuleEditor.turnSpeedContentSCM);
}
EditorGUILayout.PropertyField(cameraRotationModeProp, ShipCameraModuleEditor.cameraRotationModeContentSCM);
if (cameraRotationModeProp.intValue == (int)ShipCameraModule.CameraRotationMode.FollowVelocity ||
cameraRotationModeProp.intValue == (int)ShipCameraModule.CameraRotationMode.TopDownFollowVelocity)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("followVelocityThreshold"), ShipCameraModuleEditor.followVelocityThresholdContentSCM);
}
if (cameraRotationModeProp.intValue != (int)ShipCameraModule.CameraRotationMode.TopDownFollowTargetRotation &&
cameraRotationModeProp.intValue != (int)ShipCameraModule.CameraRotationMode.TopDownFollowVelocity &&
cameraRotationModeProp.intValue != (int)ShipCameraModule.CameraRotationMode.Fixed)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("orientUpwards"), ShipCameraModuleEditor.orientUpwardsContentSCM);
}
if (cameraRotationModeProp.intValue == (int)ShipCameraModule.CameraRotationMode.Fixed)
{
EditorGUILayout.PropertyField(serializedObject.FindProperty("cameraFixedRotation"), ShipCameraModuleEditor.cameraFixedRotationContentSCM);
}
EditorGUILayout.PropertyField(updateTypeProp, ShipCameraModuleEditor.updateTypeContentSCM);
EditorGUILayout.PropertyField(maxShakeStrengthProp, ShipCameraModuleEditor.maxShakeStrengthContentSCM);
if (maxShakeStrengthProp.floatValue > 0f)
{
EditorGUILayout.PropertyField(maxShakeDurationProp, ShipCameraModuleEditor.maxShakeDurationContentSCM);
}
EditorGUILayout.EndVertical();
#endregion
#region Clip Objects
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
EditorGUILayout.PropertyField(clipObjectsProp, ShipCameraModuleEditor.clipObjectsContentSCM);
if (clipObjectsProp.boolValue)
{
SSCEditorHelper.InTechPreview(false);
EditorGUILayout.PropertyField(minClipMoveSpeedProp, ShipCameraModuleEditor.minClipMoveSpeedContentSCM);
EditorGUILayout.PropertyField(clipMinDistanceProp, ShipCameraModuleEditor.clipMinDistanceContentSCM);
EditorGUILayout.PropertyField(clipMinOffsetXProp, ShipCameraModuleEditor.clipMinOffsetXContentSCM);
EditorGUILayout.PropertyField(clipMinOffsetYProp, ShipCameraModuleEditor.clipMinOffsetYContentSCM);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(ShipCameraModuleEditor.clipObjectMaskContentSCM, GUILayout.Width(defaultEditorLabelWidth - 58f));
if (GUILayout.Button(ShipCameraModuleEditor.resetBtnContentSCM, buttonCompact, GUILayout.MaxWidth(50f)))
{
clipObjectMaskProp.intValue = (int)ShipCameraModule.DefaultClipObjectMask;
}
EditorGUILayout.PropertyField(clipObjectMaskProp, GUIContent.none);
EditorGUILayout.EndHorizontal();
// When first added or if user attempts to set to Nothing, reset to defaults.
if (clipObjectMaskProp.intValue == 0)
{
clipObjectMaskProp.intValue = (int)ShipCameraModule.DefaultClipObjectMask;
}
}
EditorGUILayout.EndVertical();
#endregion
#region Zoom Settings
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
EditorGUILayout.PropertyField(isZoomEnabledProp, ShipCameraModuleEditor.isZoomEnabledContentSCM);
if (isZoomEnabledProp.boolValue)
{
EditorGUILayout.PropertyField(unzoomDelayProp, ShipCameraModuleEditor.unzoomDelayContentSCM);
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(zoomedInFoVProp, ShipCameraModuleEditor.zoomedInFoVContentSCM);
if (EditorGUI.EndChangeCheck())
{
if (zoomedInFoVProp.floatValue > unzoomedFoVProp.floatValue)
{
zoomedInFoVProp.floatValue = unzoomedFoVProp.floatValue;
}
}
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(unzoomedFoVProp, ShipCameraModuleEditor.unzoomedFoVContentSCM);
if (EditorGUI.EndChangeCheck())
{
if (zoomedInFoVProp.floatValue > unzoomedFoVProp.floatValue)
{
zoomedInFoVProp.floatValue = unzoomedFoVProp.floatValue;
}
if (zoomedOutFovProp.floatValue < unzoomedFoVProp.floatValue)
{
zoomedOutFovProp.floatValue = unzoomedFoVProp.floatValue;
}
}
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(zoomedOutFovProp, ShipCameraModuleEditor.zoomedOutFoVContentSCM);
if (EditorGUI.EndChangeCheck())
{
if (zoomedOutFovProp.floatValue < unzoomedFoVProp.floatValue)
{
zoomedOutFovProp.floatValue = unzoomedFoVProp.floatValue;
}
}
EditorGUILayout.PropertyField(zoomDampingProp, ShipCameraModuleEditor.zoomDampingContentSCM);
}
EditorGUILayout.EndVertical();
#endregion
serializedObject.ApplyModifiedProperties();
}
#endregion
}
}