2using System.Collections;
3using System.Collections.Generic;
6using UnityEngine.Events;
7using UnityEngine.InputSystem;
11 [DisallowMultipleComponent]
14 [Header(
"Input Actions")]
15 [SerializeField, Tooltip(
"Quits the game or play mode")]
16 private InputAction quit =
new(
"Quit", InputActionType.Value,
"<Keyboard>/Escape");
17 [SerializeField, Tooltip(
"Opens the help debug window")]
18 private InputAction help =
new(
"Help", InputActionType.Value,
"<Keyboard>/h");
19 [SerializeField, Tooltip(
"Swaps the eyes on the stereoscopic glasses")]
20 private InputAction swapEyes =
new(
"Swap Eyes", InputActionType.Value,
"<Keyboard>/e");
21 [SerializeField, Tooltip(
"Toggles rendering between stereo and mono")]
22 private InputAction stereoMonoToggle =
new(
"Stereo/Mono Toggle", InputActionType.Value,
"<Keyboard>/t");
23 [SerializeField, Tooltip(
"Toggles muting all sounds")]
24 private InputAction muteToggle =
new(
"Mute Toggle", InputActionType.Value,
"<Keyboard>/m");
25 [SerializeField, Tooltip(
"Hides the mouse when it doesn't move for a few seconds")]
26 private InputAction mouseMove =
new(
"Mouse Move", InputActionType.Value,
"<Mouse>/delta");
27 [SerializeField, Tooltip(
"Increase the interpupillary distance")]
28 private InputAction increaseIPD =
new(
"Increase IPD", InputActionType.Value,
"<Keyboard>/rightArrow");
29 [SerializeField, Tooltip(
"Decreases the interpupillary distance")]
30 private InputAction decreaseIPD =
new(
"Decrease IPD", InputActionType.Value,
"<Keyboard>/leftArrow");
31 [SerializeField, Tooltip(
"Increase the camera height")]
32 private InputAction increaseCameraHeight =
new(
"Increase Camera Height", InputActionType.Value,
"<Keyboard>/upArrow");
33 [SerializeField, Tooltip(
"Decreases the camera height")]
34 private InputAction decreaseCameraHeight =
new(
"Decrease Camera Height", InputActionType.Value,
"<Keyboard>/downArrow");
37 [SerializeField, Range(0, 0.01f), Tooltip(
"Amount to adjust interpupillary distance for stereo rendering")]
38 private float IPD_CHANGE = 0.001f;
39 [SerializeField, Range(0, 0.5f), Tooltip(
"Amount to adjust camera height")]
40 private float CAMERA_HEIGHT_CHANGE = 0.0254f;
41 [SerializeField, Tooltip(
"The Head object that gets repositioned")]
42 private Transform headTrackingCamera;
44 [SerializeField, Tooltip(
"Skin for the GUI")]
45 private GUISkin guiSkin;
48 private List<string> helpKeys =
new();
49 private List<string> helpDescriptions =
new();
50 private UnityAction extraGUICalls;
52 private enum HelpDisplay
58 private HelpDisplay showHelp = HelpDisplay.Off;
61 private readonly
int[] framerates =
new int[100];
62 private int framerateIndex = 0;
67 (quit.GetBindingDisplayString(),
"Quit the game or exit play mode"),
68 (help.GetBindingDisplayString(),
"Open this help window"),
69 (swapEyes.GetBindingDisplayString(),
"Swap the eyes on the stereoscopic glasses"),
70 (stereoMonoToggle.GetBindingDisplayString(),
"Toggle rendering between stereo and mono"),
71 (muteToggle.GetBindingDisplayString(),
"Mute all sounds"),
72 (increaseIPD.GetBindingDisplayString(),
"Increase IPD"),
73 (decreaseIPD.GetBindingDisplayString(),
"Decrease IPD"),
74 (increaseCameraHeight.GetBindingDisplayString(),
"Increase Camera Height"),
75 (decreaseCameraHeight.GetBindingDisplayString(),
"Decrease Camera Height")
81 framerates[framerateIndex] = (int)(1 / Time.unscaledDeltaTime);
82 framerateIndex = (framerateIndex + 1) % framerates.Length;
83 int currentFramerate = (
int)framerates.Average();
86 GUILayout.Label($
"Framerate: {currentFramerate} fps");
87 float ipd = cavern.IPD * 1000;
88 GUILayout.Label($
"Head height: {headTrackingCamera.localPosition.y} meters\t\tIPD: {ipd:F1} mm");
97 stereoMonoToggle.Enable();
100 increaseIPD.Enable();
101 decreaseIPD.Enable();
102 increaseCameraHeight.Enable();
103 decreaseCameraHeight.Enable();
113 stereoMonoToggle.Disable();
114 muteToggle.Disable();
116 increaseIPD.Disable();
117 decreaseIPD.Disable();
118 increaseCameraHeight.Disable();
119 decreaseCameraHeight.Disable();
128 help.performed += HelpAction;
129 swapEyes.performed += SwapEyesAction;
130 stereoMonoToggle.performed += MonoStereoAction;
131 muteToggle.performed += MuteToggleAction;
132 mouseMove.performed += OnMouseMove;
133 increaseIPD.performed += IncreaseIPDAction;
134 decreaseIPD.performed += DecreaseIPDAction;
135 increaseCameraHeight.performed += IncreaseCameraHeightAction;
136 decreaseCameraHeight.performed += DecreaseCameraHeightAction;
142 hideMouseCoroutine = HideMouse();
143 StartCoroutine(hideMouseCoroutine);
145 foreach (IDebugKeys manager
in GetComponents<IDebugKeys>())
147 foreach ((
string Key,
string Description) d in manager.KeyDescriptions())
150 helpDescriptions.Add(d.Description);
152 extraGUICalls += manager.DoExtraGUI;
160 UnityEditor.EditorApplication.ExitPlaymode();
166 void SwapEyesAction(InputAction.CallbackContext ctx)
172 void MonoStereoAction(InputAction.CallbackContext ctx)
174 CavernRenderer cavern = GetComponentInChildren<CavernRenderer>();
175 switch (cavern.GetStereoscopicMode())
177 case CavernRenderer.StereoscopicMode.Mono:
178 cavern.SetStereoscopicMode(CavernRenderer.StereoscopicMode.Stereo);
180 case CavernRenderer.StereoscopicMode.Stereo:
181 cavern.SetStereoscopicMode(CavernRenderer.StereoscopicMode.Mono);
191 void MuteToggleAction(InputAction.CallbackContext ctx)
193 AudioListener l = GetComponentInChildren<AudioListener>();
194 l.enabled = !l.enabled;
197 void HelpAction(InputAction.CallbackContext ctx)
202 case HelpDisplay.Off:
203 showHelp = HelpDisplay.PC;
206 showHelp = HelpDisplay.Off;
208 case HelpDisplay.CAVERN:
209 showHelp = HelpDisplay.Off;
215 void IncreaseIPDAction(InputAction.CallbackContext ctx)
217 CavernRenderer cavern = GetComponentInChildren<CavernRenderer>();
218 cavern.IPD += IPD_CHANGE;
221 void DecreaseIPDAction(InputAction.CallbackContext ctx)
223 CavernRenderer cavern = GetComponentInChildren<CavernRenderer>();
224 cavern.IPD -= IPD_CHANGE;
227 void IncreaseCameraHeightAction(InputAction.CallbackContext ctx)
229 headTrackingCamera.localPosition =
new(headTrackingCamera.localPosition.x, headTrackingCamera.localPosition.y + CAMERA_HEIGHT_CHANGE, headTrackingCamera.localPosition.z);
232 void DecreaseCameraHeightAction(InputAction.CallbackContext ctx)
234 headTrackingCamera.localPosition =
new(headTrackingCamera.localPosition.x, headTrackingCamera.localPosition.y - CAMERA_HEIGHT_CHANGE, headTrackingCamera.localPosition.z);
238 #region Cursor Hiding
243 IEnumerator hideMouseCoroutine =
null;
244 IEnumerator HideMouse()
246 yield
return new WaitForSeconds(3);
247 Cursor.visible =
false;
250 void OnMouseMove(InputAction.CallbackContext context)
252 StopCoroutine(hideMouseCoroutine);
254 Cursor.visible =
true;
255 hideMouseCoroutine = HideMouse();
256 StartCoroutine(hideMouseCoroutine);
265 case HelpDisplay.Off:
270 case HelpDisplay.CAVERN:
280 GUILayout.BeginArea(
new Rect(40, 40, 1000, 1000), GUI.skin.box);
282 GUILayout.BeginVertical();
283 GUILayout.BeginHorizontal();
284 GUILayout.BeginVertical();
285 foreach (
string key
in helpKeys)
287 GUILayout.Label(key);
289 GUILayout.EndVertical();
291 GUILayout.BeginVertical();
292 foreach (
string description
in helpDescriptions)
294 GUILayout.Label(description);
296 GUILayout.EndVertical();
297 GUILayout.EndHorizontal();
298 extraGUICalls.Invoke();
299 GUILayout.EndVertical();
List<(string Key, string Description)> KeyDescriptions()
void QuitAction(InputAction.CallbackContext ctx)