├── .gitignore ├── Assets ├── Examples.meta ├── Examples │ ├── AnimatedLayoutRigged.unity │ ├── AnimatedLayoutRigged.unity.meta │ ├── BasicMenuSlideAnimator.controller │ ├── BasicMenuSlideAnimator.controller.meta │ ├── BasicMenuSlide_Close.anim │ ├── BasicMenuSlide_Close.anim.meta │ ├── BasicMenuSlide_Open.anim │ ├── BasicMenuSlide_Open.anim.meta │ ├── ComplexLayout.unity │ ├── ComplexLayout.unity.meta │ ├── ComplexLayoutRigged.unity │ └── ComplexLayoutRigged.unity.meta ├── Scripts.meta ├── Scripts │ ├── Animation.meta │ ├── Animation │ │ ├── MenuAnimator.cs │ │ ├── MenuAnimator.cs.meta │ │ ├── WaitForAnimationState.cs │ │ └── WaitForAnimationState.cs.meta │ ├── Editor.meta │ ├── Editor │ │ ├── MenuStackWindow.cs │ │ ├── MenuStackWindow.cs.meta │ │ ├── NavigatorEditor.cs │ │ └── NavigatorEditor.cs.meta │ ├── Extensions.cs │ ├── Extensions.cs.meta │ ├── Menu.cs │ ├── Menu.cs.meta │ ├── MenuRoot.cs │ ├── MenuRoot.cs.meta │ ├── Navigation.meta │ ├── Navigation │ │ ├── BackMenuNavigator.cs │ │ ├── BackMenuNavigator.cs.meta │ │ ├── BaseMenuNavigator.cs │ │ ├── BaseMenuNavigator.cs.meta │ │ ├── DirectMenuNavigator.cs │ │ ├── DirectMenuNavigator.cs.meta │ │ ├── ExitMenuNavigator.cs │ │ ├── ExitMenuNavigator.cs.meta │ │ ├── INavigator.cs │ │ ├── INavigator.cs.meta │ │ ├── NextMenuNavigator.cs │ │ ├── NextMenuNavigator.cs.meta │ │ ├── RegexMenuNavigator.cs │ │ ├── RegexMenuNavigator.cs.meta │ │ ├── SceneMenuNavigator.cs │ │ └── SceneMenuNavigator.cs.meta │ ├── OverlayMenu.cs │ ├── OverlayMenu.cs.meta │ ├── RuntimeMenuTagger.cs │ └── RuntimeMenuTagger.cs.meta ├── Tests.meta └── Tests │ ├── Editor.meta │ └── Editor │ ├── BasicTest.cs │ ├── BasicTest.cs.meta │ ├── TimingTest.cs │ └── TimingTest.cs.meta ├── Doxyfile ├── LICENSE ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshAreas.asset ├── NetworkManager.asset ├── Physics2DSettings.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset └── UnityConnectSettings.asset ├── README.md └── docs ├── annotated.html ├── bc_s.png ├── bdwn.png ├── class_menu_stack_1_1_animation_1_1_menu_animator-members.html ├── class_menu_stack_1_1_animation_1_1_menu_animator.html ├── class_menu_stack_1_1_animation_1_1_menu_animator.png ├── class_menu_stack_1_1_animation_1_1_wait_for_animation_state-members.html ├── class_menu_stack_1_1_animation_1_1_wait_for_animation_state.html ├── class_menu_stack_1_1_animation_1_1_wait_for_animation_state.png ├── class_menu_stack_1_1_editor_1_1_menu_stack_window-members.html ├── class_menu_stack_1_1_editor_1_1_menu_stack_window.html ├── class_menu_stack_1_1_editor_1_1_menu_stack_window.png ├── class_menu_stack_1_1_editor_1_1_navigator_editor-members.html ├── class_menu_stack_1_1_editor_1_1_navigator_editor.html ├── class_menu_stack_1_1_editor_1_1_navigator_editor.png ├── class_menu_stack_1_1_menu-members.html ├── class_menu_stack_1_1_menu.html ├── class_menu_stack_1_1_menu.png ├── class_menu_stack_1_1_menu_root-members.html ├── class_menu_stack_1_1_menu_root.html ├── class_menu_stack_1_1_menu_root.png ├── class_menu_stack_1_1_navigation_1_1_back_menu_navigator-members.html ├── class_menu_stack_1_1_navigation_1_1_back_menu_navigator.html ├── class_menu_stack_1_1_navigation_1_1_back_menu_navigator.png ├── class_menu_stack_1_1_navigation_1_1_base_menu_navigator-members.html ├── class_menu_stack_1_1_navigation_1_1_base_menu_navigator.html ├── class_menu_stack_1_1_navigation_1_1_base_menu_navigator.png ├── class_menu_stack_1_1_navigation_1_1_direct_menu_navigator-members.html ├── class_menu_stack_1_1_navigation_1_1_direct_menu_navigator.html ├── class_menu_stack_1_1_navigation_1_1_direct_menu_navigator.png ├── class_menu_stack_1_1_navigation_1_1_exit_menu_navigator-members.html ├── class_menu_stack_1_1_navigation_1_1_exit_menu_navigator.html ├── class_menu_stack_1_1_navigation_1_1_exit_menu_navigator.png ├── class_menu_stack_1_1_navigation_1_1_next_menu_navigator-members.html ├── class_menu_stack_1_1_navigation_1_1_next_menu_navigator.html ├── class_menu_stack_1_1_navigation_1_1_next_menu_navigator.png ├── class_menu_stack_1_1_navigation_1_1_regex_menu_navigator-members.html ├── class_menu_stack_1_1_navigation_1_1_regex_menu_navigator.html ├── class_menu_stack_1_1_navigation_1_1_regex_menu_navigator.png ├── class_menu_stack_1_1_navigation_1_1_scene_menu_navigator-members.html ├── class_menu_stack_1_1_navigation_1_1_scene_menu_navigator.html ├── class_menu_stack_1_1_navigation_1_1_scene_menu_navigator.png ├── class_menu_stack_1_1_overlay_menu-members.html ├── class_menu_stack_1_1_overlay_menu.html ├── class_menu_stack_1_1_overlay_menu.png ├── class_menu_stack_1_1_runtime_menu_tagger-members.html ├── class_menu_stack_1_1_runtime_menu_tagger.html ├── classes.html ├── closed.png ├── dir_0261d5286017c38b9af36d6d3ff94a53.html ├── dir_84bbf7b3c7f28a5a18725745e1505219.html ├── dir_a1363f3d2ddf5b809e8758d99f8d6aee.html ├── dir_caa6cb601e4c74e6752991944d371be7.html ├── dir_f13b41af88cf68434578284aaf699e39.html ├── dir_f8b7016bab98b7e8d68388868b401d0d.html ├── doc.png ├── doxygen.css ├── doxygen.png ├── dynsections.js ├── folderclosed.png ├── folderopen.png ├── functions.html ├── functions_enum.html ├── functions_evnt.html ├── functions_func.html ├── functions_prop.html ├── functions_vars.html ├── hierarchy.html ├── img ├── backmenunav.png └── editorwindow.png ├── index.html ├── interface_menu_stack_1_1_navigation_1_1_i_navigator-members.html ├── interface_menu_stack_1_1_navigation_1_1_i_navigator.html ├── interface_menu_stack_1_1_navigation_1_1_i_navigator.png ├── jquery.js ├── menu.js ├── menudata.js ├── namespace_menu_stack.html ├── namespace_menu_stack_1_1_animation.html ├── namespace_menu_stack_1_1_editor.html ├── namespace_menu_stack_1_1_navigation.html ├── namespacemembers.html ├── namespacemembers_enum.html ├── namespaces.html ├── nav_f.png ├── nav_g.png ├── nav_h.png ├── open.png ├── search ├── all_0.html ├── all_0.js ├── all_1.html ├── all_1.js ├── all_10.html ├── all_10.js ├── all_11.html ├── all_11.js ├── all_12.html ├── all_12.js ├── all_2.html ├── all_2.js ├── all_3.html ├── all_3.js ├── all_4.html ├── all_4.js ├── all_5.html ├── all_5.js ├── all_6.html ├── all_6.js ├── all_7.html ├── all_7.js ├── all_8.html ├── all_8.js ├── all_9.html ├── all_9.js ├── all_a.html ├── all_a.js ├── all_b.html ├── all_b.js ├── all_c.html ├── all_c.js ├── all_d.html ├── all_d.js ├── all_e.html ├── all_e.js ├── all_f.html ├── all_f.js ├── classes_0.html ├── classes_0.js ├── classes_1.html ├── classes_1.js ├── classes_2.html ├── classes_2.js ├── classes_3.html ├── classes_3.js ├── classes_4.html ├── classes_4.js ├── classes_5.html ├── classes_5.js ├── classes_6.html ├── classes_6.js ├── classes_7.html ├── classes_7.js ├── classes_8.html ├── classes_8.js ├── classes_9.html ├── classes_9.js ├── close.png ├── enums_0.html ├── enums_0.js ├── enumvalues_0.html ├── enumvalues_0.js ├── events_0.html ├── events_0.js ├── events_1.html ├── events_1.js ├── functions_0.html ├── functions_0.js ├── functions_1.html ├── functions_1.js ├── functions_2.html ├── functions_2.js ├── functions_3.html ├── functions_3.js ├── functions_4.html ├── functions_4.js ├── functions_5.html ├── functions_5.js ├── functions_6.html ├── functions_6.js ├── functions_7.html ├── functions_7.js ├── functions_8.html ├── functions_8.js ├── functions_9.html ├── functions_9.js ├── mag_sel.png ├── namespaces_0.html ├── namespaces_0.js ├── nomatches.html ├── pages_0.html ├── pages_0.js ├── properties_0.html ├── properties_0.js ├── properties_1.html ├── properties_1.js ├── properties_2.html ├── properties_2.js ├── properties_3.html ├── properties_3.js ├── search.css ├── search.js ├── search_l.png ├── search_m.png ├── search_r.png ├── searchdata.js ├── variables_0.html ├── variables_0.js ├── variables_1.html ├── variables_1.js ├── variables_2.html ├── variables_2.js ├── variables_3.html ├── variables_3.js ├── variables_4.html ├── variables_4.js ├── variables_5.html ├── variables_5.js ├── variables_6.html ├── variables_6.js ├── variables_7.html ├── variables_7.js ├── variables_8.html ├── variables_8.js ├── variables_9.html ├── variables_9.js ├── variables_a.html ├── variables_a.js ├── variables_b.html └── variables_b.js ├── splitbar.png ├── sync_off.png ├── sync_on.png ├── tab_a.png ├── tab_b.png ├── tab_h.png ├── tab_s.png └── tabs.css /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/unity 3 | 4 | ### Unity ### 5 | /[Ll]ibrary/ 6 | /[Tt]emp/ 7 | /[Oo]bj/ 8 | /[Bb]uild/ 9 | /[Bb]uilds/ 10 | /Assets/AssetStoreTools* 11 | 12 | # Visual Studio 2015 cache directory 13 | /.vs/ 14 | 15 | # Autogenerated VS/MD/Consulo solution and project files 16 | ExportedObj/ 17 | .consulo/ 18 | *.csproj 19 | *.unityproj 20 | *.sln 21 | *.suo 22 | *.tmp 23 | *.user 24 | *.userprefs 25 | *.pidb 26 | *.booproj 27 | *.svd 28 | *.pdb 29 | 30 | 31 | # Unity3D generated meta files 32 | *.pidb.meta 33 | 34 | # Unity3D Generated File On Crash Reports 35 | sysinfo.txt 36 | 37 | # Builds 38 | *.apk 39 | *.unitypackage 40 | 41 | # End of https://www.gitignore.io/api/unity 42 | 43 | 44 | 45 | # Created by https://www.gitignore.io/api/unity 46 | 47 | ### Unity ### 48 | /[Ll]ibrary/ 49 | /[Tt]emp/ 50 | /[Oo]bj/ 51 | /[Bb]uild/ 52 | /[Bb]uilds/ 53 | /Assets/AssetStoreTools* 54 | 55 | # Visual Studio 2015 cache directory 56 | /.vs/ 57 | 58 | # Autogenerated VS/MD/Consulo solution and project files 59 | ExportedObj/ 60 | .consulo/ 61 | *.csproj 62 | *.unityproj 63 | *.sln 64 | *.suo 65 | *.tmp 66 | *.user 67 | *.userprefs 68 | *.pidb 69 | *.booproj 70 | *.svd 71 | *.pdb 72 | 73 | 74 | # Unity3D generated meta files 75 | *.pidb.meta 76 | 77 | # Unity3D Generated File On Crash Reports 78 | sysinfo.txt 79 | 80 | # Builds 81 | *.apk 82 | *.unitypackage 83 | 84 | # End of https://www.gitignore.io/api/unity 85 | -------------------------------------------------------------------------------- /Assets/Examples.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3c8980f5bd1b8d94f8b4be556794104f 3 | folderAsset: yes 4 | timeCreated: 1488151678 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Examples/AnimatedLayoutRigged.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bengreenier/Unity-MenuStack/6209d6ec82fd425573724464a75d12bc40b666f9/Assets/Examples/AnimatedLayoutRigged.unity -------------------------------------------------------------------------------- /Assets/Examples/AnimatedLayoutRigged.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a6dfaf26ce0c83e4889e2a7b925da0b1 3 | timeCreated: 1488394308 4 | licenseType: Free 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Examples/BasicMenuSlideAnimator.controller: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bengreenier/Unity-MenuStack/6209d6ec82fd425573724464a75d12bc40b666f9/Assets/Examples/BasicMenuSlideAnimator.controller -------------------------------------------------------------------------------- /Assets/Examples/BasicMenuSlideAnimator.controller.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 37d4d318776664447b9f8716d27462a1 3 | timeCreated: 1488400837 4 | licenseType: Free 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Examples/BasicMenuSlide_Close.anim: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bengreenier/Unity-MenuStack/6209d6ec82fd425573724464a75d12bc40b666f9/Assets/Examples/BasicMenuSlide_Close.anim -------------------------------------------------------------------------------- /Assets/Examples/BasicMenuSlide_Close.anim.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 01ff1ff08d480584dba935c5f45390c1 3 | timeCreated: 1488400784 4 | licenseType: Free 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Examples/BasicMenuSlide_Open.anim: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bengreenier/Unity-MenuStack/6209d6ec82fd425573724464a75d12bc40b666f9/Assets/Examples/BasicMenuSlide_Open.anim -------------------------------------------------------------------------------- /Assets/Examples/BasicMenuSlide_Open.anim.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 6b60b05ea4da6354a91bb773b2bc0527 3 | timeCreated: 1488394535 4 | licenseType: Free 5 | NativeFormatImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Examples/ComplexLayout.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bengreenier/Unity-MenuStack/6209d6ec82fd425573724464a75d12bc40b666f9/Assets/Examples/ComplexLayout.unity -------------------------------------------------------------------------------- /Assets/Examples/ComplexLayout.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 743dcbd9f0aa81d4090ad23f059518a0 3 | timeCreated: 1488151713 4 | licenseType: Free 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Examples/ComplexLayoutRigged.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bengreenier/Unity-MenuStack/6209d6ec82fd425573724464a75d12bc40b666f9/Assets/Examples/ComplexLayoutRigged.unity -------------------------------------------------------------------------------- /Assets/Examples/ComplexLayoutRigged.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ec184bc5d41694747885ff9d1bcc3b5f 3 | timeCreated: 1488382510 4 | licenseType: Free 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c1dea48bd66aa824fa4417e97580e75f 3 | folderAsset: yes 4 | timeCreated: 1488151799 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Scripts/Animation.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d31f426714aaf0c45bb47c8374231dae 3 | folderAsset: yes 4 | timeCreated: 1488392900 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Scripts/Animation/MenuAnimator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 12d38d526e1dfbd46a622a47b8ebb6e7 3 | timeCreated: 1488392900 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/Scripts/Animation/WaitForAnimationState.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using UnityEngine; 6 | 7 | namespace MenuStack.Animation 8 | { 9 | /// 10 | /// Waits for a specific animation state to be transitioned to, and for it's motion to complete 11 | /// 12 | public class WaitForAnimationState : CustomYieldInstruction 13 | { 14 | private Animator animator; 15 | private string state; 16 | private int layer; 17 | 18 | /// 19 | /// Default ctor 20 | /// 21 | /// the animator to check against 22 | /// the state to wait for 23 | /// the layer to check against 24 | public WaitForAnimationState(Animator animator, string state, int layer = 0) 25 | { 26 | this.animator = animator; 27 | this.state = state; 28 | this.layer = layer; 29 | } 30 | 31 | /// 32 | /// https://docs.unity3d.com/ScriptReference/CustomYieldInstruction.html 33 | /// 34 | /// 35 | /// This will be queried between Update() and LateUpdate() 36 | /// 37 | public override bool keepWaiting 38 | { 39 | get 40 | { 41 | var stateInfo = this.animator.GetCurrentAnimatorStateInfo(this.layer); 42 | 43 | return (!stateInfo.IsName(this.state) || this.animator.IsInTransition(this.layer)) || 44 | (this.animator.GetCurrentAnimatorClipInfoCount(this.layer) == 0 || stateInfo.normalizedTime < 1); 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Assets/Scripts/Animation/WaitForAnimationState.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fc9af53a12767b1448392c0c68aef362 3 | timeCreated: 1494977805 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/Scripts/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7e5fbe701e3533444a6ed0cded7a370c 3 | folderAsset: yes 4 | timeCreated: 1488641893 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Scripts/Editor/MenuStackWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 38fea6afbf6edce4d8e5d00c02a1cb44 3 | timeCreated: 1488408852 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/Scripts/Editor/NavigatorEditor.cs: -------------------------------------------------------------------------------- 1 | using MenuStack.Navigation; 2 | using UnityEditor; 3 | using UnityEditor.Events; 4 | using UnityEngine; 5 | using UnityEngine.UI; 6 | 7 | namespace MenuStack.Editor 8 | { 9 | /// 10 | /// Custom editor to facilitate autowiring 11 | /// 12 | [CustomEditor(typeof(BaseMenuNavigator), editorForChildClasses: true)] 13 | [CanEditMultipleObjects] 14 | public class NavigatorEditor : UnityEditor.Editor 15 | { 16 | /// 17 | /// Unity editor hook for 18 | /// 19 | void OnEnable() 20 | { 21 | // only autowire if we're not running 22 | if (!Application.isPlaying && Application.isEditor) 23 | { 24 | foreach (var obj in serializedObject.targetObjects) 25 | { 26 | var comp = obj as Component; 27 | 28 | TryAutoWire(comp.gameObject); 29 | } 30 | } 31 | } 32 | 33 | /// 34 | /// Internal helper to try and autowire 35 | /// 36 | /// The root game object 37 | void TryAutoWire(GameObject root) 38 | { 39 | var button = root.GetComponent