From 115f77bda0246a00f6e17469685c67746bdbd29d Mon Sep 17 00:00:00 2001 From: nirav Date: Sat, 12 Dec 2020 07:18:36 +0000 Subject: Initial commit --- Assets/SampleUI/Scripts/PanelManager.cs | 96 +++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 Assets/SampleUI/Scripts/PanelManager.cs (limited to 'Assets/SampleUI/Scripts/PanelManager.cs') diff --git a/Assets/SampleUI/Scripts/PanelManager.cs b/Assets/SampleUI/Scripts/PanelManager.cs new file mode 100755 index 0000000..fcd6058 --- /dev/null +++ b/Assets/SampleUI/Scripts/PanelManager.cs @@ -0,0 +1,96 @@ +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.EventSystems; +using System.Collections; +using System.Collections.Generic; + +public class PanelManager : MonoBehaviour { + + public Animator initiallyOpen; + + private int m_OpenParameterId; + private Animator m_Open; + private GameObject m_PreviouslySelected; + + const string k_OpenTransitionName = "Open"; + const string k_ClosedStateName = "Closed"; + + public void OnEnable() + { + m_OpenParameterId = Animator.StringToHash (k_OpenTransitionName); + + if (initiallyOpen == null) + return; + + OpenPanel(initiallyOpen); + } + + public void OpenPanel (Animator anim) + { + if (m_Open == anim) + return; + + anim.gameObject.SetActive(true); + var newPreviouslySelected = EventSystem.current.currentSelectedGameObject; + + anim.transform.SetAsLastSibling(); + + CloseCurrent(); + + m_PreviouslySelected = newPreviouslySelected; + + m_Open = anim; + m_Open.SetBool(m_OpenParameterId, true); + + GameObject go = FindFirstEnabledSelectable(anim.gameObject); + + SetSelected(go); + } + + static GameObject FindFirstEnabledSelectable (GameObject gameObject) + { + GameObject go = null; + var selectables = gameObject.GetComponentsInChildren (true); + foreach (var selectable in selectables) { + if (selectable.IsActive () && selectable.IsInteractable ()) { + go = selectable.gameObject; + break; + } + } + return go; + } + + public void CloseCurrent() + { + if (m_Open == null) + return; + + m_Open.SetBool(m_OpenParameterId, false); + SetSelected(m_PreviouslySelected); + StartCoroutine(DisablePanelDeleyed(m_Open)); + m_Open = null; + } + + IEnumerator DisablePanelDeleyed(Animator anim) + { + bool closedStateReached = false; + bool wantToClose = true; + while (!closedStateReached && wantToClose) + { + if (!anim.IsInTransition(0)) + closedStateReached = anim.GetCurrentAnimatorStateInfo(0).IsName(k_ClosedStateName); + + wantToClose = !anim.GetBool(m_OpenParameterId); + + yield return new WaitForEndOfFrame(); + } + + if (wantToClose) + anim.gameObject.SetActive(false); + } + + private void SetSelected(GameObject go) + { + EventSystem.current.SetSelectedGameObject(go); + } +} -- cgit v1.2.3