diff options
Diffstat (limited to 'Assets/SampleUI/Scripts/PanelManager.cs')
-rwxr-xr-x | Assets/SampleUI/Scripts/PanelManager.cs | 96 |
1 files changed, 96 insertions, 0 deletions
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<Selectable> (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); + } +} |