diff --git a/Editor/EnjoinedConfigurableJoint.cs b/Editor/EnjoinedConfigurableJoint.cs index dc33c54..1ea9f3c 100644 --- a/Editor/EnjoinedConfigurableJoint.cs +++ b/Editor/EnjoinedConfigurableJoint.cs @@ -46,7 +46,9 @@ public override void OnInspectorGUI() { /** * Linear Limit */ - if(joint.xMotion != ConfigurableJointMotion.Limited && joint.yMotion != ConfigurableJointMotion.Limited && joint.zMotion != ConfigurableJointMotion.Limited) { + if(joint.xMotion != ConfigurableJointMotion.Limited && joint.yMotion != ConfigurableJointMotion.Limited && joint.zMotion != ConfigurableJointMotion.Limited && + (joint.linearLimit.limit != 0f || joint.linearLimit.bounciness != 0f || joint.linearLimit.contactDistance != 0f || joint.linearLimitSpring.spring != 0f || + joint.linearLimitSpring.damper != 0f)) { EditorGUILayout.HelpBox("The following linear limits are only used when at least one axis of Linear Motion is set to Limited", MessageType.Info); } diff --git a/Editor/EnjoinedHingeJoint.cs b/Editor/EnjoinedHingeJoint.cs index dc698c8..a2d1e73 100644 --- a/Editor/EnjoinedHingeJoint.cs +++ b/Editor/EnjoinedHingeJoint.cs @@ -10,26 +10,25 @@ namespace JesseStiller.Enjoined { [CanEditMultipleObjects] [CustomEditor(typeof(HingeJoint))] public class EnjoinedHingeJoint : Editor { - private SerializedProperty connectedAnchor, autoConfigureConnectedAnchor, useSpring, spring; + private SerializedProperty connectedAnchor, autoConfigureConnectedAnchor, useSpring, spring, useMotor, motor, useLimits, limits; private void OnEnable() { connectedAnchor = serializedObject.FindProperty("m_ConnectedAnchor"); autoConfigureConnectedAnchor = serializedObject.FindProperty("m_AutoConfigureConnectedAnchor"); useSpring = serializedObject.FindProperty("m_UseSpring"); spring = serializedObject.FindProperty("m_Spring"); + useMotor = serializedObject.FindProperty("m_UseMotor"); + motor = serializedObject.FindProperty("m_Motor"); + useLimits = serializedObject.FindProperty("m_UseLimits"); + limits = serializedObject.FindProperty("m_Limits"); } public override void OnInspectorGUI() { - base.OnInspectorGUI(); - - GUILayout.Space(20f); - - /** - * Currently the only difference is that the connectedAnchor vector field is greyed out if autoConfigureConnectedAnchor is true - */ serializedObject.Update(); SerializedProperty iterator = serializedObject.GetIterator(); for(bool enterChildren = true; iterator.NextVisible(enterChildren); enterChildren = false) { + SubPropertyOperator subPropertyOperator; + switch(iterator.propertyPath) { case "m_AutoConfigureConnectedAnchor": break; @@ -37,13 +36,12 @@ public override void OnInspectorGUI() { GUIUtilities.DrawConnectedAnchorProperty(connectedAnchor, autoConfigureConnectedAnchor); break; case "m_UseSpring": - useSpring.boolValue = EditorGUILayout.ToggleLeft("Spring", useSpring.boolValue); + useSpring.boolValue = EditorGUILayout.Toggle("Spring", useSpring.boolValue); break; case "m_Spring": EditorGUI.indentLevel = 1; - SubPropertyOperator subPropertyOperator = new SubPropertyOperator(iterator); + subPropertyOperator = new SubPropertyOperator(iterator); while(subPropertyOperator.MoveNext()) { - Debug.Log(subPropertyOperator.iterator.propertyPath); switch(subPropertyOperator.iterator.propertyPath) { case "m_Spring.spring": EditorGUILayout.PropertyField(subPropertyOperator.iterator, new GUIContent("Force")); @@ -54,7 +52,33 @@ public override void OnInspectorGUI() { } } EditorGUI.indentLevel = 0; + break; + case "m_UseMotor": + useMotor.boolValue = EditorGUILayout.Toggle("Motor", useMotor.boolValue); + break; + case "m_Motor": + EditorGUI.indentLevel = 1; + GUIUtilities.PropertyFieldWithoutHeader(motor); + EditorGUI.indentLevel = 0; + break; + case "m_UseLimits": + useLimits.boolValue = EditorGUILayout.Toggle("Limits", useLimits.boolValue); + break; + case "m_Limits": + EditorGUI.indentLevel = 1; + subPropertyOperator = new SubPropertyOperator(iterator); + while(subPropertyOperator.MoveNext()) { + EditorGUILayout.PropertyField(subPropertyOperator.iterator); + // Clamp the min and max limit properties only to -180 to 180 + switch(subPropertyOperator.iterator.propertyPath) { + case "m_Limits.min": + case "m_Limits.max": + subPropertyOperator.iterator.floatValue = Mathf.Clamp(subPropertyOperator.iterator.floatValue, -180f, 180f); + break; + } + } + EditorGUI.indentLevel = 0; break; default: EditorGUILayout.PropertyField(iterator, true, null); diff --git a/Editor/GUIUtilities.cs b/Editor/GUIUtilities.cs index b57bd7a..617f4c5 100644 --- a/Editor/GUIUtilities.cs +++ b/Editor/GUIUtilities.cs @@ -9,7 +9,7 @@ namespace JesseStiller.Enjoined { public static class GUIUtilities { - private static readonly GUIContent[] anchorTypesGUIContent = new GUIContent[] { new GUIContent("User"), new GUIContent("Automatic") }; + private static readonly GUIContent[] anchorTypesGUIContent = new GUIContent[] { new GUIContent("Custom"), new GUIContent("Automatic") }; public static void DrawConnectedAnchorProperty(SerializedProperty connectedAnchor, SerializedProperty autoConfigureConnectedAnchor) { Rect controlRect = EditorGUILayout.GetControlRect(); diff --git a/Test Scene.unity b/Test Scene.unity new file mode 100644 index 0000000..a59de99 --- /dev/null +++ b/Test Scene.unity @@ -0,0 +1,477 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 8 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028377, g: 0.22571409, b: 0.30692285, a: 1} +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 9 + m_Resolution: 2 + m_BakeResolution: 40 + m_TextureWidth: 1024 + m_TextureHeight: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &81276446 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 81276447} + - component: {fileID: 81276449} + - component: {fileID: 81276448} + m_Layer: 0 + m_Name: Configurable Joint + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &81276447 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81276446} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -16.12846, y: 30.16961, z: 33.60329} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!153 &81276448 +ConfigurableJoint: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81276446} + m_ConnectedBody: {fileID: 0} + m_Anchor: {x: 0, y: 0, z: 0} + m_Axis: {x: 1, y: 0, z: 0} + m_AutoConfigureConnectedAnchor: 0 + m_ConnectedAnchor: {x: -16.12846, y: 30.16961, z: 33.60329} + serializedVersion: 2 + m_SecondaryAxis: {x: 0, y: 1, z: 0} + m_XMotion: 2 + m_YMotion: 2 + m_ZMotion: 2 + m_AngularXMotion: 1 + m_AngularYMotion: 1 + m_AngularZMotion: 2 + m_LinearLimitSpring: + spring: 0 + damper: 0 + m_LinearLimit: + limit: 5 + bounciness: 1 + contactDistance: 0 + m_AngularXLimitSpring: + spring: 0 + damper: 0 + m_LowAngularXLimit: + limit: -177 + bounciness: 0 + contactDistance: 0 + m_HighAngularXLimit: + limit: 89.886406 + bounciness: 0 + contactDistance: 0 + m_AngularYZLimitSpring: + spring: 1.48 + damper: 0 + m_AngularYLimit: + limit: 78.77057 + bounciness: 0 + contactDistance: 0 + m_AngularZLimit: + limit: 177 + bounciness: 0 + contactDistance: 0 + m_TargetPosition: {x: 0, y: 0, z: 0} + m_TargetVelocity: {x: 0, y: 0, z: 0} + m_XDrive: + serializedVersion: 3 + positionSpring: 0 + positionDamper: 0 + maximumForce: 3.4028233e+38 + m_YDrive: + serializedVersion: 3 + positionSpring: 0 + positionDamper: 0 + maximumForce: 3.4028233e+38 + m_ZDrive: + serializedVersion: 3 + positionSpring: 0 + positionDamper: 0 + maximumForce: 3.4028233e+38 + m_TargetRotation: {x: 0, y: 0, z: 0, w: 1} + m_TargetAngularVelocity: {x: 0, y: 0, z: 0} + m_RotationDriveMode: 0 + m_AngularXDrive: + serializedVersion: 3 + positionSpring: 0 + positionDamper: 0 + maximumForce: 3.4028233e+38 + m_AngularYZDrive: + serializedVersion: 3 + positionSpring: 0 + positionDamper: 0 + maximumForce: 3.4028233e+38 + m_SlerpDrive: + serializedVersion: 3 + positionSpring: 0 + positionDamper: 0 + maximumForce: 3.4028233e+38 + m_ProjectionMode: 0 + m_ProjectionDistance: 0.1 + m_ProjectionAngle: 180 + m_ConfiguredInWorldSpace: 0 + m_SwapBodies: 0 + m_BreakForce: Infinity + m_BreakTorque: Infinity + m_EnableCollision: 0 + m_EnablePreprocessing: 1 + m_MassScale: 1 + m_ConnectedMassScale: 1 +--- !u!54 &81276449 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 81276446} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!1 &950539000 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 950539002} + - component: {fileID: 950539001} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &950539001 +Light: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950539000} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &950539002 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 950539000} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &963349592 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 963349595} + - component: {fileID: 963349594} + - component: {fileID: 963349593} + m_Layer: 0 + m_Name: Hinge Joint + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!59 &963349593 +HingeJoint: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963349592} + m_ConnectedBody: {fileID: 0} + m_Anchor: {x: 0, y: 0, z: 0} + m_Axis: {x: 1, y: 0, z: 0} + m_AutoConfigureConnectedAnchor: 1 + m_ConnectedAnchor: {x: -16.12846, y: 30.16961, z: 33.60329} + m_UseSpring: 0 + m_Spring: + spring: 0 + damper: 0 + targetPosition: 0 + m_UseMotor: 0 + m_Motor: + targetVelocity: 0 + force: 0 + freeSpin: 0 + m_UseLimits: 0 + m_Limits: + min: 100 + max: 180 + bounciness: 0 + bounceMinVelocity: 0.2 + contactDistance: 0 + m_BreakForce: Infinity + m_BreakTorque: Infinity + m_EnableCollision: 0 + m_EnablePreprocessing: 1 + m_MassScale: 1 + m_ConnectedMassScale: 1 +--- !u!54 &963349594 +Rigidbody: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963349592} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!4 &963349595 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963349592} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -16.12846, y: 30.16961, z: 33.60329} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &986589420 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 986589424} + - component: {fileID: 986589423} + - component: {fileID: 986589422} + - component: {fileID: 986589421} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &986589421 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 986589420} + m_Enabled: 1 +--- !u!124 &986589422 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 986589420} + m_Enabled: 1 +--- !u!20 &986589423 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 986589420} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &986589424 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 986589420} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Test Scene.unity.meta b/Test Scene.unity.meta new file mode 100644 index 0000000..c0b63d4 --- /dev/null +++ b/Test Scene.unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a14275d072afe924a921f4fb80cb2fdb +timeCreated: 1510656523 +licenseType: Free +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: