Added adjustable fade speed and raycast block handling.
Added adjustable fade speed and raycast block handling.

 Binary files a/Assets/Plugins/KerbalEngineer.Unity.dll and b/Assets/Plugins/KerbalEngineer.Unity.dll differ
--- a/Assets/Prefabs/flight-menu.prefab
+++ b/Assets/Prefabs/flight-menu.prefab
@@ -48,6 +48,8 @@
   - 222: {fileID: 22270862}
   - 114: {fileID: 11423044}
   - 114: {fileID: 11485532}
+  - 225: {fileID: 22567868}
+  - 114: {fileID: 11415294}
   m_Layer: 5
   m_Name: flight-menu
   m_TagString: Untagged
@@ -245,6 +247,18 @@
   m_FillAmount: 1
   m_FillClockwise: 1
   m_FillOrigin: 0
+--- !u!114 &11415294
+MonoBehaviour:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 126098}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 2019631361, guid: a3a55138b08428847a08c7b48fe72efe, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_FadeDuration: .200000003
 --- !u!114 &11423044
 MonoBehaviour:
   m_ObjectHideFlags: 1
@@ -779,6 +793,17 @@
   m_AnchoredPosition: {x: 0, y: 0}
   m_SizeDelta: {x: 0, y: 0}
   m_Pivot: {x: .5, y: 1}
+--- !u!225 &22567868
+CanvasGroup:
+  m_ObjectHideFlags: 1
+  m_PrefabParentObject: {fileID: 0}
+  m_PrefabInternal: {fileID: 100100000}
+  m_GameObject: {fileID: 126098}
+  m_Enabled: 1
+  m_Alpha: 1
+  m_Interactable: 1
+  m_BlocksRaycasts: 1
+  m_IgnoreParentGroups: 0
 --- !u!1001 &100100000
 Prefab:
   m_ObjectHideFlags: 1

--- /dev/null
+++ b/KerbalEngineer.Unity/CanvasGroupFader.cs
@@ -1,1 +1,89 @@
+namespace KerbalEngineer.Unity
+{
+    using System;
+    using System.Collections;
+    using UnityEngine;
 
+    [RequireComponent(typeof(CanvasGroup))]
+    public class CanvasGroupFader : MonoBehaviour
+    {
+        [SerializeField]
+        private float m_FadeDuration = 0.2f;
+
+        private CanvasGroup m_CanvasGroup;
+        private IEnumerator m_FadeCoroutine;
+
+        /// <summary>
+        ///     Fades the canvas group to a specified alpha value with optional callback.
+        /// </summary>
+        public void FadeTo(float alpha, Action callback = null)
+        {
+            FadeTo(alpha, false, callback);
+        }
+
+        /// <summary>
+        ///     Fades the canvas group to a specified alpha using the supplied blocking state during fade with optional callback.
+        /// </summary>
+        public void FadeTo(float alpha, bool blockRaycasts, Action callback = null)
+        {
+            if (m_CanvasGroup == null)
+            {
+                return;
+            }
+
+            Fade(m_CanvasGroup.alpha, alpha, false, callback);
+        }
+
+        /// <summary>
+        ///     Sets the alpha value of the canvas group.
+        /// </summary>
+        public void SetAlpha(float alpha, bool blockRaycasts = false)
+        {
+            if (m_CanvasGroup == null)
+            {
+                return;
+            }
+
+            alpha = Mathf.Clamp01(alpha);
+            m_CanvasGroup.alpha = alpha;
+            m_CanvasGroup.blocksRaycasts = blockRaycasts || !(alpha < 1.0f);
+        }
+
+        protected virtual void Awake()
+        {
+            // cache components
+            m_CanvasGroup = GetComponent<CanvasGroup>();
+        }
+
+        /// <summary>
+        ///     Starts a fade from one alpha value to another with callback.
+        /// </summary>
+        private void Fade(float from, float to, bool blockRaycasts, Action callback)
+        {
+            if (m_FadeCoroutine != null)
+            {
+                StopCoroutine(m_FadeCoroutine);
+            }
+
+            m_FadeCoroutine = FadeCoroutine(from, to, blockRaycasts, callback);
+            StartCoroutine(m_FadeCoroutine);
+        }
+
+        /// <summary>
+        ///     Coroutine that handles the fading.
+        /// </summary>
+        private IEnumerator FadeCoroutine(float from, float to, bool blockRaycasts, Action callback)
+        {
+            float progress = 0.0f;
+
+            while (progress <= 1.0f)
+            {
+                progress += Time.deltaTime / m_FadeDuration;
+                SetAlpha(Mathf.Lerp(from, to, progress), blockRaycasts);
+                yield return null;
+            }
+
+            callback?.Invoke();
+        }
+    }
+}

--- /dev/null
+++ b/KerbalEngineer.Unity/Flight/FlightEngineerMenu.cs
@@ -1,1 +1,29 @@
+// 
+//     Kerbal Engineer Redux
+// 
+//     Copyright (C) 2016 CYBUTEK
+// 
+//     This program is free software: you can redistribute it and/or modify
+//     it under the terms of the GNU General Public License as published by
+//     the Free Software Foundation, either version 3 of the License, or
+//     (at your option) any later version.
+// 
+//     This program is distributed in the hope that it will be useful,
+//     but WITHOUT ANY WARRANTY; without even the implied warranty of
+//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//     GNU General Public License for more details.
+//     You should have received a copy of the GNU General Public License
+//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+//  
 
+namespace KerbalEngineer.Unity.Flight
+{
+    public class FlightEngineerMenu : CanvasGroupFader
+    {
+        protected virtual void OnEnable()
+        {
+            SetAlpha(0.0f);
+            FadeTo(1.0f);
+        }
+    }
+}

--- a/KerbalEngineer.Unity/KerbalEngineer.Unity.csproj
+++ b/KerbalEngineer.Unity/KerbalEngineer.Unity.csproj
@@ -32,6 +32,7 @@
   </PropertyGroup>
   <ItemGroup>
     <Compile Include="CanvasGroupFader.cs" />
+    <Compile Include="Flight\FlightEngineerMenu.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>

 Binary files a/Output/KerbalEngineer/KerbalEngineer and b/Output/KerbalEngineer/KerbalEngineer differ
 Binary files a/Output/KerbalEngineer/KerbalEngineer.Unity.dll and b/Output/KerbalEngineer/KerbalEngineer.Unity.dll differ
 Binary files a/Output/KerbalEngineer/KerbalEngineer.dll and b/Output/KerbalEngineer/KerbalEngineer.dll differ
 Binary files a/Output/KerbalEngineer/prefabs and b/Output/KerbalEngineer/prefabs differ
--- a/Output/KerbalEngineer/prefabs.manifest
+++ b/Output/KerbalEngineer/prefabs.manifest
@@ -1,12 +1,12 @@
 ManifestFileVersion: 0
-CRC: 3110848426
+CRC: 1765835818
 Hashes:
   AssetFileHash:
     serializedVersion: 2
-    Hash: 1222d5da945826ed2afaf4cba65a3f5d
+    Hash: 0189854def44ed20b086b6c4266b8c5d
   TypeTreeHash:
     serializedVersion: 2
-    Hash: c49d0f1c41a1b57d6af1061f875f232a
+    Hash: ca6c59ab938e037b0e2b7931aee3e292
 HashAppended: 0
 ClassTypes:
 - Class: 1
@@ -29,6 +29,8 @@
   Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
 - Class: 114
   Script: {fileID: 1297475563, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3}
+- Class: 114
+  Script: {fileID: 2019631361, guid: a3a55138b08428847a08c7b48fe72efe, type: 3}
 - Class: 115
   Script: {instanceID: 0}
 - Class: 128
@@ -39,6 +41,8 @@
   Script: {instanceID: 0}
 - Class: 224
   Script: {instanceID: 0}
+- Class: 225
+  Script: {instanceID: 0}
 Assets:
 - Assets/Prefabs/flight-menu.prefab
 Dependencies: []