Performance drops with Custom Editor

Hello,

I have a Custom Editor and as soon as I select the object in the inspector with this custom editor the performance goes slower. Am I doing something wrong or that I could improve on some way? Is a custom editor that much slower?

Thanks! :slight_smile:

[CustomEditor(typeof(CameraManager))]
    public class CameraManagerEditor : Editor
    {
        // Basic properties
        private SerializedProperty _basicOffsetDistance;
        private SerializedProperty _basicOffsetHeight;
        private SerializedProperty _basicLookAtOffsetDistance;
        private SerializedProperty _basicLookAtOffsetHeight;

        // Spring properties
        private SerializedProperty _springEnabled;
        private SerializedProperty _springHorizontalOffset;
        private SerializedProperty _springVerticalOffset;
        private SerializedProperty _springSpeed;
        private SerializedProperty _springBreakFactor;
        private SerializedProperty _springInertialFactor;
        private SerializedProperty _springFOVOffset;
        private SerializedProperty _springMaximumTime;

        // Slope properties
        private SerializedProperty _slopeEnabled;
        private SerializedProperty _slopeVerticalOffset;
        private SerializedProperty _slopeVerticalLookAtOffset;
        private SerializedProperty _slopePositiveOffsetFactor;
        private SerializedProperty _slopeNegativeOffsetFactor;
        private SerializedProperty _slopeLookAtFactor;
        private SerializedProperty _slopeSpeedUp;
        private SerializedProperty _slopeSpeedDown;
        private SerializedProperty _slopeSpeedBack;
        private SerializedProperty _slopeMaxAngle;

        // Sway properties
        private SerializedProperty _swayEnabled;
        private SerializedProperty _swayMaxAngle;
        private SerializedProperty _swaySpeed;
        private SerializedProperty _swayTurnMaxAngle;
        private SerializedProperty _swayTurnSpeed;
        private SerializedProperty _swayDriftMaxAngle;
        private SerializedProperty _swayDriftSpeed;

        // Drift properties
        private SerializedProperty _driftEnabled;
        private SerializedProperty _driftRadius;
        private SerializedProperty _driftMaxAngle;
        private SerializedProperty _driftForwardFactor;
        private SerializedProperty _driftLateralFactor;
        private SerializedProperty _driftLookAtFactor;
        private SerializedProperty _driftAcceleration;
        private SerializedProperty _driftSpeedBack;

        // Bounce properties
        private SerializedProperty _bounceEnabled;
        private SerializedProperty _bounceAmplitude;
        private SerializedProperty _bounceMaxTimeOnAir;
        private SerializedProperty _bounceMaxTimeBouncing;
        private SerializedProperty _bounceFrequency;

        // Turbo properties
        private SerializedProperty _turboEnabled;
        private SerializedProperty _turboAmplitude;

        public void OnEnable()
        {
            _basicOffsetDistance = serializedObject.FindProperty("basicOffsetDistance");
            _basicOffsetHeight = serializedObject.FindProperty("basicOffsetHeight");
            _basicLookAtOffsetDistance = serializedObject.FindProperty("basicLookAtOffsetDistance");
            _basicLookAtOffsetHeight = serializedObject.FindProperty("basicLookAtOffsetHeight");

            _springEnabled = serializedObject.FindProperty("springEnabled");
            _springHorizontalOffset = serializedObject.FindProperty("springHorizontalOffset");
            _springVerticalOffset = serializedObject.FindProperty("springVerticalOffset");
            _springSpeed = serializedObject.FindProperty("springSpeed");
            _springBreakFactor = serializedObject.FindProperty("springBreakFactor");
            _springInertialFactor = serializedObject.FindProperty("springInertialFactor");
            _springFOVOffset = serializedObject.FindProperty("springFOVOffset");
            _springMaximumTime = serializedObject.FindProperty("springMaximumTime");

            _slopeEnabled = serializedObject.FindProperty("slopeEnabled");
            _slopeVerticalOffset = serializedObject.FindProperty("slopeVerticalOffset");
            _slopeVerticalLookAtOffset = serializedObject.FindProperty("slopeVerticalLookAtOffset");
            _slopePositiveOffsetFactor = serializedObject.FindProperty("slopePositiveOffsetFactor");
            _slopeNegativeOffsetFactor = serializedObject.FindProperty("slopeNegativeOffsetFactor");
            _slopeLookAtFactor = serializedObject.FindProperty("slopeLookAtFactor");
            _slopeSpeedUp = serializedObject.FindProperty("slopeSpeedUp");
            _slopeSpeedDown = serializedObject.FindProperty("slopeSpeedDown");
            _slopeSpeedBack = serializedObject.FindProperty("slopeSpeedBack");
            _slopeMaxAngle = serializedObject.FindProperty("slopeMaxAngle");

            _swayEnabled = serializedObject.FindProperty("swayEnabled");
            _swayMaxAngle = serializedObject.FindProperty("swayMaxAngle");
            _swaySpeed = serializedObject.FindProperty("swaySpeed");
            _swayTurnMaxAngle = serializedObject.FindProperty("swayTurnMaxAngle");
            _swayTurnSpeed = serializedObject.FindProperty("swayTurnSpeed");
            _swayDriftMaxAngle = serializedObject.FindProperty("swayDriftMaxAngle");
            _swayDriftSpeed = serializedObject.FindProperty("swayDriftSpeed");

            _driftEnabled = serializedObject.FindProperty("driftEnabled");
            _driftRadius = serializedObject.FindProperty("driftRadius");
            _driftMaxAngle = serializedObject.FindProperty("driftMaxAngle");
            _driftForwardFactor = serializedObject.FindProperty("driftForwardFactor");
            _driftLateralFactor = serializedObject.FindProperty("driftLateralFactor");
            _driftLookAtFactor = serializedObject.FindProperty("driftLookAtFactor");
            _driftAcceleration = serializedObject.FindProperty("driftAcceleration");
            _driftSpeedBack = serializedObject.FindProperty("driftSpeedBack");

            _bounceEnabled = serializedObject.FindProperty("bounceEnabled");
            _bounceAmplitude = serializedObject.FindProperty("bounceAmplitude");
            _bounceFrequency = serializedObject.FindProperty("bounceFrequency");
            _bounceMaxTimeBouncing = serializedObject.FindProperty("bounceMaxTimeBouncing");
            _bounceMaxTimeOnAir = serializedObject.FindProperty("bounceMaxTimeOnAir");

            _turboEnabled = serializedObject.FindProperty("turboEnabled");
            _turboAmplitude = serializedObject.FindProperty("turboAmplitude");
        }
       
        override public void OnInspectorGUI()
        {
            EditorGUI.BeginChangeCheck();

            DrawDefaultInspector();

            CameraManager cameraManager = (CameraManager)target;

            base.serializedObject.Update();

            if (GUILayout.Button("Reload setup"))
            {
                cameraManager.ReloadSetup();
            }

            EditorGUILayout.PropertyField(_basicOffsetDistance);
            EditorGUILayout.PropertyField(_basicOffsetHeight);
            EditorGUILayout.PropertyField(_basicLookAtOffsetDistance);
            EditorGUILayout.PropertyField(_basicLookAtOffsetHeight);

            EditorGUILayout.PropertyField(_springEnabled);

            if (_springEnabled.boolValue)
            {
                EditorGUILayout.PropertyField(_springHorizontalOffset);
                EditorGUILayout.PropertyField(_springVerticalOffset);
                EditorGUILayout.PropertyField(_springSpeed);
                EditorGUILayout.PropertyField(_springBreakFactor);
                EditorGUILayout.PropertyField(_springInertialFactor);
                EditorGUILayout.PropertyField(_springFOVOffset);
                EditorGUILayout.PropertyField(_springMaximumTime);
            }

            EditorGUILayout.PropertyField(_slopeEnabled);
            if (_slopeEnabled.boolValue)
            {
                EditorGUILayout.PropertyField(_slopeVerticalOffset);
                EditorGUILayout.PropertyField(_slopeVerticalLookAtOffset);
                EditorGUILayout.PropertyField(_slopePositiveOffsetFactor);
                EditorGUILayout.PropertyField(_slopeNegativeOffsetFactor);
                EditorGUILayout.PropertyField(_slopeLookAtFactor);
                EditorGUILayout.PropertyField(_slopeSpeedUp);
                EditorGUILayout.PropertyField(_slopeSpeedDown);
                EditorGUILayout.PropertyField(_slopeSpeedBack);
                EditorGUILayout.PropertyField(_slopeMaxAngle);
            }

            EditorGUILayout.PropertyField(_swayEnabled);
            if (_swayEnabled.boolValue)
            {
                EditorGUILayout.PropertyField(_swayMaxAngle);
                EditorGUILayout.PropertyField(_swaySpeed);
                EditorGUILayout.PropertyField(_swayTurnMaxAngle);
                EditorGUILayout.PropertyField(_swayTurnSpeed);
                EditorGUILayout.PropertyField(_swayDriftMaxAngle);
                EditorGUILayout.PropertyField(_swayDriftSpeed);
            }

            EditorGUILayout.PropertyField(_driftEnabled);
            if (_driftEnabled.boolValue)
            {
                EditorGUILayout.PropertyField(_driftRadius);
                EditorGUILayout.PropertyField(_driftMaxAngle);
                EditorGUILayout.PropertyField(_driftForwardFactor);
                EditorGUILayout.PropertyField(_driftLateralFactor);
                EditorGUILayout.PropertyField(_driftLookAtFactor);
                EditorGUILayout.PropertyField(_driftAcceleration);
                EditorGUILayout.PropertyField(_driftSpeedBack);
            }

            EditorGUILayout.PropertyField(_bounceEnabled);
            if (_bounceEnabled.boolValue)
            {
                EditorGUILayout.PropertyField(_bounceAmplitude);
                EditorGUILayout.PropertyField(_bounceFrequency);
                EditorGUILayout.PropertyField(_bounceMaxTimeBouncing);
                EditorGUILayout.PropertyField(_bounceMaxTimeOnAir);
            }

            EditorGUILayout.PropertyField(_turboEnabled);

            if (_turboEnabled.boolValue)
            {
                EditorGUILayout.PropertyField(_turboAmplitude);
            }

            EditorGUILayout.Space();

            if (GUILayout.Button("Reload setup"))
            {
                cameraManager.ReloadSetup();
            }

            if (EditorGUI.EndChangeCheck())
            {
                base.serializedObject.ApplyModifiedProperties();
            }

        }

        public void OnDisable()
        {
        }

    }

I don’t see any red flags.

Are there any errors in the console? Maybe it’s not able to find one of the properties, and it’s spamming the console.

Have you tried commenting out parts to narrow down the culprit?

Did you attach the Unity Profiler to measure what code is causing the performance issue? Might be easier to get told by the profiler what’s slow, than trying to find it via guessing :slight_smile:

Diagnosing Performance Problems
https://unity3d.com/de/learn/tutorials/temas/performance-optimization/profiler-window?playlist=44069

1 Like