summaryrefslogtreecommitdiff
path: root/Assets/SampleUI/Scripts/PanelManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/SampleUI/Scripts/PanelManager.cs')
-rwxr-xr-xAssets/SampleUI/Scripts/PanelManager.cs96
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);
+ }
+}