@@ -5,11 +5,36 @@ namespace Rellac.UI
55 [ CreateAssetMenu ( fileName = "New UI Manager" , menuName = "UI/Manager" , order = 1 ) ]
66 public class UIManager : ScriptableObject
77 {
8+ /// <summary>
9+ /// Manager loops between a selection of UIPanels
10+ /// </summary>
11+ [ Tooltip ( "" ) ]
12+ [ SerializeField ] private bool containsLoopGroup = false ;
813 /// <summary>
914 /// Panel to start when manager is initialised - no transition will be made
1015 /// </summary>
1116 [ Tooltip ( "Panel to start when manager is initialised - no transition will be made" ) ]
1217 [ SerializeField ] private UIPanel initialPanel = null ;
18+ /// <summary>
19+ /// Speed to play transitions across a loop group
20+ /// </summary>
21+ [ Tooltip ( "Speed to play transitions across a loop group" ) ]
22+ [ SerializeField ] private float loopTransitionSpeed = 1 ;
23+ /// <summary>
24+ /// Animation to play when transitioning to the previous panel in a loop group
25+ /// </summary>
26+ [ Tooltip ( "Animation to play when transitioning to the previous panel in a loop group" ) ]
27+ [ SerializeField ] private UITransition prevTransition = null ;
28+ /// <summary>
29+ /// Animation to play when transitioning to the next panel in a loop group
30+ /// </summary>
31+ [ Tooltip ( "Animation to play when transitioning to the next panel in a loop group" ) ]
32+ [ SerializeField ] private UITransition nextTransition = null ;
33+ /// <summary>
34+ /// Group of UIPanels to transition between is manager contains a loop group
35+ /// </summary>
36+ [ Tooltip ( "Group of UIPanels to transition between is manager contains a loop group" ) ]
37+ [ SerializeField ] private UIPanel [ ] loopGroup = null ;
1338
1439 RectTransform root_ ;
1540 /// <summary>
@@ -45,6 +70,27 @@ public Animator animator
4570 private bool transitioning = false ;
4671 private UIPanel currentPanel ;
4772
73+ private int loopIdx_ ;
74+ private int loopIdx
75+ {
76+ get
77+ {
78+ return loopIdx_ ;
79+ }
80+ set
81+ {
82+ loopIdx_ = value ;
83+ if ( loopIdx_ >= loopGroup . Length )
84+ {
85+ loopIdx_ = 0 ;
86+ }
87+ if ( loopIdx < 0 )
88+ {
89+ loopIdx = loopGroup . Length - 1 ;
90+ }
91+ }
92+ }
93+
4894 /// <summary>
4995 /// Initialise manager in scene
5096 /// </summary>
@@ -63,11 +109,18 @@ public void Initialise(RectTransform parent)
63109 fitter . Fit ( ) ;
64110 }
65111
66- RectTransform panelRoot = ( RectTransform ) Instantiate ( initialPanel . panelPrefab , inParent ) . transform ;
112+ UIPanel panel = initialPanel ;
113+ if ( containsLoopGroup )
114+ {
115+ panel = loopGroup [ 0 ] ;
116+ loopIdx = 0 ;
117+ }
118+
119+ RectTransform panelRoot = ( RectTransform ) Instantiate ( panel . panelPrefab , inParent ) . transform ;
67120 animator . Play ( "Instant" ) ;
68- initialPanel . Initialise ( panelRoot ) ;
69- root . GetComponent < MonoBehaviour > ( ) . StartCoroutine ( initialPanel . WaitForTransitionIn ( panelRoot ) ) ;
70- currentPanel = initialPanel ;
121+ panel . Initialise ( panelRoot ) ;
122+ root . GetComponent < MonoBehaviour > ( ) . StartCoroutine ( panel . WaitForTransitionIn ( panelRoot , panel . animationSpeed ) ) ;
123+ currentPanel = panel ;
71124 transitioning = false ;
72125 }
73126
@@ -76,11 +129,61 @@ public void Initialise(RectTransform parent)
76129 /// </summary>
77130 /// <param name="input">UIPanel to transition to</param>
78131 public void SetPanel ( UIPanel input )
132+ {
133+ if ( TryPreparePanel ( input ) )
134+ {
135+ input . PlayTransition ( this , input . transition , containsLoopGroup ? loopTransitionSpeed : input . animationSpeed ) ;
136+ transitioning = true ;
137+ }
138+ }
139+
140+ public void NextPanel ( )
141+ {
142+ if ( CheckIsValidLoopGroup ( ) )
143+ {
144+ loopIdx ++ ;
145+ if ( TryPreparePanel ( loopGroup [ loopIdx ] ) )
146+ {
147+ loopGroup [ loopIdx ] . PlayTransition ( this , nextTransition , containsLoopGroup ? loopTransitionSpeed : loopGroup [ loopIdx ] . animationSpeed ) ;
148+ transitioning = true ;
149+ }
150+ }
151+ }
152+
153+ public void PreviousPanel ( )
154+ {
155+ if ( CheckIsValidLoopGroup ( ) )
156+ {
157+ loopIdx -- ;
158+ if ( TryPreparePanel ( loopGroup [ loopIdx ] ) )
159+ {
160+ loopGroup [ loopIdx ] . PlayTransition ( this , prevTransition , containsLoopGroup ? loopTransitionSpeed : loopGroup [ loopIdx ] . animationSpeed ) ;
161+ transitioning = true ;
162+ }
163+ }
164+ }
165+
166+ private bool CheckIsValidLoopGroup ( )
167+ {
168+ if ( ! containsLoopGroup )
169+ {
170+ Debug . LogError ( "Trying to Call NextPanel() on a UIManager that doesn't contain a loop group" ) ;
171+ return false ;
172+ }
173+ if ( loopGroup . Length == 0 )
174+ {
175+ Debug . LogError ( "No panels listed in loop group of " + name ) ;
176+ return false ;
177+ }
178+ return true ;
179+ }
180+
181+ private bool TryPreparePanel ( UIPanel input )
79182 {
80183 if ( transitioning )
81184 {
82185 Debug . LogError ( "Wait for transition to end before setting new panel" ) ;
83- return ;
186+ return false ;
84187 }
85188 if ( currentPanel != null )
86189 {
@@ -102,8 +205,7 @@ public void SetPanel(UIPanel input)
102205 }
103206 root . GetComponent < MonoBehaviour > ( ) . StartCoroutine ( WaitForAnimationEnd ( input ) ) ;
104207 input . Initialise ( ( RectTransform ) Instantiate ( input . panelPrefab , inParent ) . transform ) ;
105- input . PlayTransition ( this ) ;
106- transitioning = true ;
208+ return true ;
107209 }
108210
109211 private IEnumerator WaitForAnimationEnd ( UIPanel panel )
0 commit comments