public override void OnInspectorGUI()
    {
        EditorGUI.BeginChangeCheck();

        GUILayout.Space(8);

        serializedObject.Update();
        SerializedProperty damageTagProperty = serializedObject.FindProperty("damageTag");

        EditorGUILayout.PropertyField(damageTagProperty);

        serializedObject.ApplyModifiedProperties();

        GUILayout.Space(8);
        EditorGUILayout.LabelField("Inputs", EditorStyles.boldLabel);
        PlayerShipInputs baseInputs = targetPlayerSpaceShip.GetPlayerShipInputs;
        PlayerShipInputs newInputs  =
            (PlayerShipInputs)EditorGUILayout.ObjectField
                ("Inputs", baseInputs, typeof(PlayerShipInputs), false);

        if (newInputs != baseInputs)
        {
            Undo.RecordObject(targetPlayerSpaceShip, "Undo Affect Inputs");
            targetPlayerSpaceShip.SetPlayerShipInputs(newInputs);
            currentInputEditor = null;
        }

        PlayerShipInputs finalInputs = targetPlayerSpaceShip.GetPlayerShipInputs;

        if (finalInputs != null)
        {
            if (currentInputEditor == null)
            {
                Editor.CreateCachedEditor(finalInputs, typeof(PlayerShipInputsInspector), ref currentInputEditor);
            }

            showInputs = EditorGUILayout.BeginFoldoutHeaderGroup(showInputs, (showInputs ? "Close" : "Open") + " Inputs", showInputs ? EditorStyles.boldLabel : null);
            EditorGUILayout.EndFoldoutHeaderGroup();

            if (showInputs)
            {
                EditorGUI.indentLevel += 1;
                EditorGUILayout.BeginVertical("box");
                currentInputEditor.OnInspectorGUI();
                EditorGUILayout.EndVertical();
                EditorGUI.indentLevel -= 1;
                GUILayout.Space(8);
                EditorStaticMethods.DrawLine(2, Color.black);
            }
        }

        if (EditorGUI.EndChangeCheck())
        {
            EditorSceneManager.MarkSceneDirty(targetPlayerSpaceShip.gameObject.scene);
        }

        base.OnInspectorGUI();
    }
    public override void OnInspectorGUI()
    {
        EditorGUI.BeginChangeCheck();


        System.Type shipType = targetSpaceShip.GetType();
        if (shipType != typeof(PlayerSpaceShipScript))
        {
            GUILayout.Space(8);

            serializedObject.Update();
            SerializedProperty damageTagProperty = serializedObject.FindProperty("damageTag");
            EditorGUILayout.PropertyField(damageTagProperty);

            serializedObject.ApplyModifiedProperties();
        }

        #region Movements
        GUILayout.Space(8);
        EditorGUILayout.LabelField("Movement System", EditorStyles.boldLabel);

        EditorGUI.BeginChangeCheck();
        SpaceShipMovementParameters newMovementParameters =
            (SpaceShipMovementParameters)EditorGUILayout.ObjectField
                ("Movement Parameters", targetSpaceShip.GetMovementSystem.GetMovementParameters, typeof(SpaceShipMovementParameters), false);

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(targetSpaceShip, "Undo Affect Movement Parameters");
            targetSpaceShip.GetMovementSystem.SetMovementParameters(newMovementParameters);
        }

        SpaceShipMovementParameters finalMovementParameters = targetSpaceShip.GetMovementSystem.GetMovementParameters;
        if (finalMovementParameters != null)
        {
            showMovementParameters = EditorGUILayout.BeginFoldoutHeaderGroup(showMovementParameters, (showMovementParameters ? "Close" : "Open") + " Movement Parameters", showMovementParameters ? EditorStyles.boldLabel : null);
            EditorGUILayout.EndFoldoutHeaderGroup();

            if (showMovementParameters)
            {
                EditorGUI.indentLevel += 1;
                EditorGUILayout.BeginVertical("box");
                SpaceShipMovementParametersInspector.ShowMovementParameters(finalMovementParameters, 10);
                EditorGUILayout.EndVertical();
                EditorGUI.indentLevel -= 1;

                GUILayout.Space(8);
                EditorStaticMethods.DrawLine(2, Color.black);
            }
        }
        #endregion

        #region Shooting
        GUILayout.Space(8);
        EditorGUILayout.LabelField("Shooting System", EditorStyles.boldLabel);

        EditorGUI.BeginChangeCheck();

        Transform newWeaponsParent = (Transform)EditorGUILayout.ObjectField("Weapons Parent", targetSpaceShip.GetShootingSystem.GetWeaponsParent, typeof(Transform), true);

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(targetSpaceShip, "Undo Affect Weapons Parent");
            targetSpaceShip.GetShootingSystem.SetWeaponsParent(newWeaponsParent);
        }

        EditorGUI.BeginChangeCheck();

        WeaponParameters newWeaponParameters = (WeaponParameters)EditorGUILayout.ObjectField("Weapon Parameters", targetSpaceShip.GetShootingSystem.GetBaseWeaponParameters, typeof(WeaponParameters), false);

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(targetSpaceShip, "Undo Affect Weapons Parameters");
            targetSpaceShip.GetShootingSystem.SetWeaponParameters(newWeaponParameters);
        }

        WeaponParameters finalWeaponParameters = targetSpaceShip.GetShootingSystem.GetBaseWeaponParameters;

        if (finalWeaponParameters != null)
        {
            showWeaponParameters = EditorGUILayout.BeginFoldoutHeaderGroup(showWeaponParameters, (showWeaponParameters ? "Close" : "Open") + " Weapon Parameters", showWeaponParameters ? EditorStyles.boldLabel : null);
            EditorGUILayout.EndFoldoutHeaderGroup();

            if (showWeaponParameters)
            {
                EditorGUI.indentLevel += 1;
                EditorGUILayout.BeginVertical("box");
                WeaponParametersInspector.ShowWeaponParameters(finalWeaponParameters, 15, ref showShootParameters, ref showProjectileParameters);
                EditorGUILayout.EndVertical();
                EditorGUI.indentLevel -= 1;

                GUILayout.Space(8);
                EditorStaticMethods.DrawLine(2, Color.black);
            }
        }
        #endregion

        #region Others
        GUILayout.Space(8);
        EditorGUILayout.LabelField("Other References", EditorStyles.boldLabel);

        EditorGUI.BeginChangeCheck();

        DamageableComponent newLinkedDamagesComponent = (DamageableComponent)EditorGUILayout.ObjectField("Linked Damageable Component", targetSpaceShip.GetRelatedDamageableComponent, typeof(DamageableComponent), true);

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(targetSpaceShip, "Change Damageable Component");
            targetSpaceShip.SetRelatedDamageableComponent(newLinkedDamagesComponent);
        }

        if (targetSpaceShip.GetRelatedDamageableComponent != null)
        {
            EditorGUI.BeginChangeCheck();

            int newLifeAmount = EditorGUILayout.IntField("Ship Life Amount", targetSpaceShip.GetRelatedDamageableComponent.GetMaxLifeAmount);

            if (EditorGUI.EndChangeCheck())
            {
                Debug.Log("Life Amount Changed");
                Undo.RecordObject(targetSpaceShip.GetRelatedDamageableComponent, "Undo Change Max Life Amount");
                targetSpaceShip.GetRelatedDamageableComponent.SetMaxLifeAmount(newLifeAmount);
            }
        }

        #endregion

        if (EditorGUI.EndChangeCheck())
        {
            EditorSceneManager.MarkSceneDirty(targetSpaceShip.gameObject.scene);
        }

        //base.OnInspectorGUI();
    }